1 /* 2 * pixel format descriptor 3 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 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 * 12 * FFmpeg is distributed in the hope that it will be useful, 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 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 module ffmpeg.libavutil.pixdesc; 22 23 import ffmpeg.libavutil; 24 25 extern (C) @nogc nothrow: 26 27 struct AVComponentDescriptor 28 { 29 /** 30 * Which of the 4 planes contains the component. 31 */ 32 int plane; 33 34 /** 35 * Number of elements between 2 horizontally consecutive pixels. 36 * Elements are bits for bitstream formats, bytes otherwise. 37 */ 38 int step; 39 40 /** 41 * Number of elements before the component of the first pixel. 42 * Elements are bits for bitstream formats, bytes otherwise. 43 */ 44 int offset; 45 46 /** 47 * Number of least significant bits that must be shifted away 48 * to get the value. 49 */ 50 int shift; 51 52 /** 53 * Number of bits in the component. 54 */ 55 int depth; 56 57 /** deprecated, use step instead */ 58 int step_minus1; 59 60 /** deprecated, use depth instead */ 61 int depth_minus1; 62 63 /** deprecated, use offset instead */ 64 int offset_plus1; 65 } 66 67 /** 68 * Descriptor that unambiguously describes how the bits of a pixel are 69 * stored in the up to 4 data planes of an image. It also stores the 70 * subsampling factors and number of components. 71 * 72 * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV 73 * and all the YUV variants) AVPixFmtDescriptor just stores how values 74 * are stored not what these values represent. 75 */ 76 struct AVPixFmtDescriptor 77 { 78 const(char)* name; 79 ubyte nb_components; ///< The number of components each pixel has, (1-4) 80 81 /** 82 * Amount to shift the luma width right to find the chroma width. 83 * For YV12 this is 1 for example. 84 * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w) 85 * The note above is needed to ensure rounding up. 86 * This value only refers to the chroma components. 87 */ 88 ubyte log2_chroma_w; 89 90 /** 91 * Amount to shift the luma height right to find the chroma height. 92 * For YV12 this is 1 for example. 93 * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h) 94 * The note above is needed to ensure rounding up. 95 * This value only refers to the chroma components. 96 */ 97 ubyte log2_chroma_h; 98 99 /** 100 * Combination of AV_PIX_FMT_FLAG_... flags. 101 */ 102 ulong flags; 103 104 /** 105 * Parameters that describe how pixels are packed. 106 * If the format has 1 or 2 components, then luma is 0. 107 * If the format has 3 or 4 components: 108 * if the RGB flag is set then 0 is red, 1 is green and 2 is blue; 109 * otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V. 110 * 111 * If present, the Alpha channel is always the last component. 112 */ 113 AVComponentDescriptor[4] comp; 114 115 /** 116 * Alternative comma-separated names. 117 */ 118 const(char)* alias_; 119 } 120 121 /** 122 * Pixel format is big-endian. 123 */ 124 enum AV_PIX_FMT_FLAG_BE = 1 << 0; 125 /** 126 * Pixel format has a palette in data[1], values are indexes in this palette. 127 */ 128 enum AV_PIX_FMT_FLAG_PAL = 1 << 1; 129 /** 130 * All values of a component are bit-wise packed end to end. 131 */ 132 enum AV_PIX_FMT_FLAG_BITSTREAM = 1 << 2; 133 /** 134 * Pixel format is an HW accelerated format. 135 */ 136 enum AV_PIX_FMT_FLAG_HWACCEL = 1 << 3; 137 /** 138 * At least one pixel component is not in the first data plane. 139 */ 140 enum AV_PIX_FMT_FLAG_PLANAR = 1 << 4; 141 /** 142 * The pixel format contains RGB-like data (as opposed to YUV/grayscale). 143 */ 144 enum AV_PIX_FMT_FLAG_RGB = 1 << 5; 145 146 /** 147 * The pixel format is "pseudo-paletted". This means that it contains a 148 * fixed palette in the 2nd plane but the palette is fixed/constant for each 149 * PIX_FMT. This allows interpreting the data as if it was PAL8, which can 150 * in some cases be simpler. Or the data can be interpreted purely based on 151 * the pixel format without using the palette. 152 * An example of a pseudo-paletted format is AV_PIX_FMT_GRAY8 153 * 154 * @deprecated This flag is deprecated, and will be removed. When it is removed, 155 * the extra palette allocation in AVFrame.data[1] is removed as well. Only 156 * actual paletted formats (as indicated by AV_PIX_FMT_FLAG_PAL) will have a 157 * palette. Starting with FFmpeg versions which have this flag deprecated, the 158 * extra "pseudo" palette is already ignored, and API users are not required to 159 * allocate a palette for AV_PIX_FMT_FLAG_PSEUDOPAL formats (it was required 160 * before the deprecation, though). 161 */ 162 enum AV_PIX_FMT_FLAG_PSEUDOPAL = 1 << 6; 163 164 /** 165 * The pixel format has an alpha channel. This is set on all formats that 166 * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always 167 * straight, never pre-multiplied. 168 * 169 * If a codec or a filter does not support alpha, it should set all alpha to 170 * opaque, or use the equivalent pixel formats without alpha component, e.g. 171 * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA. 172 */ 173 enum AV_PIX_FMT_FLAG_ALPHA = 1 << 7; 174 175 /** 176 * The pixel format is following a Bayer pattern 177 */ 178 enum AV_PIX_FMT_FLAG_BAYER = 1 << 8; 179 180 /** 181 * The pixel format contains IEEE-754 floating point values. Precision (double, 182 * single, or half) should be determined by the pixel size (64, 32, or 16 bits). 183 */ 184 enum AV_PIX_FMT_FLAG_FLOAT = 1 << 9; 185 186 /** 187 * Return the number of bits per pixel used by the pixel format 188 * described by pixdesc. Note that this is not the same as the number 189 * of bits per sample. 190 * 191 * The returned number of bits refers to the number of bits actually 192 * used for storing the pixel information, that is padding bits are 193 * not counted. 194 */ 195 int av_get_bits_per_pixel (const(AVPixFmtDescriptor)* pixdesc); 196 197 /** 198 * Return the number of bits per pixel for the pixel format 199 * described by pixdesc, including any padding or unused bits. 200 */ 201 int av_get_padded_bits_per_pixel (const(AVPixFmtDescriptor)* pixdesc); 202 203 /** 204 * @return a pixel format descriptor for provided pixel format or NULL if 205 * this pixel format is unknown. 206 */ 207 const(AVPixFmtDescriptor)* av_pix_fmt_desc_get (AVPixelFormat pix_fmt); 208 209 /** 210 * Iterate over all pixel format descriptors known to libavutil. 211 * 212 * @param prev previous descriptor. NULL to get the first descriptor. 213 * 214 * @return next descriptor or NULL after the last descriptor 215 */ 216 const(AVPixFmtDescriptor)* av_pix_fmt_desc_next (const(AVPixFmtDescriptor)* prev); 217 218 /** 219 * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc 220 * is not a valid pointer to a pixel format descriptor. 221 */ 222 AVPixelFormat av_pix_fmt_desc_get_id (const(AVPixFmtDescriptor)* desc); 223 224 /** 225 * Utility function to access log2_chroma_w log2_chroma_h from 226 * the pixel format AVPixFmtDescriptor. 227 * 228 * @param[in] pix_fmt the pixel format 229 * @param[out] h_shift store log2_chroma_w (horizontal/width shift) 230 * @param[out] v_shift store log2_chroma_h (vertical/height shift) 231 * 232 * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format 233 */ 234 int av_pix_fmt_get_chroma_sub_sample ( 235 AVPixelFormat pix_fmt, 236 int* h_shift, 237 int* v_shift); 238 239 /** 240 * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a 241 * valid pixel format. 242 */ 243 int av_pix_fmt_count_planes (AVPixelFormat pix_fmt); 244 245 /** 246 * @return the name for provided color range or NULL if unknown. 247 */ 248 const(char)* av_color_range_name (AVColorRange range); 249 250 /** 251 * @return the AVColorRange value for name or an AVError if not found. 252 */ 253 int av_color_range_from_name (const(char)* name); 254 255 /** 256 * @return the name for provided color primaries or NULL if unknown. 257 */ 258 const(char)* av_color_primaries_name (AVColorPrimaries primaries); 259 260 /** 261 * @return the AVColorPrimaries value for name or an AVError if not found. 262 */ 263 int av_color_primaries_from_name (const(char)* name); 264 265 /** 266 * @return the name for provided color transfer or NULL if unknown. 267 */ 268 const(char)* av_color_transfer_name (AVColorTransferCharacteristic transfer); 269 270 /** 271 * @return the AVColorTransferCharacteristic value for name or an AVError if not found. 272 */ 273 int av_color_transfer_from_name (const(char)* name); 274 275 /** 276 * @return the name for provided color space or NULL if unknown. 277 */ 278 const(char)* av_color_space_name (AVColorSpace space); 279 280 /** 281 * @return the AVColorSpace value for name or an AVError if not found. 282 */ 283 int av_color_space_from_name (const(char)* name); 284 285 /** 286 * @return the name for provided chroma location or NULL if unknown. 287 */ 288 const(char)* av_chroma_location_name (AVChromaLocation location); 289 290 /** 291 * @return the AVChromaLocation value for name or an AVError if not found. 292 */ 293 int av_chroma_location_from_name (const(char)* name); 294 295 /** 296 * Return the pixel format corresponding to name. 297 * 298 * If there is no pixel format with name name, then looks for a 299 * pixel format with the name corresponding to the native endian 300 * format of name. 301 * For example in a little-endian system, first looks for "gray16", 302 * then for "gray16le". 303 * 304 * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE. 305 */ 306 AVPixelFormat av_get_pix_fmt (const(char)* name); 307 308 /** 309 * Return the short name for a pixel format, NULL in case pix_fmt is 310 * unknown. 311 * 312 * @see av_get_pix_fmt(), av_get_pix_fmt_string() 313 */ 314 const(char)* av_get_pix_fmt_name (AVPixelFormat pix_fmt); 315 316 /** 317 * Print in buf the string corresponding to the pixel format with 318 * number pix_fmt, or a header if pix_fmt is negative. 319 * 320 * @param buf the buffer where to write the string 321 * @param buf_size the size of buf 322 * @param pix_fmt the number of the pixel format to print the 323 * corresponding info string, or a negative value to print the 324 * corresponding header. 325 */ 326 char* av_get_pix_fmt_string (char* buf, int buf_size, AVPixelFormat pix_fmt); 327 328 /** 329 * Read a line from an image, and write the values of the 330 * pixel format component c to dst. 331 * 332 * @param data the array containing the pointers to the planes of the image 333 * @param linesize the array containing the linesizes of the image 334 * @param desc the pixel format descriptor for the image 335 * @param x the horizontal coordinate of the first pixel to read 336 * @param y the vertical coordinate of the first pixel to read 337 * @param w the width of the line to read, that is the number of 338 * values to write to dst 339 * @param read_pal_component if not zero and the format is a paletted 340 * format writes the values corresponding to the palette 341 * component c in data[1] to dst, rather than the palette indexes in 342 * data[0]. The behavior is undefined if the format is not paletted. 343 * @param dst_element_size size of elements in dst array (2 or 4 byte) 344 */ 345 void av_read_image_line2 ( 346 void* dst, 347 ref const(ubyte)*[4] data, 348 ref const(int)[4] linesize, 349 const(AVPixFmtDescriptor)* desc, 350 int x, 351 int y, 352 int c, 353 int w, 354 int read_pal_component, 355 int dst_element_size); 356 357 void av_read_image_line ( 358 ushort* dst, 359 ref const(ubyte)*[4] data, 360 ref const(int)[4] linesize, 361 const(AVPixFmtDescriptor)* desc, 362 int x, 363 int y, 364 int c, 365 int w, 366 int read_pal_component); 367 368 /** 369 * Write the values from src to the pixel format component c of an 370 * image line. 371 * 372 * @param src array containing the values to write 373 * @param data the array containing the pointers to the planes of the 374 * image to write into. It is supposed to be zeroed. 375 * @param linesize the array containing the linesizes of the image 376 * @param desc the pixel format descriptor for the image 377 * @param x the horizontal coordinate of the first pixel to write 378 * @param y the vertical coordinate of the first pixel to write 379 * @param w the width of the line to write, that is the number of 380 * values to write to the image line 381 * @param src_element_size size of elements in src array (2 or 4 byte) 382 */ 383 void av_write_image_line2 ( 384 const(void)* src, 385 ref ubyte*[4] data, 386 ref const(int)[4] linesize, 387 const(AVPixFmtDescriptor)* desc, 388 int x, 389 int y, 390 int c, 391 int w, 392 int src_element_size); 393 394 void av_write_image_line ( 395 const(ushort)* src, 396 ref ubyte*[4] data, 397 ref const(int)[4] linesize, 398 const(AVPixFmtDescriptor)* desc, 399 int x, 400 int y, 401 int c, 402 int w); 403 404 /** 405 * Utility function to swap the endianness of a pixel format. 406 * 407 * @param[in] pix_fmt the pixel format 408 * 409 * @return pixel format with swapped endianness if it exists, 410 * otherwise AV_PIX_FMT_NONE 411 */ 412 AVPixelFormat av_pix_fmt_swap_endianness (AVPixelFormat pix_fmt); 413 414 enum FF_LOSS_RESOLUTION = 0x0001; /**< loss due to resolution change */ 415 enum FF_LOSS_DEPTH = 0x0002; /**< loss due to color depth change */ 416 enum FF_LOSS_COLORSPACE = 0x0004; /**< loss due to color space conversion */ 417 enum FF_LOSS_ALPHA = 0x0008; /**< loss of alpha bits */ 418 enum FF_LOSS_COLORQUANT = 0x0010; /**< loss due to color quantization */ 419 enum FF_LOSS_CHROMA = 0x0020; /**< loss of chroma (e.g. RGB to gray conversion) */ 420 421 /** 422 * Compute what kind of losses will occur when converting from one specific 423 * pixel format to another. 424 * When converting from one pixel format to another, information loss may occur. 425 * For example, when converting from RGB24 to GRAY, the color information will 426 * be lost. Similarly, other losses occur when converting from some formats to 427 * other formats. These losses can involve loss of chroma, but also loss of 428 * resolution, loss of color depth, loss due to the color space conversion, loss 429 * of the alpha bits or loss due to color quantization. 430 * av_get_fix_fmt_loss() informs you about the various types of losses 431 * which will occur when converting from one pixel format to another. 432 * 433 * @param[in] dst_pix_fmt destination pixel format 434 * @param[in] src_pix_fmt source pixel format 435 * @param[in] has_alpha Whether the source pixel format alpha channel is used. 436 * @return Combination of flags informing you what kind of losses will occur 437 * (maximum loss for an invalid dst_pix_fmt). 438 */ 439 int av_get_pix_fmt_loss ( 440 AVPixelFormat dst_pix_fmt, 441 AVPixelFormat src_pix_fmt, 442 int has_alpha); 443 444 /** 445 * Compute what kind of losses will occur when converting from one specific 446 * pixel format to another. 447 * When converting from one pixel format to another, information loss may occur. 448 * For example, when converting from RGB24 to GRAY, the color information will 449 * be lost. Similarly, other losses occur when converting from some formats to 450 * other formats. These losses can involve loss of chroma, but also loss of 451 * resolution, loss of color depth, loss due to the color space conversion, loss 452 * of the alpha bits or loss due to color quantization. 453 * av_get_fix_fmt_loss() informs you about the various types of losses 454 * which will occur when converting from one pixel format to another. 455 * 456 * @param[in] dst_pix_fmt destination pixel format 457 * @param[in] src_pix_fmt source pixel format 458 * @param[in] has_alpha Whether the source pixel format alpha channel is used. 459 * @return Combination of flags informing you what kind of losses will occur 460 * (maximum loss for an invalid dst_pix_fmt). 461 */ 462 AVPixelFormat av_find_best_pix_fmt_of_2 ( 463 AVPixelFormat dst_pix_fmt1, 464 AVPixelFormat dst_pix_fmt2, 465 AVPixelFormat src_pix_fmt, 466 int has_alpha, 467 int* loss_ptr); 468 469 /* AVUTIL_PIXDESC_H */