1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker /*!\file 12*fb1b10abSAndroid Build Coastguard Worker * \brief Describes the vpx image descriptor and associated operations 13*fb1b10abSAndroid Build Coastguard Worker * 14*fb1b10abSAndroid Build Coastguard Worker */ 15*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VPX_VPX_IMAGE_H_ 16*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_VPX_IMAGE_H_ 17*fb1b10abSAndroid Build Coastguard Worker 18*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 19*fb1b10abSAndroid Build Coastguard Worker extern "C" { 20*fb1b10abSAndroid Build Coastguard Worker #endif 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker /*!\brief Current ABI version number 23*fb1b10abSAndroid Build Coastguard Worker * 24*fb1b10abSAndroid Build Coastguard Worker * \internal 25*fb1b10abSAndroid Build Coastguard Worker * If this file is altered in any way that changes the ABI, this value 26*fb1b10abSAndroid Build Coastguard Worker * must be bumped. Examples include, but are not limited to, changing 27*fb1b10abSAndroid Build Coastguard Worker * types, removing or reassigning enums, adding/removing/rearranging 28*fb1b10abSAndroid Build Coastguard Worker * fields to structures 29*fb1b10abSAndroid Build Coastguard Worker */ 30*fb1b10abSAndroid Build Coastguard Worker #define VPX_IMAGE_ABI_VERSION (5) /**<\hideinitializer*/ 31*fb1b10abSAndroid Build Coastguard Worker 32*fb1b10abSAndroid Build Coastguard Worker #define VPX_IMG_FMT_PLANAR 0x100 /**< Image is a planar format. */ 33*fb1b10abSAndroid Build Coastguard Worker #define VPX_IMG_FMT_UV_FLIP 0x200 /**< V plane precedes U in memory. */ 34*fb1b10abSAndroid Build Coastguard Worker #define VPX_IMG_FMT_HAS_ALPHA 0x400 /**< Image has an alpha channel. */ 35*fb1b10abSAndroid Build Coastguard Worker #define VPX_IMG_FMT_HIGHBITDEPTH 0x800 /**< Image uses 16bit framebuffer. */ 36*fb1b10abSAndroid Build Coastguard Worker 37*fb1b10abSAndroid Build Coastguard Worker /*!\brief List of supported image formats */ 38*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_img_fmt { 39*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_NONE, 40*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_YV12 = 41*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_UV_FLIP | 1, /**< planar YVU */ 42*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I420 = VPX_IMG_FMT_PLANAR | 2, 43*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I422 = VPX_IMG_FMT_PLANAR | 5, 44*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I444 = VPX_IMG_FMT_PLANAR | 6, 45*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I440 = VPX_IMG_FMT_PLANAR | 7, 46*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_NV12 = VPX_IMG_FMT_PLANAR | 9, 47*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I42016 = VPX_IMG_FMT_I420 | VPX_IMG_FMT_HIGHBITDEPTH, 48*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I42216 = VPX_IMG_FMT_I422 | VPX_IMG_FMT_HIGHBITDEPTH, 49*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I44416 = VPX_IMG_FMT_I444 | VPX_IMG_FMT_HIGHBITDEPTH, 50*fb1b10abSAndroid Build Coastguard Worker VPX_IMG_FMT_I44016 = VPX_IMG_FMT_I440 | VPX_IMG_FMT_HIGHBITDEPTH 51*fb1b10abSAndroid Build Coastguard Worker } vpx_img_fmt_t; /**< alias for enum vpx_img_fmt */ 52*fb1b10abSAndroid Build Coastguard Worker 53*fb1b10abSAndroid Build Coastguard Worker /*!\brief List of supported color spaces */ 54*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_color_space { 55*fb1b10abSAndroid Build Coastguard Worker VPX_CS_UNKNOWN = 0, /**< Unknown */ 56*fb1b10abSAndroid Build Coastguard Worker VPX_CS_BT_601 = 1, /**< BT.601 */ 57*fb1b10abSAndroid Build Coastguard Worker VPX_CS_BT_709 = 2, /**< BT.709 */ 58*fb1b10abSAndroid Build Coastguard Worker VPX_CS_SMPTE_170 = 3, /**< SMPTE.170 */ 59*fb1b10abSAndroid Build Coastguard Worker VPX_CS_SMPTE_240 = 4, /**< SMPTE.240 */ 60*fb1b10abSAndroid Build Coastguard Worker VPX_CS_BT_2020 = 5, /**< BT.2020 */ 61*fb1b10abSAndroid Build Coastguard Worker VPX_CS_RESERVED = 6, /**< Reserved */ 62*fb1b10abSAndroid Build Coastguard Worker VPX_CS_SRGB = 7 /**< sRGB */ 63*fb1b10abSAndroid Build Coastguard Worker } vpx_color_space_t; /**< alias for enum vpx_color_space */ 64*fb1b10abSAndroid Build Coastguard Worker 65*fb1b10abSAndroid Build Coastguard Worker /*!\brief List of supported color range */ 66*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_color_range { 67*fb1b10abSAndroid Build Coastguard Worker VPX_CR_STUDIO_RANGE = 0, /**<- Y [16..235], UV [16..240] (bit depth 8) */ 68*fb1b10abSAndroid Build Coastguard Worker /**<- Y [64..940], UV [64..960] (bit depth 10) */ 69*fb1b10abSAndroid Build Coastguard Worker /**<- Y [256..3760], UV [256..3840] (bit depth 12) */ 70*fb1b10abSAndroid Build Coastguard Worker VPX_CR_FULL_RANGE = 1 /**<- YUV/RGB [0..255] (bit depth 8) */ 71*fb1b10abSAndroid Build Coastguard Worker /**<- YUV/RGB [0..1023] (bit depth 10) */ 72*fb1b10abSAndroid Build Coastguard Worker /**<- YUV/RGB [0..4095] (bit depth 12) */ 73*fb1b10abSAndroid Build Coastguard Worker } vpx_color_range_t; /**< alias for enum vpx_color_range */ 74*fb1b10abSAndroid Build Coastguard Worker 75*fb1b10abSAndroid Build Coastguard Worker /**\brief Image Descriptor */ 76*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_image { 77*fb1b10abSAndroid Build Coastguard Worker vpx_img_fmt_t fmt; /**< Image Format */ 78*fb1b10abSAndroid Build Coastguard Worker vpx_color_space_t cs; /**< Color Space */ 79*fb1b10abSAndroid Build Coastguard Worker vpx_color_range_t range; /**< Color Range */ 80*fb1b10abSAndroid Build Coastguard Worker 81*fb1b10abSAndroid Build Coastguard Worker /* Image storage dimensions */ 82*fb1b10abSAndroid Build Coastguard Worker unsigned int w; /**< Stored image width */ 83*fb1b10abSAndroid Build Coastguard Worker unsigned int h; /**< Stored image height */ 84*fb1b10abSAndroid Build Coastguard Worker unsigned int bit_depth; /**< Stored image bit-depth */ 85*fb1b10abSAndroid Build Coastguard Worker 86*fb1b10abSAndroid Build Coastguard Worker /* Image display dimensions */ 87*fb1b10abSAndroid Build Coastguard Worker unsigned int d_w; /**< Displayed image width */ 88*fb1b10abSAndroid Build Coastguard Worker unsigned int d_h; /**< Displayed image height */ 89*fb1b10abSAndroid Build Coastguard Worker 90*fb1b10abSAndroid Build Coastguard Worker /* Image intended rendering dimensions */ 91*fb1b10abSAndroid Build Coastguard Worker unsigned int r_w; /**< Intended rendering image width */ 92*fb1b10abSAndroid Build Coastguard Worker unsigned int r_h; /**< Intended rendering image height */ 93*fb1b10abSAndroid Build Coastguard Worker 94*fb1b10abSAndroid Build Coastguard Worker /* Chroma subsampling info */ 95*fb1b10abSAndroid Build Coastguard Worker unsigned int x_chroma_shift; /**< subsampling order, X */ 96*fb1b10abSAndroid Build Coastguard Worker unsigned int y_chroma_shift; /**< subsampling order, Y */ 97*fb1b10abSAndroid Build Coastguard Worker 98*fb1b10abSAndroid Build Coastguard Worker /* Image data pointers. */ 99*fb1b10abSAndroid Build Coastguard Worker #define VPX_PLANE_PACKED 0 /**< To be used for all packed formats */ 100*fb1b10abSAndroid Build Coastguard Worker #define VPX_PLANE_Y 0 /**< Y (Luminance) plane */ 101*fb1b10abSAndroid Build Coastguard Worker #define VPX_PLANE_U 1 /**< U (Chroma) plane */ 102*fb1b10abSAndroid Build Coastguard Worker #define VPX_PLANE_V 2 /**< V (Chroma) plane */ 103*fb1b10abSAndroid Build Coastguard Worker #define VPX_PLANE_ALPHA 3 /**< A (Transparency) plane */ 104*fb1b10abSAndroid Build Coastguard Worker unsigned char *planes[4]; /**< pointer to the top left pixel for each plane */ 105*fb1b10abSAndroid Build Coastguard Worker int stride[4]; /**< stride between rows for each plane */ 106*fb1b10abSAndroid Build Coastguard Worker 107*fb1b10abSAndroid Build Coastguard Worker int bps; /**< bits per sample (for packed formats) */ 108*fb1b10abSAndroid Build Coastguard Worker 109*fb1b10abSAndroid Build Coastguard Worker /*!\brief The following member may be set by the application to associate 110*fb1b10abSAndroid Build Coastguard Worker * data with this image. 111*fb1b10abSAndroid Build Coastguard Worker */ 112*fb1b10abSAndroid Build Coastguard Worker void *user_priv; 113*fb1b10abSAndroid Build Coastguard Worker 114*fb1b10abSAndroid Build Coastguard Worker /* The following members should be treated as private. */ 115*fb1b10abSAndroid Build Coastguard Worker unsigned char *img_data; /**< private */ 116*fb1b10abSAndroid Build Coastguard Worker int img_data_owner; /**< private */ 117*fb1b10abSAndroid Build Coastguard Worker int self_allocd; /**< private */ 118*fb1b10abSAndroid Build Coastguard Worker 119*fb1b10abSAndroid Build Coastguard Worker void *fb_priv; /**< Frame buffer data associated with the image. */ 120*fb1b10abSAndroid Build Coastguard Worker } vpx_image_t; /**< alias for struct vpx_image */ 121*fb1b10abSAndroid Build Coastguard Worker 122*fb1b10abSAndroid Build Coastguard Worker /**\brief Representation of a rectangle on a surface */ 123*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_image_rect { 124*fb1b10abSAndroid Build Coastguard Worker unsigned int x; /**< leftmost column */ 125*fb1b10abSAndroid Build Coastguard Worker unsigned int y; /**< topmost row */ 126*fb1b10abSAndroid Build Coastguard Worker unsigned int w; /**< width */ 127*fb1b10abSAndroid Build Coastguard Worker unsigned int h; /**< height */ 128*fb1b10abSAndroid Build Coastguard Worker } vpx_image_rect_t; /**< alias for struct vpx_image_rect */ 129*fb1b10abSAndroid Build Coastguard Worker 130*fb1b10abSAndroid Build Coastguard Worker /*!\brief Open a descriptor, allocating storage for the underlying image 131*fb1b10abSAndroid Build Coastguard Worker * 132*fb1b10abSAndroid Build Coastguard Worker * Returns a descriptor for storing an image of the given format. The 133*fb1b10abSAndroid Build Coastguard Worker * storage for the descriptor is allocated on the heap. 134*fb1b10abSAndroid Build Coastguard Worker * 135*fb1b10abSAndroid Build Coastguard Worker * \param[in] img Pointer to storage for descriptor. If this parameter 136*fb1b10abSAndroid Build Coastguard Worker * is NULL, the storage for the descriptor will be 137*fb1b10abSAndroid Build Coastguard Worker * allocated on the heap. 138*fb1b10abSAndroid Build Coastguard Worker * \param[in] fmt Format for the image 139*fb1b10abSAndroid Build Coastguard Worker * \param[in] d_w Width of the image. Must not exceed 0x08000000 140*fb1b10abSAndroid Build Coastguard Worker * (2^27). 141*fb1b10abSAndroid Build Coastguard Worker * \param[in] d_h Height of the image. Must not exceed 0x08000000 142*fb1b10abSAndroid Build Coastguard Worker * (2^27). 143*fb1b10abSAndroid Build Coastguard Worker * \param[in] align Alignment, in bytes, of the image buffer and 144*fb1b10abSAndroid Build Coastguard Worker * each row in the image (stride). Must not exceed 145*fb1b10abSAndroid Build Coastguard Worker * 65536. 146*fb1b10abSAndroid Build Coastguard Worker * 147*fb1b10abSAndroid Build Coastguard Worker * \return Returns a pointer to the initialized image descriptor. If the img 148*fb1b10abSAndroid Build Coastguard Worker * parameter is non-null, the value of the img parameter will be 149*fb1b10abSAndroid Build Coastguard Worker * returned. 150*fb1b10abSAndroid Build Coastguard Worker */ 151*fb1b10abSAndroid Build Coastguard Worker vpx_image_t *vpx_img_alloc(vpx_image_t *img, vpx_img_fmt_t fmt, 152*fb1b10abSAndroid Build Coastguard Worker unsigned int d_w, unsigned int d_h, 153*fb1b10abSAndroid Build Coastguard Worker unsigned int align); 154*fb1b10abSAndroid Build Coastguard Worker 155*fb1b10abSAndroid Build Coastguard Worker /*!\brief Open a descriptor, using existing storage for the underlying image 156*fb1b10abSAndroid Build Coastguard Worker * 157*fb1b10abSAndroid Build Coastguard Worker * Returns a descriptor for storing an image of the given format. The 158*fb1b10abSAndroid Build Coastguard Worker * storage for descriptor has been allocated elsewhere, and a descriptor is 159*fb1b10abSAndroid Build Coastguard Worker * desired to "wrap" that storage. 160*fb1b10abSAndroid Build Coastguard Worker * 161*fb1b10abSAndroid Build Coastguard Worker * \param[in] img Pointer to storage for descriptor. If this 162*fb1b10abSAndroid Build Coastguard Worker * parameter is NULL, the storage for the descriptor 163*fb1b10abSAndroid Build Coastguard Worker * will be allocated on the heap. 164*fb1b10abSAndroid Build Coastguard Worker * \param[in] fmt Format for the image 165*fb1b10abSAndroid Build Coastguard Worker * \param[in] d_w Width of the image. Must not exceed 0x08000000 166*fb1b10abSAndroid Build Coastguard Worker * (2^27). 167*fb1b10abSAndroid Build Coastguard Worker * \param[in] d_h Height of the image. Must not exceed 0x08000000 168*fb1b10abSAndroid Build Coastguard Worker * (2^27). 169*fb1b10abSAndroid Build Coastguard Worker * \param[in] stride_align Alignment, in bytes, of each row in the image 170*fb1b10abSAndroid Build Coastguard Worker * (stride). Must not exceed 65536. 171*fb1b10abSAndroid Build Coastguard Worker * \param[in] img_data Storage to use for the image. The storage must 172*fb1b10abSAndroid Build Coastguard Worker * outlive the returned image descriptor; it can be 173*fb1b10abSAndroid Build Coastguard Worker * disposed of after calling vpx_img_free(). 174*fb1b10abSAndroid Build Coastguard Worker * 175*fb1b10abSAndroid Build Coastguard Worker * \return Returns a pointer to the initialized image descriptor. If the img 176*fb1b10abSAndroid Build Coastguard Worker * parameter is non-null, the value of the img parameter will be 177*fb1b10abSAndroid Build Coastguard Worker * returned. 178*fb1b10abSAndroid Build Coastguard Worker */ 179*fb1b10abSAndroid Build Coastguard Worker vpx_image_t *vpx_img_wrap(vpx_image_t *img, vpx_img_fmt_t fmt, unsigned int d_w, 180*fb1b10abSAndroid Build Coastguard Worker unsigned int d_h, unsigned int stride_align, 181*fb1b10abSAndroid Build Coastguard Worker unsigned char *img_data); 182*fb1b10abSAndroid Build Coastguard Worker 183*fb1b10abSAndroid Build Coastguard Worker /*!\brief Set the rectangle identifying the displayed portion of the image 184*fb1b10abSAndroid Build Coastguard Worker * 185*fb1b10abSAndroid Build Coastguard Worker * Updates the displayed rectangle (aka viewport) on the image surface to 186*fb1b10abSAndroid Build Coastguard Worker * match the specified coordinates and size. Specifically, sets img->d_w, 187*fb1b10abSAndroid Build Coastguard Worker * img->d_h, and elements of the img->planes[] array. 188*fb1b10abSAndroid Build Coastguard Worker * 189*fb1b10abSAndroid Build Coastguard Worker * \param[in] img Image descriptor 190*fb1b10abSAndroid Build Coastguard Worker * \param[in] x leftmost column 191*fb1b10abSAndroid Build Coastguard Worker * \param[in] y topmost row 192*fb1b10abSAndroid Build Coastguard Worker * \param[in] w width 193*fb1b10abSAndroid Build Coastguard Worker * \param[in] h height 194*fb1b10abSAndroid Build Coastguard Worker * 195*fb1b10abSAndroid Build Coastguard Worker * \return 0 if the requested rectangle is valid, nonzero (-1) otherwise. 196*fb1b10abSAndroid Build Coastguard Worker */ 197*fb1b10abSAndroid Build Coastguard Worker int vpx_img_set_rect(vpx_image_t *img, unsigned int x, unsigned int y, 198*fb1b10abSAndroid Build Coastguard Worker unsigned int w, unsigned int h); 199*fb1b10abSAndroid Build Coastguard Worker 200*fb1b10abSAndroid Build Coastguard Worker /*!\brief Flip the image vertically (top for bottom) 201*fb1b10abSAndroid Build Coastguard Worker * 202*fb1b10abSAndroid Build Coastguard Worker * Adjusts the image descriptor's pointers and strides to make the image 203*fb1b10abSAndroid Build Coastguard Worker * be referenced upside-down. 204*fb1b10abSAndroid Build Coastguard Worker * 205*fb1b10abSAndroid Build Coastguard Worker * \param[in] img Image descriptor 206*fb1b10abSAndroid Build Coastguard Worker */ 207*fb1b10abSAndroid Build Coastguard Worker void vpx_img_flip(vpx_image_t *img); 208*fb1b10abSAndroid Build Coastguard Worker 209*fb1b10abSAndroid Build Coastguard Worker /*!\brief Close an image descriptor 210*fb1b10abSAndroid Build Coastguard Worker * 211*fb1b10abSAndroid Build Coastguard Worker * Frees all allocated storage associated with an image descriptor. 212*fb1b10abSAndroid Build Coastguard Worker * 213*fb1b10abSAndroid Build Coastguard Worker * \param[in] img Image descriptor 214*fb1b10abSAndroid Build Coastguard Worker */ 215*fb1b10abSAndroid Build Coastguard Worker void vpx_img_free(vpx_image_t *img); 216*fb1b10abSAndroid Build Coastguard Worker 217*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus 218*fb1b10abSAndroid Build Coastguard Worker } // extern "C" 219*fb1b10abSAndroid Build Coastguard Worker #endif 220*fb1b10abSAndroid Build Coastguard Worker 221*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VPX_VPX_IMAGE_H_ 222