blob: a233ec8c6effd678f8e6d4de5fb518ca2d6b153a [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
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080028#include <gui/BufferItem.h>
29#include <gui/BufferItemConsumer.h>
Yin-Chia Yehc3603822016-01-18 22:11:19 -080030#include <gui/Surface.h>
31
32#include <media/stagefright/foundation/ALooper.h>
33#include <media/stagefright/foundation/AHandler.h>
34#include <media/stagefright/foundation/AMessage.h>
35
36using namespace android;
37
38namespace {
39 enum {
40 IMAGE_READER_MAX_NUM_PLANES = 3,
41 };
42
43 enum {
44 ACQUIRE_SUCCESS = 0,
45 ACQUIRE_NO_BUFFERS = 1,
46 ACQUIRE_MAX_IMAGES = 2,
47 };
48}
49
50struct AImageReader : public RefBase {
51 public:
Yin-Chia Yehc3603822016-01-18 22:11:19 -080052 static bool isSupportedFormat(int32_t format);
53 static int getNumPlanesForFormat(int32_t format);
54
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080055 AImageReader(int32_t width,
56 int32_t height,
57 int32_t format,
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080058 uint64_t usage0,
59 uint64_t usage1,
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080060 int32_t maxImages);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080061 ~AImageReader();
62
63 // Inintialize AImageReader, uninitialized or failed to initialize AImageReader
64 // should never be passed to application
65 media_status_t init();
66
67 media_status_t setImageListener(AImageReader_ImageListener* listener);
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080068 media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080069
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080070 media_status_t acquireNextImage(/*out*/AImage** image, /*out*/int* fenceFd);
71 media_status_t acquireLatestImage(/*out*/AImage** image, /*out*/int* fenceFd);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080072
73 ANativeWindow* getWindow() const { return mWindow.get(); };
74 int32_t getWidth() const { return mWidth; };
75 int32_t getHeight() const { return mHeight; };
76 int32_t getFormat() const { return mFormat; };
77 int32_t getMaxImages() const { return mMaxImages; };
78
Yin-Chia Yehc3603822016-01-18 22:11:19 -080079 private:
80
81 friend struct AImage; // for grabing reader lock
82
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080083 BufferItem* getBufferItemLocked();
84 void returnBufferItemLocked(BufferItem* buffer);
85
86 // Called by AImageReader_acquireXXX to acquire a Buffer and setup AImage.
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080087 media_status_t acquireImageLocked(/*out*/AImage** image, /*out*/int* fenceFd);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080088
89 // Called by AImage to close image
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080090 void releaseImageLocked(AImage* image, int releaseFenceFd);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080091
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080092 static int getBufferWidth(BufferItem* buffer);
93 static int getBufferHeight(BufferItem* buffer);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080094
95 media_status_t setImageListenerLocked(AImageReader_ImageListener* listener);
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080096 media_status_t setBufferRemovedListenerLocked(AImageReader_BufferRemovedListener* listener);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080097
98 // definition of handler and message
99 enum {
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800100 kWhatBufferRemoved,
101 kWhatImageAvailable,
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800102 };
103 static const char* kCallbackFpKey;
104 static const char* kContextKey;
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800105 static const char* kGraphicBufferKey;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800106 class CallbackHandler : public AHandler {
107 public:
108 CallbackHandler(AImageReader* reader) : mReader(reader) {}
109 void onMessageReceived(const sp<AMessage> &msg) override;
110 private:
111 AImageReader* mReader;
112 };
113 sp<CallbackHandler> mHandler;
114 sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800115 List<BufferItem*> mBuffers;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800116
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800117 const int32_t mWidth;
118 const int32_t mHeight;
119 const int32_t mFormat;
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800120 const uint64_t mUsage0; // AHARDWAREBUFFER_USAGE0* flags.
121 const uint64_t mUsage1; // AHARDWAREBUFFER_USAGE1* flags.
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800122 const int32_t mMaxImages;
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800123
124 // TODO(jwcai) Seems completely unused in AImageReader class.
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800125 const int32_t mNumPlanes;
126
127 struct FrameListener : public ConsumerBase::FrameAvailableListener {
128 public:
Chih-Hung Hsieh724e0412016-08-29 14:22:17 -0700129 explicit FrameListener(AImageReader* parent) : mReader(parent) {}
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800130
131 void onFrameAvailable(const BufferItem& item) override;
132
133 media_status_t setImageListener(AImageReader_ImageListener* listener);
134
135 private:
136 AImageReader_ImageListener mListener = {nullptr, nullptr};
137 wp<AImageReader> mReader;
138 Mutex mLock;
139 };
140 sp<FrameListener> mFrameListener;
141
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800142 struct BufferRemovedListener : public BufferItemConsumer::BufferFreedListener {
143 public:
144 explicit BufferRemovedListener(AImageReader* parent) : mReader(parent) {}
145
146 void onBufferFreed(const wp<GraphicBuffer>& graphicBuffer) override;
147
148 media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
149
150 private:
151 AImageReader_BufferRemovedListener mListener = {nullptr, nullptr};
152 wp<AImageReader> mReader;
153 Mutex mLock;
154 };
155 sp<BufferRemovedListener> mBufferRemovedListener;
156
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800157 int mHalFormat;
158 android_dataspace mHalDataSpace;
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800159 uint64_t mHalUsage;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800160
161 sp<IGraphicBufferProducer> mProducer;
162 sp<Surface> mSurface;
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800163 sp<BufferItemConsumer> mBufferItemConsumer;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800164 sp<ANativeWindow> mWindow;
165
166 List<AImage*> mAcquiredImages;
167
168 Mutex mLock;
169};
170
171#endif // _NDK_IMAGE_READER_PRIV_H