1c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh/* 2c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * Copyright (C) 2016 The Android Open Source Project 3c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * 4c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 5c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * you may not use this file except in compliance with the License. 6c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * You may obtain a copy of the License at 7c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * 8c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * http://www.apache.org/licenses/LICENSE-2.0 9c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * 10c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * Unless required by applicable law or agreed to in writing, software 11c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS, 12c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * See the License for the specific language governing permissions and 14c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh * limitations under the License. 15c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh */ 16c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 17c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#ifndef _NDK_IMAGE_READER_PRIV_H 18c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#define _NDK_IMAGE_READER_PRIV_H 19c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 20c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <inttypes.h> 21c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 227e8d4ba5887affda749978d787b898bf31fda729Colin Cross#include <media/NdkImageReader.h> 23c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 24c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <utils/List.h> 25c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <utils/Mutex.h> 26c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <utils/StrongPointer.h> 27c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 282f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai#include <gui/BufferItem.h> 292f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai#include <gui/BufferItemConsumer.h> 30c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <gui/Surface.h> 31c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 32c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <media/stagefright/foundation/ALooper.h> 33c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <media/stagefright/foundation/AHandler.h> 34c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#include <media/stagefright/foundation/AMessage.h> 35c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 36c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehusing namespace android; 37c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 38c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehnamespace { 39c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh enum { 40c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh IMAGE_READER_MAX_NUM_PLANES = 3, 41c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh }; 42c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 43c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh enum { 44c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh ACQUIRE_SUCCESS = 0, 45c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh ACQUIRE_NO_BUFFERS = 1, 46c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh ACQUIRE_MAX_IMAGES = 2, 47c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh }; 48c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh} 49c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 50c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yehstruct AImageReader : public RefBase { 51c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh public: 5255ec25693db12f8f342378aac1f6a55ec4dd4957Jiwen 'Steve' Cai static bool isSupportedFormatAndUsage(int32_t format, uint64_t usage0); 53c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh static int getNumPlanesForFormat(int32_t format); 54c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 552f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai AImageReader(int32_t width, 562f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai int32_t height, 572f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai int32_t format, 58e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai uint64_t usage, 592f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai int32_t maxImages); 60c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh ~AImageReader(); 61c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 62c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh // Inintialize AImageReader, uninitialized or failed to initialize AImageReader 63c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh // should never be passed to application 64c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh media_status_t init(); 65c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 66c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh media_status_t setImageListener(AImageReader_ImageListener* listener); 67e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener); 68c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 69e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai media_status_t acquireNextImage(/*out*/AImage** image, /*out*/int* fenceFd); 70e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai media_status_t acquireLatestImage(/*out*/AImage** image, /*out*/int* fenceFd); 71c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 72c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh ANativeWindow* getWindow() const { return mWindow.get(); }; 73c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh int32_t getWidth() const { return mWidth; }; 74c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh int32_t getHeight() const { return mHeight; }; 75c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh int32_t getFormat() const { return mFormat; }; 76c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh int32_t getMaxImages() const { return mMaxImages; }; 77c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 78c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh private: 79c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 80c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh friend struct AImage; // for grabing reader lock 81c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 822f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai BufferItem* getBufferItemLocked(); 832f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai void returnBufferItemLocked(BufferItem* buffer); 842f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai 852f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai // Called by AImageReader_acquireXXX to acquire a Buffer and setup AImage. 86e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai media_status_t acquireImageLocked(/*out*/AImage** image, /*out*/int* fenceFd); 87c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 88b29fce7b7e2220e6d0feb3597a35216c89c9f412Yin-Chia Yeh // Called by AImage/~AImageReader to close image. Caller is responsible to grab AImage::mLock 89e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai void releaseImageLocked(AImage* image, int releaseFenceFd); 90c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 912f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai static int getBufferWidth(BufferItem* buffer); 922f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai static int getBufferHeight(BufferItem* buffer); 93c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 94c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh media_status_t setImageListenerLocked(AImageReader_ImageListener* listener); 95e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai media_status_t setBufferRemovedListenerLocked(AImageReader_BufferRemovedListener* listener); 96c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 97c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh // definition of handler and message 98c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh enum { 99e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai kWhatBufferRemoved, 100e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai kWhatImageAvailable, 101c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh }; 102c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh static const char* kCallbackFpKey; 103c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh static const char* kContextKey; 104e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai static const char* kGraphicBufferKey; 105c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh class CallbackHandler : public AHandler { 106c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh public: 107c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh CallbackHandler(AImageReader* reader) : mReader(reader) {} 108c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh void onMessageReceived(const sp<AMessage> &msg) override; 109c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh private: 110c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh AImageReader* mReader; 111c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh }; 112c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh sp<CallbackHandler> mHandler; 113c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on 1142f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai List<BufferItem*> mBuffers; 115c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 116c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const int32_t mWidth; 117c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const int32_t mHeight; 118c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const int32_t mFormat; 119e31bc87213619054f18fcc8462641767e82a7eafJiwen 'Steve' Cai const uint64_t mUsage; // AHARDWAREBUFFER_USAGE_* flags. 120c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const int32_t mMaxImages; 1212f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai 1222f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai // TODO(jwcai) Seems completely unused in AImageReader class. 123c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh const int32_t mNumPlanes; 124c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 125c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh struct FrameListener : public ConsumerBase::FrameAvailableListener { 126c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh public: 127724e04107548bfdb67f4be5772c0f08a0bd65f3eChih-Hung Hsieh explicit FrameListener(AImageReader* parent) : mReader(parent) {} 128c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 129c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh void onFrameAvailable(const BufferItem& item) override; 130c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 131c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh media_status_t setImageListener(AImageReader_ImageListener* listener); 132c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 133c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh private: 134c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh AImageReader_ImageListener mListener = {nullptr, nullptr}; 135c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh wp<AImageReader> mReader; 136c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh Mutex mLock; 137c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh }; 138c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh sp<FrameListener> mFrameListener; 139c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 140e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai struct BufferRemovedListener : public BufferItemConsumer::BufferFreedListener { 141e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai public: 142e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai explicit BufferRemovedListener(AImageReader* parent) : mReader(parent) {} 143e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai 144e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai void onBufferFreed(const wp<GraphicBuffer>& graphicBuffer) override; 145e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai 146e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener); 147e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai 148e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai private: 149e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai AImageReader_BufferRemovedListener mListener = {nullptr, nullptr}; 150e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai wp<AImageReader> mReader; 151e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai Mutex mLock; 152e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai }; 153e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai sp<BufferRemovedListener> mBufferRemovedListener; 154e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai 155c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh int mHalFormat; 156c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh android_dataspace mHalDataSpace; 157e168996c51cbbc78790c2b3282c9455a5c7b667cJiwen 'Steve' Cai uint64_t mHalUsage; 158c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 159c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh sp<IGraphicBufferProducer> mProducer; 160c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh sp<Surface> mSurface; 1612f1a4737c997d9589447a51974e3aaecafee2937Jiwen 'Steve' Cai sp<BufferItemConsumer> mBufferItemConsumer; 162c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh sp<ANativeWindow> mWindow; 163c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 164c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh List<AImage*> mAcquiredImages; 165c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 166c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh Mutex mLock; 167c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh}; 168c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh 169c360382bf257d815b2a411152485d3c3b37a9f46Yin-Chia Yeh#endif // _NDK_IMAGE_READER_PRIV_H 170