vpx_image.h 8.49 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9 10 11
 */


James Zern's avatar
James Zern committed
12
/*!\file
John Koleszar's avatar
John Koleszar committed
13 14 15
 * \brief Describes the vpx image descriptor and associated operations
 *
 */
James Zern's avatar
James Zern committed
16 17 18
#ifndef VPX_VPX_IMAGE_H_
#define VPX_VPX_IMAGE_H_

John Koleszar's avatar
John Koleszar committed
19 20 21 22
#ifdef __cplusplus
extern "C" {
#endif

John Koleszar's avatar
John Koleszar committed
23 24 25 26 27 28 29 30
  /*!\brief Current ABI version number
   *
   * \internal
   * If this file is altered in any way that changes the ABI, this value
   * must be bumped.  Examples include, but are not limited to, changing
   * types, removing or reassigning enums, adding/removing/rearranging
   * fields to structures
   */
31
#define VPX_IMAGE_ABI_VERSION (2) /**<\hideinitializer*/
John Koleszar's avatar
John Koleszar committed
32 33


34 35 36 37
#define VPX_IMG_FMT_PLANAR     0x100  /**< Image is a planar format. */
#define VPX_IMG_FMT_UV_FLIP    0x200  /**< V plane precedes U in memory. */
#define VPX_IMG_FMT_HAS_ALPHA  0x400  /**< Image has an alpha channel. */
#define VPX_IMG_FMT_HIGHBITDEPTH 0x800  /**< Image uses 16bit framebuffer. */
John Koleszar's avatar
John Koleszar committed
38

John Koleszar's avatar
John Koleszar committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
  /*!\brief List of supported image formats */
  typedef enum vpx_img_fmt {
    VPX_IMG_FMT_NONE,
    VPX_IMG_FMT_RGB24,   /**< 24 bit per pixel packed RGB */
    VPX_IMG_FMT_RGB32,   /**< 32 bit per pixel packed 0RGB */
    VPX_IMG_FMT_RGB565,  /**< 16 bit per pixel, 565 */
    VPX_IMG_FMT_RGB555,  /**< 16 bit per pixel, 555 */
    VPX_IMG_FMT_UYVY,    /**< UYVY packed YUV */
    VPX_IMG_FMT_YUY2,    /**< YUYV packed YUV */
    VPX_IMG_FMT_YVYU,    /**< YVYU packed YUV */
    VPX_IMG_FMT_BGR24,   /**< 24 bit per pixel packed BGR */
    VPX_IMG_FMT_RGB32_LE, /**< 32 bit packed BGR0 */
    VPX_IMG_FMT_ARGB,     /**< 32 bit packed ARGB, alpha=255 */
    VPX_IMG_FMT_ARGB_LE,  /**< 32 bit packed BGRA, alpha=255 */
    VPX_IMG_FMT_RGB565_LE,  /**< 16 bit per pixel, gggbbbbb rrrrrggg */
    VPX_IMG_FMT_RGB555_LE,  /**< 16 bit per pixel, gggbbbbb 0rrrrrgg */
    VPX_IMG_FMT_YV12    = VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_UV_FLIP | 1, /**< planar YVU */
    VPX_IMG_FMT_I420    = VPX_IMG_FMT_PLANAR | 2,
    VPX_IMG_FMT_VPXYV12 = VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_UV_FLIP | 3, /** < planar 4:2:0 format with vpx color space */
58 59 60
    VPX_IMG_FMT_VPXI420 = VPX_IMG_FMT_PLANAR | 4,
    VPX_IMG_FMT_I422    = VPX_IMG_FMT_PLANAR | 5,
    VPX_IMG_FMT_I444    = VPX_IMG_FMT_PLANAR | 6,
Deb Mukherjee's avatar
Deb Mukherjee committed
61 62
    VPX_IMG_FMT_I440    = VPX_IMG_FMT_PLANAR | 7,
    VPX_IMG_FMT_444A    = VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_HAS_ALPHA | 6,
63 64
    VPX_IMG_FMT_I42016    = VPX_IMG_FMT_I420 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I42216    = VPX_IMG_FMT_I422 | VPX_IMG_FMT_HIGHBITDEPTH,
Deb Mukherjee's avatar
Deb Mukherjee committed
65 66
    VPX_IMG_FMT_I44416    = VPX_IMG_FMT_I444 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I44016    = VPX_IMG_FMT_I440 | VPX_IMG_FMT_HIGHBITDEPTH
67
  } vpx_img_fmt_t; /**< alias for enum vpx_img_fmt */
John Koleszar's avatar
John Koleszar committed
68

John Koleszar's avatar
John Koleszar committed
69 70 71
  /**\brief Image Descriptor */
  typedef struct vpx_image {
    vpx_img_fmt_t fmt; /**< Image Format */
John Koleszar's avatar
John Koleszar committed
72

John Koleszar's avatar
John Koleszar committed
73
    /* Image storage dimensions */
74 75 76
    unsigned int  w;           /**< Stored image width */
    unsigned int  h;           /**< Stored image height */
    unsigned int  bit_depth;   /**< Stored image bit-depth */
John Koleszar's avatar
John Koleszar committed
77

John Koleszar's avatar
John Koleszar committed
78 79 80
    /* Image display dimensions */
    unsigned int  d_w;   /**< Displayed image width */
    unsigned int  d_h;   /**< Displayed image height */
John Koleszar's avatar
John Koleszar committed
81

John Koleszar's avatar
John Koleszar committed
82 83 84
    /* Chroma subsampling info */
    unsigned int  x_chroma_shift;   /**< subsampling order, X */
    unsigned int  y_chroma_shift;   /**< subsampling order, Y */
John Koleszar's avatar
John Koleszar committed
85

John Koleszar's avatar
John Koleszar committed
86
    /* Image data pointers. */
87 88 89 90
#define VPX_PLANE_PACKED 0   /**< To be used for all packed formats */
#define VPX_PLANE_Y      0   /**< Y (Luminance) plane */
#define VPX_PLANE_U      1   /**< U (Chroma) plane */
#define VPX_PLANE_V      2   /**< V (Chroma) plane */
James Zern's avatar
James Zern committed
91
#define VPX_PLANE_ALPHA  3   /**< A (Transparency) plane */
John Koleszar's avatar
John Koleszar committed
92 93
    unsigned char *planes[4];  /**< pointer to the top left pixel for each plane */
    int      stride[4];  /**< stride between rows for each plane */
John Koleszar's avatar
John Koleszar committed
94

John Koleszar's avatar
John Koleszar committed
95
    int     bps; /**< bits per sample (for packed formats) */
John Koleszar's avatar
John Koleszar committed
96

John Koleszar's avatar
John Koleszar committed
97 98
    /* The following member may be set by the application to associate data
     * with this image.
John Koleszar's avatar
John Koleszar committed
99
     */
John Koleszar's avatar
John Koleszar committed
100 101
    void    *user_priv; /**< may be set by the application to associate data
                         *   with this image. */
John Koleszar's avatar
John Koleszar committed
102

John Koleszar's avatar
John Koleszar committed
103 104 105 106
    /* The following members should be treated as private. */
    unsigned char *img_data;       /**< private */
    int      img_data_owner; /**< private */
    int      self_allocd;    /**< private */
107 108

    void    *fb_priv; /**< Frame buffer data associated with the image. */
John Koleszar's avatar
John Koleszar committed
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
  } vpx_image_t; /**< alias for struct vpx_image */

  /**\brief Representation of a rectangle on a surface */
  typedef struct vpx_image_rect {
    unsigned int x; /**< leftmost column */
    unsigned int y; /**< topmost row */
    unsigned int w; /**< width */
    unsigned int h; /**< height */
  } vpx_image_rect_t; /**< alias for struct vpx_image_rect */

  /*!\brief Open a descriptor, allocating storage for the underlying image
   *
   * Returns a descriptor for storing an image of the given format. The
   * storage for the descriptor is allocated on the heap.
   *
   * \param[in]    img       Pointer to storage for descriptor. If this parameter
   *                         is NULL, the storage for the descriptor will be
   *                         allocated on the heap.
   * \param[in]    fmt       Format for the image
   * \param[in]    d_w       Width of the image
   * \param[in]    d_h       Height of the image
John Koleszar's avatar
John Koleszar committed
130 131
   * \param[in]    align     Alignment, in bytes, of the image buffer and
   *                         each row in the image(stride).
John Koleszar's avatar
John Koleszar committed
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
   *
   * \return Returns a pointer to the initialized image descriptor. If the img
   *         parameter is non-null, the value of the img parameter will be
   *         returned.
   */
  vpx_image_t *vpx_img_alloc(vpx_image_t  *img,
                             vpx_img_fmt_t fmt,
                             unsigned int d_w,
                             unsigned int d_h,
                             unsigned int align);

  /*!\brief Open a descriptor, using existing storage for the underlying image
   *
   * Returns a descriptor for storing an image of the given format. The
   * storage for descriptor has been allocated elsewhere, and a descriptor is
   * desired to "wrap" that storage.
   *
   * \param[in]    img       Pointer to storage for descriptor. If this parameter
   *                         is NULL, the storage for the descriptor will be
   *                         allocated on the heap.
   * \param[in]    fmt       Format for the image
   * \param[in]    d_w       Width of the image
   * \param[in]    d_h       Height of the image
   * \param[in]    align     Alignment, in bytes, of each row in the image.
   * \param[in]    img_data  Storage to use for the image
   *
   * \return Returns a pointer to the initialized image descriptor. If the img
   *         parameter is non-null, the value of the img parameter will be
   *         returned.
   */
  vpx_image_t *vpx_img_wrap(vpx_image_t  *img,
                            vpx_img_fmt_t fmt,
                            unsigned int d_w,
                            unsigned int d_h,
                            unsigned int align,
                            unsigned char      *img_data);


  /*!\brief Set the rectangle identifying the displayed portion of the image
   *
   * Updates the displayed rectangle (aka viewport) on the image surface to
   * match the specified coordinates and size.
   *
   * \param[in]    img       Image descriptor
   * \param[in]    x         leftmost column
   * \param[in]    y         topmost row
   * \param[in]    w         width
   * \param[in]    h         height
   *
   * \return 0 if the requested rectangle is valid, nonzero otherwise.
   */
  int vpx_img_set_rect(vpx_image_t  *img,
                       unsigned int  x,
                       unsigned int  y,
                       unsigned int  w,
                       unsigned int  h);


  /*!\brief Flip the image vertically (top for bottom)
   *
   * Adjusts the image descriptor's pointers and strides to make the image
   * be referenced upside-down.
   *
   * \param[in]    img       Image descriptor
   */
  void vpx_img_flip(vpx_image_t *img);

  /*!\brief Close an image descriptor
   *
   * Frees all allocated storage associated with an image descriptor.
   *
   * \param[in]    img       Image descriptor
   */
  void vpx_img_free(vpx_image_t *img);
John Koleszar's avatar
John Koleszar committed
206 207

#ifdef __cplusplus
James Zern's avatar
James Zern committed
208 209 210
}  // extern "C"
#endif

James Zern's avatar
James Zern committed
211
#endif  // VPX_VPX_IMAGE_H_