blob: 48f0953bf997e47a862f601f90f29c05ecdc500a [file] [log] [blame]
Yin-Chia Yehc3603822016-01-18 22:11:19 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _NDK_IMAGE_READER_PRIV_H
18#define _NDK_IMAGE_READER_PRIV_H
19
20#include <inttypes.h>
21
22#include "NdkImageReader.h"
23
24#include <utils/List.h>
25#include <utils/Mutex.h>
26#include <utils/StrongPointer.h>
27
28#include <gui/CpuConsumer.h>
29#include <gui/Surface.h>
30
31#include <media/stagefright/foundation/ALooper.h>
32#include <media/stagefright/foundation/AHandler.h>
33#include <media/stagefright/foundation/AMessage.h>
34
35using namespace android;
36
37namespace {
38 enum {
39 IMAGE_READER_MAX_NUM_PLANES = 3,
40 };
41
42 enum {
43 ACQUIRE_SUCCESS = 0,
44 ACQUIRE_NO_BUFFERS = 1,
45 ACQUIRE_MAX_IMAGES = 2,
46 };
47}
48
49struct AImageReader : public RefBase {
50 public:
51
52 static bool isSupportedFormat(int32_t format);
53 static int getNumPlanesForFormat(int32_t format);
54
55 AImageReader(int32_t width, int32_t height, int32_t format, int32_t maxImages);
56 ~AImageReader();
57
58 // Inintialize AImageReader, uninitialized or failed to initialize AImageReader
59 // should never be passed to application
60 media_status_t init();
61
62 media_status_t setImageListener(AImageReader_ImageListener* listener);
63
64 media_status_t acquireNextImage(/*out*/AImage** image);
65 media_status_t acquireLatestImage(/*out*/AImage** image);
66
67 ANativeWindow* getWindow() const { return mWindow.get(); };
68 int32_t getWidth() const { return mWidth; };
69 int32_t getHeight() const { return mHeight; };
70 int32_t getFormat() const { return mFormat; };
71 int32_t getMaxImages() const { return mMaxImages; };
72
73
74 private:
75
76 friend struct AImage; // for grabing reader lock
77
78 media_status_t acquireCpuConsumerImageLocked(/*out*/AImage** image);
79 CpuConsumer::LockedBuffer* getLockedBufferLocked();
80 void returnLockedBufferLocked(CpuConsumer::LockedBuffer* buffer);
81
82 // Called by AImage to close image
83 void releaseImageLocked(AImage* image);
84
85 static int getBufferWidth(CpuConsumer::LockedBuffer* buffer);
86 static int getBufferHeight(CpuConsumer::LockedBuffer* buffer);
87
88 media_status_t setImageListenerLocked(AImageReader_ImageListener* listener);
89
90 // definition of handler and message
91 enum {
92 kWhatImageAvailable
93 };
94 static const char* kCallbackFpKey;
95 static const char* kContextKey;
96 class CallbackHandler : public AHandler {
97 public:
98 CallbackHandler(AImageReader* reader) : mReader(reader) {}
99 void onMessageReceived(const sp<AMessage> &msg) override;
100 private:
101 AImageReader* mReader;
102 };
103 sp<CallbackHandler> mHandler;
104 sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on
105
106 List<CpuConsumer::LockedBuffer*> mBuffers;
107 const int32_t mWidth;
108 const int32_t mHeight;
109 const int32_t mFormat;
110 const int32_t mMaxImages;
111 const int32_t mNumPlanes;
112
113 struct FrameListener : public ConsumerBase::FrameAvailableListener {
114 public:
115 FrameListener(AImageReader* parent) : mReader(parent) {}
116
117 void onFrameAvailable(const BufferItem& item) override;
118
119 media_status_t setImageListener(AImageReader_ImageListener* listener);
120
121 private:
122 AImageReader_ImageListener mListener = {nullptr, nullptr};
123 wp<AImageReader> mReader;
124 Mutex mLock;
125 };
126 sp<FrameListener> mFrameListener;
127
128 int mHalFormat;
129 android_dataspace mHalDataSpace;
130
131 sp<IGraphicBufferProducer> mProducer;
132 sp<Surface> mSurface;
133 sp<CpuConsumer> mCpuConsumer;
134 sp<ANativeWindow> mWindow;
135
136 List<AImage*> mAcquiredImages;
137
138 Mutex mLock;
139};
140
141#endif // _NDK_IMAGE_READER_PRIV_H