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, 3, 0, 7 },
00162 { 0, 2, 2, 0, 7 },
00163 { 0, 2, 1, 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 .flags = PIX_FMT_PSEUDOPAL,
00224 },
00225 [PIX_FMT_MONOWHITE] = {
00226 .name = "monow",
00227 .nb_components = 1,
00228 .log2_chroma_w = 0,
00229 .log2_chroma_h = 0,
00230 .comp = {
00231 { 0, 0, 1, 0, 0 },
00232 },
00233 .flags = PIX_FMT_BITSTREAM,
00234 },
00235 [PIX_FMT_MONOBLACK] = {
00236 .name = "monob",
00237 .nb_components = 1,
00238 .log2_chroma_w = 0,
00239 .log2_chroma_h = 0,
00240 .comp = {
00241 { 0, 0, 1, 7, 0 },
00242 },
00243 .flags = PIX_FMT_BITSTREAM,
00244 },
00245 [PIX_FMT_PAL8] = {
00246 .name = "pal8",
00247 .nb_components = 1,
00248 .log2_chroma_w = 0,
00249 .log2_chroma_h = 0,
00250 .comp = {
00251 { 0, 0, 1, 0, 7 },
00252 },
00253 .flags = PIX_FMT_PAL,
00254 },
00255 [PIX_FMT_YUVJ420P] = {
00256 .name = "yuvj420p",
00257 .nb_components = 3,
00258 .log2_chroma_w = 1,
00259 .log2_chroma_h = 1,
00260 .comp = {
00261 { 0, 0, 1, 0, 7 },
00262 { 1, 0, 1, 0, 7 },
00263 { 2, 0, 1, 0, 7 },
00264 },
00265 .flags = PIX_FMT_PLANAR,
00266 },
00267 [PIX_FMT_YUVJ422P] = {
00268 .name = "yuvj422p",
00269 .nb_components = 3,
00270 .log2_chroma_w = 1,
00271 .log2_chroma_h = 0,
00272 .comp = {
00273 { 0, 0, 1, 0, 7 },
00274 { 1, 0, 1, 0, 7 },
00275 { 2, 0, 1, 0, 7 },
00276 },
00277 .flags = PIX_FMT_PLANAR,
00278 },
00279 [PIX_FMT_YUVJ444P] = {
00280 .name = "yuvj444p",
00281 .nb_components = 3,
00282 .log2_chroma_w = 0,
00283 .log2_chroma_h = 0,
00284 .comp = {
00285 { 0, 0, 1, 0, 7 },
00286 { 1, 0, 1, 0, 7 },
00287 { 2, 0, 1, 0, 7 },
00288 },
00289 .flags = PIX_FMT_PLANAR,
00290 },
00291 [PIX_FMT_XVMC_MPEG2_MC] = {
00292 .name = "xvmcmc",
00293 .flags = PIX_FMT_HWACCEL,
00294 },
00295 [PIX_FMT_XVMC_MPEG2_IDCT] = {
00296 .name = "xvmcidct",
00297 .flags = PIX_FMT_HWACCEL,
00298 },
00299 [PIX_FMT_UYVY422] = {
00300 .name = "uyvy422",
00301 .nb_components = 3,
00302 .log2_chroma_w = 1,
00303 .log2_chroma_h = 0,
00304 .comp = {
00305 { 0, 1, 2, 0, 7 },
00306 { 0, 3, 1, 0, 7 },
00307 { 0, 3, 3, 0, 7 },
00308 },
00309 },
00310 [PIX_FMT_UYYVYY411] = {
00311 .name = "uyyvyy411",
00312 .nb_components = 3,
00313 .log2_chroma_w = 2,
00314 .log2_chroma_h = 0,
00315 .comp = {
00316 { 0, 3, 2, 0, 7 },
00317 { 0, 5, 1, 0, 7 },
00318 { 0, 5, 4, 0, 7 },
00319 },
00320 },
00321 [PIX_FMT_BGR8] = {
00322 .name = "bgr8",
00323 .nb_components = 3,
00324 .log2_chroma_w = 0,
00325 .log2_chroma_h = 0,
00326 .comp = {
00327 { 0, 0, 1, 0, 2 },
00328 { 0, 0, 1, 3, 2 },
00329 { 0, 0, 1, 6, 1 },
00330 },
00331 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
00332 },
00333 [PIX_FMT_BGR4] = {
00334 .name = "bgr4",
00335 .nb_components = 3,
00336 .log2_chroma_w = 0,
00337 .log2_chroma_h = 0,
00338 .comp = {
00339 { 0, 3, 4, 0, 0 },
00340 { 0, 3, 2, 0, 1 },
00341 { 0, 3, 1, 0, 0 },
00342 },
00343 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
00344 },
00345 [PIX_FMT_BGR4_BYTE] = {
00346 .name = "bgr4_byte",
00347 .nb_components = 3,
00348 .log2_chroma_w = 0,
00349 .log2_chroma_h = 0,
00350 .comp = {
00351 { 0, 0, 1, 0, 0 },
00352 { 0, 0, 1, 1, 1 },
00353 { 0, 0, 1, 3, 0 },
00354 },
00355 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
00356 },
00357 [PIX_FMT_RGB8] = {
00358 .name = "rgb8",
00359 .nb_components = 3,
00360 .log2_chroma_w = 0,
00361 .log2_chroma_h = 0,
00362 .comp = {
00363 { 0, 0, 1, 6, 1 },
00364 { 0, 0, 1, 3, 2 },
00365 { 0, 0, 1, 0, 2 },
00366 },
00367 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
00368 },
00369 [PIX_FMT_RGB4] = {
00370 .name = "rgb4",
00371 .nb_components = 3,
00372 .log2_chroma_w = 0,
00373 .log2_chroma_h = 0,
00374 .comp = {
00375 { 0, 3, 1, 0, 0 },
00376 { 0, 3, 2, 0, 1 },
00377 { 0, 3, 4, 0, 0 },
00378 },
00379 .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
00380 },
00381 [PIX_FMT_RGB4_BYTE] = {
00382 .name = "rgb4_byte",
00383 .nb_components = 3,
00384 .log2_chroma_w = 0,
00385 .log2_chroma_h = 0,
00386 .comp = {
00387 { 0, 0, 1, 3, 0 },
00388 { 0, 0, 1, 1, 1 },
00389 { 0, 0, 1, 0, 0 },
00390 },
00391 .flags = PIX_FMT_RGB | PIX_FMT_PSEUDOPAL,
00392 },
00393 [PIX_FMT_NV12] = {
00394 .name = "nv12",
00395 .nb_components = 3,
00396 .log2_chroma_w = 1,
00397 .log2_chroma_h = 1,
00398 .comp = {
00399 { 0, 0, 1, 0, 7 },
00400 { 1, 1, 1, 0, 7 },
00401 { 1, 1, 2, 0, 7 },
00402 },
00403 .flags = PIX_FMT_PLANAR,
00404 },
00405 [PIX_FMT_NV21] = {
00406 .name = "nv21",
00407 .nb_components = 3,
00408 .log2_chroma_w = 1,
00409 .log2_chroma_h = 1,
00410 .comp = {
00411 { 0, 0, 1, 0, 7 },
00412 { 1, 1, 2, 0, 7 },
00413 { 1, 1, 1, 0, 7 },
00414 },
00415 .flags = PIX_FMT_PLANAR,
00416 },
00417 [PIX_FMT_ARGB] = {
00418 .name = "argb",
00419 .nb_components = 4,
00420 .log2_chroma_w = 0,
00421 .log2_chroma_h = 0,
00422 .comp = {
00423 { 0, 3, 2, 0, 7 },
00424 { 0, 3, 3, 0, 7 },
00425 { 0, 3, 4, 0, 7 },
00426 { 0, 3, 1, 0, 7 },
00427 },
00428 .flags = PIX_FMT_RGB,
00429 },
00430 [PIX_FMT_RGBA] = {
00431 .name = "rgba",
00432 .nb_components = 4,
00433 .log2_chroma_w = 0,
00434 .log2_chroma_h = 0,
00435 .comp = {
00436 { 0, 3, 1, 0, 7 },
00437 { 0, 3, 2, 0, 7 },
00438 { 0, 3, 3, 0, 7 },
00439 { 0, 3, 4, 0, 7 },
00440 },
00441 .flags = PIX_FMT_RGB,
00442 },
00443 [PIX_FMT_ABGR] = {
00444 .name = "abgr",
00445 .nb_components = 4,
00446 .log2_chroma_w = 0,
00447 .log2_chroma_h = 0,
00448 .comp = {
00449 { 0, 3, 4, 0, 7 },
00450 { 0, 3, 3, 0, 7 },
00451 { 0, 3, 2, 0, 7 },
00452 { 0, 3, 1, 0, 7 },
00453 },
00454 .flags = PIX_FMT_RGB,
00455 },
00456 [PIX_FMT_BGRA] = {
00457 .name = "bgra",
00458 .nb_components = 4,
00459 .log2_chroma_w = 0,
00460 .log2_chroma_h = 0,
00461 .comp = {
00462 { 0, 3, 3, 0, 7 },
00463 { 0, 3, 2, 0, 7 },
00464 { 0, 3, 1, 0, 7 },
00465 { 0, 3, 4, 0, 7 },
00466 },
00467 .flags = PIX_FMT_RGB,
00468 },
00469 [PIX_FMT_0RGB] = {
00470 .name = "0rgb",
00471 .nb_components= 3,
00472 .log2_chroma_w= 0,
00473 .log2_chroma_h= 0,
00474 .comp = {
00475 { 0, 3, 2, 0, 7 },
00476 { 0, 3, 3, 0, 7 },
00477 { 0, 3, 4, 0, 7 },
00478 },
00479 .flags = PIX_FMT_RGB,
00480 },
00481 [PIX_FMT_RGB0] = {
00482 .name = "rgb0",
00483 .nb_components= 3,
00484 .log2_chroma_w= 0,
00485 .log2_chroma_h= 0,
00486 .comp = {
00487 { 0, 3, 1, 0, 7 },
00488 { 0, 3, 2, 0, 7 },
00489 { 0, 3, 3, 0, 7 },
00490 { 0, 3, 4, 0, 7 },
00491 },
00492 .flags = PIX_FMT_RGB,
00493 },
00494 [PIX_FMT_0BGR] = {
00495 .name = "0bgr",
00496 .nb_components= 3,
00497 .log2_chroma_w= 0,
00498 .log2_chroma_h= 0,
00499 .comp = {
00500 { 0, 3, 4, 0, 7 },
00501 { 0, 3, 3, 0, 7 },
00502 { 0, 3, 2, 0, 7 },
00503 },
00504 .flags = PIX_FMT_RGB,
00505 },
00506 [PIX_FMT_BGR0] = {
00507 .name = "bgr0",
00508 .nb_components= 3,
00509 .log2_chroma_w= 0,
00510 .log2_chroma_h= 0,
00511 .comp = {
00512 { 0, 3, 3, 0, 7 },
00513 { 0, 3, 2, 0, 7 },
00514 { 0, 3, 1, 0, 7 },
00515 { 0, 3, 4, 0, 7 },
00516 },
00517 .flags = PIX_FMT_RGB,
00518 },
00519 [PIX_FMT_GRAY16BE] = {
00520 .name = "gray16be",
00521 .nb_components = 1,
00522 .log2_chroma_w = 0,
00523 .log2_chroma_h = 0,
00524 .comp = {
00525 { 0, 1, 1, 0, 15 },
00526 },
00527 .flags = PIX_FMT_BE,
00528 },
00529 [PIX_FMT_GRAY16LE] = {
00530 .name = "gray16le",
00531 .nb_components = 1,
00532 .log2_chroma_w = 0,
00533 .log2_chroma_h = 0,
00534 .comp = {
00535 { 0, 1, 1, 0, 15 },
00536 },
00537 },
00538 [PIX_FMT_YUV440P] = {
00539 .name = "yuv440p",
00540 .nb_components = 3,
00541 .log2_chroma_w = 0,
00542 .log2_chroma_h = 1,
00543 .comp = {
00544 { 0, 0, 1, 0, 7 },
00545 { 1, 0, 1, 0, 7 },
00546 { 2, 0, 1, 0, 7 },
00547 },
00548 .flags = PIX_FMT_PLANAR,
00549 },
00550 [PIX_FMT_YUVJ440P] = {
00551 .name = "yuvj440p",
00552 .nb_components = 3,
00553 .log2_chroma_w = 0,
00554 .log2_chroma_h = 1,
00555 .comp = {
00556 { 0, 0, 1, 0, 7 },
00557 { 1, 0, 1, 0, 7 },
00558 { 2, 0, 1, 0, 7 },
00559 },
00560 .flags = PIX_FMT_PLANAR,
00561 },
00562 [PIX_FMT_YUVA420P] = {
00563 .name = "yuva420p",
00564 .nb_components = 4,
00565 .log2_chroma_w = 1,
00566 .log2_chroma_h = 1,
00567 .comp = {
00568 { 0, 0, 1, 0, 7 },
00569 { 1, 0, 1, 0, 7 },
00570 { 2, 0, 1, 0, 7 },
00571 { 3, 0, 1, 0, 7 },
00572 },
00573 .flags = PIX_FMT_PLANAR,
00574 },
00575 [PIX_FMT_YUVA422P] = {
00576 .name = "yuva422p",
00577 .nb_components = 4,
00578 .log2_chroma_w = 1,
00579 .log2_chroma_h = 0,
00580 .comp = {
00581 { 0, 0, 1, 0, 7 },
00582 { 1, 0, 1, 0, 7 },
00583 { 2, 0, 1, 0, 7 },
00584 { 3, 0, 1, 0, 7 },
00585 },
00586 .flags = PIX_FMT_PLANAR,
00587 },
00588 [PIX_FMT_YUVA444P] = {
00589 .name = "yuva444p",
00590 .nb_components = 4,
00591 .log2_chroma_w = 0,
00592 .log2_chroma_h = 0,
00593 .comp = {
00594 { 0, 0, 1, 0, 7 },
00595 { 1, 0, 1, 0, 7 },
00596 { 2, 0, 1, 0, 7 },
00597 { 3, 0, 1, 0, 7 },
00598 },
00599 .flags = PIX_FMT_PLANAR,
00600 },
00601 [PIX_FMT_VDPAU_H264] = {
00602 .name = "vdpau_h264",
00603 .log2_chroma_w = 1,
00604 .log2_chroma_h = 1,
00605 .flags = PIX_FMT_HWACCEL,
00606 },
00607 [PIX_FMT_VDPAU_MPEG1] = {
00608 .name = "vdpau_mpeg1",
00609 .log2_chroma_w = 1,
00610 .log2_chroma_h = 1,
00611 .flags = PIX_FMT_HWACCEL,
00612 },
00613 [PIX_FMT_VDPAU_MPEG2] = {
00614 .name = "vdpau_mpeg2",
00615 .log2_chroma_w = 1,
00616 .log2_chroma_h = 1,
00617 .flags = PIX_FMT_HWACCEL,
00618 },
00619 [PIX_FMT_VDPAU_WMV3] = {
00620 .name = "vdpau_wmv3",
00621 .log2_chroma_w = 1,
00622 .log2_chroma_h = 1,
00623 .flags = PIX_FMT_HWACCEL,
00624 },
00625 [PIX_FMT_VDPAU_VC1] = {
00626 .name = "vdpau_vc1",
00627 .log2_chroma_w = 1,
00628 .log2_chroma_h = 1,
00629 .flags = PIX_FMT_HWACCEL,
00630 },
00631 [PIX_FMT_VDPAU_MPEG4] = {
00632 .name = "vdpau_mpeg4",
00633 .log2_chroma_w = 1,
00634 .log2_chroma_h = 1,
00635 .flags = PIX_FMT_HWACCEL,
00636 },
00637 [PIX_FMT_RGB48BE] = {
00638 .name = "rgb48be",
00639 .nb_components = 3,
00640 .log2_chroma_w = 0,
00641 .log2_chroma_h = 0,
00642 .comp = {
00643 { 0, 5, 1, 0, 15 },
00644 { 0, 5, 3, 0, 15 },
00645 { 0, 5, 5, 0, 15 },
00646 },
00647 .flags = PIX_FMT_RGB | PIX_FMT_BE,
00648 },
00649 [PIX_FMT_RGB48LE] = {
00650 .name = "rgb48le",
00651 .nb_components = 3,
00652 .log2_chroma_w = 0,
00653 .log2_chroma_h = 0,
00654 .comp = {
00655 { 0, 5, 1, 0, 15 },
00656 { 0, 5, 3, 0, 15 },
00657 { 0, 5, 5, 0, 15 },
00658 },
00659 .flags = PIX_FMT_RGB,
00660 },
00661 [PIX_FMT_RGBA64BE] = {
00662 .name = "rgba64be",
00663 .nb_components= 4,
00664 .log2_chroma_w= 0,
00665 .log2_chroma_h= 0,
00666 .comp = {
00667 { 0, 7, 1, 0, 15 },
00668 { 0, 7, 3, 0, 15 },
00669 { 0, 7, 5, 0, 15 },
00670 { 0, 7, 7, 0, 15 },
00671 },
00672 .flags = PIX_FMT_RGB | PIX_FMT_BE,
00673 },
00674 [PIX_FMT_RGBA64LE] = {
00675 .name = "rgba64le",
00676 .nb_components= 4,
00677 .log2_chroma_w= 0,
00678 .log2_chroma_h= 0,
00679 .comp = {
00680 { 0, 7, 1, 0, 15 },
00681 { 0, 7, 3, 0, 15 },
00682 { 0, 7, 5, 0, 15 },
00683 { 0, 7, 7, 0, 15 },
00684 },
00685 .flags = PIX_FMT_RGB,
00686 },
00687 [PIX_FMT_RGB565BE] = {
00688 .name = "rgb565be",
00689 .nb_components = 3,
00690 .log2_chroma_w = 0,
00691 .log2_chroma_h = 0,
00692 .comp = {
00693 { 0, 1, 0, 3, 4 },
00694 { 0, 1, 1, 5, 5 },
00695 { 0, 1, 1, 0, 4 },
00696 },
00697 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00698 },
00699 [PIX_FMT_RGB565LE] = {
00700 .name = "rgb565le",
00701 .nb_components = 3,
00702 .log2_chroma_w = 0,
00703 .log2_chroma_h = 0,
00704 .comp = {
00705 { 0, 1, 2, 3, 4 },
00706 { 0, 1, 1, 5, 5 },
00707 { 0, 1, 1, 0, 4 },
00708 },
00709 .flags = PIX_FMT_RGB,
00710 },
00711 [PIX_FMT_RGB555BE] = {
00712 .name = "rgb555be",
00713 .nb_components = 3,
00714 .log2_chroma_w = 0,
00715 .log2_chroma_h = 0,
00716 .comp = {
00717 { 0, 1, 0, 2, 4 },
00718 { 0, 1, 1, 5, 4 },
00719 { 0, 1, 1, 0, 4 },
00720 },
00721 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00722 },
00723 [PIX_FMT_RGB555LE] = {
00724 .name = "rgb555le",
00725 .nb_components = 3,
00726 .log2_chroma_w = 0,
00727 .log2_chroma_h = 0,
00728 .comp = {
00729 { 0, 1, 2, 2, 4 },
00730 { 0, 1, 1, 5, 4 },
00731 { 0, 1, 1, 0, 4 },
00732 },
00733 .flags = PIX_FMT_RGB,
00734 },
00735 [PIX_FMT_RGB444BE] = {
00736 .name = "rgb444be",
00737 .nb_components = 3,
00738 .log2_chroma_w = 0,
00739 .log2_chroma_h = 0,
00740 .comp = {
00741 { 0, 1, 0, 0, 3 },
00742 { 0, 1, 1, 4, 3 },
00743 { 0, 1, 1, 0, 3 },
00744 },
00745 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00746 },
00747 [PIX_FMT_RGB444LE] = {
00748 .name = "rgb444le",
00749 .nb_components = 3,
00750 .log2_chroma_w = 0,
00751 .log2_chroma_h = 0,
00752 .comp = {
00753 { 0, 1, 2, 0, 3 },
00754 { 0, 1, 1, 4, 3 },
00755 { 0, 1, 1, 0, 3 },
00756 },
00757 .flags = PIX_FMT_RGB,
00758 },
00759 [PIX_FMT_BGR48BE] = {
00760 .name = "bgr48be",
00761 .nb_components = 3,
00762 .log2_chroma_w = 0,
00763 .log2_chroma_h = 0,
00764 .comp = {
00765 { 0, 5, 5, 0, 15 },
00766 { 0, 5, 3, 0, 15 },
00767 { 0, 5, 1, 0, 15 },
00768 },
00769 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00770 },
00771 [PIX_FMT_BGR48LE] = {
00772 .name = "bgr48le",
00773 .nb_components = 3,
00774 .log2_chroma_w = 0,
00775 .log2_chroma_h = 0,
00776 .comp = {
00777 { 0, 5, 5, 0, 15 },
00778 { 0, 5, 3, 0, 15 },
00779 { 0, 5, 1, 0, 15 },
00780 },
00781 .flags = PIX_FMT_RGB,
00782 },
00783 [PIX_FMT_BGRA64BE] = {
00784 .name = "bgra64be",
00785 .nb_components= 4,
00786 .log2_chroma_w= 0,
00787 .log2_chroma_h= 0,
00788 .comp = {
00789 { 0, 7, 5, 0, 15 },
00790 { 0, 7, 3, 0, 15 },
00791 { 0, 7, 1, 0, 15 },
00792 { 0, 7, 7, 0, 15 },
00793 },
00794 .flags = PIX_FMT_BE,
00795 },
00796 [PIX_FMT_BGRA64LE] = {
00797 .name = "bgra64le",
00798 .nb_components= 4,
00799 .log2_chroma_w= 0,
00800 .log2_chroma_h= 0,
00801 .comp = {
00802 { 0, 7, 5, 0, 15 },
00803 { 0, 7, 3, 0, 15 },
00804 { 0, 7, 1, 0, 15 },
00805 { 0, 7, 7, 0, 15 },
00806 },
00807 },
00808 [PIX_FMT_BGR565BE] = {
00809 .name = "bgr565be",
00810 .nb_components = 3,
00811 .log2_chroma_w = 0,
00812 .log2_chroma_h = 0,
00813 .comp = {
00814 { 0, 1, 1, 0, 4 },
00815 { 0, 1, 1, 5, 5 },
00816 { 0, 1, 0, 3, 4 },
00817 },
00818 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00819 },
00820 [PIX_FMT_BGR565LE] = {
00821 .name = "bgr565le",
00822 .nb_components = 3,
00823 .log2_chroma_w = 0,
00824 .log2_chroma_h = 0,
00825 .comp = {
00826 { 0, 1, 1, 0, 4 },
00827 { 0, 1, 1, 5, 5 },
00828 { 0, 1, 2, 3, 4 },
00829 },
00830 .flags = PIX_FMT_RGB,
00831 },
00832 [PIX_FMT_BGR555BE] = {
00833 .name = "bgr555be",
00834 .nb_components = 3,
00835 .log2_chroma_w = 0,
00836 .log2_chroma_h = 0,
00837 .comp = {
00838 { 0, 1, 1, 0, 4 },
00839 { 0, 1, 1, 5, 4 },
00840 { 0, 1, 0, 2, 4 },
00841 },
00842 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00843 },
00844 [PIX_FMT_BGR555LE] = {
00845 .name = "bgr555le",
00846 .nb_components = 3,
00847 .log2_chroma_w = 0,
00848 .log2_chroma_h = 0,
00849 .comp = {
00850 { 0, 1, 1, 0, 4 },
00851 { 0, 1, 1, 5, 4 },
00852 { 0, 1, 2, 2, 4 },
00853 },
00854 .flags = PIX_FMT_RGB,
00855 },
00856 [PIX_FMT_BGR444BE] = {
00857 .name = "bgr444be",
00858 .nb_components = 3,
00859 .log2_chroma_w = 0,
00860 .log2_chroma_h = 0,
00861 .comp = {
00862 { 0, 1, 1, 0, 3 },
00863 { 0, 1, 1, 4, 3 },
00864 { 0, 1, 0, 0, 3 },
00865 },
00866 .flags = PIX_FMT_BE | PIX_FMT_RGB,
00867 },
00868 [PIX_FMT_BGR444LE] = {
00869 .name = "bgr444le",
00870 .nb_components = 3,
00871 .log2_chroma_w = 0,
00872 .log2_chroma_h = 0,
00873 .comp = {
00874 { 0, 1, 1, 0, 3 },
00875 { 0, 1, 1, 4, 3 },
00876 { 0, 1, 2, 0, 3 },
00877 },
00878 .flags = PIX_FMT_RGB,
00879 },
00880 [PIX_FMT_VAAPI_MOCO] = {
00881 .name = "vaapi_moco",
00882 .log2_chroma_w = 1,
00883 .log2_chroma_h = 1,
00884 .flags = PIX_FMT_HWACCEL,
00885 },
00886 [PIX_FMT_VAAPI_IDCT] = {
00887 .name = "vaapi_idct",
00888 .log2_chroma_w = 1,
00889 .log2_chroma_h = 1,
00890 .flags = PIX_FMT_HWACCEL,
00891 },
00892 [PIX_FMT_VAAPI_VLD] = {
00893 .name = "vaapi_vld",
00894 .log2_chroma_w = 1,
00895 .log2_chroma_h = 1,
00896 .flags = PIX_FMT_HWACCEL,
00897 },
00898 [PIX_FMT_YUV420P9LE] = {
00899 .name = "yuv420p9le",
00900 .nb_components = 3,
00901 .log2_chroma_w = 1,
00902 .log2_chroma_h = 1,
00903 .comp = {
00904 { 0, 1, 1, 0, 8 },
00905 { 1, 1, 1, 0, 8 },
00906 { 2, 1, 1, 0, 8 },
00907 },
00908 .flags = PIX_FMT_PLANAR,
00909 },
00910 [PIX_FMT_YUV420P9BE] = {
00911 .name = "yuv420p9be",
00912 .nb_components = 3,
00913 .log2_chroma_w = 1,
00914 .log2_chroma_h = 1,
00915 .comp = {
00916 { 0, 1, 1, 0, 8 },
00917 { 1, 1, 1, 0, 8 },
00918 { 2, 1, 1, 0, 8 },
00919 },
00920 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00921 },
00922 [PIX_FMT_YUV420P10LE] = {
00923 .name = "yuv420p10le",
00924 .nb_components = 3,
00925 .log2_chroma_w = 1,
00926 .log2_chroma_h = 1,
00927 .comp = {
00928 { 0, 1, 1, 0, 9 },
00929 { 1, 1, 1, 0, 9 },
00930 { 2, 1, 1, 0, 9 },
00931 },
00932 .flags = PIX_FMT_PLANAR,
00933 },
00934 [PIX_FMT_YUV420P10BE] = {
00935 .name = "yuv420p10be",
00936 .nb_components = 3,
00937 .log2_chroma_w = 1,
00938 .log2_chroma_h = 1,
00939 .comp = {
00940 { 0, 1, 1, 0, 9 },
00941 { 1, 1, 1, 0, 9 },
00942 { 2, 1, 1, 0, 9 },
00943 },
00944 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00945 },
00946 [PIX_FMT_YUV420P16LE] = {
00947 .name = "yuv420p16le",
00948 .nb_components = 3,
00949 .log2_chroma_w = 1,
00950 .log2_chroma_h = 1,
00951 .comp = {
00952 { 0, 1, 1, 0, 15 },
00953 { 1, 1, 1, 0, 15 },
00954 { 2, 1, 1, 0, 15 },
00955 },
00956 .flags = PIX_FMT_PLANAR,
00957 },
00958 [PIX_FMT_YUV420P16BE] = {
00959 .name = "yuv420p16be",
00960 .nb_components = 3,
00961 .log2_chroma_w = 1,
00962 .log2_chroma_h = 1,
00963 .comp = {
00964 { 0, 1, 1, 0, 15 },
00965 { 1, 1, 1, 0, 15 },
00966 { 2, 1, 1, 0, 15 },
00967 },
00968 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00969 },
00970 [PIX_FMT_YUV422P9LE] = {
00971 .name = "yuv422p9le",
00972 .nb_components = 3,
00973 .log2_chroma_w = 1,
00974 .log2_chroma_h = 0,
00975 .comp = {
00976 { 0, 1, 1, 0, 8 },
00977 { 1, 1, 1, 0, 8 },
00978 { 2, 1, 1, 0, 8 },
00979 },
00980 .flags = PIX_FMT_PLANAR,
00981 },
00982 [PIX_FMT_YUV422P9BE] = {
00983 .name = "yuv422p9be",
00984 .nb_components = 3,
00985 .log2_chroma_w = 1,
00986 .log2_chroma_h = 0,
00987 .comp = {
00988 { 0, 1, 1, 0, 8 },
00989 { 1, 1, 1, 0, 8 },
00990 { 2, 1, 1, 0, 8 },
00991 },
00992 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
00993 },
00994 [PIX_FMT_YUV422P10LE] = {
00995 .name = "yuv422p10le",
00996 .nb_components = 3,
00997 .log2_chroma_w = 1,
00998 .log2_chroma_h = 0,
00999 .comp = {
01000 { 0, 1, 1, 0, 9 },
01001 { 1, 1, 1, 0, 9 },
01002 { 2, 1, 1, 0, 9 },
01003 },
01004 .flags = PIX_FMT_PLANAR,
01005 },
01006 [PIX_FMT_YUV422P10BE] = {
01007 .name = "yuv422p10be",
01008 .nb_components = 3,
01009 .log2_chroma_w = 1,
01010 .log2_chroma_h = 0,
01011 .comp = {
01012 { 0, 1, 1, 0, 9 },
01013 { 1, 1, 1, 0, 9 },
01014 { 2, 1, 1, 0, 9 },
01015 },
01016 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
01017 },
01018 [PIX_FMT_YUV422P16LE] = {
01019 .name = "yuv422p16le",
01020 .nb_components = 3,
01021 .log2_chroma_w = 1,
01022 .log2_chroma_h = 0,
01023 .comp = {
01024 { 0, 1, 1, 0, 15 },
01025 { 1, 1, 1, 0, 15 },
01026 { 2, 1, 1, 0, 15 },
01027 },
01028 .flags = PIX_FMT_PLANAR,
01029 },
01030 [PIX_FMT_YUV422P16BE] = {
01031 .name = "yuv422p16be",
01032 .nb_components = 3,
01033 .log2_chroma_w = 1,
01034 .log2_chroma_h = 0,
01035 .comp = {
01036 { 0, 1, 1, 0, 15 },
01037 { 1, 1, 1, 0, 15 },
01038 { 2, 1, 1, 0, 15 },
01039 },
01040 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
01041 },
01042 [PIX_FMT_YUV444P16LE] = {
01043 .name = "yuv444p16le",
01044 .nb_components = 3,
01045 .log2_chroma_w = 0,
01046 .log2_chroma_h = 0,
01047 .comp = {
01048 { 0, 1, 1, 0, 15 },
01049 { 1, 1, 1, 0, 15 },
01050 { 2, 1, 1, 0, 15 },
01051 },
01052 .flags = PIX_FMT_PLANAR,
01053 },
01054 [PIX_FMT_YUV444P16BE] = {
01055 .name = "yuv444p16be",
01056 .nb_components = 3,
01057 .log2_chroma_w = 0,
01058 .log2_chroma_h = 0,
01059 .comp = {
01060 { 0, 1, 1, 0, 15 },
01061 { 1, 1, 1, 0, 15 },
01062 { 2, 1, 1, 0, 15 },
01063 },
01064 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
01065 },
01066 [PIX_FMT_YUV444P10LE] = {
01067 .name = "yuv444p10le",
01068 .nb_components = 3,
01069 .log2_chroma_w = 0,
01070 .log2_chroma_h = 0,
01071 .comp = {
01072 { 0, 1, 1, 0, 9 },
01073 { 1, 1, 1, 0, 9 },
01074 { 2, 1, 1, 0, 9 },
01075 },
01076 .flags = PIX_FMT_PLANAR,
01077 },
01078 [PIX_FMT_YUV444P10BE] = {
01079 .name = "yuv444p10be",
01080 .nb_components = 3,
01081 .log2_chroma_w = 0,
01082 .log2_chroma_h = 0,
01083 .comp = {
01084 { 0, 1, 1, 0, 9 },
01085 { 1, 1, 1, 0, 9 },
01086 { 2, 1, 1, 0, 9 },
01087 },
01088 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
01089 },
01090 [PIX_FMT_YUV444P9LE] = {
01091 .name = "yuv444p9le",
01092 .nb_components = 3,
01093 .log2_chroma_w = 0,
01094 .log2_chroma_h = 0,
01095 .comp = {
01096 { 0, 1, 1, 0, 8 },
01097 { 1, 1, 1, 0, 8 },
01098 { 2, 1, 1, 0, 8 },
01099 },
01100 .flags = PIX_FMT_PLANAR,
01101 },
01102 [PIX_FMT_YUV444P9BE] = {
01103 .name = "yuv444p9be",
01104 .nb_components = 3,
01105 .log2_chroma_w = 0,
01106 .log2_chroma_h = 0,
01107 .comp = {
01108 { 0, 1, 1, 0, 8 },
01109 { 1, 1, 1, 0, 8 },
01110 { 2, 1, 1, 0, 8 },
01111 },
01112 .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
01113 },
01114 [PIX_FMT_DXVA2_VLD] = {
01115 .name = "dxva2_vld",
01116 .log2_chroma_w = 1,
01117 .log2_chroma_h = 1,
01118 .flags = PIX_FMT_HWACCEL,
01119 },
01120 [PIX_FMT_VDA_VLD] = {
01121 .name = "vda_vld",
01122 .log2_chroma_w = 1,
01123 .log2_chroma_h = 1,
01124 .flags = PIX_FMT_HWACCEL,
01125 },
01126 [PIX_FMT_GRAY8A] = {
01127 .name = "gray8a",
01128 .nb_components = 2,
01129 .comp = {
01130 { 0, 1, 1, 0, 7 },
01131 { 0, 1, 2, 0, 7 },
01132 },
01133 },
01134 [PIX_FMT_GBRP] = {
01135 .name = "gbrp",
01136 .nb_components = 3,
01137 .log2_chroma_w = 0,
01138 .log2_chroma_h = 0,
01139 .comp = {
01140 { 2, 0, 1, 0, 7 },
01141 { 0, 0, 1, 0, 7 },
01142 { 1, 0, 1, 0, 7 },
01143 },
01144 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01145 },
01146 [PIX_FMT_GBRP9LE] = {
01147 .name = "gbrp9le",
01148 .nb_components = 3,
01149 .log2_chroma_w = 0,
01150 .log2_chroma_h = 0,
01151 .comp = {
01152 { 2, 1, 1, 0, 8 },
01153 { 0, 1, 1, 0, 8 },
01154 { 1, 1, 1, 0, 8 },
01155 },
01156 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01157 },
01158 [PIX_FMT_GBRP9BE] = {
01159 .name = "gbrp9be",
01160 .nb_components = 3,
01161 .log2_chroma_w = 0,
01162 .log2_chroma_h = 0,
01163 .comp = {
01164 { 2, 1, 1, 0, 8 },
01165 { 0, 1, 1, 0, 8 },
01166 { 1, 1, 1, 0, 8 },
01167 },
01168 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
01169 },
01170 [PIX_FMT_GBRP10LE] = {
01171 .name = "gbrp10le",
01172 .nb_components = 3,
01173 .log2_chroma_w = 0,
01174 .log2_chroma_h = 0,
01175 .comp = {
01176 { 2, 1, 1, 0, 9 },
01177 { 0, 1, 1, 0, 9 },
01178 { 1, 1, 1, 0, 9 },
01179 },
01180 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01181 },
01182 [PIX_FMT_GBRP10BE] = {
01183 .name = "gbrp10be",
01184 .nb_components = 3,
01185 .log2_chroma_w = 0,
01186 .log2_chroma_h = 0,
01187 .comp = {
01188 { 2, 1, 1, 0, 9 },
01189 { 0, 1, 1, 0, 9 },
01190 { 1, 1, 1, 0, 9 },
01191 },
01192 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
01193 },
01194 [PIX_FMT_GBRP16LE] = {
01195 .name = "gbrp16le",
01196 .nb_components = 3,
01197 .log2_chroma_w = 0,
01198 .log2_chroma_h = 0,
01199 .comp = {
01200 { 2, 1, 1, 0, 15 },
01201 { 0, 1, 1, 0, 15 },
01202 { 1, 1, 1, 0, 15 },
01203 },
01204 .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
01205 },
01206 [PIX_FMT_GBRP16BE] = {
01207 .name = "gbrp16be",
01208 .nb_components = 3,
01209 .log2_chroma_w = 0,
01210 .log2_chroma_h = 0,
01211 .comp = {
01212 { 2, 1, 1, 0, 15 },
01213 { 0, 1, 1, 0, 15 },
01214 { 1, 1, 1, 0, 15 },
01215 },
01216 .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
01217 },
01218 };
01219
01220 static enum PixelFormat get_pix_fmt_internal(const char *name)
01221 {
01222 enum PixelFormat pix_fmt;
01223
01224 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
01225 if (av_pix_fmt_descriptors[pix_fmt].name &&
01226 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
01227 return pix_fmt;
01228
01229 return PIX_FMT_NONE;
01230 }
01231
01232 const char *av_get_pix_fmt_name(enum PixelFormat pix_fmt)
01233 {
01234 return (unsigned)pix_fmt < PIX_FMT_NB ?
01235 av_pix_fmt_descriptors[pix_fmt].name : NULL;
01236 }
01237
01238 #if HAVE_BIGENDIAN
01239 # define X_NE(be, le) be
01240 #else
01241 # define X_NE(be, le) le
01242 #endif
01243
01244 enum PixelFormat av_get_pix_fmt(const char *name)
01245 {
01246 enum PixelFormat pix_fmt;
01247
01248 if (!strcmp(name, "rgb32"))
01249 name = X_NE("argb", "bgra");
01250 else if (!strcmp(name, "bgr32"))
01251 name = X_NE("abgr", "rgba");
01252
01253 pix_fmt = get_pix_fmt_internal(name);
01254 if (pix_fmt == PIX_FMT_NONE) {
01255 char name2[32];
01256
01257 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
01258 pix_fmt = get_pix_fmt_internal(name2);
01259 }
01260 return pix_fmt;
01261 }
01262
01263 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc)
01264 {
01265 int c, bits = 0;
01266 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
01267
01268 for (c = 0; c < pixdesc->nb_components; c++) {
01269 int s = c == 1 || c == 2 ? 0 : log2_pixels;
01270 bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
01271 }
01272
01273 return bits >> log2_pixels;
01274 }
01275
01276 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
01277 {
01278
01279 if (pix_fmt < 0) {
01280 snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
01281 } else {
01282 const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
01283 snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
01284 pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
01285 }
01286
01287 return buf;
01288 }