blob: 66005cb19131fb24c3598a7462d6b8f45917ce80 [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/**
18 * @addtogroup Media Camera
19 * @{
20 */
21
22/**
23 * @file NdkImage.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_H
37#define _NDK_IMAGE_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 "NdkMediaError.h"
42
Jiwen 'Steve' Cai355d9902017-02-09 13:36:13 -080043#if __ANDROID_API__ >= 26
44#include <android/hardware_buffer.h>
45#endif /* __ANDROID_API__ >= 26 */
46
Yin-Chia Yehc3603822016-01-18 22:11:19 -080047#ifdef __cplusplus
48extern "C" {
49#endif
50
Dan Albert2975a242016-09-23 16:17:45 -070051#if __ANDROID_API__ >= 24
52
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -070053/**
54 * AImage is an opaque type that provides access to image generated by {@link AImageReader}.
55 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -080056typedef struct AImage AImage;
57
58// Formats not listed here will not be supported by AImageReader
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -070059enum AIMAGE_FORMATS {
60 /**
Jiwen 'Steve' Caide2a5442017-02-08 14:41:41 -080061 * 32 bits RGBA format, 8 bits for each of the four channels.
62 *
63 * <p>
64 * Corresponding formats:
65 * <ul>
66 * <li>AHardwareBuffer: AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM</li>
67 * <li>Vulkan: VK_FORMAT_R8G8B8A8_UNORM</li>
68 * <li>OpenGL ES: GL_RGBA8</li>
69 * </ul>
70 * </p>
71 *
72 * @see AImage
73 * @see AImageReader
74 * @see AHardwareBuffer
75 */
76 AIMAGE_FORMAT_RGBA_8888 = 0x1,
77
78 /**
79 * 32 bits RGBX format, 8 bits for each of the four channels.
80 *
81 * <p>
82 * Corresponding formats:
83 * <ul>
84 * <li>AHardwareBuffer: AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM</li>
85 * <li>Vulkan: VK_FORMAT_R8G8B8A8_UNORM</li>
86 * <li>OpenGL ES: GL_RGBA8</li>
87 * </ul>
88 * </p>
89 *
90 * @see AImage
91 * @see AImageReader
92 * @see AHardwareBuffer
93 */
94 AIMAGE_FORMAT_RGBX_8888 = 0x2,
95
96 /**
97 * 24 bits RGB format, 8 bits for each of the three channels.
98 *
99 * <p>
100 * Corresponding formats:
101 * <ul>
102 * <li>AHardwareBuffer: AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM</li>
103 * <li>Vulkan: VK_FORMAT_R8G8B8_UNORM</li>
104 * <li>OpenGL ES: GL_RGB8</li>
105 * </ul>
106 * </p>
107 *
108 * @see AImage
109 * @see AImageReader
110 * @see AHardwareBuffer
111 */
112 AIMAGE_FORMAT_RGB_888 = 0x3,
113
114 /**
115 * 16 bits RGB format, 5 bits for Red channel, 6 bits for Green channel,
116 * and 5 bits for Blue channel.
117 *
118 * <p>
119 * Corresponding formats:
120 * <ul>
121 * <li>AHardwareBuffer: AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM</li>
122 * <li>Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16</li>
123 * <li>OpenGL ES: GL_RGB565</li>
124 * </ul>
125 * </p>
126 *
127 * @see AImage
128 * @see AImageReader
129 * @see AHardwareBuffer
130 */
131 AIMAGE_FORMAT_RGB_565 = 0x4,
132
133 /**
134 * 64 bits RGBA format, 16 bits for each of the four channels.
135 *
136 * <p>
137 * Corresponding formats:
138 * <ul>
Jesse Hall9b46a4b2017-04-19 15:50:05 -0700139 * <li>AHardwareBuffer: AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT</li>
Jiwen 'Steve' Caide2a5442017-02-08 14:41:41 -0800140 * <li>Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT</li>
141 * <li>OpenGL ES: GL_RGBA16F</li>
142 * </ul>
143 * </p>
144 *
145 * @see AImage
146 * @see AImageReader
147 * @see AHardwareBuffer
148 */
149 AIMAGE_FORMAT_RGBA_FP16 = 0x16,
150
151 /**
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700152 * Multi-plane Android YUV 420 format.
153 *
154 * <p>This format is a generic YCbCr format, capable of describing any 4:2:0
155 * chroma-subsampled planar or semiplanar buffer (but not fully interleaved),
156 * with 8 bits per color sample.</p>
157 *
158 * <p>Images in this format are always represented by three separate buffers
159 * of data, one for each color plane. Additional information always
160 * accompanies the buffers, describing the row stride and the pixel stride
161 * for each plane.</p>
162 *
163 * <p>The order of planes is guaranteed such that plane #0 is always Y, plane #1 is always
164 * U (Cb), and plane #2 is always V (Cr).</p>
165 *
166 * <p>The Y-plane is guaranteed not to be interleaved with the U/V planes
167 * (in particular, pixel stride is always 1 in {@link AImage_getPlanePixelStride}).</p>
168 *
169 * <p>The U/V planes are guaranteed to have the same row stride and pixel stride, that is, the
170 * return value of {@link AImage_getPlaneRowStride} for the U/V plane are guaranteed to be the
171 * same, and the return value of {@link AImage_getPlanePixelStride} for the U/V plane are also
172 * guaranteed to be the same.</p>
173 *
174 * <p>For example, the {@link AImage} object can provide data
175 * in this format from a {@link ACameraDevice} through an {@link AImageReader} object.</p>
176 *
177 * <p>This format is always supported as an output format for the android Camera2 NDK API.</p>
178 *
179 * @see AImage
180 * @see AImageReader
181 * @see ACameraDevice
182 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800183 AIMAGE_FORMAT_YUV_420_888 = 0x23,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700184
185 /**
186 * Compressed JPEG format.
187 *
188 * <p>This format is always supported as an output format for the android Camera2 NDK API.</p>
189 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800190 AIMAGE_FORMAT_JPEG = 0x100,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700191
192 /**
193 * 16 bits per pixel raw camera sensor image format, usually representing a single-channel
194 * Bayer-mosaic image.
195 *
196 * <p>The layout of the color mosaic, the maximum and minimum encoding
197 * values of the raw pixel data, the color space of the image, and all other
198 * needed information to interpret a raw sensor image must be queried from
199 * the {@link ACameraDevice} which produced the image.</p>
200 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800201 AIMAGE_FORMAT_RAW16 = 0x20,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700202
203 /**
204 * Private raw camera sensor image format, a single channel image with implementation depedent
205 * pixel layout.
206 *
207 * <p>AIMAGE_FORMAT_RAW_PRIVATE is a format for unprocessed raw image buffers coming from an
208 * image sensor. The actual structure of buffers of this format is implementation-dependent.</p>
209 *
210 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800211 AIMAGE_FORMAT_RAW_PRIVATE = 0x24,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700212
213 /**
214 * Android 10-bit raw format.
215 *
216 * <p>
217 * This is a single-plane, 10-bit per pixel, densely packed (in each row),
218 * unprocessed format, usually representing raw Bayer-pattern images coming
219 * from an image sensor.
220 * </p>
221 * <p>
222 * In an image buffer with this format, starting from the first pixel of
223 * each row, each 4 consecutive pixels are packed into 5 bytes (40 bits).
224 * Each one of the first 4 bytes contains the top 8 bits of each pixel, The
225 * fifth byte contains the 2 least significant bits of the 4 pixels, the
226 * exact layout data for each 4 consecutive pixels is illustrated below
227 * (Pi[j] stands for the jth bit of the ith pixel):
228 * </p>
229 * <table>
230 * <tr>
231 * <th align="center"></th>
232 * <th align="center">bit 7</th>
233 * <th align="center">bit 6</th>
234 * <th align="center">bit 5</th>
235 * <th align="center">bit 4</th>
236 * <th align="center">bit 3</th>
237 * <th align="center">bit 2</th>
238 * <th align="center">bit 1</th>
239 * <th align="center">bit 0</th>
240 * </tr>
241 * <tr>
242 * <td align="center">Byte 0:</td>
243 * <td align="center">P0[9]</td>
244 * <td align="center">P0[8]</td>
245 * <td align="center">P0[7]</td>
246 * <td align="center">P0[6]</td>
247 * <td align="center">P0[5]</td>
248 * <td align="center">P0[4]</td>
249 * <td align="center">P0[3]</td>
250 * <td align="center">P0[2]</td>
251 * </tr>
252 * <tr>
253 * <td align="center">Byte 1:</td>
254 * <td align="center">P1[9]</td>
255 * <td align="center">P1[8]</td>
256 * <td align="center">P1[7]</td>
257 * <td align="center">P1[6]</td>
258 * <td align="center">P1[5]</td>
259 * <td align="center">P1[4]</td>
260 * <td align="center">P1[3]</td>
261 * <td align="center">P1[2]</td>
262 * </tr>
263 * <tr>
264 * <td align="center">Byte 2:</td>
265 * <td align="center">P2[9]</td>
266 * <td align="center">P2[8]</td>
267 * <td align="center">P2[7]</td>
268 * <td align="center">P2[6]</td>
269 * <td align="center">P2[5]</td>
270 * <td align="center">P2[4]</td>
271 * <td align="center">P2[3]</td>
272 * <td align="center">P2[2]</td>
273 * </tr>
274 * <tr>
275 * <td align="center">Byte 3:</td>
276 * <td align="center">P3[9]</td>
277 * <td align="center">P3[8]</td>
278 * <td align="center">P3[7]</td>
279 * <td align="center">P3[6]</td>
280 * <td align="center">P3[5]</td>
281 * <td align="center">P3[4]</td>
282 * <td align="center">P3[3]</td>
283 * <td align="center">P3[2]</td>
284 * </tr>
285 * <tr>
286 * <td align="center">Byte 4:</td>
287 * <td align="center">P3[1]</td>
288 * <td align="center">P3[0]</td>
289 * <td align="center">P2[1]</td>
290 * <td align="center">P2[0]</td>
291 * <td align="center">P1[1]</td>
292 * <td align="center">P1[0]</td>
293 * <td align="center">P0[1]</td>
294 * <td align="center">P0[0]</td>
295 * </tr>
296 * </table>
297 * <p>
298 * This format assumes
299 * <ul>
300 * <li>a width multiple of 4 pixels</li>
301 * <li>an even height</li>
302 * </ul>
303 * </p>
304 *
305 * <pre>size = row stride * height</pre> where the row stride is in <em>bytes</em>,
306 * not pixels.
307 *
308 * <p>
309 * Since this is a densely packed format, the pixel stride is always 0. The
310 * application must use the pixel data layout defined in above table to
311 * access each row data. When row stride is equal to (width * (10 / 8)), there
312 * will be no padding bytes at the end of each row, the entire image data is
313 * densely packed. When stride is larger than (width * (10 / 8)), padding
314 * bytes will be present at the end of each row.
315 * </p>
316 * <p>
317 * For example, the {@link AImage} object can provide data in this format from a
318 * {@link ACameraDevice} (if supported) through a {@link AImageReader} object.
319 * The number of planes returned by {@link AImage_getNumberOfPlanes} will always be 1.
320 * The pixel stride is undefined ({@link AImage_getPlanePixelStride} will return
321 * {@link AMEDIA_ERROR_UNSUPPORTED}), and the {@link AImage_getPlaneRowStride} described the
322 * vertical neighboring pixel distance (in bytes) between adjacent rows.
323 * </p>
324 *
325 * @see AImage
326 * @see AImageReader
327 * @see ACameraDevice
328 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800329 AIMAGE_FORMAT_RAW10 = 0x25,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700330
331 /**
332 * Android 12-bit raw format.
333 *
334 * <p>
335 * This is a single-plane, 12-bit per pixel, densely packed (in each row),
336 * unprocessed format, usually representing raw Bayer-pattern images coming
337 * from an image sensor.
338 * </p>
339 * <p>
340 * In an image buffer with this format, starting from the first pixel of each
341 * row, each two consecutive pixels are packed into 3 bytes (24 bits). The first
342 * and second byte contains the top 8 bits of first and second pixel. The third
343 * byte contains the 4 least significant bits of the two pixels, the exact layout
344 * data for each two consecutive pixels is illustrated below (Pi[j] stands for
345 * the jth bit of the ith pixel):
346 * </p>
347 * <table>
348 * <tr>
349 * <th align="center"></th>
350 * <th align="center">bit 7</th>
351 * <th align="center">bit 6</th>
352 * <th align="center">bit 5</th>
353 * <th align="center">bit 4</th>
354 * <th align="center">bit 3</th>
355 * <th align="center">bit 2</th>
356 * <th align="center">bit 1</th>
357 * <th align="center">bit 0</th>
358 * </tr>
359 * <tr>
360 * <td align="center">Byte 0:</td>
361 * <td align="center">P0[11]</td>
362 * <td align="center">P0[10]</td>
363 * <td align="center">P0[ 9]</td>
364 * <td align="center">P0[ 8]</td>
365 * <td align="center">P0[ 7]</td>
366 * <td align="center">P0[ 6]</td>
367 * <td align="center">P0[ 5]</td>
368 * <td align="center">P0[ 4]</td>
369 * </tr>
370 * <tr>
371 * <td align="center">Byte 1:</td>
372 * <td align="center">P1[11]</td>
373 * <td align="center">P1[10]</td>
374 * <td align="center">P1[ 9]</td>
375 * <td align="center">P1[ 8]</td>
376 * <td align="center">P1[ 7]</td>
377 * <td align="center">P1[ 6]</td>
378 * <td align="center">P1[ 5]</td>
379 * <td align="center">P1[ 4]</td>
380 * </tr>
381 * <tr>
382 * <td align="center">Byte 2:</td>
383 * <td align="center">P1[ 3]</td>
384 * <td align="center">P1[ 2]</td>
385 * <td align="center">P1[ 1]</td>
386 * <td align="center">P1[ 0]</td>
387 * <td align="center">P0[ 3]</td>
388 * <td align="center">P0[ 2]</td>
389 * <td align="center">P0[ 1]</td>
390 * <td align="center">P0[ 0]</td>
391 * </tr>
392 * </table>
393 * <p>
394 * This format assumes
395 * <ul>
396 * <li>a width multiple of 4 pixels</li>
397 * <li>an even height</li>
398 * </ul>
399 * </p>
400 *
401 * <pre>size = row stride * height</pre> where the row stride is in <em>bytes</em>,
402 * not pixels.
403 *
404 * <p>
405 * Since this is a densely packed format, the pixel stride is always 0. The
406 * application must use the pixel data layout defined in above table to
407 * access each row data. When row stride is equal to (width * (12 / 8)), there
408 * will be no padding bytes at the end of each row, the entire image data is
409 * densely packed. When stride is larger than (width * (12 / 8)), padding
410 * bytes will be present at the end of each row.
411 * </p>
412 * <p>
413 * For example, the {@link AImage} object can provide data in this format from a
414 * {@link ACameraDevice} (if supported) through a {@link AImageReader} object.
415 * The number of planes returned by {@link AImage_getNumberOfPlanes} will always be 1.
416 * The pixel stride is undefined ({@link AImage_getPlanePixelStride} will return
417 * {@link AMEDIA_ERROR_UNSUPPORTED}), and the {@link AImage_getPlaneRowStride} described the
418 * vertical neighboring pixel distance (in bytes) between adjacent rows.
419 * </p>
420 *
421 * @see AImage
422 * @see AImageReader
423 * @see ACameraDevice
424 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800425 AIMAGE_FORMAT_RAW12 = 0x26,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700426
427 /**
428 * Android dense depth image format.
429 *
430 * <p>Each pixel is 16 bits, representing a depth ranging measurement from a depth camera or
431 * similar sensor. The 16-bit sample consists of a confidence value and the actual ranging
432 * measurement.</p>
433 *
434 * <p>The confidence value is an estimate of correctness for this sample. It is encoded in the
435 * 3 most significant bits of the sample, with a value of 0 representing 100% confidence, a
436 * value of 1 representing 0% confidence, a value of 2 representing 1/7, a value of 3
437 * representing 2/7, and so on.</p>
438 *
439 * <p>As an example, the following sample extracts the range and confidence from the first pixel
440 * of a DEPTH16-format {@link AImage}, and converts the confidence to a floating-point value
441 * between 0 and 1.f inclusive, with 1.f representing maximum confidence:
442 *
443 * <pre>
444 * uint16_t* data;
445 * int dataLength;
446 * AImage_getPlaneData(image, 0, (uint8_t**)&data, &dataLength);
447 * uint16_t depthSample = data[0];
448 * uint16_t depthRange = (depthSample & 0x1FFF);
449 * uint16_t depthConfidence = ((depthSample >> 13) & 0x7);
450 * float depthPercentage = depthConfidence == 0 ? 1.f : (depthConfidence - 1) / 7.f;
451 * </pre>
452 * </p>
453 *
454 * <p>This format assumes
455 * <ul>
456 * <li>an even width</li>
457 * <li>an even height</li>
458 * <li>a horizontal stride multiple of 16 pixels</li>
459 * </ul>
460 * </p>
461 *
462 * <pre> y_size = stride * height </pre>
463 *
464 * When produced by a camera, the units for the range are millimeters.
465 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800466 AIMAGE_FORMAT_DEPTH16 = 0x44363159,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700467
468 /**
469 * Android sparse depth point cloud format.
470 *
471 * <p>A variable-length list of 3D points plus a confidence value, with each point represented
472 * by four floats; first the X, Y, Z position coordinates, and then the confidence value.</p>
473 *
474 * <p>The number of points is ((size of the buffer in bytes) / 16).
475 *
476 * <p>The coordinate system and units of the position values depend on the source of the point
477 * cloud data. The confidence value is between 0.f and 1.f, inclusive, with 0 representing 0%
478 * confidence and 1.f representing 100% confidence in the measured position values.</p>
479 *
480 * <p>As an example, the following code extracts the first depth point in a DEPTH_POINT_CLOUD
481 * format {@link AImage}:
482 * <pre>
483 * float* data;
484 * int dataLength;
485 * AImage_getPlaneData(image, 0, (uint8_t**)&data, &dataLength);
486 * float x = data[0];
487 * float y = data[1];
488 * float z = data[2];
489 * float confidence = data[3];
490 * </pre>
491 *
492 */
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700493 AIMAGE_FORMAT_DEPTH_POINT_CLOUD = 0x101,
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700494
495 /**
496 * Android private opaque image format.
497 *
498 * <p>This format is not currently supported by {@link AImageReader}.</p>
499 */
500 AIMAGE_FORMAT_PRIVATE = 0x22
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800501};
502
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700503/**
504 * Data type describing an cropped rectangle returned by {@link AImage_getCropRect}.
505 *
506 * <p>Note that the right and bottom coordinates are exclusive, so the width of the rectangle is
507 * (right - left) and the height of the rectangle is (bottom - top).</p>
508 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800509typedef struct AImageCropRect {
510 int32_t left;
511 int32_t top;
512 int32_t right;
513 int32_t bottom;
514} AImageCropRect;
515
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700516/**
517 * Return the image back the the system and delete the AImage object from memory.
518 *
519 * <p>Do NOT use the image pointer after this method returns.
520 * Note that if the parent {@link AImageReader} is closed, all the {@link AImage} objects acquired
521 * from the parent reader will be returned to system. All AImage_* methods except this method will
522 * return {@link AMEDIA_ERROR_INVALID_OBJECT}. Application still needs to call this method on those
523 * {@link AImage} objects to fully delete the {@link AImage} object from memory.</p>
524 *
525 * @param image The {@link AImage} to be deleted.
526 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800527void AImage_delete(AImage* image);
528
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700529/**
530 * Query the width of the input {@link AImage}.
531 *
532 * @param image the {@link AImage} of interest.
533 * @param width the width of the image will be filled here if the method call succeeeds.
534 *
535 * @return <ul>
536 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
537 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or width is NULL.</li>
538 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
539 * image has been deleted.</li></ul>
540 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800541media_status_t AImage_getWidth(const AImage* image, /*out*/int32_t* width);
542
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700543/**
544 * Query the height of the input {@link AImage}.
545 *
546 * @param image the {@link AImage} of interest.
547 * @param height the height of the image will be filled here if the method call succeeeds.
548 *
549 * @return <ul>
550 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
551 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or height is NULL.</li>
552 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
553 * image has been deleted.</li></ul>
554 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800555media_status_t AImage_getHeight(const AImage* image, /*out*/int32_t* height);
556
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700557/**
558 * Query the format of the input {@link AImage}.
559 *
560 * <p>The format value will be one of AIMAGE_FORMAT_* enum value.</p>
561 *
562 * @param image the {@link AImage} of interest.
563 * @param format the format of the image will be filled here if the method call succeeeds.
564 *
565 * @return <ul>
566 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
567 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or format is NULL.</li>
568 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
569 * image has been deleted.</li></ul>
570 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800571media_status_t AImage_getFormat(const AImage* image, /*out*/int32_t* format);
572
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700573/**
574 * Query the cropped rectangle of the input {@link AImage}.
575 *
576 * <p>The crop rectangle specifies the region of valid pixels in the image, using coordinates in the
577 * largest-resolution plane.</p>
578 *
579 * @param image the {@link AImage} of interest.
580 * @param rect the cropped rectangle of the image will be filled here if the method call succeeeds.
581 *
582 * @return <ul>
583 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
584 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or rect is NULL.</li>
585 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
586 * image has been deleted.</li></ul>
587 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800588media_status_t AImage_getCropRect(const AImage* image, /*out*/AImageCropRect* rect);
589
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700590/**
591 * Query the timestamp of the input {@link AImage}.
592 *
593 * <p>
594 * The timestamp is measured in nanoseconds, and is normally monotonically increasing. The
595 * timestamps for the images from different sources may have different timebases therefore may not
596 * be comparable. The specific meaning and timebase of the timestamp depend on the source providing
597 * images. For images generated by camera, the timestamp value will match
598 * {@link ACAMERA_SENSOR_TIMESTAMP} of the {@link ACameraMetadata} in
599 * {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted} and
600 * {@link ACameraCaptureSession_captureCallbacks#onCaptureCompleted} callback.
601 * </p>
602 *
603 * @param image the {@link AImage} of interest.
604 * @param timestampNs the timestamp of the image will be filled here if the method call succeeeds.
605 *
606 * @return <ul>
607 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
608 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or timestampNs is NULL.</li>
609 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
610 * image has been deleted.</li></ul>
611 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800612media_status_t AImage_getTimestamp(const AImage* image, /*out*/int64_t* timestampNs);
613
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700614/**
615 * Query the number of planes of the input {@link AImage}.
616 *
617 * <p>The number of plane of an {@link AImage} is determined by its format, which can be queried by
618 * {@link AImage_getFormat} method.</p>
619 *
620 * @param image the {@link AImage} of interest.
621 * @param numPlanes the number of planes of the image will be filled here if the method call
622 * succeeeds.
623 *
624 * @return <ul>
625 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
626 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or numPlanes is NULL.</li>
627 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
628 * image has been deleted.</li></ul>
629 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800630media_status_t AImage_getNumberOfPlanes(const AImage* image, /*out*/int32_t* numPlanes);
631
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700632/**
633 * Query the pixel stride of the input {@link AImage}.
634 *
635 * <p>This is the distance between two consecutive pixel values in a row of pixels. It may be
636 * larger than the size of a single pixel to account for interleaved image data or padded formats.
637 * Note that pixel stride is undefined for some formats such as {@link AIMAGE_FORMAT_RAW_PRIVATE},
638 * and calling this method on images of these formats will cause {@link AMEDIA_ERROR_UNSUPPORTED}
639 * being returned.
640 * For formats where pixel stride is well defined, the pixel stride is always greater than 0.</p>
641 *
642 * @param image the {@link AImage} of interest.
643 * @param planeIdx the index of the plane. Must be less than the number of planes of input image.
644 * @param pixelStride the pixel stride of the image will be filled here if the method call succeeeds.
645 *
646 * @return <ul>
647 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
648 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or pixelStride is NULL, or planeIdx
649 * is out of the range of [0, numOfPlanes - 1].</li>
650 * <li>{@link AMEDIA_ERROR_UNSUPPORTED} if pixel stride is undefined for the format of input
651 * image.</li>
652 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800653 * image has been deleted.</li>
654 * <li>{@link AMEDIA_IMGREADER_CANNOT_LOCK_IMAGE} if the {@link AImage} cannot be locked
655 * for CPU access.</li></ul>
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700656 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800657media_status_t AImage_getPlanePixelStride(
658 const AImage* image, int planeIdx, /*out*/int32_t* pixelStride);
659
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700660/**
661 * Query the row stride of the input {@link AImage}.
662 *
663 * <p>This is the distance between the start of two consecutive rows of pixels in the image. Note
664 * that row stried is undefined for some formats such as {@link AIMAGE_FORMAT_RAW_PRIVATE}, and
665 * calling this method on images of these formats will cause {@link AMEDIA_ERROR_UNSUPPORTED}
666 * being returned.
667 * For formats where row stride is well defined, the row stride is always greater than 0.</p>
668 *
669 * @param image the {@link AImage} of interest.
670 * @param planeIdx the index of the plane. Must be less than the number of planes of input image.
671 * @param rowStride the row stride of the image will be filled here if the method call succeeeds.
672 *
673 * @return <ul>
674 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
675 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or rowStride is NULL, or planeIdx
676 * is out of the range of [0, numOfPlanes - 1].</li>
677 * <li>{@link AMEDIA_ERROR_UNSUPPORTED} if row stride is undefined for the format of input
678 * image.</li>
679 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800680 * image has been deleted.</li>
681 * <li>{@link AMEDIA_IMGREADER_CANNOT_LOCK_IMAGE} if the {@link AImage} cannot be locked
682 * for CPU access.</li></ul>
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700683 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800684media_status_t AImage_getPlaneRowStride(
685 const AImage* image, int planeIdx, /*out*/int32_t* rowStride);
686
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700687/**
688 * Get the data pointer of the input image for direct application access.
689 *
690 * <p>Note that once the {@link AImage} or the parent {@link AImageReader} is deleted, the data
691 * pointer from previous AImage_getPlaneData call becomes invalid. Do NOT use it after the
692 * {@link AImage} or the parent {@link AImageReader} is deleted.</p>
693 *
694 * @param image the {@link AImage} of interest.
695 * @param planeIdx the index of the plane. Must be less than the number of planes of input image.
696 * @param data the data pointer of the image will be filled here if the method call succeeeds.
697 * @param dataLength the valid length of data will be filled here if the method call succeeeds.
698 *
699 * @return <ul>
700 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
701 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image, data or dataLength is NULL, or
702 * planeIdx is out of the range of [0, numOfPlanes - 1].</li>
703 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this
Jiwen 'Steve' Cai2f1a4732017-02-04 17:31:55 -0800704 * image has been deleted.</li>
705 * <li>{@link AMEDIA_IMGREADER_CANNOT_LOCK_IMAGE} if the {@link AImage} cannot be locked
706 * for CPU access.</li></ul>
Yin-Chia Yeh1d0955c2016-05-16 01:14:13 -0700707 */
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800708media_status_t AImage_getPlaneData(
709 const AImage* image, int planeIdx,
710 /*out*/uint8_t** data, /*out*/int* dataLength);
711
Dan Albert2975a242016-09-23 16:17:45 -0700712#endif /* __ANDROID_API__ >= 24 */
713
Jiwen 'Steve' Cai355d9902017-02-09 13:36:13 -0800714#if __ANDROID_API__ >= 26
715
716/*
717 * Return the image back the the system and delete the AImage object from memory asynchronously.
718 *
719 * <p>Similar to {@link AImage_delete}, do NOT use the image pointer after this method returns.
720 * However, the caller can still hold on to the {@link AHardwareBuffer} returned from this image and
721 * signal the release of the hardware buffer back to the {@link AImageReader}'s queue using
722 * releaseFenceFd.</p>
723 *
724 * @param image The {@link AImage} to be deleted.
725 * @param releaseFenceFd A sync fence fd defined in {@link sync.h}, which signals the release of
726 * underlying {@link AHardwareBuffer}.
727 *
728 * @see sync.h
729 */
730void AImage_deleteAsync(AImage* image, int releaseFenceFd);
731
732/**
733 * Get the hardware buffer handle of the input image intended for GPU and/or hardware access.
734 *
735 * <p>Note that no reference on the returned {@link AHardwareBuffer} handle is acquired
736 * automatically. Once the {@link AImage} or the parent {@link AImageReader} is deleted, the
737 * {@link AHardwareBuffer} handle from previous {@link AImage_getHardwareBuffer} becomes
738 * invalid.</p>
739 *
740 * <p>If the caller ever needs to hold on a reference to the {@link AHardwareBuffer} handle after
741 * the {@link AImage} or the parent {@link AImageReader} is deleted, it must call {@link
742 * AHardwareBuffer_acquire} to acquire an extra reference, and call {@link AHardwareBuffer_release}
743 * once it has finished using it in order to properly deallocate the underlying memory managed by
744 * {@link AHardwareBuffer}. If the caller has acquired extra reference on an {@link AHardwareBuffer}
745 * returned from this function, it must also listen to {@link onBufferFreed} callback to be
746 * notified when the buffer is no longer used by {@link AImageReader}.</p>
747 *
748 * @param image the {@link AImage} of interest.
749 * @param outBuffer The memory area pointed to by buffer will contain the acquired AHardwareBuffer
750 * handle.
751 * @return <ul>
752 * <li>{@link AMEDIA_OK} if the method call succeeds.</li>
753 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or buffer is NULL</li></ul>
754 *
755 * @see AImageReader_ImageCallback
756 */
757media_status_t AImage_getHardwareBuffer(const AImage* image, /*out*/AHardwareBuffer** buffer);
758
759#endif /* __ANDROID_API__ >= 26 */
760
Yin-Chia Yehc3603822016-01-18 22:11:19 -0800761#ifdef __cplusplus
762} // extern "C"
763#endif
764
765#endif //_NDK_IMAGE_H
Yin-Chia Yeh3e49be12016-04-12 16:00:33 -0700766
767/** @} */