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