1 /* 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 /** 18 * @addtogroup Media Camera 19 * @{ 20 */ 21 22 /** 23 * @file NdkImage.h 24 */ 25 26 /* 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 39 #include "NdkMediaError.h" 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 /** 46 * AImage is an opaque type that provides access to image generated by {@link AImageReader}. 47 */ 48 typedef struct AImage AImage; 49 50 // Formats not listed here will not be supported by AImageReader 51 enum AIMAGE_FORMATS { 52 /** 53 * Multi-plane Android YUV 420 format. 54 * 55 * <p>This format is a generic YCbCr format, capable of describing any 4:2:0 56 * chroma-subsampled planar or semiplanar buffer (but not fully interleaved), 57 * with 8 bits per color sample.</p> 58 * 59 * <p>Images in this format are always represented by three separate buffers 60 * of data, one for each color plane. Additional information always 61 * accompanies the buffers, describing the row stride and the pixel stride 62 * for each plane.</p> 63 * 64 * <p>The order of planes is guaranteed such that plane #0 is always Y, plane #1 is always 65 * U (Cb), and plane #2 is always V (Cr).</p> 66 * 67 * <p>The Y-plane is guaranteed not to be interleaved with the U/V planes 68 * (in particular, pixel stride is always 1 in {@link AImage_getPlanePixelStride}).</p> 69 * 70 * <p>The U/V planes are guaranteed to have the same row stride and pixel stride, that is, the 71 * return value of {@link AImage_getPlaneRowStride} for the U/V plane are guaranteed to be the 72 * same, and the return value of {@link AImage_getPlanePixelStride} for the U/V plane are also 73 * guaranteed to be the same.</p> 74 * 75 * <p>For example, the {@link AImage} object can provide data 76 * in this format from a {@link ACameraDevice} through an {@link AImageReader} object.</p> 77 * 78 * <p>This format is always supported as an output format for the android Camera2 NDK API.</p> 79 * 80 * @see AImage 81 * @see AImageReader 82 * @see ACameraDevice 83 */ 84 AIMAGE_FORMAT_YUV_420_888 = 0x23, 85 86 /** 87 * Compressed JPEG format. 88 * 89 * <p>This format is always supported as an output format for the android Camera2 NDK API.</p> 90 */ 91 AIMAGE_FORMAT_JPEG = 0x100, 92 93 /** 94 * 16 bits per pixel raw camera sensor image format, usually representing a single-channel 95 * Bayer-mosaic image. 96 * 97 * <p>The layout of the color mosaic, the maximum and minimum encoding 98 * values of the raw pixel data, the color space of the image, and all other 99 * needed information to interpret a raw sensor image must be queried from 100 * the {@link ACameraDevice} which produced the image.</p> 101 */ 102 AIMAGE_FORMAT_RAW16 = 0x20, 103 104 /** 105 * Private raw camera sensor image format, a single channel image with implementation depedent 106 * pixel layout. 107 * 108 * <p>AIMAGE_FORMAT_RAW_PRIVATE is a format for unprocessed raw image buffers coming from an 109 * image sensor. The actual structure of buffers of this format is implementation-dependent.</p> 110 * 111 */ 112 AIMAGE_FORMAT_RAW_PRIVATE = 0x24, 113 114 /** 115 * Android 10-bit raw format. 116 * 117 * <p> 118 * This is a single-plane, 10-bit per pixel, densely packed (in each row), 119 * unprocessed format, usually representing raw Bayer-pattern images coming 120 * from an image sensor. 121 * </p> 122 * <p> 123 * In an image buffer with this format, starting from the first pixel of 124 * each row, each 4 consecutive pixels are packed into 5 bytes (40 bits). 125 * Each one of the first 4 bytes contains the top 8 bits of each pixel, The 126 * fifth byte contains the 2 least significant bits of the 4 pixels, the 127 * exact layout data for each 4 consecutive pixels is illustrated below 128 * (Pi[j] stands for the jth bit of the ith pixel): 129 * </p> 130 * <table> 131 * <tr> 132 * <th align="center"></th> 133 * <th align="center">bit 7</th> 134 * <th align="center">bit 6</th> 135 * <th align="center">bit 5</th> 136 * <th align="center">bit 4</th> 137 * <th align="center">bit 3</th> 138 * <th align="center">bit 2</th> 139 * <th align="center">bit 1</th> 140 * <th align="center">bit 0</th> 141 * </tr> 142 * <tr> 143 * <td align="center">Byte 0:</td> 144 * <td align="center">P0[9]</td> 145 * <td align="center">P0[8]</td> 146 * <td align="center">P0[7]</td> 147 * <td align="center">P0[6]</td> 148 * <td align="center">P0[5]</td> 149 * <td align="center">P0[4]</td> 150 * <td align="center">P0[3]</td> 151 * <td align="center">P0[2]</td> 152 * </tr> 153 * <tr> 154 * <td align="center">Byte 1:</td> 155 * <td align="center">P1[9]</td> 156 * <td align="center">P1[8]</td> 157 * <td align="center">P1[7]</td> 158 * <td align="center">P1[6]</td> 159 * <td align="center">P1[5]</td> 160 * <td align="center">P1[4]</td> 161 * <td align="center">P1[3]</td> 162 * <td align="center">P1[2]</td> 163 * </tr> 164 * <tr> 165 * <td align="center">Byte 2:</td> 166 * <td align="center">P2[9]</td> 167 * <td align="center">P2[8]</td> 168 * <td align="center">P2[7]</td> 169 * <td align="center">P2[6]</td> 170 * <td align="center">P2[5]</td> 171 * <td align="center">P2[4]</td> 172 * <td align="center">P2[3]</td> 173 * <td align="center">P2[2]</td> 174 * </tr> 175 * <tr> 176 * <td align="center">Byte 3:</td> 177 * <td align="center">P3[9]</td> 178 * <td align="center">P3[8]</td> 179 * <td align="center">P3[7]</td> 180 * <td align="center">P3[6]</td> 181 * <td align="center">P3[5]</td> 182 * <td align="center">P3[4]</td> 183 * <td align="center">P3[3]</td> 184 * <td align="center">P3[2]</td> 185 * </tr> 186 * <tr> 187 * <td align="center">Byte 4:</td> 188 * <td align="center">P3[1]</td> 189 * <td align="center">P3[0]</td> 190 * <td align="center">P2[1]</td> 191 * <td align="center">P2[0]</td> 192 * <td align="center">P1[1]</td> 193 * <td align="center">P1[0]</td> 194 * <td align="center">P0[1]</td> 195 * <td align="center">P0[0]</td> 196 * </tr> 197 * </table> 198 * <p> 199 * This format assumes 200 * <ul> 201 * <li>a width multiple of 4 pixels</li> 202 * <li>an even height</li> 203 * </ul> 204 * </p> 205 * 206 * <pre>size = row stride * height</pre> where the row stride is in <em>bytes</em>, 207 * not pixels. 208 * 209 * <p> 210 * Since this is a densely packed format, the pixel stride is always 0. The 211 * application must use the pixel data layout defined in above table to 212 * access each row data. When row stride is equal to (width * (10 / 8)), there 213 * will be no padding bytes at the end of each row, the entire image data is 214 * densely packed. When stride is larger than (width * (10 / 8)), padding 215 * bytes will be present at the end of each row. 216 * </p> 217 * <p> 218 * For example, the {@link AImage} object can provide data in this format from a 219 * {@link ACameraDevice} (if supported) through a {@link AImageReader} object. 220 * The number of planes returned by {@link AImage_getNumberOfPlanes} will always be 1. 221 * The pixel stride is undefined ({@link AImage_getPlanePixelStride} will return 222 * {@link AMEDIA_ERROR_UNSUPPORTED}), and the {@link AImage_getPlaneRowStride} described the 223 * vertical neighboring pixel distance (in bytes) between adjacent rows. 224 * </p> 225 * 226 * @see AImage 227 * @see AImageReader 228 * @see ACameraDevice 229 */ 230 AIMAGE_FORMAT_RAW10 = 0x25, 231 232 /** 233 * Android 12-bit raw format. 234 * 235 * <p> 236 * This is a single-plane, 12-bit per pixel, densely packed (in each row), 237 * unprocessed format, usually representing raw Bayer-pattern images coming 238 * from an image sensor. 239 * </p> 240 * <p> 241 * In an image buffer with this format, starting from the first pixel of each 242 * row, each two consecutive pixels are packed into 3 bytes (24 bits). The first 243 * and second byte contains the top 8 bits of first and second pixel. The third 244 * byte contains the 4 least significant bits of the two pixels, the exact layout 245 * data for each two consecutive pixels is illustrated below (Pi[j] stands for 246 * the jth bit of the ith pixel): 247 * </p> 248 * <table> 249 * <tr> 250 * <th align="center"></th> 251 * <th align="center">bit 7</th> 252 * <th align="center">bit 6</th> 253 * <th align="center">bit 5</th> 254 * <th align="center">bit 4</th> 255 * <th align="center">bit 3</th> 256 * <th align="center">bit 2</th> 257 * <th align="center">bit 1</th> 258 * <th align="center">bit 0</th> 259 * </tr> 260 * <tr> 261 * <td align="center">Byte 0:</td> 262 * <td align="center">P0[11]</td> 263 * <td align="center">P0[10]</td> 264 * <td align="center">P0[ 9]</td> 265 * <td align="center">P0[ 8]</td> 266 * <td align="center">P0[ 7]</td> 267 * <td align="center">P0[ 6]</td> 268 * <td align="center">P0[ 5]</td> 269 * <td align="center">P0[ 4]</td> 270 * </tr> 271 * <tr> 272 * <td align="center">Byte 1:</td> 273 * <td align="center">P1[11]</td> 274 * <td align="center">P1[10]</td> 275 * <td align="center">P1[ 9]</td> 276 * <td align="center">P1[ 8]</td> 277 * <td align="center">P1[ 7]</td> 278 * <td align="center">P1[ 6]</td> 279 * <td align="center">P1[ 5]</td> 280 * <td align="center">P1[ 4]</td> 281 * </tr> 282 * <tr> 283 * <td align="center">Byte 2:</td> 284 * <td align="center">P1[ 3]</td> 285 * <td align="center">P1[ 2]</td> 286 * <td align="center">P1[ 1]</td> 287 * <td align="center">P1[ 0]</td> 288 * <td align="center">P0[ 3]</td> 289 * <td align="center">P0[ 2]</td> 290 * <td align="center">P0[ 1]</td> 291 * <td align="center">P0[ 0]</td> 292 * </tr> 293 * </table> 294 * <p> 295 * This format assumes 296 * <ul> 297 * <li>a width multiple of 4 pixels</li> 298 * <li>an even height</li> 299 * </ul> 300 * </p> 301 * 302 * <pre>size = row stride * height</pre> where the row stride is in <em>bytes</em>, 303 * not pixels. 304 * 305 * <p> 306 * Since this is a densely packed format, the pixel stride is always 0. The 307 * application must use the pixel data layout defined in above table to 308 * access each row data. When row stride is equal to (width * (12 / 8)), there 309 * will be no padding bytes at the end of each row, the entire image data is 310 * densely packed. When stride is larger than (width * (12 / 8)), padding 311 * bytes will be present at the end of each row. 312 * </p> 313 * <p> 314 * For example, the {@link AImage} object can provide data in this format from a 315 * {@link ACameraDevice} (if supported) through a {@link AImageReader} object. 316 * The number of planes returned by {@link AImage_getNumberOfPlanes} will always be 1. 317 * The pixel stride is undefined ({@link AImage_getPlanePixelStride} will return 318 * {@link AMEDIA_ERROR_UNSUPPORTED}), and the {@link AImage_getPlaneRowStride} described the 319 * vertical neighboring pixel distance (in bytes) between adjacent rows. 320 * </p> 321 * 322 * @see AImage 323 * @see AImageReader 324 * @see ACameraDevice 325 */ 326 AIMAGE_FORMAT_RAW12 = 0x26, 327 328 /** 329 * Android dense depth image format. 330 * 331 * <p>Each pixel is 16 bits, representing a depth ranging measurement from a depth camera or 332 * similar sensor. The 16-bit sample consists of a confidence value and the actual ranging 333 * measurement.</p> 334 * 335 * <p>The confidence value is an estimate of correctness for this sample. It is encoded in the 336 * 3 most significant bits of the sample, with a value of 0 representing 100% confidence, a 337 * value of 1 representing 0% confidence, a value of 2 representing 1/7, a value of 3 338 * representing 2/7, and so on.</p> 339 * 340 * <p>As an example, the following sample extracts the range and confidence from the first pixel 341 * of a DEPTH16-format {@link AImage}, and converts the confidence to a floating-point value 342 * between 0 and 1.f inclusive, with 1.f representing maximum confidence: 343 * 344 * <pre> 345 * uint16_t* data; 346 * int dataLength; 347 * AImage_getPlaneData(image, 0, (uint8_t**)&data, &dataLength); 348 * uint16_t depthSample = data[0]; 349 * uint16_t depthRange = (depthSample & 0x1FFF); 350 * uint16_t depthConfidence = ((depthSample >> 13) & 0x7); 351 * float depthPercentage = depthConfidence == 0 ? 1.f : (depthConfidence - 1) / 7.f; 352 * </pre> 353 * </p> 354 * 355 * <p>This format assumes 356 * <ul> 357 * <li>an even width</li> 358 * <li>an even height</li> 359 * <li>a horizontal stride multiple of 16 pixels</li> 360 * </ul> 361 * </p> 362 * 363 * <pre> y_size = stride * height </pre> 364 * 365 * When produced by a camera, the units for the range are millimeters. 366 */ 367 AIMAGE_FORMAT_DEPTH16 = 0x44363159, 368 369 /** 370 * Android sparse depth point cloud format. 371 * 372 * <p>A variable-length list of 3D points plus a confidence value, with each point represented 373 * by four floats; first the X, Y, Z position coordinates, and then the confidence value.</p> 374 * 375 * <p>The number of points is ((size of the buffer in bytes) / 16). 376 * 377 * <p>The coordinate system and units of the position values depend on the source of the point 378 * cloud data. The confidence value is between 0.f and 1.f, inclusive, with 0 representing 0% 379 * confidence and 1.f representing 100% confidence in the measured position values.</p> 380 * 381 * <p>As an example, the following code extracts the first depth point in a DEPTH_POINT_CLOUD 382 * format {@link AImage}: 383 * <pre> 384 * float* data; 385 * int dataLength; 386 * AImage_getPlaneData(image, 0, (uint8_t**)&data, &dataLength); 387 * float x = data[0]; 388 * float y = data[1]; 389 * float z = data[2]; 390 * float confidence = data[3]; 391 * </pre> 392 * 393 */ 394 AIMAGE_FORMAT_DEPTH_POINT_CLOUD = 0x101, 395 396 /** 397 * Android private opaque image format. 398 * 399 * <p>This format is not currently supported by {@link AImageReader}.</p> 400 */ 401 AIMAGE_FORMAT_PRIVATE = 0x22 402 }; 403 404 /** 405 * Data type describing an cropped rectangle returned by {@link AImage_getCropRect}. 406 * 407 * <p>Note that the right and bottom coordinates are exclusive, so the width of the rectangle is 408 * (right - left) and the height of the rectangle is (bottom - top).</p> 409 */ 410 typedef struct AImageCropRect { 411 int32_t left; 412 int32_t top; 413 int32_t right; 414 int32_t bottom; 415 } AImageCropRect; 416 417 /** 418 * Return the image back the the system and delete the AImage object from memory. 419 * 420 * <p>Do NOT use the image pointer after this method returns. 421 * Note that if the parent {@link AImageReader} is closed, all the {@link AImage} objects acquired 422 * from the parent reader will be returned to system. All AImage_* methods except this method will 423 * return {@link AMEDIA_ERROR_INVALID_OBJECT}. Application still needs to call this method on those 424 * {@link AImage} objects to fully delete the {@link AImage} object from memory.</p> 425 * 426 * @param image The {@link AImage} to be deleted. 427 */ 428 void AImage_delete(AImage* image); 429 430 /** 431 * Query the width of the input {@link AImage}. 432 * 433 * @param image the {@link AImage} of interest. 434 * @param width the width of the image will be filled here if the method call succeeeds. 435 * 436 * @return <ul> 437 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 438 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or width is NULL.</li> 439 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 440 * image has been deleted.</li></ul> 441 */ 442 media_status_t AImage_getWidth(const AImage* image, /*out*/int32_t* width); 443 444 /** 445 * Query the height of the input {@link AImage}. 446 * 447 * @param image the {@link AImage} of interest. 448 * @param height the height of the image will be filled here if the method call succeeeds. 449 * 450 * @return <ul> 451 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 452 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or height is NULL.</li> 453 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 454 * image has been deleted.</li></ul> 455 */ 456 media_status_t AImage_getHeight(const AImage* image, /*out*/int32_t* height); 457 458 /** 459 * Query the format of the input {@link AImage}. 460 * 461 * <p>The format value will be one of AIMAGE_FORMAT_* enum value.</p> 462 * 463 * @param image the {@link AImage} of interest. 464 * @param format the format of the image will be filled here if the method call succeeeds. 465 * 466 * @return <ul> 467 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 468 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or format is NULL.</li> 469 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 470 * image has been deleted.</li></ul> 471 */ 472 media_status_t AImage_getFormat(const AImage* image, /*out*/int32_t* format); 473 474 /** 475 * Query the cropped rectangle of the input {@link AImage}. 476 * 477 * <p>The crop rectangle specifies the region of valid pixels in the image, using coordinates in the 478 * largest-resolution plane.</p> 479 * 480 * @param image the {@link AImage} of interest. 481 * @param rect the cropped rectangle of the image will be filled here if the method call succeeeds. 482 * 483 * @return <ul> 484 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 485 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or rect is NULL.</li> 486 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 487 * image has been deleted.</li></ul> 488 */ 489 media_status_t AImage_getCropRect(const AImage* image, /*out*/AImageCropRect* rect); 490 491 /** 492 * Query the timestamp of the input {@link AImage}. 493 * 494 * <p> 495 * The timestamp is measured in nanoseconds, and is normally monotonically increasing. The 496 * timestamps for the images from different sources may have different timebases therefore may not 497 * be comparable. The specific meaning and timebase of the timestamp depend on the source providing 498 * images. For images generated by camera, the timestamp value will match 499 * {@link ACAMERA_SENSOR_TIMESTAMP} of the {@link ACameraMetadata} in 500 * {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted} and 501 * {@link ACameraCaptureSession_captureCallbacks#onCaptureCompleted} callback. 502 * </p> 503 * 504 * @param image the {@link AImage} of interest. 505 * @param timestampNs the timestamp of the image will be filled here if the method call succeeeds. 506 * 507 * @return <ul> 508 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 509 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or timestampNs is NULL.</li> 510 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 511 * image has been deleted.</li></ul> 512 */ 513 media_status_t AImage_getTimestamp(const AImage* image, /*out*/int64_t* timestampNs); 514 515 /** 516 * Query the number of planes of the input {@link AImage}. 517 * 518 * <p>The number of plane of an {@link AImage} is determined by its format, which can be queried by 519 * {@link AImage_getFormat} method.</p> 520 * 521 * @param image the {@link AImage} of interest. 522 * @param numPlanes the number of planes of the image will be filled here if the method call 523 * succeeeds. 524 * 525 * @return <ul> 526 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 527 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or numPlanes is NULL.</li> 528 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 529 * image has been deleted.</li></ul> 530 */ 531 media_status_t AImage_getNumberOfPlanes(const AImage* image, /*out*/int32_t* numPlanes); 532 533 /** 534 * Query the pixel stride of the input {@link AImage}. 535 * 536 * <p>This is the distance between two consecutive pixel values in a row of pixels. It may be 537 * larger than the size of a single pixel to account for interleaved image data or padded formats. 538 * Note that pixel stride is undefined for some formats such as {@link AIMAGE_FORMAT_RAW_PRIVATE}, 539 * and calling this method on images of these formats will cause {@link AMEDIA_ERROR_UNSUPPORTED} 540 * being returned. 541 * For formats where pixel stride is well defined, the pixel stride is always greater than 0.</p> 542 * 543 * @param image the {@link AImage} of interest. 544 * @param planeIdx the index of the plane. Must be less than the number of planes of input image. 545 * @param pixelStride the pixel stride of the image will be filled here if the method call succeeeds. 546 * 547 * @return <ul> 548 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 549 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or pixelStride is NULL, or planeIdx 550 * is out of the range of [0, numOfPlanes - 1].</li> 551 * <li>{@link AMEDIA_ERROR_UNSUPPORTED} if pixel stride is undefined for the format of input 552 * image.</li> 553 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 554 * image has been deleted.</li></ul> 555 */ 556 media_status_t AImage_getPlanePixelStride( 557 const AImage* image, int planeIdx, /*out*/int32_t* pixelStride); 558 559 /** 560 * Query the row stride of the input {@link AImage}. 561 * 562 * <p>This is the distance between the start of two consecutive rows of pixels in the image. Note 563 * that row stried is undefined for some formats such as {@link AIMAGE_FORMAT_RAW_PRIVATE}, and 564 * calling this method on images of these formats will cause {@link AMEDIA_ERROR_UNSUPPORTED} 565 * being returned. 566 * For formats where row stride is well defined, the row stride is always greater than 0.</p> 567 * 568 * @param image the {@link AImage} of interest. 569 * @param planeIdx the index of the plane. Must be less than the number of planes of input image. 570 * @param rowStride the row stride of the image will be filled here if the method call succeeeds. 571 * 572 * @return <ul> 573 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 574 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image or rowStride is NULL, or planeIdx 575 * is out of the range of [0, numOfPlanes - 1].</li> 576 * <li>{@link AMEDIA_ERROR_UNSUPPORTED} if row stride is undefined for the format of input 577 * image.</li> 578 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 579 * image has been deleted.</li></ul> 580 */ 581 media_status_t AImage_getPlaneRowStride( 582 const AImage* image, int planeIdx, /*out*/int32_t* rowStride); 583 584 /** 585 * Get the data pointer of the input image for direct application access. 586 * 587 * <p>Note that once the {@link AImage} or the parent {@link AImageReader} is deleted, the data 588 * pointer from previous AImage_getPlaneData call becomes invalid. Do NOT use it after the 589 * {@link AImage} or the parent {@link AImageReader} is deleted.</p> 590 * 591 * @param image the {@link AImage} of interest. 592 * @param planeIdx the index of the plane. Must be less than the number of planes of input image. 593 * @param data the data pointer of the image will be filled here if the method call succeeeds. 594 * @param dataLength the valid length of data will be filled here if the method call succeeeds. 595 * 596 * @return <ul> 597 * <li>{@link AMEDIA_OK} if the method call succeeds.</li> 598 * <li>{@link AMEDIA_ERROR_INVALID_PARAMETER} if image, data or dataLength is NULL, or 599 * planeIdx is out of the range of [0, numOfPlanes - 1].</li> 600 * <li>{@link AMEDIA_ERROR_INVALID_OBJECT} if the {@link AImageReader} generated this 601 * image has been deleted.</li></ul> 602 */ 603 media_status_t AImage_getPlaneData( 604 const AImage* image, int planeIdx, 605 /*out*/uint8_t** data, /*out*/int* dataLength); 606 607 #ifdef __cplusplus 608 } // extern "C" 609 #endif 610 611 #endif //_NDK_IMAGE_H 612 613 /** @} */ 614