summaryrefslogtreecommitdiffstats
path: root/media/libvpx/vpx/vpx_image.h
blob: c06d35101cca128ecf1b698a24355dced7656714 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


/*!\file
 * \brief Describes the vpx image descriptor and associated operations
 *
 */
#ifndef VPX_VPX_IMAGE_H_
#define VPX_VPX_IMAGE_H_

#ifdef __cplusplus
extern "C" {
#endif

  /*!\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
   */
#define VPX_IMAGE_ABI_VERSION (3) /**<\hideinitializer*/


#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. */

  /*!\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 */
    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,
    VPX_IMG_FMT_I440    = VPX_IMG_FMT_PLANAR | 7,
    VPX_IMG_FMT_444A    = VPX_IMG_FMT_PLANAR | VPX_IMG_FMT_HAS_ALPHA | 6,
    VPX_IMG_FMT_I42016    = VPX_IMG_FMT_I420 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I42216    = VPX_IMG_FMT_I422 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I44416    = VPX_IMG_FMT_I444 | VPX_IMG_FMT_HIGHBITDEPTH,
    VPX_IMG_FMT_I44016    = VPX_IMG_FMT_I440 | VPX_IMG_FMT_HIGHBITDEPTH
  } vpx_img_fmt_t; /**< alias for enum vpx_img_fmt */

  /*!\brief List of supported color spaces */
  typedef enum vpx_color_space {
    VPX_CS_UNKNOWN    = 0,  /**< Unknown */
    VPX_CS_BT_601     = 1,  /**< BT.601 */
    VPX_CS_BT_709     = 2,  /**< BT.709 */
    VPX_CS_SMPTE_170  = 3,  /**< SMPTE.170 */
    VPX_CS_SMPTE_240  = 4,  /**< SMPTE.240 */
    VPX_CS_BT_2020    = 5,  /**< BT.2020 */
    VPX_CS_RESERVED   = 6,  /**< Reserved */
    VPX_CS_SRGB       = 7   /**< sRGB */
  } vpx_color_space_t; /**< alias for enum vpx_color_space */

  /**\brief Image Descriptor */
  typedef struct vpx_image {
    vpx_img_fmt_t fmt; /**< Image Format */
    vpx_color_space_t cs; /**< Color Space */

    /* Image storage dimensions */
    unsigned int  w;           /**< Stored image width */
    unsigned int  h;           /**< Stored image height */
    unsigned int  bit_depth;   /**< Stored image bit-depth */

    /* Image display dimensions */
    unsigned int  d_w;   /**< Displayed image width */
    unsigned int  d_h;   /**< Displayed image height */

    /* Chroma subsampling info */
    unsigned int  x_chroma_shift;   /**< subsampling order, X */
    unsigned int  y_chroma_shift;   /**< subsampling order, Y */

    /* Image data pointers. */
#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 */
#define VPX_PLANE_ALPHA  3   /**< A (Transparency) plane */
    unsigned char *planes[4];  /**< pointer to the top left pixel for each plane */
    int      stride[4];  /**< stride between rows for each plane */

    int     bps; /**< bits per sample (for packed formats) */

    /* The following member may be set by the application to associate data
     * with this image.
     */
    void    *user_priv; /**< may be set by the application to associate data
                         *   with this image. */

    /* The following members should be treated as private. */
    unsigned char *img_data;       /**< private */
    int      img_data_owner; /**< private */
    int      self_allocd;    /**< private */

    void    *fb_priv; /**< Frame buffer data associated with the image. */
  } 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
   * \param[in]    align     Alignment, in bytes, of the image buffer and
   *                         each row in the image(stride).
   *
   * \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);

#ifdef __cplusplus
}  // extern "C"
#endif

#endif  // VPX_VPX_IMAGE_H_