00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include "pixfmt.h"
00025 #include "pixdesc.h"
00026
00027 #include "intreadwrite.h"
00028
00029 void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
00030 const AVPixFmtDescriptor *desc, int x, int y, int c, int w,
00031 int read_pal_component)
00032 {
00033 AVComponentDescriptor comp = desc->comp[c];
00034 int plane = comp.plane;
00035 int depth = comp.depth_minus1 + 1;
00036 int mask = (1 << depth) - 1;
00037 int shift = comp.shift;
00038 int step = comp.step_minus1 + 1;
00039 int flags = desc->flags;
00040
00041 if (flags & PIX_FMT_BITSTREAM) {
00042 int skip = x * step + comp.offset_plus1 - 1;
00043 const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
00044 int shift = 8 - depth - (skip & 7);
00045
00046 while (w--) {
00047 int val = (*p >> shift) & mask;
00048 if (read_pal_component)
00049 val = data[1][4*val + c];
00050 shift -= step;
00051 p -= shift >> 3;
00052 shift &= 7;
00053 *dst++ = val;
00054 }
00055 } else {
00056 const uint8_t *p = data[plane] + y * linesize[plane] + x * step + comp.offset_plus1 - 1;
00057 int is_8bit = shift + depth <= 8;
00058
00059 if (is_8bit)
00060 p += !!(flags & PIX_FMT_BE);
00061
00062 while (w--) {
00063 int val = is_8bit ? *p :
00064 flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
00065 val = (val >> shift) & mask;
00066 if (read_pal_component)
00067 val = data[1][4 * val + c];
00068 p += step;
00069 *dst++ = val;
00070 }
00071 }
00072 }
00073
00074 void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
00075 const AVPixFmtDescriptor *desc, int x, int y, int c, int w)
00076 {
00077 AVComponentDescriptor comp = desc->comp[c];
00078 int plane = comp.plane;
00079 int depth = comp.depth_minus1 + 1;
00080 int step = comp.step_minus1 + 1;
00081 int flags = desc->flags;
00082
00083 if (flags & PIX_FMT_BITSTREAM) {
00084 int skip = x * step + comp.offset_plus1 - 1;
00085 uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
00086 int shift = 8 - depth - (skip & 7);
00087
00088 while (w--) {
00089 *p |= *src++ << shift;
00090 shift -= step;
00091 p -= shift >> 3;
00092 shift &= 7;
00093 }
00094 } else {
00095 int shift = comp.shift;
00096 uint8_t *p = data[plane] + y * linesize[plane] + x * step + comp.offset_plus1 - 1;
00097
00098 if (shift + depth <= 8) {
00099 p += !!(flags & PIX_FMT_BE);
00100 while (w--) {
00101 *p |= (*src++ << shift);
00102 p += step;
00103 }
00104 } else {
00105 while (w--) {
00106 if (flags & PIX_FMT_BE) {
00107 uint16_t val = AV_RB16(p) | (*src++ << shift);
00108 AV_WB16(p, val);
00109 } else {
00110 uint16_t val = AV_RL16(p) | (*src++ << shift);
00111 AV_WL16(p, val);
00112 }
00113 p += step;
00114 }
00115 }
00116 }
00117 }
00118
00119 const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = {
00120 [PIX_FMT_YUV420P] = {
00121 .name = "yuv420p",
00122 .nb_components = 3,
00123 .log2_chroma_w = 1,
00124 .log2_chroma_h = 1,
00125 .comp = {
00126 { 0, 0, 1, 0, 7 },
00127 { 1, 0, 1, 0, 7 },
00128 { 2, 0, 1, 0, 7 },
00129 },
00130 .flags = PIX_FMT_PLANAR,
00131 },
00132 [PIX_FMT_YUYV422] = {
00133 .name = "yuyv422",
00134 .nb_components = 3,
00135 .log2_chroma_w = 1,
00136 .log2_chroma_h = 0,
00137 .comp = {
00138 { 0, 1, 1, 0, 7 },
00139 { 0, 3, 2, 0, 7 },
00140 { 0, 3, 4, 0, 7 },
00141 },
00142 },
00143 [PIX_FMT_RGB24] = {
00144 .name = "rgb24",
00145 .nb_components = 3,
00146 .log2_chroma_w = 0,
00147 .log2_chroma_h = 0,
00148 .comp = {
00149 { 0, 2, 1, 0, 7 },
00150 { 0, 2, 2, 0, 7 },
00151 { 0, 2, 3, 0, 7 },
00152 },
00153 .flags = PIX_FMT_RGB,
00154 },
00155 [PIX_FMT_BGR24] = {
00156 .name = "bgr24",
00157 .nb_components = 3,
00158 .log2_chroma_w = 0,
00159 .log2_chroma_h = 0,
00160 .comp = {
00161 { 0, 2, 1, 0, 7 },
00162 { 0, 2, 2, 0, 7 },
00163 { 0, 2, 3, 0, 7 },
00164 },
00165 .flags = PIX_FMT_RGB,
00166 },
00167 [PIX_FMT_YUV422P] = {
00168 .name = "yuv422p",
00169 .nb_components = 3,
00170 .log2_chroma_w = 1,
00171 .log2_chroma_h = 0,
00172 .comp = {
00173 { 0, 0, 1, 0, 7 },
00174 { 1, 0, 1, 0, 7 },
00175 { 2, 0, 1, 0, 7 },
00176 },
00177 .flags = PIX_FMT_PLANAR,
00178 },
00179 [PIX_FMT_YUV444P] = {
00180 .name = "yuv444p",
00181 .nb_components = 3,
00182 .log2_chroma_w = 0,
00183 .log2_chroma_h = 0,
00184 .comp = {
00185 { 0, 0, 1, 0, 7 },
00186 { 1, 0, 1, 0, 7 },
00187 { 2, 0, 1, 0, 7 },
00188 },
00189 .flags = PIX_FMT_PLANAR,
00190 },
00191 [PIX_FMT_YUV410P] = {
00192 .name = "yuv410p",
00193 .nb_components = 3,
00194 .log2_chroma_w = 2,
00195 .log2_chroma_h = 2,
00196 .comp = {
00197 { 0, 0, 1, 0, 7 },
00198 { 1, 0, 1, 0, 7 },
00199 { 2, 0, 1, 0, 7 },
00200 },
00201 .flags = PIX_FMT_PLANAR,
00202 },
00203 [PIX_FMT_YUV411P] = {
00204 .name = "yuv411p",
00205 .nb_components = 3,
00206 .log2_chroma_w = 2,
00207 .log2_chroma_h = 0,
00208 .comp = {
00209 { 0, 0, 1, 0, 7 },
00210 { 1, 0, 1, 0, 7 },
00211 { 2, 0, 1, 0, 7 },
00212 },
00213 .flags = PIX_FMT_PLANAR,
00214 },
00215 [PIX_FMT_GRAY8] = {
00216 .name = "gray",
00217 .nb_components = 1,
00218 .log2_chroma_w = 0,
00219 .log2_chroma_h = 0,
00220 .comp = {
00221 { 0, 0, 1, 0, 7 },
00222 },
00223 },
00224 [PIX_FMT_MONOWHITE] = {
00225 .name = "monow",
00226 .nb_components = 1,
00227 .log2_chroma_w = 0,
00228 .log2_chroma_h = 0,
00229 .comp = {
00230 { 0, 0, 1, 0, 0 },
00231 },
00232 .flags = PIX_FMT_BITSTREAM,
00233 },
00234 [PIX_FMT_MONOBLACK] = {
00235 .name = "monob",
00236 .nb_components = 1,
00237 .log2_chroma_w = 0,
00238 .log2_chroma_h = 0,
00239 .comp = {
00240 { 0, 0, 1, 7, 0 },
00241 },
00242 .flags = PIX_FMT_BITSTREAM,
00243 },
00244 [PIX_FMT_PAL8] = {
00245 .name = "pal8",
00246 .nb_components = 1,
00247 .log2_chroma_w = 0,
00248 .log2_chroma_h = 0,
00249 .comp = {
00250 { 0, 0, 1, 0, 7 },
00251 },
00252 .flags = PIX_FMT_PAL,
00253 },
00254 [PIX_FMT_YUVJ420P] = {
00255 .name = "yuvj420p",
00256 .nb_components = 3,
00257 .log2_chroma_w = 1,
00258 .log2_chroma_h = 1,
00259 .comp = {
00260 { 0, 0, 1, 0, 7 },
00261 { 1, 0, 1, 0, 7 },
00262 { 2, 0, 1, 0, 7 },
00263 },
00264 .flags = PIX_FMT_PLANAR,
00265 },
00266 [PIX_FMT_YUVJ422P] = {
00267 .name = "yuvj422p",
00268 .nb_components = 3,
00269 .log2_chroma_w = 1,
00270 .log2_chroma_h = 0,
00271 .comp = {
00272 { 0, 0, 1, 0, 7 },
00273 { 1, 0, 1, 0, 7 },
00274 { 2, 0, 1, 0, 7 },
00275 },
00276 .flags = PIX_FMT_PLANAR,
00277 },
00278 [PIX_FMT_YUVJ444P] = {
00279 .name = "yuvj444p",
00280 .nb_components = 3,
00281 .log2_chroma_w = 0,
00282 .log2_chroma_h = 0,
00283 .comp = {
00284 {0, 0, 1, 0, 7},
00285 {1, 0, 1, 0, 7},
00286 {2, 0, 1, 0, 7},
00287 },
00288 .flags = PIX_FMT_PLANAR,
00289 },
00290 [PIX_FMT_XVMC_MPEG2_MC] = {
00291 .name = "xvmcmc",
00292 .flags = PIX_FMT_HWACCEL,
00293 },
00294 [PIX_FMT_XVMC_MPEG2_IDCT] = {
00295 .name = "xvmcidct",
00296 .flags = PIX_FMT_HWACCEL,
00297 },
00298 [PIX_FMT_UYVY422] = {
00299 .name = "uyvy422",
00300 .nb_components = 3,
00301 .log2_chroma_w = 1,
00302 .log2_chroma_h = 0,
00303 .comp = {
00304 { 0, 1, 2, 0, 7 },
00305 { 0, 3, 1, 0, 7 },
00306 { 0, 3, 3, 0, 7 },
00307 },
00308 },
00309 [PIX_FMT_UYYVYY411] = {
00310 .name = "uyyvyy411",
00311 .nb_components = 3,
00312 .log2_chroma_w = 2,
00313 .log2_chroma_h = 0,
00314 .comp = {
00315 { 0, 3, 2, 0, 7 },
00316 { 0, 5, 1, 0, 7 },
00317 { 0, 5, 4, 0, 7 },
00318 },
00319 },
00320 [PIX_FMT_BGR8] = {
00321 .name = "bgr8",
00322 .nb_components = 3,
00323 .log2_chroma_w = 0,
00324 .log2_chroma_h = 0,
00325 .comp = {
00326 { 0, 0, 1, 6, 1 },
00327 { 0, 0, 1, 3, 2 },
00328 { 0, 0, 1, 0, 2 },
00329 },
00330 .flags = PIX_FMT_PAL | PIX_FMT_RGB,
00331 },
00332 [PIX_FMT_BGR4] = {
00333 .name = "bgr4",
00334 .nb_components = 3,
00335 .log2_chroma_w = 0,
00336 .log2_chroma_h = 0,
00337 .comp = {
00338 { 0, 3, 1, 0, 0 },
00339 { 0, 3, 2, 0, 1 },
00340 { 0, 3, 4, 0, 0 },
00341 },
00342 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
00343 },
00344 [PIX_FMT_BGR4_BYTE] = {
00345 .name = "bgr4_byte",
00346 .nb_components = 3,
00347 .log2_chroma_w = 0,
00348 .log2_chroma_h = 0,
00349 .comp = {
00350 { 0, 0, 1, 3, 0 },
00351 { 0, 0, 1, 1, 1 },
00352 { 0, 0, 1, 0, 0 },
00353 },
00354 .flags = PIX_FMT_PAL | PIX_FMT_RGB,
00355 },
00356 [PIX_FMT_RGB8] = {
00357 .name = "rgb8",
00358 .nb_components = 3,
00359 .log2_chroma_w = 0,
00360 .log2_chroma_h = 0,
00361 .comp = {
00362 { 0, 0, 1, 6, 1 },
00363 { 0, 0, 1, 3, 2 },
00364 { 0, 0, 1, 0, 2 },
00365 },
00366 .flags = PIX_FMT_PAL | PIX_FMT_RGB,
00367 },
00368 [PIX_FMT_RGB4] = {
00369 .name = "rgb4",
00370 .nb_components = 3,
00371 .log2_chroma_w = 0,
00372 .log2_chroma_h = 0,
00373 .comp = {
00374 { 0, 3, 1, 0, 0 },
00375 { 0, 3, 2, 0, 1 },
00376 { 0, 3, 4, 0, 0 },
00377 },
00378 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
00379 },
00380 [PIX_FMT_RGB4_BYTE] = {
00381 .name = "rgb4_byte",
00382 .nb_components = 3,
00383 .log2_chroma_w = 0,
00384 .log2_chroma_h = 0,
00385 .comp = {
00386 { 0, 0, 1, 3, 0 },
00387 { 0, 0, 1, 1, 1 },
00388 { 0, 0, 1, 0, 0 },
00389 },
00390 .flags = PIX_FMT_PAL | PIX_FMT_RGB,
00391 },
00392 [PIX_FMT_NV12] = {
00393 .name = "nv12",
00394 .nb_components = 3,
00395 .log2_chroma_w = 1,
00396 .log2_chroma_h = 1,
00397 .comp = {
00398 { 0,0,1,0,7 },
00399 { 1,1,1,0,7 },
00400 { 1,1,2,0,7 },
00401 },
00402 .flags = PIX_FMT_PLANAR,
00403 },
00404 [PIX_FMT_NV21] = {
00405 .name = "nv21",
00406 .nb_components = 3,
00407 .log2_chroma_w = 1,
00408 .log2_chroma_h = 1,
00409 .comp = {
00410 { 0, 0, 1, 0, 7 },
00411 { 1, 1, 1, 0, 7 },
00412 { 1, 1, 2, 0, 7 },
00413 },
00414 .flags = PIX_FMT_PLANAR,
00415 },
00416 [PIX_FMT_ARGB] = {
00417 .name = "argb",
00418 .nb_components = 4,
00419 .log2_chroma_w = 0,
00420 .log2_chroma_h = 0,
00421 .comp = {
00422 { 0, 3, 1, 0, 7 },
00423 { 0, 3, 2, 0, 7 },
00424 { 0, 3, 3, 0, 7 },
00425 { 0, 3, 4, 0, 7 },
00426 },
00427 .flags = PIX_FMT_RGB,
00428 },
00429 [PIX_FMT_RGBA] = {
00430 .name = "rgba",
00431 .nb_components = 4,
00432 .log2_chroma_w = 0,
00433 .log2_chroma_h = 0,
00434 .comp = {
00435 { 0, 3, 1, 0, 7 },
00436 { 0, 3, 2, 0, 7 },
00437 { 0, 3, 3, 0, 7 },
00438 { 0, 3, 4, 0, 7 },
00439 },
00440 .flags = PIX_FMT_RGB,
00441 },
00442 [PIX_FMT_ABGR] = {
00443 .name = "abgr",
00444 .nb_components = 4,
00445 .log2_chroma_w = 0,
00446 .log2_chroma_h = 0,
00447 .comp = {
00448 { 0, 3, 1, 0, 7 },
00449 { 0, 3, 2, 0, 7 },
00450 { 0, 3, 3, 0, 7 },
00451 { 0, 3, 4, 0, 7 },
00452 },
00453 .flags = PIX_FMT_RGB,
00454 },
00455 [PIX_FMT_BGRA] = {
00456 .name = "bgra",
00457 .nb_components = 4,
00458 .log2_chroma_w = 0,
00459 .log2_chroma_h = 0,
00460 .comp = {
00461 { 0, 3, 1, 0, 7 },
00462 { 0, 3, 2, 0, 7 },
00463 { 0, 3, 3, 0, 7 },
00464 { 0, 3, 4, 0, 7 },
00465 },
00466 .flags = PIX_FMT_RGB,
00467 },
00468 [PIX_FMT_GRAY16BE] = {
00469 .name = "gray16be",
00470 .nb_components = 1,
00471 .log2_chroma_w = 0,
00472 .log2_chroma_h = 0,
00473 .comp = {
00474 { 0, 1, 1, 0, 15 },
00475 },
00476 .flags = PIX_FMT_BE,
00477 },
00478 [PIX_FMT_GRAY16LE] = {
00479 .name = "gray16le",
00480 .nb_components = 1,
00481 .log2_chroma_w = 0,
00482 .log2_chroma_h = 0,
00483 .comp = {
00484 { 0, 1, 1, 0, 15 },
00485 },
00486 },
00487 [PIX_FMT_YUV440P] = {
00488 .name = "yuv440p",
00489 .nb_components = 3,
00490 .log2_chroma_w = 0,
00491 .log2_chroma_h = 1,
00492 .comp = {
00493 { 0, 0, 1, 0, 7 },
00494 { 1, 0, 1, 0, 7 },
00495 { 2, 0, 1, 0, 7 },
00496 },
00497 .flags = PIX_FMT_PLANAR,
00498 },
00499 [PIX_FMT_YUVJ440P] = {
00500 .name = "yuvj440p",
00501 .nb_components = 3,
00502 .log2_chroma_w = 0,
00503 .log2_chroma_h = 1,
00504 .comp = {
00505 { 0, 0, 1, 0, 7 },
00506 { 1, 0, 1, 0, 7 },
00507 { 2, 0, 1, 0, 7 },
00508 },
00509 .flags = PIX_FMT_PLANAR,
00510 },
00511 [PIX_FMT_YUVA420P] = {
00512 .name = "yuva420p",
00513 .nb_components = 4,
00514 .log2_chroma_w = 1,
00515 .log2_chroma_h = 1,
00516 .comp = {
00517 { 0, 0, 1, 0, 7 },
00518 { 1, 0, 1, 0, 7 },
00519 { 2, 0, 1, 0, 7 },
00520 { 3, 0, 1, 0, 7 },
00521 },
00522 .flags = PIX_FMT_PLANAR,
00523 },
00524 [PIX_FMT_VDPAU_H264] = {
00525 .name = "vdpau_h264",
00526 .log2_chroma_w = 1,
00527 .log2_chroma_h = 1,
00528 .flags = PIX_FMT_HWACCEL,
00529 },
00530 [PIX_FMT_VDPAU_MPEG1] = {
00531 .name = "vdpau_mpeg1",
00532 .log2_chroma_w = 1,
00533 .log2_chroma_h = 1,
00534 .flags = PIX_FMT_HWACCEL,
00535 },
00536 [PIX_FMT_VDPAU_MPEG2] = {
00537 .name = "vdpau_mpeg2",
00538 .log2_chroma_w = 1,
00539 .log2_chroma_h = 1,
00540 .flags = PIX_FMT_HWACCEL,
00541 },
00542 [PIX_FMT_VDPAU_WMV3] = {
00543 .name = "vdpau_wmv3",
00544 .log2_chroma_w = 1,
00545 .log2_chroma_h = 1,
00546 .flags = PIX_FMT_HWACCEL,
00547 },
00548 [PIX_FMT_VDPAU_VC1] = {
00549 .name = "vdpau_vc1",
00550 .log2_chroma_w = 1,
00551 .log2_chroma_h = 1,
00552 .flags = PIX_FMT_HWACCEL,
00553 },
00554 [PIX_FMT_VDPAU_MPEG4] = {
00555 .name = "vdpau_mpeg4",
00556 .log2_chroma_w = 1,
00557 .log2_chroma_h = 1,
00558 .flags = PIX_FMT_HWACCEL,
00559 },
00560 [PIX_FMT_RGB48BE] = {
00561 .name = "rgb48be",
00562 .nb_components = 3,
00563 .log2_chroma_w = 0,
00564 .log2_chroma_h = 0,
00565 .comp = {
00566 { 0, 5, 1, 0, 15 },
00567 { 0, 5, 3, 0, 15 },
00568 { 0, 5, 5, 0, 15 },
00569 },
00570 .flags = PIX_FMT_RGB | PIX_FMT_BE,
00571 },
00572 [PIX_FMT_RGB48LE] = {
00573 .name = "rgb48le",
00574 .nb_components = 3,
00575 .log2_chroma_w = 0,
00576 .log2_chroma_h = 0,
00577 .comp = {
00578 { 0, 5, 1, 0, 15 },
00579 { 0, 5, 3, 0, 15 },
00580 { 0, 5, 5, 0, 15 },
00581 },
00582 .flags = PIX_FMT_RGB,
00583 },
00584 [PIX_FMT_RGB565BE] = {
00585 .name = "rgb565be",
00586 .nb_components = 3,
00587 .log2_chroma_w = 0,
00588 .log2_chroma_h = 0,
00589 .comp = {
00590 { 0, 1, 0, 3, 4 },
00591 { 0, 1, 1, 5, 5 },
00592 { 0, 1, 1, 0, 4 },
00593 },
00594 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00595 },
00596 [PIX_FMT_RGB565LE] = {
00597 .name = "rgb565le",
00598 .nb_components = 3,
00599 .log2_chroma_w = 0,
00600 .log2_chroma_h = 0,
00601 .comp = {
00602 { 0, 1, 2, 3, 4 },
00603 { 0, 1, 1, 5, 5 },
00604 { 0, 1, 1, 0, 4 },
00605 },
00606 .flags = PIX_FMT_RGB,
00607 },
00608 [PIX_FMT_RGB555BE] = {
00609 .name = "rgb555be",
00610 .nb_components = 3,
00611 .log2_chroma_w = 0,
00612 .log2_chroma_h = 0,
00613 .comp = {
00614 { 0, 1, 0, 2, 4 },
00615 { 0, 1, 1, 5, 4 },
00616 { 0, 1, 1, 0, 4 },
00617 },
00618 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00619 },
00620 [PIX_FMT_RGB555LE] = {
00621 .name = "rgb555le",
00622 .nb_components = 3,
00623 .log2_chroma_w = 0,
00624 .log2_chroma_h = 0,
00625 .comp = {
00626 { 0, 1, 2, 2, 4 },
00627 { 0, 1, 1, 5, 4 },
00628 { 0, 1, 1, 0, 4 },
00629 },
00630 .flags = PIX_FMT_RGB,
00631 },
00632 [PIX_FMT_RGB444BE] = {
00633 .name = "rgb444be",
00634 .nb_components = 3,
00635 .log2_chroma_w = 0,
00636 .log2_chroma_h = 0,
00637 .comp = {
00638 { 0, 1, 0, 0, 3 },
00639 { 0, 1, 1, 4, 3 },
00640 { 0, 1, 1, 0, 3 },
00641 },
00642 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00643 },
00644 [PIX_FMT_RGB444LE] = {
00645 .name = "rgb444le",
00646 .nb_components = 3,
00647 .log2_chroma_w = 0,
00648 .log2_chroma_h = 0,
00649 .comp = {
00650 { 0, 1, 2, 0, 3 },
00651 { 0, 1, 1, 4, 3 },
00652 { 0, 1, 1, 0, 3 },
00653 },
00654 .flags = PIX_FMT_RGB,
00655 },
00656 [PIX_FMT_BGR48BE] = {
00657 .name = "bgr48be",
00658 .nb_components = 3,
00659 .log2_chroma_w = 0,
00660 .log2_chroma_h = 0,
00661 .comp = {
00662 { 0, 5, 1, 0, 15 },
00663 { 0, 5, 3, 0, 15 },
00664 { 0, 5, 5, 0, 15 },
00665 },
00666 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00667 },
00668 [PIX_FMT_BGR48LE] = {
00669 .name = "bgr48le",
00670 .nb_components = 3,
00671 .log2_chroma_w = 0,
00672 .log2_chroma_h = 0,
00673 .comp = {
00674 { 0, 5, 1, 0, 15 },
00675 { 0, 5, 3, 0, 15 },
00676 { 0, 5, 5, 0, 15 },
00677 },
00678 .flags = PIX_FMT_RGB,
00679 },
00680 [PIX_FMT_BGR565BE] = {
00681 .name = "bgr565be",
00682 .nb_components = 3,
00683 .log2_chroma_w = 0,
00684 .log2_chroma_h = 0,
00685 .comp = {
00686 { 0, 1, 0, 3, 4 },
00687 { 0, 1, 1, 5, 5 },
00688 { 0, 1, 1, 0, 4 },
00689 },
00690 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00691 },
00692 [PIX_FMT_BGR565LE] = {
00693 .name = "bgr565le",
00694 .nb_components = 3,
00695 .log2_chroma_w = 0,
00696 .log2_chroma_h = 0,
00697 .comp = {
00698 { 0, 1, 2, 3, 4 },
00699 { 0, 1, 1, 5, 5 },
00700 { 0, 1, 1, 0, 4 },
00701 },
00702 .flags = PIX_FMT_RGB,
00703 },
00704 [PIX_FMT_BGR555BE] = {
00705 .name = "bgr555be",
00706 .nb_components = 3,
00707 .log2_chroma_w = 0,
00708 .log2_chroma_h = 0,
00709 .comp = {
00710 { 0, 1, 0, 2, 4 },
00711 { 0, 1, 1, 5, 4 },
00712 { 0, 1, 1, 0, 4 },
00713 },
00714 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00715 },
00716 [PIX_FMT_BGR555LE] = {
00717 .name = "bgr555le",
00718 .nb_components = 3,
00719 .log2_chroma_w = 0,
00720 .log2_chroma_h = 0,
00721 .comp = {
00722 { 0, 1, 2, 2, 4 },
00723 { 0, 1, 1, 5, 4 },
00724 { 0, 1, 1, 0, 4 },
00725 },
00726 .flags = PIX_FMT_RGB,
00727 },
00728 [PIX_FMT_BGR444BE] = {
00729 .name = "bgr444be",
00730 .nb_components = 3,
00731 .log2_chroma_w = 0,
00732 .log2_chroma_h = 0,
00733 .comp = {
00734 { 0, 1, 0, 0, 3 },
00735 { 0, 1, 1, 4, 3 },
00736 { 0, 1, 1, 0, 3 },
00737 },
00738 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00739 },
00740 [PIX_FMT_BGR444LE] = {
00741 .name = "bgr444le",
00742 .nb_components = 3,
00743 .log2_chroma_w = 0,
00744 .log2_chroma_h = 0,
00745 .comp = {
00746 { 0, 1, 2, 0, 3 },
00747 { 0, 1, 1, 4, 3 },
00748 { 0, 1, 1, 0, 3 },
00749 },
00750 .flags = PIX_FMT_RGB,
00751 },
00752 [PIX_FMT_VAAPI_MOCO] = {
00753 .name = "vaapi_moco",
00754 .log2_chroma_w = 1,
00755 .log2_chroma_h = 1,
00756 .flags = PIX_FMT_HWACCEL,
00757 },
00758 [PIX_FMT_VAAPI_IDCT] = {
00759 .name = "vaapi_idct",
00760 .log2_chroma_w = 1,
00761 .log2_chroma_h = 1,
00762 .flags = PIX_FMT_HWACCEL,
00763 },
00764 [PIX_FMT_VAAPI_VLD] = {
00765 .name = "vaapi_vld",
00766 .log2_chroma_w = 1,
00767 .log2_chroma_h = 1,
00768 .flags = PIX_FMT_HWACCEL,
00769 },
00770 [PIX_FMT_VDA_VLD] = {
00771 .name = "vda_vld",
00772 .log2_chroma_w = 1,
00773 .log2_chroma_h = 1,
00774 .flags = PIX_FMT_HWACCEL,
00775 },
00776 [PIX_FMT_YUV420P9LE] = {
00777 .name = "yuv420p9le",
00778 .nb_components = 3,
00779 .log2_chroma_w = 1,
00780 .log2_chroma_h = 1,
00781 .comp = {
00782 { 0, 1, 1, 0, 8 },
00783 { 1, 1, 1, 0, 8 },
00784 { 2, 1, 1, 0, 8 },
00785 },
00786 .flags = PIX_FMT_PLANAR,
00787 },
00788 [PIX_FMT_YUV420P9BE] = {
00789 .name = "yuv420p9be",
00790 .nb_components = 3,
00791 .log2_chroma_w = 1,
00792 .log2_chroma_h = 1,
00793 .comp = {
00794 { 0, 1, 1, 0, 8 },
00795 { 1, 1, 1, 0, 8 },
00796 { 2, 1, 1, 0, 8 },
00797 },
00798 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00799 },
00800 [PIX_FMT_YUV420P10LE] = {
00801 .name = "yuv420p10le",
00802 .nb_components = 3,
00803 .log2_chroma_w = 1,
00804 .log2_chroma_h = 1,
00805 .comp = {
00806 { 0, 1, 1, 0, 9 },
00807 { 1, 1, 1, 0, 9 },
00808 { 2, 1, 1, 0, 9 },
00809 },
00810 .flags = PIX_FMT_PLANAR,
00811 },
00812 [PIX_FMT_YUV420P10BE] = {
00813 .name = "yuv420p10be",
00814 .nb_components = 3,
00815 .log2_chroma_w = 1,
00816 .log2_chroma_h = 1,
00817 .comp = {
00818 { 0, 1, 1, 0, 9 },
00819 { 1, 1, 1, 0, 9 },
00820 { 2, 1, 1, 0, 9 },
00821 },
00822 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00823 },
00824 [PIX_FMT_YUV420P16LE] = {
00825 .name = "yuv420p16le",
00826 .nb_components = 3,
00827 .log2_chroma_w = 1,
00828 .log2_chroma_h = 1,
00829 .comp = {
00830 { 0, 1, 1, 0, 15 },
00831 { 1, 1, 1, 0, 15 },
00832 { 2, 1, 1, 0, 15 },
00833 },
00834 .flags = PIX_FMT_PLANAR,
00835 },
00836 [PIX_FMT_YUV420P16BE] = {
00837 .name = "yuv420p16be",
00838 .nb_components = 3,
00839 .log2_chroma_w = 1,
00840 .log2_chroma_h = 1,
00841 .comp = {
00842 { 0, 1, 1, 0, 15 },
00843 { 1, 1, 1, 0, 15 },
00844 { 2, 1, 1, 0, 15 },
00845 },
00846 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00847 },
00848 [PIX_FMT_YUV422P9LE] = {
00849 .name = "yuv422p9le",
00850 .nb_components = 3,
00851 .log2_chroma_w = 1,
00852 .log2_chroma_h = 0,
00853 .comp = {
00854 { 0, 1, 1, 0, 8 },
00855 { 1, 1, 1, 0, 8 },
00856 { 2, 1, 1, 0, 8 },
00857 },
00858 .flags = PIX_FMT_PLANAR,
00859 },
00860 [PIX_FMT_YUV422P9BE] = {
00861 .name = "yuv422p9be",
00862 .nb_components = 3,
00863 .log2_chroma_w = 1,
00864 .log2_chroma_h = 0,
00865 .comp = {
00866 {0,1,1,0,8},
00867 {1,1,1,0,8},
00868 {2,1,1,0,8},
00869 },
00870 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00871 },
00872 [PIX_FMT_YUV422P10LE] = {
00873 .name = "yuv422p10le",
00874 .nb_components = 3,
00875 .log2_chroma_w = 1,
00876 .log2_chroma_h = 0,
00877 .comp = {
00878 { 0, 1, 1, 0, 9 },
00879 { 1, 1, 1, 0, 9 },
00880 { 2, 1, 1, 0, 9 },
00881 },
00882 .flags = PIX_FMT_PLANAR,
00883 },
00884 [PIX_FMT_YUV422P10BE] = {
00885 .name = "yuv422p10be",
00886 .nb_components = 3,
00887 .log2_chroma_w = 1,
00888 .log2_chroma_h = 0,
00889 .comp = {
00890 { 0, 1, 1, 0, 9 },
00891 { 1, 1, 1, 0, 9 },
00892 { 2, 1, 1, 0, 9 },
00893 },
00894 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00895 },
00896 [PIX_FMT_YUV422P16LE] = {
00897 .name = "yuv422p16le",
00898 .nb_components = 3,
00899 .log2_chroma_w = 1,
00900 .log2_chroma_h = 0,
00901 .comp = {
00902 { 0, 1, 1, 0, 15 },
00903 { 1, 1, 1, 0, 15 },
00904 { 2, 1, 1, 0, 15 },
00905 },
00906 .flags = PIX_FMT_PLANAR,
00907 },
00908 [PIX_FMT_YUV422P16BE] = {
00909 .name = "yuv422p16be",
00910 .nb_components = 3,
00911 .log2_chroma_w = 1,
00912 .log2_chroma_h = 0,
00913 .comp = {
00914 { 0, 1, 1, 0, 15 },
00915 { 1, 1, 1, 0, 15 },
00916 { 2, 1, 1, 0, 15 },
00917 },
00918 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00919 },
00920 [PIX_FMT_YUV444P16LE] = {
00921 .name = "yuv444p16le",
00922 .nb_components = 3,
00923 .log2_chroma_w = 0,
00924 .log2_chroma_h = 0,
00925 .comp = {
00926 { 0, 1, 1, 0, 15 },
00927 { 1, 1, 1, 0, 15 },
00928 { 2, 1, 1, 0, 15 },
00929 },
00930 .flags = PIX_FMT_PLANAR,
00931 },
00932 [PIX_FMT_YUV444P16BE] = {
00933 .name = "yuv444p16be",
00934 .nb_components = 3,
00935 .log2_chroma_w = 0,
00936 .log2_chroma_h = 0,
00937 .comp = {
00938 { 0, 1, 1, 0, 15 },
00939 { 1, 1, 1, 0, 15 },
00940 { 2, 1, 1, 0, 15 },
00941 },
00942 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00943 },
00944 [PIX_FMT_YUV444P10LE] = {
00945 .name = "yuv444p10le",
00946 .nb_components = 3,
00947 .log2_chroma_w = 0,
00948 .log2_chroma_h = 0,
00949 .comp = {
00950 { 0, 1, 1, 0, 9 },
00951 { 1, 1, 1, 0, 9 },
00952 { 2, 1, 1, 0, 9 },
00953 },
00954 .flags = PIX_FMT_PLANAR,
00955 },
00956 [PIX_FMT_YUV444P10BE] = {
00957 .name = "yuv444p10be",
00958 .nb_components = 3,
00959 .log2_chroma_w = 0,
00960 .log2_chroma_h = 0,
00961 .comp = {
00962 { 0, 1, 1, 0, 9 },
00963 { 1, 1, 1, 0, 9 },
00964 { 2, 1, 1, 0, 9 },
00965 },
00966 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00967 },
00968 [PIX_FMT_YUV444P9LE] = {
00969 .name = "yuv444p9le",
00970 .nb_components = 3,
00971 .log2_chroma_w = 0,
00972 .log2_chroma_h = 0,
00973 .comp = {
00974 { 0, 1, 1, 0, 8 },
00975 { 1, 1, 1, 0, 8 },
00976 { 2, 1, 1, 0, 8 },
00977 },
00978 .flags = PIX_FMT_PLANAR,
00979 },
00980 [PIX_FMT_YUV444P9BE] = {
00981 .name = "yuv444p9be",
00982 .nb_components = 3,
00983 .log2_chroma_w = 0,
00984 .log2_chroma_h = 0,
00985 .comp = {
00986 { 0, 1, 1, 0, 8 },
00987 { 1, 1, 1, 0, 8 },
00988 { 2, 1, 1, 0, 8 },
00989 },
00990 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00991 },
00992 [PIX_FMT_DXVA2_VLD] = {
00993 .name = "dxva2_vld",
00994 .log2_chroma_w = 1,
00995 .log2_chroma_h = 1,
00996 .flags = PIX_FMT_HWACCEL,
00997 },
00998 [PIX_FMT_Y400A] = {
00999 .name = "y400a",
01000 .nb_components = 2,
01001 .comp = {
01002 { 0, 1, 1, 0, 7 },
01003 { 0, 1, 2, 0, 7 },
01004 },
01005 },
01006 [PIX_FMT_GBRP] = {
01007 .name = "gbrp",
01008 .nb_components = 3,
01009 .log2_chroma_w = 0,
01010 .log2_chroma_h = 0,
01011 .comp = {
01012 { 0, 0, 1, 0, 7 },
01013 { 1, 0, 1, 0, 7 },
01014 { 2, 0, 1, 0, 7 },
01015 },
01016 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01017 },
01018 [PIX_FMT_GBRP9LE] = {
01019 .name = "gbrp9le",
01020 .nb_components = 3,
01021 .log2_chroma_w = 0,
01022 .log2_chroma_h = 0,
01023 .comp = {
01024 { 0, 1, 1, 0, 8 },
01025 { 1, 1, 1, 0, 8 },
01026 { 2, 1, 1, 0, 8 },
01027 },
01028 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01029 },
01030 [PIX_FMT_GBRP9BE] = {
01031 .name = "gbrp9be",
01032 .nb_components = 3,
01033 .log2_chroma_w = 0,
01034 .log2_chroma_h = 0,
01035 .comp = {
01036 { 0, 1, 1, 0, 8 },
01037 { 1, 1, 1, 0, 8 },
01038 { 2, 1, 1, 0, 8 },
01039 },
01040 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
01041 },
01042 [PIX_FMT_GBRP10LE] = {
01043 .name = "gbrp10le",
01044 .nb_components = 3,
01045 .log2_chroma_w = 0,
01046 .log2_chroma_h = 0,
01047 .comp = {
01048 { 0, 1, 1, 0, 9 },
01049 { 1, 1, 1, 0, 9 },
01050 { 2, 1, 1, 0, 9 },
01051 },
01052 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01053 },
01054 [PIX_FMT_GBRP10BE] = {
01055 .name = "gbrp10be",
01056 .nb_components = 3,
01057 .log2_chroma_w = 0,
01058 .log2_chroma_h = 0,
01059 .comp = {
01060 { 0, 1, 1, 0, 9 },
01061 { 1, 1, 1, 0, 9 },
01062 { 2, 1, 1, 0, 9 },
01063 },
01064 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
01065 },
01066 [PIX_FMT_GBRP16LE] = {
01067 .name = "gbrp16le",
01068 .nb_components = 3,
01069 .log2_chroma_w = 0,
01070 .log2_chroma_h = 0,
01071 .comp = {
01072 { 0, 1, 1, 0, 15 },
01073 { 1, 1, 1, 0, 15 },
01074 { 2, 1, 1, 0, 15 },
01075 },
01076 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01077 },
01078 [PIX_FMT_GBRP16BE] = {
01079 .name = "gbrp16be",
01080 .nb_components = 3,
01081 .log2_chroma_w = 0,
01082 .log2_chroma_h = 0,
01083 .comp = {
01084 { 0, 1, 1, 0, 15 },
01085 { 1, 1, 1, 0, 15 },
01086 { 2, 1, 1, 0, 15 },
01087 },
01088 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
01089 },
01090 };
01091
01092 static enum PixelFormat get_pix_fmt_internal(const char *name)
01093 {
01094 enum PixelFormat pix_fmt;
01095
01096 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
01097 if (av_pix_fmt_descriptors[pix_fmt].name &&
01098 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
01099 return pix_fmt;
01100
01101 return PIX_FMT_NONE;
01102 }
01103
01104 const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
01105 {
01106 return (unsigned)pix_fmt < PIX_FMT_NB ?
01107 av_pix_fmt_descriptors[pix_fmt].name : NULL;
01108 }
01109
01110 #if HAVE_BIGENDIAN
01111 # define X_NE(be, le) be
01112 #else
01113 # define X_NE(be, le) le
01114 #endif
01115
01116 enum PixelFormat av_get_pix_fmt(const char *name)
01117 {
01118 enum PixelFormat pix_fmt;
01119
01120 if (!strcmp(name, "rgb32"))
01121 name = X_NE("argb", "bgra");
01122 else if (!strcmp(name, "bgr32"))
01123 name = X_NE("abgr", "rgba");
01124
01125 pix_fmt = get_pix_fmt_internal(name);
01126 if (pix_fmt == PIX_FMT_NONE) {
01127 char name2[32];
01128
01129 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
01130 pix_fmt = get_pix_fmt_internal(name2);
01131 }
01132 return pix_fmt;
01133 }
01134
01135 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
01136 {
01137 int c, bits = 0;
01138 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
01139
01140 for (c = 0; c < pixdesc->nb_components; c++) {
01141 int s = c == 1 || c == 2 ? 0 : log2_pixels;
01142 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
01143 }
01144
01145 return bits >> log2_pixels;
01146 }
01147
01148 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
01149 {
01150
01151 if (pix_fmt < 0) {
01152 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
01153 } else {
01154 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
01155 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
01156 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
01157 }
01158
01159 return buf;
01160 }