xref: /aosp_15_r20/frameworks/av/media/ndk/NdkImageReaderPriv.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #ifndef _NDK_IMAGE_READER_PRIV_H
18*ec779b8eSAndroid Build Coastguard Worker #define _NDK_IMAGE_READER_PRIV_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <inttypes.h>
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker #include <media/NdkImageReader.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <media-vndk/VndkImageReader.h>
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker #include <utils/List.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker #include <com_android_graphics_libgui_flags.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <gui/BufferItem.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <gui/BufferItemConsumer.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <gui/Surface.h>
33*ec779b8eSAndroid Build Coastguard Worker 
34*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ALooper.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AHandler.h>
36*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AMessage.h>
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker using namespace android;
39*ec779b8eSAndroid Build Coastguard Worker 
40*ec779b8eSAndroid Build Coastguard Worker namespace {
41*ec779b8eSAndroid Build Coastguard Worker     enum {
42*ec779b8eSAndroid Build Coastguard Worker         IMAGE_READER_MAX_NUM_PLANES = 3,
43*ec779b8eSAndroid Build Coastguard Worker     };
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker     enum {
46*ec779b8eSAndroid Build Coastguard Worker         ACQUIRE_SUCCESS = 0,
47*ec779b8eSAndroid Build Coastguard Worker         ACQUIRE_NO_BUFFERS = 1,
48*ec779b8eSAndroid Build Coastguard Worker         ACQUIRE_MAX_IMAGES = 2,
49*ec779b8eSAndroid Build Coastguard Worker     };
50*ec779b8eSAndroid Build Coastguard Worker }
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker struct AImageReader : public RefBase {
53*ec779b8eSAndroid Build Coastguard Worker   public:
54*ec779b8eSAndroid Build Coastguard Worker     static bool isSupportedFormatAndUsage(int32_t format, uint64_t usage0);
55*ec779b8eSAndroid Build Coastguard Worker     static int getNumPlanesForFormat(int32_t format);
56*ec779b8eSAndroid Build Coastguard Worker 
57*ec779b8eSAndroid Build Coastguard Worker     AImageReader(int32_t width,
58*ec779b8eSAndroid Build Coastguard Worker                  int32_t height,
59*ec779b8eSAndroid Build Coastguard Worker                  int32_t format,
60*ec779b8eSAndroid Build Coastguard Worker                  uint64_t usage,
61*ec779b8eSAndroid Build Coastguard Worker                  int32_t maxImages,
62*ec779b8eSAndroid Build Coastguard Worker                  uint32_t hardwareBufferFormat,
63*ec779b8eSAndroid Build Coastguard Worker                  android_dataspace dataSpace);
64*ec779b8eSAndroid Build Coastguard Worker     ~AImageReader();
65*ec779b8eSAndroid Build Coastguard Worker 
66*ec779b8eSAndroid Build Coastguard Worker     // Initialize AImageReader, uninitialized or failed to initialize AImageReader
67*ec779b8eSAndroid Build Coastguard Worker     // should never be passed to application
68*ec779b8eSAndroid Build Coastguard Worker     media_status_t init();
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker     media_status_t setImageListener(AImageReader_ImageListener* listener);
71*ec779b8eSAndroid Build Coastguard Worker     media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
72*ec779b8eSAndroid Build Coastguard Worker     media_status_t setUsage(uint64_t usage);
73*ec779b8eSAndroid Build Coastguard Worker 
74*ec779b8eSAndroid Build Coastguard Worker     media_status_t acquireNextImage(/*out*/AImage** image, /*out*/int* fenceFd);
75*ec779b8eSAndroid Build Coastguard Worker     media_status_t acquireLatestImage(/*out*/AImage** image, /*out*/int* fenceFd);
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker     media_status_t getWindowNativeHandle(/*out*/native_handle_t **handle);
78*ec779b8eSAndroid Build Coastguard Worker 
getWindowAImageReader79*ec779b8eSAndroid Build Coastguard Worker     ANativeWindow* getWindow()    const { return mWindow.get(); };
getWidthAImageReader80*ec779b8eSAndroid Build Coastguard Worker     int32_t        getWidth()     const { return mWidth; };
getHeightAImageReader81*ec779b8eSAndroid Build Coastguard Worker     int32_t        getHeight()    const { return mHeight; };
getFormatAImageReader82*ec779b8eSAndroid Build Coastguard Worker     int32_t        getFormat()    const { return mFormat; };
getMaxImagesAImageReader83*ec779b8eSAndroid Build Coastguard Worker     int32_t        getMaxImages() const { return mMaxImages; };
84*ec779b8eSAndroid Build Coastguard Worker     void           close();
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker   private:
87*ec779b8eSAndroid Build Coastguard Worker     friend struct AImage; // for grabing reader lock
88*ec779b8eSAndroid Build Coastguard Worker 
89*ec779b8eSAndroid Build Coastguard Worker     BufferItem* getBufferItemLocked();
90*ec779b8eSAndroid Build Coastguard Worker     void returnBufferItemLocked(BufferItem* buffer);
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker     // Called by AImageReader_acquireXXX to acquire a Buffer and setup AImage.
93*ec779b8eSAndroid Build Coastguard Worker     media_status_t acquireImageLocked(/*out*/AImage** image, /*out*/int* fenceFd);
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker     // Called by AImage/~AImageReader to close image. Caller is responsible to grab AImage::mLock
96*ec779b8eSAndroid Build Coastguard Worker     void releaseImageLocked(AImage* image, int releaseFenceFd, bool clearCache = true);
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker     static int getBufferWidth(BufferItem* buffer);
99*ec779b8eSAndroid Build Coastguard Worker     static int getBufferHeight(BufferItem* buffer);
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     media_status_t setImageListenerLocked(AImageReader_ImageListener* listener);
102*ec779b8eSAndroid Build Coastguard Worker     media_status_t setBufferRemovedListenerLocked(AImageReader_BufferRemovedListener* listener);
103*ec779b8eSAndroid Build Coastguard Worker 
104*ec779b8eSAndroid Build Coastguard Worker     // definition of handler and message
105*ec779b8eSAndroid Build Coastguard Worker     enum {
106*ec779b8eSAndroid Build Coastguard Worker         kWhatBufferRemoved,
107*ec779b8eSAndroid Build Coastguard Worker         kWhatImageAvailable,
108*ec779b8eSAndroid Build Coastguard Worker     };
109*ec779b8eSAndroid Build Coastguard Worker     static const char* kCallbackFpKey;
110*ec779b8eSAndroid Build Coastguard Worker     static const char* kContextKey;
111*ec779b8eSAndroid Build Coastguard Worker     static const char* kGraphicBufferKey;
112*ec779b8eSAndroid Build Coastguard Worker     class CallbackHandler : public AHandler {
113*ec779b8eSAndroid Build Coastguard Worker       public:
CallbackHandlerAImageReader114*ec779b8eSAndroid Build Coastguard Worker         CallbackHandler(AImageReader* reader) : mReader(reader) {}
115*ec779b8eSAndroid Build Coastguard Worker         void onMessageReceived(const sp<AMessage> &msg) override;
116*ec779b8eSAndroid Build Coastguard Worker       private:
117*ec779b8eSAndroid Build Coastguard Worker         AImageReader* mReader;
118*ec779b8eSAndroid Build Coastguard Worker     };
119*ec779b8eSAndroid Build Coastguard Worker     sp<CallbackHandler> mHandler;
120*ec779b8eSAndroid Build Coastguard Worker     sp<ALooper>         mCbLooper; // Looper thread where callbacks actually happen on
121*ec779b8eSAndroid Build Coastguard Worker     List<BufferItem*>   mBuffers;
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker     const int32_t mWidth;
124*ec779b8eSAndroid Build Coastguard Worker     const int32_t mHeight;
125*ec779b8eSAndroid Build Coastguard Worker     int32_t mFormat;
126*ec779b8eSAndroid Build Coastguard Worker     uint64_t mUsage;  // AHARDWAREBUFFER_USAGE_* flags.
127*ec779b8eSAndroid Build Coastguard Worker     const int32_t mMaxImages;
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker     // TODO(jwcai) Seems completely unused in AImageReader class.
130*ec779b8eSAndroid Build Coastguard Worker     const int32_t mNumPlanes;
131*ec779b8eSAndroid Build Coastguard Worker 
132*ec779b8eSAndroid Build Coastguard Worker     uint32_t mHalFormat = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
133*ec779b8eSAndroid Build Coastguard Worker     android_dataspace mHalDataSpace = HAL_DATASPACE_UNKNOWN;
134*ec779b8eSAndroid Build Coastguard Worker 
135*ec779b8eSAndroid Build Coastguard Worker     struct FrameListener : public ConsumerBase::FrameAvailableListener {
136*ec779b8eSAndroid Build Coastguard Worker       public:
FrameListenerAImageReader::FrameListener137*ec779b8eSAndroid Build Coastguard Worker         explicit FrameListener(AImageReader* parent) : mReader(parent) {}
138*ec779b8eSAndroid Build Coastguard Worker 
139*ec779b8eSAndroid Build Coastguard Worker         void onFrameAvailable(const BufferItem& item) override;
140*ec779b8eSAndroid Build Coastguard Worker 
141*ec779b8eSAndroid Build Coastguard Worker         media_status_t setImageListener(AImageReader_ImageListener* listener);
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker       private:
144*ec779b8eSAndroid Build Coastguard Worker         AImageReader_ImageListener mListener = {nullptr, nullptr};
145*ec779b8eSAndroid Build Coastguard Worker         const wp<AImageReader>     mReader;
146*ec779b8eSAndroid Build Coastguard Worker         Mutex                      mLock;
147*ec779b8eSAndroid Build Coastguard Worker     };
148*ec779b8eSAndroid Build Coastguard Worker     sp<FrameListener> mFrameListener;
149*ec779b8eSAndroid Build Coastguard Worker 
150*ec779b8eSAndroid Build Coastguard Worker     struct BufferRemovedListener : public BufferItemConsumer::BufferFreedListener {
151*ec779b8eSAndroid Build Coastguard Worker       public:
BufferRemovedListenerAImageReader::BufferRemovedListener152*ec779b8eSAndroid Build Coastguard Worker         explicit BufferRemovedListener(AImageReader* parent) : mReader(parent) {}
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker         void onBufferFreed(const wp<GraphicBuffer>& graphicBuffer) override;
155*ec779b8eSAndroid Build Coastguard Worker 
156*ec779b8eSAndroid Build Coastguard Worker         media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
157*ec779b8eSAndroid Build Coastguard Worker 
158*ec779b8eSAndroid Build Coastguard Worker        private:
159*ec779b8eSAndroid Build Coastguard Worker         AImageReader_BufferRemovedListener mListener = {nullptr, nullptr};
160*ec779b8eSAndroid Build Coastguard Worker         const wp<AImageReader>     mReader;
161*ec779b8eSAndroid Build Coastguard Worker         Mutex                      mLock;
162*ec779b8eSAndroid Build Coastguard Worker     };
163*ec779b8eSAndroid Build Coastguard Worker     sp<BufferRemovedListener> mBufferRemovedListener;
164*ec779b8eSAndroid Build Coastguard Worker 
165*ec779b8eSAndroid Build Coastguard Worker     uint64_t mHalUsage;
166*ec779b8eSAndroid Build Coastguard Worker 
167*ec779b8eSAndroid Build Coastguard Worker #if !COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
168*ec779b8eSAndroid Build Coastguard Worker     sp<IGraphicBufferProducer> mProducer;
169*ec779b8eSAndroid Build Coastguard Worker #endif  // !COM_ANDROID_GRAPHICS_LIBGUI_FLAGS(WB_CONSUMER_BASE_OWNS_BQ)
170*ec779b8eSAndroid Build Coastguard Worker     sp<Surface>                mSurface;
171*ec779b8eSAndroid Build Coastguard Worker     sp<BufferItemConsumer>     mBufferItemConsumer;
172*ec779b8eSAndroid Build Coastguard Worker     sp<ANativeWindow>          mWindow;
173*ec779b8eSAndroid Build Coastguard Worker     native_handle_t*           mWindowHandle = nullptr;
174*ec779b8eSAndroid Build Coastguard Worker 
175*ec779b8eSAndroid Build Coastguard Worker     List<AImage*>              mAcquiredImages;
176*ec779b8eSAndroid Build Coastguard Worker     bool                       mIsOpen = false;
177*ec779b8eSAndroid Build Coastguard Worker 
178*ec779b8eSAndroid Build Coastguard Worker     Mutex                      mLock;
179*ec779b8eSAndroid Build Coastguard Worker };
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker #endif // _NDK_IMAGE_READER_PRIV_H
182