pixdesc.h 13.8 KB
Newer Older
1
/*
2
 * pixel format descriptor
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

22 23
#ifndef AVUTIL_PIXDESC_H
#define AVUTIL_PIXDESC_H
24

25
#include <inttypes.h>
26 27

#include "attributes.h"
28
#include "pixfmt.h"
29

30 31 32 33 34
typedef struct AVComponentDescriptor {
    /**
     * Which of the 4 planes contains the component.
     */
    uint16_t plane        : 2;
35 36 37 38 39

    /**
     * Number of elements between 2 horizontally consecutive pixels minus 1.
     * Elements are bits for bitstream formats, bytes otherwise.
     */
40
    uint16_t step_minus1  : 3;
41 42 43 44 45

    /**
     * Number of elements before the component of the first pixel plus 1.
     * Elements are bits for bitstream formats, bytes otherwise.
     */
46 47 48 49 50 51 52 53 54 55 56 57 58
    uint16_t offset_plus1 : 3;

    /**
     * Number of least significant bits that must be shifted away
     * to get the value.
     */
    uint16_t shift        : 3;

    /**
     * Number of bits in the component minus 1.
     */
    uint16_t depth_minus1 : 4;
} AVComponentDescriptor;
59

60
/**
61
 * Descriptor that unambiguously describes how the bits of a pixel are
62 63 64
 * stored in the up to 4 data planes of an image. It also stores the
 * subsampling factors and number of components.
 *
65 66 67
 * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV
 *       and all the YUV variants) AVPixFmtDescriptor just stores how values
 *       are stored not what these values represent.
68
 */
69
typedef struct AVPixFmtDescriptor {
70
    const char *name;
71
    uint8_t nb_components;  ///< The number of components each pixel has, (1-4)
72 73

    /**
74 75 76 77
     * Amount to shift the luma width right to find the chroma width.
     * For YV12 this is 1 for example.
     * chroma_width = -((-luma_width) >> log2_chroma_w)
     * The note above is needed to ensure rounding up.
78
     * This value only refers to the chroma components.
79
     */
80
    uint8_t log2_chroma_w;  ///< chroma_width = -((-luma_width )>>log2_chroma_w)
81 82

    /**
83 84 85 86
     * Amount to shift the luma height right to find the chroma height.
     * For YV12 this is 1 for example.
     * chroma_height= -((-luma_height) >> log2_chroma_h)
     * The note above is needed to ensure rounding up.
87
     * This value only refers to the chroma components.
88 89 90
     */
    uint8_t log2_chroma_h;
    uint8_t flags;
91 92

    /**
93 94 95 96 97 98
     * Parameters that describe how pixels are packed.
     * If the format has 2 or 4 components, then alpha is last.
     * If the format has 1 or 2 components, then luma is 0.
     * If the format has 3 or 4 components,
     * if the RGB flag is set then 0 is red, 1 is green and 2 is blue;
     * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V.
99 100
     */
    AVComponentDescriptor comp[4];
101 102 103 104 105

    /**
     * Alternative comma-separated names.
     */
    const char *alias;
106
} AVPixFmtDescriptor;
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
/**
 * Pixel format is big-endian.
 */
#define AV_PIX_FMT_FLAG_BE           (1 << 0)
/**
 * Pixel format has a palette in data[1], values are indexes in this palette.
 */
#define AV_PIX_FMT_FLAG_PAL          (1 << 1)
/**
 * All values of a component are bit-wise packed end to end.
 */
#define AV_PIX_FMT_FLAG_BITSTREAM    (1 << 2)
/**
 * Pixel format is an HW accelerated format.
 */
#define AV_PIX_FMT_FLAG_HWACCEL      (1 << 3)
/**
 * At least one pixel component is not in the first data plane.
 */
#define AV_PIX_FMT_FLAG_PLANAR       (1 << 4)
/**
 * The pixel format contains RGB-like data (as opposed to YUV/grayscale).
 */
#define AV_PIX_FMT_FLAG_RGB          (1 << 5)
132
/**
133
 * The pixel format is "pseudo-paletted". This means that FFmpeg treats it as
134 135 136
 * paletted internally, but the palette is generated by the decoder and is not
 * stored in the file.
 */
137 138 139 140 141
#define AV_PIX_FMT_FLAG_PSEUDOPAL    (1 << 6)
/**
 * The pixel format has an alpha channel.
 */
#define AV_PIX_FMT_FLAG_ALPHA        (1 << 7)
142

143 144
#if FF_API_PIX_FMT
/**
145
 * @deprecated use the AV_PIX_FMT_FLAG_* flags
146 147 148 149 150 151 152 153 154 155
 */
