Commit | Line | Data |
---|---|---|
9b61d838 | 1 | /* |
e0cffbe7 | 2 | * pixel format descriptor |
9b61d838 MN |
3 | * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at> |
4 | * | |
2912e87a | 5 | * This file is part of Libav. |
9b61d838 | 6 | * |
2912e87a | 7 | * Libav is free software; you can redistribute it and/or |
9b61d838 MN |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either | |
10 | * version 2.1 of the License, or (at your option) any later version. | |
11 | * | |
2912e87a | 12 | * Libav is distributed in the hope that it will be useful, |
9b61d838 MN |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 | * Lesser General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU Lesser General Public | |
2912e87a | 18 | * License along with Libav; if not, write to the Free Software |
9b61d838 MN |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ | |
21 | ||
51135d1d SS |
22 | #ifndef AVUTIL_PIXDESC_H |
23 | #define AVUTIL_PIXDESC_H | |
5499a313 | 24 | |
9b61d838 | 25 | #include <inttypes.h> |
bf4b0ed1 DB |
26 | |
27 | #include "attributes.h" | |
8f653e28 | 28 | #include "pixfmt.h" |
9b61d838 | 29 | |
b2e059a1 LB |
30 | typedef struct AVComponentDescriptor { |
31 | /** | |
32 | * Which of the 4 planes contains the component. | |
33 | */ | |
6b3ef7f0 | 34 | int plane; |
21010f6b SS |
35 | |
36 | /** | |
2268db2c | 37 | * Number of elements between 2 horizontally consecutive pixels. |
21010f6b SS |
38 | * Elements are bits for bitstream formats, bytes otherwise. |
39 | */ | |
2268db2c | 40 | int step; |
21010f6b SS |
41 | |
42 | /** | |
2268db2c | 43 | * Number of elements before the component of the first pixel. |
21010f6b SS |
44 | * Elements are bits for bitstream formats, bytes otherwise. |
45 | */ | |
2268db2c | 46 | int offset; |
b2e059a1 LB |
47 | |
48 | /** | |
49 | * Number of least significant bits that must be shifted away | |
50 | * to get the value. | |
51 | */ | |
6b3ef7f0 | 52 | int shift; |
b2e059a1 LB |
53 | |
54 | /** | |
2268db2c | 55 | * Number of bits in the component. |
b2e059a1 | 56 | */ |
2268db2c VG |
57 | int depth; |
58 | ||
59 | #if FF_API_PLUS1_MINUS1 | |
60 | /** deprecated, use step instead */ | |
61 | attribute_deprecated int step_minus1; | |
62 | ||
63 | /** deprecated, use depth instead */ | |
64 | attribute_deprecated int depth_minus1; | |
65 | ||
66 | /** deprecated, use offset instead */ | |
67 | attribute_deprecated int offset_plus1; | |
68 | #endif | |
b2e059a1 | 69 | } AVComponentDescriptor; |
9b61d838 | 70 | |
d3bcbf57 | 71 | /** |
e0cffbe7 | 72 | * Descriptor that unambiguously describes how the bits of a pixel are |
d3bcbf57 MN |
73 | * stored in the up to 4 data planes of an image. It also stores the |
74 | * subsampling factors and number of components. | |
75 | * | |
e0cffbe7 DB |
76 | * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV |
77 | * and all the YUV variants) AVPixFmtDescriptor just stores how values | |
78 | * are stored not what these values represent. | |
d3bcbf57 | 79 | */ |
b2e059a1 | 80 | typedef struct AVPixFmtDescriptor { |
1e896640 | 81 | const char *name; |
b2e059a1 | 82 | uint8_t nb_components; ///< The number of components each pixel has, (1-4) |
9b61d838 MN |
83 | |
84 | /** | |
e0cffbe7 DB |
85 | * Amount to shift the luma width right to find the chroma width. |
86 | * For YV12 this is 1 for example. | |
6695f178 | 87 | * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) |
e0cffbe7 | 88 | * The note above is needed to ensure rounding up. |
357561e7 | 89 | * This value only refers to the chroma components. |
9b61d838 | 90 | */ |
6695f178 | 91 | uint8_t log2_chroma_w; |
9b61d838 MN |
92 | |
93 | /** | |
e0cffbe7 DB |
94 | * Amount to shift the luma height right to find the chroma height. |
95 | * For YV12 this is 1 for example. | |
6695f178 | 96 | * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) |
e0cffbe7 | 97 | * The note above is needed to ensure rounding up. |
357561e7 | 98 | * This value only refers to the chroma components. |
9b61d838 MN |
99 | */ |
100 | uint8_t log2_chroma_h; | |
b8b5d827 | 101 | |
102 | /** | |
103 | * Combination of AV_PIX_FMT_FLAG_... flags. | |
104 | */ | |
105 | uint64_t flags; | |
357561e7 SS |
106 | |
107 | /** | |
108 | * Parameters that describe how pixels are packed. If the format | |
109 | * has chroma components, they must be stored in comp[1] and | |
110 | * comp[2]. | |
7b02cb29 LB |
111 | * If the format is RGB-like, the first component is R, followed |
112 | * by G and B. | |
113 | * | |
114 | * If the format is YUV-like, the first component is Y, followed | |
115 | * by U and V. | |
116 | * | |
117 | * If present, the Alpha channel is always the last component. | |
357561e7 SS |
118 | */ |
119 | AVComponentDescriptor comp[4]; | |
d2962e9f LB |
120 | |
121 | /** | |
122 | * Alternative comma-separated names. | |
123 | */ | |
124 | const char *alias; | |
b2e059a1 | 125 | } AVPixFmtDescriptor; |
9b61d838 | 126 | |
e6c4ac7b AK |
127 | /** |
128 | * Pixel format is big-endian. | |
129 | */ | |
130 | #define AV_PIX_FMT_FLAG_BE (1 << 0) | |
131 | /** | |
132 | * Pixel format has a palette in data[1], values are indexes in this palette. | |
133 | */ | |
134 | #define AV_PIX_FMT_FLAG_PAL (1 << 1) | |
135 | /** | |
136 | * All values of a component are bit-wise packed end to end. | |
137 | */ | |
138 | #define AV_PIX_FMT_FLAG_BITSTREAM (1 << 2) | |
139 | /** | |
140 | * Pixel format is an HW accelerated format. | |
141 | */ | |
142 | #define AV_PIX_FMT_FLAG_HWACCEL (1 << 3) | |
143 | /** | |
144 | * At least one pixel component is not in the first data plane. | |
145 | */ | |
146 | #define AV_PIX_FMT_FLAG_PLANAR (1 << 4) | |
147 | /** | |
148 | * The pixel format contains RGB-like data (as opposed to YUV/grayscale). | |
149 | */ | |
150 | #define AV_PIX_FMT_FLAG_RGB (1 << 5) | |
38d55332 AK |
151 | /** |
152 | * The pixel format is "pseudo-paletted". This means that Libav treats it as | |
153 | * paletted internally, but the palette is generated by the decoder and is not | |
154 | * stored in the file. | |
155 | */ | |
e6c4ac7b AK |
156 | #define AV_PIX_FMT_FLAG_PSEUDOPAL (1 << 6) |
157 | /** | |
158 | * The pixel format has an alpha channel. | |
159 | */ | |
160 | #define AV_PIX_FMT_FLAG_ALPHA (1 << 7) | |
cbe5a60c | 161 | |
9b34899e | 162 | /** |
49bd8e4b | 163 | * Read a line from an image, and write the values of the |
351aff72 | 164 | * pixel format component c to dst. |
9b34899e SS |
165 | * |
166 | * @param data the array containing the pointers to the planes of the image | |
9a58234f | 167 | * @param linesize the array containing the linesizes of the image |
9b34899e SS |
168 | * @param desc the pixel format descriptor for the image |
169 | * @param x the horizontal coordinate of the first pixel to read | |
170 | * @param y the vertical coordinate of the first pixel to read | |
171 | * @param w the width of the line to read, that is the number of | |
bf7e799c | 172 | * values to write to dst |
0a47f60a | 173 | * @param read_pal_component if not zero and the format is a paletted |
351aff72 SS |
174 | * format writes the values corresponding to the palette |
175 | * component c in data[1] to dst, rather than the palette indexes in | |
0a47f60a | 176 | * data[0]. The behavior is undefined if the format is not paletted. |
9b34899e | 177 | */ |
b2e059a1 LB |
178 | void av_read_image_line(uint16_t *dst, const uint8_t *data[4], |
179 | const int linesize[4], const AVPixFmtDescriptor *desc, | |
180 | int x, int y, int c, int w, int read_pal_component); | |
9401d18f SS |
181 | |
182 | /** | |
49bd8e4b | 183 | * Write the values from src to the pixel format component c of an |
9401d18f SS |
184 | * image line. |
185 | * | |
186 | * @param src array containing the values to write | |
187 | * @param data the array containing the pointers to the planes of the | |
188 | * image to write into. It is supposed to be zeroed. | |
9a58234f | 189 | * @param linesize the array containing the linesizes of the image |
9401d18f SS |
190 | * @param desc the pixel format descriptor for the image |
191 | * @param x the horizontal coordinate of the first pixel to write | |
192 | * @param y the vertical coordinate of the first pixel to write | |
193 | * @param w the width of the line to write, that is the number of | |
194 | * values to write to the image line | |
195 | */ | |
b2e059a1 LB |
196 | void av_write_image_line(const uint16_t *src, uint8_t *data[4], |
197 | const int linesize[4], const AVPixFmtDescriptor *desc, | |
198 | int x, int y, int c, int w); | |
5499a313 | 199 | |
5efccce2 | 200 | /** |
49bd8e4b | 201 | * Return the pixel format corresponding to name. |
80a07f6e SS |
202 | * |
203 | * If there is no pixel format with name name, then looks for a | |
204 | * pixel format with the name corresponding to the native endian | |
205 | * format of name. | |
206 | * For example in a little-endian system, first looks for "gray16", | |
207 | * then for "gray16le". | |
208 | * | |
209 | * Finally if no pixel format has been found, returns PIX_FMT_NONE. | |
210 | */ | |
716d413c | 211 | enum AVPixelFormat av_get_pix_fmt(const char *name); |
80a07f6e SS |
212 | |
213 | /** | |
8f653e28 SS |
214 | * Return the short name for a pixel format, NULL in case pix_fmt is |
215 | * unknown. | |
216 | * | |
217 | * @see av_get_pix_fmt(), av_get_pix_fmt_string() | |
218 | */ | |
716d413c | 219 | const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt); |
8f653e28 SS |
220 | |
221 | /** | |
bb4afa13 SS |
222 | * Print in buf the string corresponding to the pixel format with |
223 | * number pix_fmt, or an header if pix_fmt is negative. | |
224 | * | |
225 | * @param buf the buffer where to write the string | |
226 | * @param buf_size the size of buf | |
227 | * @param pix_fmt the number of the pixel format to print the | |
228 | * corresponding info string, or a negative value to print the | |
229 | * corresponding header. | |
230 | */ | |
b2e059a1 LB |
231 | char *av_get_pix_fmt_string(char *buf, int buf_size, |
232 | enum AVPixelFormat pix_fmt); | |
bb4afa13 SS |
233 | |
234 | /** | |
49bd8e4b | 235 | * Return the number of bits per pixel used by the pixel format |
ede75ebc KK |
236 | * described by pixdesc. Note that this is not the same as the number |
237 | * of bits per sample. | |
5efccce2 SS |
238 | * |
239 | * The returned number of bits refers to the number of bits actually | |
240 | * used for storing the pixel information, that is padding bits are | |
241 | * not counted. | |
242 | */ | |
243 | int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc); | |
244 | ||
d2fcb356 AK |
245 | /** |
246 | * @return a pixel format descriptor for provided pixel format or NULL if | |
247 | * this pixel format is unknown. | |
248 | */ | |
249 | const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt); | |
250 | ||
251 | /** | |
252 | * Iterate over all pixel format descriptors known to libavutil. | |
253 | * | |
254 | * @param prev previous descriptor. NULL to get the first descriptor. | |
255 | * | |
256 | * @return next descriptor or NULL after the last descriptor | |
257 | */ | |
258 | const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev); | |
259 | ||
260 | /** | |
261 | * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc | |
262 | * is not a valid pointer to a pixel format descriptor. | |
263 | */ | |
264 | enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc); | |
265 | ||
c1a02e88 LB |
266 | /** |
267 | * Utility function to access log2_chroma_w log2_chroma_h from | |
268 | * the pixel format AVPixFmtDescriptor. | |
269 | * | |
270 | * @param[in] pix_fmt the pixel format | |
d336bfcf AK |
271 | * @param[out] h_shift store log2_chroma_w (horizontal/width shift) |
272 | * @param[out] v_shift store log2_chroma_h (vertical/height shift) | |
c1a02e88 LB |
273 | * |
274 | * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format | |
275 | */ | |
276 | int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, | |
277 | int *h_shift, int *v_shift); | |
278 | ||
2c328a90 AK |
279 | /** |
280 | * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a | |
281 | * valid pixel format. | |
282 | */ | |
283 | int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt); | |
284 | ||
74652af8 JG |
285 | /** |
286 | * Utility function to swap the endianness of a pixel format. | |
287 | * | |
288 | * @param[in] pix_fmt the pixel format | |
289 | * | |
290 | * @return pixel format with swapped endianness if it exists, | |
291 | * otherwise AV_PIX_FMT_NONE | |
292 | */ | |
293 | enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt); | |
294 | ||
5a419b2d VG |
295 | /** |
296 | * @return the name for provided color range or NULL if unknown. | |
297 | */ | |
298 | const char *av_color_range_name(enum AVColorRange range); | |
299 | ||
300 | /** | |
301 | * @return the name for provided color primaries or NULL if unknown. | |
302 | */ | |
303 | const char *av_color_primaries_name(enum AVColorPrimaries primaries); | |
304 | ||
305 | /** | |
306 | * @return the name for provided color transfer or NULL if unknown. | |
307 | */ | |
308 | const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer); | |
309 | ||
310 | /** | |
311 | * @return the name for provided color space or NULL if unknown. | |
312 | */ | |
313 | const char *av_color_space_name(enum AVColorSpace space); | |
314 | ||
315 | /** | |
316 | * @return the name for provided chroma location or NULL if unknown. | |
317 | */ | |
318 | const char *av_chroma_location_name(enum AVChromaLocation location); | |
319 | ||
51135d1d | 320 | #endif /* AVUTIL_PIXDESC_H */ |