blob: 1c50d83e3d288b7848c6bfbd0d4a4fb965b19b15 [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
Colin Cross7e8d4ba2017-05-04 16:17:42 -070022#include <media/NdkImageReader.h>
Sungtak Leed66d8242024-11-15 22:25:35 +000023#include <media-vndk/VndkImageReader.h>
Yin-Chia Yehc3603822016-01-18 22:11:19 -080024
25#include <utils/List.h>
26#include <utils/Mutex.h>
27#include <utils/StrongPointer.h>
28
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080029#include <gui/BufferItem.h>
30#include <gui/BufferItemConsumer.h>
Yin-Chia Yehc3603822016-01-18 22:11:19 -080031#include <gui/Surface.h>
32
33#include <media/stagefright/foundation/ALooper.h>
34#include <media/stagefright/foundation/AHandler.h>
35#include <media/stagefright/foundation/AMessage.h>
36
37using namespace android;
38
39namespace {
40 enum {
41 IMAGE_READER_MAX_NUM_PLANES = 3,
42 };
43
44 enum {
45 ACQUIRE_SUCCESS = 0,
46 ACQUIRE_NO_BUFFERS = 1,
47 ACQUIRE_MAX_IMAGES = 2,
48 };
49}
50
51struct AImageReader : public RefBase {
52 public:
Jiwen 'Steve' Cai55ec2562017-04-12 15:56:41 -070053 static bool isSupportedFormatAndUsage(int32_t format, uint64_t usage0);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080054 static int getNumPlanesForFormat(int32_t format);
55
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080056 AImageReader(int32_t width,
57 int32_t height,
58 int32_t format,
Jiwen 'Steve' Caie31bc872017-04-21 17:13:18 -070059 uint64_t usage,
Sally Qida6ca842022-01-10 16:10:28 -080060 int32_t maxImages,
61 uint32_t hardwareBufferFormat,
62 android_dataspace dataSpace);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080063 ~AImageReader();
64
Sally Qida6ca842022-01-10 16:10:28 -080065 // Initialize AImageReader, uninitialized or failed to initialize AImageReader
Yin-Chia Yehc3603822016-01-18 22:11:19 -080066 // should never be passed to application
67 media_status_t init();
68
69 media_status_t setImageListener(AImageReader_ImageListener* listener);
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080070 media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
Sungtak Leed66d8242024-11-15 22:25:35 +000071 media_status_t setUsage(uint64_t usage);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080072
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080073 media_status_t acquireNextImage(/*out*/AImage** image, /*out*/int* fenceFd);
74 media_status_t acquireLatestImage(/*out*/AImage** image, /*out*/int* fenceFd);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080075
Jayant Chowdhary249e1f22018-09-24 15:07:45 -070076 media_status_t getWindowNativeHandle(/*out*/native_handle_t **handle);
77
Yin-Chia Yehc3603822016-01-18 22:11:19 -080078 ANativeWindow* getWindow() const { return mWindow.get(); };
79 int32_t getWidth() const { return mWidth; };
80 int32_t getHeight() const { return mHeight; };
81 int32_t getFormat() const { return mFormat; };
82 int32_t getMaxImages() const { return mMaxImages; };
Jayant Chowdhary9ddd6e82019-07-16 11:04:06 -070083 void close();
Yin-Chia Yehc3603822016-01-18 22:11:19 -080084
Yin-Chia Yehc3603822016-01-18 22:11:19 -080085 private:
Yin-Chia Yehc3603822016-01-18 22:11:19 -080086 friend struct AImage; // for grabing reader lock
87
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080088 BufferItem* getBufferItemLocked();
89 void returnBufferItemLocked(BufferItem* buffer);
90
91 // Called by AImageReader_acquireXXX to acquire a Buffer and setup AImage.
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -080092 media_status_t acquireImageLocked(/*out*/AImage** image, /*out*/int* fenceFd);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080093
Yin-Chia Yehb29fce72017-11-06 17:16:22 -080094 // Called by AImage/~AImageReader to close image. Caller is responsible to grab AImage::mLock
Yin-Chia Yeh55baca22019-01-07 13:54:13 -080095 void releaseImageLocked(AImage* image, int releaseFenceFd, bool clearCache = true);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080096
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -080097 static int getBufferWidth(BufferItem* buffer);
98 static int getBufferHeight(BufferItem* buffer);
Yin-Chia Yehc3603822016-01-18 22:11:19 -080099
100 media_status_t setImageListenerLocked(AImageReader_ImageListener* listener);
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800101 media_status_t setBufferRemovedListenerLocked(AImageReader_BufferRemovedListener* listener);
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800102
103 // definition of handler and message
104 enum {
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800105 kWhatBufferRemoved,
106 kWhatImageAvailable,
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800107 };
108 static const char* kCallbackFpKey;
109 static const char* kContextKey;
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800110 static const char* kGraphicBufferKey;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800111 class CallbackHandler : public AHandler {
112 public:
113 CallbackHandler(AImageReader* reader) : mReader(reader) {}
114 void onMessageReceived(const sp<AMessage> &msg) override;
115 private:
116 AImageReader* mReader;
117 };
118 sp<CallbackHandler> mHandler;
119 sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800120 List<BufferItem*> mBuffers;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800121
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800122 const int32_t mWidth;
123 const int32_t mHeight;
Sally Qida6ca842022-01-10 16:10:28 -0800124 int32_t mFormat;
Sungtak Leed66d8242024-11-15 22:25:35 +0000125 uint64_t mUsage; // AHARDWAREBUFFER_USAGE_* flags.
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800126 const int32_t mMaxImages;
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800127
128 // TODO(jwcai) Seems completely unused in AImageReader class.
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800129 const int32_t mNumPlanes;
130
Sally Qida6ca842022-01-10 16:10:28 -0800131 uint32_t mHalFormat = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
132 android_dataspace mHalDataSpace = HAL_DATASPACE_UNKNOWN;
133
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800134 struct FrameListener : public ConsumerBase::FrameAvailableListener {
135 public:
Chih-Hung Hsieh724e0412016-08-29 14:22:17 -0700136 explicit FrameListener(AImageReader* parent) : mReader(parent) {}
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800137
138 void onFrameAvailable(const BufferItem& item) override;
139
140 media_status_t setImageListener(AImageReader_ImageListener* listener);
141
142 private:
143 AImageReader_ImageListener mListener = {nullptr, nullptr};
Jayant Chowdharyc65f56f2019-07-01 13:18:17 -0700144 const wp<AImageReader> mReader;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800145 Mutex mLock;
146 };
147 sp<FrameListener> mFrameListener;
148
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800149 struct BufferRemovedListener : public BufferItemConsumer::BufferFreedListener {
150 public:
151 explicit BufferRemovedListener(AImageReader* parent) : mReader(parent) {}
152
153 void onBufferFreed(const wp<GraphicBuffer>& graphicBuffer) override;
154
155 media_status_t setBufferRemovedListener(AImageReader_BufferRemovedListener* listener);
156
157 private:
158 AImageReader_BufferRemovedListener mListener = {nullptr, nullptr};
Jayant Chowdharyc65f56f2019-07-01 13:18:17 -0700159 const wp<AImageReader> mReader;
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800160 Mutex mLock;
161 };
162 sp<BufferRemovedListener> mBufferRemovedListener;
163
Jiwen 'Steve' Caie1689962017-02-20 16:59:05 -0800164 uint64_t mHalUsage;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800165
166 sp<IGraphicBufferProducer> mProducer;
167 sp<Surface> mSurface;
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800168 sp<BufferItemConsumer> mBufferItemConsumer;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800169 sp<ANativeWindow> mWindow;
Jayant Chowdhary249e1f22018-09-24 15:07:45 -0700170 native_handle_t* mWindowHandle = nullptr;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800171
172 List<AImage*> mAcquiredImages;
Jayant Chowdhary3a4af232020-12-15 11:01:03 -0800173 bool mIsOpen = false;
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800174
175 Mutex mLock;
176};
177
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800178#endif // _NDK_IMAGE_READER_PRIV_H