#define PIX_FMT_BE        AV_PIX_FMT_FLAG_BE
#define PIX_FMT_PAL       AV_PIX_FMT_FLAG_PAL
#define PIX_FMT_BITSTREAM AV_PIX_FMT_FLAG_BITSTREAM
#define PIX_FMT_HWACCEL   AV_PIX_FMT_FLAG_HWACCEL
#define PIX_FMT_PLANAR    AV_PIX_FMT_FLAG_PLANAR
#define PIX_FMT_RGB       AV_PIX_FMT_FLAG_RGB
#define PIX_FMT_PSEUDOPAL AV_PIX_FMT_FLAG_PSEUDOPAL
#define PIX_FMT_ALPHA     AV_PIX_FMT_FLAG_ALPHA
#endif
156

157
#if FF_API_PIX_FMT_DESC
158 159 160
/**
 * The array of all the pixel format descriptors.
 */
161
extern attribute_deprecated const AVPixFmtDescriptor av_pix_fmt_descriptors[];
162
#endif
163

Stefano Sabatini's avatar
Stefano Sabatini committed
164
/**
165
 * Read a line from an image, and write the values of the
166
 * pixel format component c to dst.
Stefano Sabatini's avatar
Stefano Sabatini committed
167 168
 *
 * @param data the array containing the pointers to the planes of the image
169
 * @param linesize the array containing the linesizes of the image
Stefano Sabatini's avatar
Stefano Sabatini committed
170 171 172 173
 * @param desc the pixel format descriptor for the image
 * @param x the horizontal coordinate of the first pixel to read
 * @param y the vertical coordinate of the first pixel to read
 * @param w the width of the line to read, that is the number of
174
 * values to write to dst
175
 * @param read_pal_component if not zero and the format is a paletted
176 177
 * format writes the values corresponding to the palette
 * component c in data[1] to dst, rather than the palette indexes in
178
 * data[0]. The behavior is undefined if the format is not paletted.
Stefano Sabatini's avatar
Stefano Sabatini committed
179
 */
180 181 182
void av_read_image_line(uint16_t *dst, const uint8_t *data[4],
                        const int linesize[4], const AVPixFmtDescriptor *desc,
                        int x, int y, int c, int w, int read_pal_component);
183 184

/**
185
 * Write the values from src to the pixel format component c of an
186 187 188 189 190
 * image line.
 *
 * @param src array containing the values to write
 * @param data the array containing the pointers to the planes of the
 * image to write into. It is supposed to be zeroed.
191
 * @param linesize the array containing the linesizes of the image
192 193 194 195 196 197
 * @param desc the pixel format descriptor for the image
 * @param x the horizontal coordinate of the first pixel to write
 * @param y the vertical coordinate of the first pixel to write
 * @param w the width of the line to write, that is the number of
 * values to write to the image line
 */
198 199 200
void av_write_image_line(const uint16_t *src, uint8_t *data[4],
                         const int linesize[4], const AVPixFmtDescriptor *desc,
                         int x, int y, int c, int w);
201

202
/**
203
 * Return the pixel format corresponding to name.
204 205 206 207 208 209 210
 *
 * If there is no pixel format with name name, then looks for a
 * pixel format with the name corresponding to the native endian
 * format of name.
 * For example in a little-endian system, first looks for "gray16",
 * then for "gray16le".
 *
211
 * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE.
212
 */
213
enum AVPixelFormat av_get_pix_fmt(const char *name);
214

215 216 217 218 219 220
/**
 * Return the short name for a pixel format, NULL in case pix_fmt is
 * unknown.
 *
 * @see av_get_pix_fmt(), av_get_pix_fmt_string()
 */
221
const char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt);
222

223 224
/**
 * Print in buf the string corresponding to the pixel format with
225
 * number pix_fmt, or a header if pix_fmt is negative.
226 227 228 229 230 231 232
 *
 * @param buf the buffer where to write the string
 * @param buf_size the size of buf
 * @param pix_fmt the number of the pixel format to print the
 * corresponding info string, or a negative value to print the
 * corresponding header.
 */
233 234
char *av_get_pix_fmt_string(char *buf, int buf_size,
                            enum AVPixelFormat pix_fmt);
235

236
/**
237
 * Return the number of bits per pixel used by the pixel format
238 239
 * described by pixdesc. Note that this is not the same as the number
 * of bits per sample.
240 241 242 243 244 245 246
 *
 * The returned number of bits refers to the number of bits actually
 * used for storing the pixel information, that is padding bits are
 * not counted.
 */
int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);

247 248 249 250 251 252
/**
 * Return the number of bits per pixel for the pixel format
 * described by pixdesc, including any padding or unused bits.
 */
int av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);

