Home | History | Annotate | Download | only in ndk
      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