blob: 7a0c17ba655630d5e95e1801a2809a18bdcd277a [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
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -070017/**
Quddus Chong25f5ece2017-06-06 11:14:04 -070018 * @addtogroup Media
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -070019 * @{
20 */
21
22/**
23 * @file NdkImageReader.h
24 */
25
Yin-Chia Yehc3603822016-01-18 22:11:19 -080026/*
27 * This file defines an NDK API.
28 * Do not remove methods.
29 * Do not change method signatures.
30 * Do not change the value of constants.
31 * Do not change the size of any of the classes defined in here.
32 * Do not reference types that are not part of the NDK.
33 * Do not #include files that aren't part of the NDK.
34 */
35
36#ifndef _NDK_IMAGE_READER_H
37#define _NDK_IMAGE_READER_H
38
Dan Albert2975a242016-09-23 16:17:45 -070039#include <sys/cdefs.h>
40
Yin-Chia Yehc3603822016-01-18 22:11:19 -080041#include <android/native_window.h>
42#include "NdkMediaError.h"
43#include "NdkImage.h"
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
Dan Albert2975a242016-09-23 16:17:45 -070049#if __ANDROID_API__ >= 24
50
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -070051/**
52 * AImage is an opaque type that allows direct application access to image data rendered into a
53 * {@link ANativeWindow}.
54 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -080055typedef struct AImageReader AImageReader;
56
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -070057/**
58 * Create a new reader for images of the desired size and format.
59 *
60 * <p>
61 * The maxImages parameter determines the maximum number of {@link AImage} objects that can be
62 * acquired from the {@link AImageReader} simultaneously. Requesting more buffers will use up
63 * more memory, so it is important to use only the minimum number necessary for the use case.
64 * </p>
65 * <p>
66 * The valid sizes and formats depend on the source of the image data.
67 * </p>
68 *
69 * @param width The default width in pixels of the Images that this reader will produce.
70 * @param height The default height in pixels of the Images that this reader will produce.
71 * @param format The format of the Image that this reader will produce. This must be one of the
72 * AIMAGE_FORMAT_* enum value defined in {@link AIMAGE_FORMATS}. Note that not all
Jiwen 'Steve' Cai55ec2562017-04-12 15:56:41 -070073 * formats are supported. One example is {@link AIMAGE_FORMAT_PRIVATE}, as it is not
74 * intended to be read by applications directly. That format is supported by
75 * {@link AImageReader_newWithUsage} introduced in API 26.
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -070076 * @param maxImages The maximum number of images the user will want to access simultaneously. This
77 * should be as small as possible to limit memory use. Once maxImages Images are obtained
78 * by the user, one of them has to be released before a new {@link AImage} will become
79 * available for access through {@link AImageReader_acquireLatestImage} or
80 * {@link AImageReader_acquireNextImage}. Must be greater than 0.
81 * @param reader The created image reader will be filled here if the method call succeeeds.
82 *
83 * @return <ul>
84 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
85 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader is NULL, or one or more of width,
86 * height, format, maxImages arguments is not supported.</li>
87 * <li>{@link AMEDIA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
88 *
89 * @see AImage
90 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -080091media_status_t AImageReader_new(
92 int32_t width, int32_t height, int32_t format, int32_t maxImages,
93 /*out*/AImageReader** reader);
94
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -070095/**
96 * Delete an {@link AImageReader} and return all images generated by this reader to system.
97 *
98 * <p>This method will return all {@link AImage} objects acquired by this reader (via
99 * {@link AImageReader_acquireNextImage} or {@link AImageReader_acquireLatestImage}) to system,
100 * making any of data pointers obtained from {@link AImage_getPlaneData} invalid. Do NOT access
101 * the reader object or any of those data pointers after this method returns.</p>
102 *
103 * @param reader The image reader to be deleted.
104 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800105void AImageReader_delete(AImageReader* reader);
106
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700107/**
108 * Get a {@link ANativeWindow} that can be used to produce {@link AImage} for this image reader.
109 *
110 * @param reader The image reader of interest.
111 * @param window The output {@link ANativeWindow} will be filled here if the method call succeeds.
112 * The {@link ANativeWindow} is managed by this image reader. Do NOT call
113 * {@link ANativeWindow_release} on it. Instead, use {@link AImageReader_delete}.
114 *
115 * @return <ul>
116 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
117 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or window is NULL.</li></ul>
118 */
119media_status_t AImageReader_getWindow(AImageReader* reader, /*out*/ANativeWindow** window);
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800120
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700121/**
122 * Query the default width of the {@link AImage} generated by this reader, in pixels.
123 *
124 * <p>The width may be overridden by the producer sending buffers to this reader's
125 * {@link ANativeWindow}. If so, the actual width of the images can be found using
126 * {@link AImage_getWidth}.</p>
127 *
128 * @param reader The image reader of interest.
129 * @param width the default width of the reader will be filled here if the method call succeeeds.
130 *
131 * @return <ul>
132 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
133 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or width is NULL.</li></ul>
134 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800135media_status_t AImageReader_getWidth(const AImageReader* reader, /*out*/int32_t* width);
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700136
137/**
138 * Query the default height of the {@link AImage} generated by this reader, in pixels.
139 *
140 * <p>The height may be overridden by the producer sending buffers to this reader's
141 * {@link ANativeWindow}. If so, the actual height of the images can be found using
142 * {@link AImage_getHeight}.</p>
143 *
144 * @param reader The image reader of interest.
145 * @param height the default height of the reader will be filled here if the method call succeeeds.
146 *
147 * @return <ul>
148 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
149 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or height is NULL.</li></ul>
150 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800151media_status_t AImageReader_getHeight(const AImageReader* reader, /*out*/int32_t* height);
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700152
153/**
154 * Query the format of the {@link AImage} generated by this reader.
155 *
156 * @param reader The image reader of interest.
157 * @param format the fromat of the reader will be filled here if the method call succeeeds. The
158 * value will be one of the AIMAGE_FORMAT_* enum value defiend in {@link NdkImage.h}.
159 *
160 * @return <ul>
161 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
162 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or format is NULL.</li></ul>
163 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800164media_status_t AImageReader_getFormat(const AImageReader* reader, /*out*/int32_t* format);
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700165
166/**
167 * Query the maximum number of concurrently acquired {@link AImage}s of this reader.
168 *
169 * @param reader The image reader of interest.
170 * @param maxImages the maximum number of concurrently acquired images of the reader will be filled
171 * here if the method call succeeeds.
172 *
173 * @return <ul>
174 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
175 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or maxImages is NULL.</li></ul>
176 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800177media_status_t AImageReader_getMaxImages(const AImageReader* reader, /*out*/int32_t* maxImages);
178
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700179/**
180 * Acquire the next {@link AImage} from the image reader's queue.
181 *
182 * <p>Warning: Consider using {@link AImageReader_acquireLatestImage} instead, as it will
183 * automatically release older images, and allow slower-running processing routines to catch
184 * up to the newest frame. Usage of {@link AImageReader_acquireNextImage} is recommended for
185 * batch/background processing. Incorrectly using this method can cause images to appear
186 * with an ever-increasing delay, followed by a complete stall where no new images seem to appear.
187 * </p>
188 *
189 * <p>
190 * This method will fail if {@link AImageReader_getMaxImages maxImages} have been acquired with
191 * {@link AImageReader_acquireNextImage} or {@link AImageReader_acquireLatestImage}. In particular
192 * a sequence of {@link AImageReader_acquireNextImage} or {@link AImageReader_acquireLatestImage}
193 * calls greater than {@link AImageReader_getMaxImages maxImages} without calling
194 * {@link AImage_delete} in-between will exhaust the underlying queue. At such a time,
195 * {@link AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED} will be returned until more images are released with
196 * {@link AImage_delete}.
197 * </p>
198 *
199 * @param reader The image reader of interest.
200 * @param image the acquired {@link AImage} will be filled here if the method call succeeeds.
201 *
202 * @return <ul>
203 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
204 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or image is NULL.</li>
205 * <li>{@link AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED} if the number of concurrently acquired
206 * images has reached the limit.</li>
207 * <li>{@link AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE} if there is no buffers currently
208 * available in the reader queue.</li>
209 * <li>{@link AMEDIA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
210 *
211 * @see AImageReader_acquireLatestImage
212 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800213media_status_t AImageReader_acquireNextImage(AImageReader* reader, /*out*/AImage** image);
214
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700215/**
216
217 * Acquire the latest {@link AImage} from the image reader's queue, dropping older images.
218 *
219 * <p>
220 * This operation will acquire all the images possible from the image reader, but
221 * {@link AImage_delete} all images that aren't the latest. This function is recommended to use over
222 * {@link AImageReader_acquireNextImage} for most use-cases, as it's more suited for real-time
223 * processing.
224 * </p>
225 * <p>
226 * Note that {@link AImageReader_getMaxImages maxImages} should be at least 2 for
227 * {@link AImageReader_acquireLatestImage} to be any different than
228 * {@link AImageReader_acquireNextImage} - discarding all-but-the-newest {@link AImage} requires
229 * temporarily acquiring two {@link AImage}s at once. Or more generally, calling
230 * {@link AImageReader_acquireLatestImage} with less than two images of margin, that is
231 * (maxImages - currentAcquiredImages < 2) will not discard as expected.
232 * </p>
233 * <p>
234 * This method will fail if {@link AImageReader_getMaxImages maxImages} have been acquired with
235 * {@link AImageReader_acquireNextImage} or {@link AImageReader_acquireLatestImage}. In particular
236 * a sequence of {@link AImageReader_acquireNextImage} or {@link AImageReader_acquireLatestImage}
237 * calls greater than {@link AImageReader_getMaxImages maxImages} without calling
238 * {@link AImage_delete} in-between will exhaust the underlying queue. At such a time,
239 * {@link AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED} will be returned until more images are released with
240 * {@link AImage_delete}.
241 * </p>
242 *
243 * @param reader The image reader of interest.
244 * @param image the acquired {@link AImage} will be filled here if the method call succeeeds.
245 *
246 * @return <ul>
247 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
248 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader or image is NULL.</li>
249 * <li>{@link AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED} if the number of concurrently acquired
250 * images has reached the limit.</li>
251 * <li>{@link AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE} if there is no buffers currently
252 * available in the reader queue.</li>
253 * <li>{@link AMEDIA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
254 *
255 * @see AImageReader_acquireNextImage
256 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800257media_status_t AImageReader_acquireLatestImage(AImageReader* reader, /*out*/AImage** image);
258
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700259
260/**
261 * The definition of {@link AImageReader} new image available callback.
262 *
263 * @param context The optional application context provided by user in
264 * {@link AImageReader_setImageListener}.
265 * @param session The camera capture session whose state is changing.
266 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800267typedef void (*AImageReader_ImageCallback)(void* context, AImageReader* reader);
268
269typedef struct AImageReader_ImageListener {
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700270 /// optional application context.
271 void* context;
272
273 /**
274 * This callback is called when there is a new image available for in the image reader's queue.
275 *
276 * <p>The callback happens on one dedicated thread per {@link AImageReader} instance. It is okay
277 * to use AImageReader_* and AImage_* methods within the callback. Note that it is possible that
278 * calling {@link AImageReader_acquireNextImage} or {@link AImageReader_acquireLatestImage}
279 * returns {@link AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE} within this callback. For example, when
280 * there are multiple images and callbacks queued, if application called
281 * {@link AImageReader_acquireLatestImage}, some images will be returned to system before their
282 * corresponding callback is executed.</p>
283 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800284 AImageReader_ImageCallback onImageAvailable;
285} AImageReader_ImageListener;
286
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700287/**
288 * Set the onImageAvailable listener of this image reader.
289 *
290 * <p>Note that calling this method will replace previously registered listeners.</p>
291 *
292 * @param reader The image reader of interest.
293 * @param listener the {@link AImageReader_ImageListener} to be registered. Set this to NULL if
294 * application no longer needs to listen to new images.
295 *
296 * @return <ul>
297 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
298 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader is NULL.</li></ul>
299 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800300media_status_t AImageReader_setImageListener(
301 AImageReader* reader, AImageReader_ImageListener* listener);
302
Dan Albert2975a242016-09-23 16:17:45 -0700303#endif /* __ANDROID_API__ >= 24 */
304
Jiwen 'Steve' Cai355d9902017-02-09 13:36:13 -0800305#if __ANDROID_API__ >= 26
306
307/**
308 * AImageReader constructor similar to {@link AImageReader_new} that takes an additional parameter
309 * for the consumer usage. All other parameters and the return values are identical to those passed
310 * to {@line AImageReader_new}.
311 *
Jiwen 'Steve' Cai55ec2562017-04-12 15:56:41 -0700312 * <p>If the {@code format} is {@link AIMAGE_FORMAT_PRIVATE}, the created {@link AImageReader}
313 * will produce images whose contents are not directly accessible by the application. The application can
314 * still acquire images from this {@link AImageReader} and access {@link AHardwareBuffer} via
315 * {@link AImage_getHardwareBuffer()}. The {@link AHardwareBuffer} gained this way can then
316 * be passed back to hardware (such as GPU or hardware encoder if supported) for future processing.
317 * For example, you can obtain an {@link EGLClientBuffer} from the {@link AHardwareBuffer} by using
318 * {@link eglGetNativeClientBufferANDROID} extension and pass that {@link EGLClientBuffer} to {@link
319 * eglCreateImageKHR} to create an {@link EGLImage} resource type, which may then be bound to a
320 * texture via {@link glEGLImageTargetTexture2DOES} on supported devices. This can be useful for
321 * transporting textures that may be shared cross-process.</p>
322 * <p>In general, when software access to image data is not necessary, an {@link AImageReader}
323 * created with {@link AIMAGE_FORMAT_PRIVATE} format is more efficient, compared with {@link
324 * AImageReader}s using other format such as {@link AIMAGE_FORMAT_YUV_420_888}.</p>
325 *
326 * <p>Note that not all format and usage flag combination is supported by the {@link AImageReader},
327 * especially if {@code format} is {@link AIMAGE_FORMAT_PRIVATE}, {@code usage} must not include either
328 * {@link AHARDWAREBUFFER_USAGE_READ_RARELY} or {@link AHARDWAREBUFFER_USAGE_READ_OFTEN}</p>
329 *
330 * @param width The default width in pixels of the Images that this reader will produce.
331 * @param height The default height in pixels of the Images that this reader will produce.
332 * @param format The format of the Image that this reader will produce. This must be one of the
333 * AIMAGE_FORMAT_* enum value defined in {@link AIMAGE_FORMATS}.
Jiwen 'Steve' Caie31bc872017-04-21 17:13:18 -0700334 * @param usage specifies how the consumer will access the AImage, using combination of the
335 * AHARDWAREBUFFER_USAGE flags described in {@link hardware_buffer.h}.
336 * Passing {@link AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN} is equivalent to calling
337 * {@link AImageReader_new} with the same parameters.
338 *
339 * Note that not all format and usage flag combination is supported by the {@link AImageReader}.
340 * Below are the combinations supported by the {@link AImageReader}.
341 * <table>
342 * <tr>
343 * <th>Format</th>
344 * <th>Compatible usage flags</th>
345 * </tr>
346 * <tr>
347 * <td>non-{@link AIMAGE_FORMAT_PRIVATE PRIVATE} formats defined in {@link AImage.h}
348 * </td>
349 * <td>{@link AHARDWAREBUFFER_USAGE_CPU_READ_RARELY} or
350 * {@link AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN}</td>
351 * </tr>
352 * <tr>
353 * <td>{@link AIMAGE_FORMAT_RGBA_8888}</td>
354 * <td>{@link AHARDWAREBUFFER_USAGE_VIDEO_ENCODE} or
355 * {@link AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE}, or combined</td>
356 * </tr>
357 * </table>
Jiwen 'Steve' Cai55ec2562017-04-12 15:56:41 -0700358 * @return <ul>
359 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
360 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader is NULL, or one or more of width,
361 * height, format, maxImages, or usage arguments is not supported.</li>
362 * <li>{@link AMEDIA_ERROR_UNKNOWN} if the method fails for some other reasons.</li></ul>
Jiwen 'Steve' Cai355d9902017-02-09 13:36:13 -0800363 *
364 * @see AImage
365 * @see AImageReader_new
366 * @see AHardwareBuffer
367 */
368media_status_t AImageReader_newWithUsage(
Jiwen 'Steve' Caie31bc872017-04-21 17:13:18 -0700369 int32_t width, int32_t height, int32_t format, uint64_t usage, int32_t maxImages,
370 /*out*/ AImageReader** reader);
Jiwen 'Steve' Cai355d9902017-02-09 13:36:13 -0800371
372/*
373 * Acquire the next {@link AImage} from the image reader's queue asynchronously.
374 *
375 * <p>AImageReader acquire method similar to {@link AImageReader_acquireNextImage} that takes an
376 * additional parameter for the sync fence. All other parameters and the return values are
377 * identical to those passed to {@link AImageReader_acquireNextImage}.</p>
378 *
379 * @param acquireFenceFd A sync fence fd defined in {@link sync.h}, which is used to signal when the
380 * buffer is ready to consume. When synchronization fence is not needed, fence will be set
381 * to -1 and the {@link AImage} returned is ready for use immediately. Otherwise, user shall
382 * use syscalls such as {@code poll()}, {@code epoll()}, {@code select()} to wait for the
383 * fence fd to change status before attempting to access the {@link AImage} returned.
384 *
385 * @see sync.h
386 * @see sync_get_fence_info
387 */
388media_status_t AImageReader_acquireNextImageAsync(
389 AImageReader* reader, /*out*/AImage** image, /*out*/int* acquireFenceFd);
390
391/*
392 * Acquire the latest {@link AImage} from the image reader's queue asynchronously, dropping older
393 * images.
394 *
395 * <p>AImageReader acquire method similar to {@link AImageReader_acquireLatestImage} that takes an
396 * additional parameter for the sync fence. All other parameters and the return values are
397 * identical to those passed to {@link AImageReader_acquireLatestImage}.</p>
398 *
399 * @param acquireFenceFd A sync fence fd defined in {@link sync.h}, which is used to signal when the
400 * buffer is ready to consume. When synchronization fence is not needed, fence will be set
401 * to -1 and the {@link AImage} returned is ready for use immediately. Otherwise, user shall
402 * use syscalls such as {@code poll()}, {@code epoll()}, {@code select()} to wait for the
403 * fence fd to change status before attempting to access the {@link AImage} returned.
404 *
405 * @see sync.h
406 * @see sync_get_fence_info
407 */
408media_status_t AImageReader_acquireLatestImageAsync(
409 AImageReader* reader, /*out*/AImage** image, /*out*/int* acquireFenceFd);
410/**
411 * The definition of {@link AImageReader} buffer removed callback.
412 *
413 * @param context The optional application context provided by user in
414 * {@link AImageReader_setBufferRemovedListener}.
415 * @param reader The {@link AImageReader} of interest.
416 * @param buffer The {@link AHardwareBuffer} that is being removed from this image reader.
417 */
418typedef void (*AImageReader_BufferRemovedCallback)(void* context,
419 AImageReader* reader,
420 AHardwareBuffer* buffer);
421
422typedef struct AImageReader_BufferRemovedListener {
423 /// optional application context.
424 void* context;
425
426 /**
427 * This callback is called when an old {@link AHardwareBuffer} is about to be removed from the
428 * image reader.
429 *
430 * <p>Note that registering this callback is optional unless the user holds on extra reference
431 * to {@link AHardwareBuffer} returned from {@link AImage_getHardwareBuffer} by calling {@link
432 * AHardwareBuffer_acquire} or creating external graphic objects, such as EglImage, from it.</p>
433 *
434 * <p>If the callback is registered, the {@link AImageReader} will hold on the last of its
435 * references to the {@link AHardwareBuffer} until this callback returns. User can use the
436 * callback to get notified that it becomes the last owner of the buffer. It is up to the user
437 * to decide to either 1) immediately release all of its references to the buffer; or 2) keep
438 * using the buffer and release it in future. Note that, if option 2 if used, user of this API
439 * is responsible to deallocate the buffer properly by calling {@link AHardwareBuffer_release}.
440 * </p>
441 *
442 * @see AHardwareBuffer_release
443 * @see AImage_getHardwareBuffer
444 */
445 AImageReader_BufferRemovedCallback onBufferRemoved;
446} AImageReader_BufferRemovedListener;
447
448/**
449 * Set the onBufferRemoved listener of this image reader.
450 *
451 * <p>Note that calling this method will replace previously registered listeners.</p>
452 *
453 * @param reader The image reader of interest.
454 * @param listener the {@link AImageReader_BufferRemovedListener} to be registered. Set this to
455 * NULL if application no longer needs to listen to buffer removed events.
456 *
457 * @return <ul>
458 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
459 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if reader is NULL.</li></ul>
460 *
461 * @see AImage_getHardwareBuffer
462 */
463media_status_t AImageReader_setBufferRemovedListener(
464 AImageReader* reader, AImageReader_BufferRemovedListener* listener);
465
466#endif /* __ANDROID_API__ >= 26 */
467
468
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800469#ifdef __cplusplus
470} // extern "C"
471#endif
472
473#endif //_NDK_IMAGE_READER_H
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700474
475/** @} */