253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
/**
 * @return a pixel format descriptor for provided pixel format or NULL if
 * this pixel format is unknown.
 */
const AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);

/**
 * Iterate over all pixel format descriptors known to libavutil.
 *
 * @param prev previous descriptor. NULL to get the first descriptor.
 *
 * @return next descriptor or NULL after the last descriptor
 */
const AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev);

/**
 * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc
 * is not a valid pointer to a pixel format descriptor.
 */
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc);

274 275 276 277
/**
 * Utility function to access log2_chroma_w log2_chroma_h from
 * the pixel format AVPixFmtDescriptor.
 *
278
 * See av_get_chroma_sub_sample() for a function that asserts a
279
 * valid pixel format instead of returning an error code.
Lou Logan's avatar
Lou Logan committed
280
 * Its recommended that you use avcodec_get_chroma_sub_sample unless
281 282
 * you do check the return code!
 *
283
 * @param[in]  pix_fmt the pixel format
284 285
 * @param[out] h_shift store log2_chroma_w
 * @param[out] v_shift store log2_chroma_h
286 287 288 289 290 291
 *
 * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format
 */
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,
                                     int *h_shift, int *v_shift);

292 293 294 295 296 297
/**
 * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a
 * valid pixel format.
 */
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt);

298
void ff_check_pixfmt_descriptors(void);
299

300 301 302 303 304 305 306 307 308 309
/**
 * Utility function to swap the endianness of a pixel format.
 *
 * @param[in]  pix_fmt the pixel format
 *
 * @return pixel format with swapped endianness if it exists,
 * otherwise AV_PIX_FMT_NONE
 */
enum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt);

310 311 312 313 314 315
#define FF_LOSS_RESOLUTION  0x0001 /**< loss due to resolution change */
#define FF_LOSS_DEPTH       0x0002 /**< loss due to color depth change */
#define FF_LOSS_COLORSPACE  0x0004 /**< loss due to color space conversion */
#define FF_LOSS_ALPHA       0x0008 /**< loss of alpha bits */
#define FF_LOSS_COLORQUANT  0x0010 /**< loss due to color quantization */
#define FF_LOSS_CHROMA      0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */
316

317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
/**
 * Compute what kind of losses will occur when converting from one specific
 * pixel format to another.
 * When converting from one pixel format to another, information loss may occur.
 * For example, when converting from RGB24 to GRAY, the color information will
 * be lost. Similarly, other losses occur when converting from some formats to
 * other formats. These losses can involve loss of chroma, but also loss of
 * resolution, loss of color depth, loss due to the color space conversion, loss
 * of the alpha bits or loss due to color quantization.
 * av_get_fix_fmt_loss() informs you about the various types of losses
 * which will occur when converting from one pixel format to another.
 *
 * @param[in] dst_pix_fmt destination pixel format
 * @param[in] src_pix_fmt source pixel format
 * @param[in] has_alpha Whether the source pixel format alpha channel is used.
 * @return Combination of flags informing you what kind of losses will occur
 * (maximum loss for an invalid dst_pix_fmt).
 */
int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
                        enum AVPixelFormat src_pix_fmt,
                        int has_alpha);

/**
 * Compute what kind of losses will occur when converting from one specific
 * pixel format to another.
 * When converting from one pixel format to another, information loss may occur.
 * For example, when converting from RGB24 to GRAY, the color information will
 * be lost. Similarly, other losses occur when converting from some formats to
 * other formats. These losses can involve loss of chroma, but also loss of
 * resolution, loss of color depth, loss due to the color space conversion, loss
 * of the alpha bits or loss due to color quantization.
 * av_get_fix_fmt_loss() informs you about the various types of losses
 * which will occur when converting from one pixel format to another.
 *
 * @param[in] dst_pix_fmt destination pixel format
 * @param[in] src_pix_fmt source pixel format
 * @param[in] has_alpha Whether the source pixel format alpha channel is used.
 * @return Combination of flags informing you what kind of losses will occur
 * (maximum loss for an invalid dst_pix_fmt).
 */
enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
                                             enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
359

360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
/**
 * @return the name for provided color range or NULL if unknown.
 */
const char *av_color_range_name(enum AVColorRange range);

/**
 * @return the name for provided color primaries or NULL if unknown.
 */
const char *av_color_primaries_name(enum AVColorPrimaries primaries);

/**
 * @return the name for provided color transfer or NULL if unknown.
 */
const char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer);

/**
 * @return the name for provided color space or NULL if unknown.
 */
const char *av_color_space_name(enum AVColorSpace space);

/**
 * @return the name for provided chroma location or NULL if unknown.
 */
const char *av_chroma_location_name(enum AVChromaLocation location);

385
#endif /* AVUTIL_PIXDESC_H */