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