Libav
|
00001 /* 00002 * pixel format descriptor 00003 * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at> 00004 * 00005 * This file is part of FFmpeg. 00006 * 00007 * FFmpeg is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * FFmpeg is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with FFmpeg; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 */ 00021 00022 #include "pixfmt.h" 00023 #include "pixdesc.h" 00024 00025 #include "intreadwrite.h" 00026 00027 void read_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4], 00028 const AVPixFmtDescriptor *desc, int x, int y, int c, int w, int read_pal_component) 00029 { 00030 AVComponentDescriptor comp= desc->comp[c]; 00031 int plane= comp.plane; 00032 int depth= comp.depth_minus1+1; 00033 int mask = (1<<depth)-1; 00034 int shift= comp.shift; 00035 int step = comp.step_minus1+1; 00036 int flags= desc->flags; 00037 00038 if (flags & PIX_FMT_BITSTREAM){ 00039 int skip = x*step + comp.offset_plus1-1; 00040 const uint8_t *p = data[plane] + y*linesize[plane] + (skip>>3); 00041 int shift = 8 - depth - (skip&7); 00042 00043 while(w--){ 00044 int val = (*p >> shift) & mask; 00045 if(read_pal_component) 00046 val= data[1][4*val + c]; 00047 shift -= step; 00048 p -= shift>>3; 00049 shift &= 7; 00050 *dst++= val; 00051 } 00052 } else { 00053 const uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1; 00054 00055 while(w--){ 00056 int val; 00057 if(flags & PIX_FMT_BE) val= AV_RB16(p); 00058 else val= AV_RL16(p); 00059 val = (val>>shift) & mask; 00060 if(read_pal_component) 00061 val= data[1][4*val + c]; 00062 p+= step; 00063 *dst++= val; 00064 } 00065 } 00066 } 00067 00068 void write_line(const uint16_t *src, uint8_t *data[4], const int linesize[4], 00069 const AVPixFmtDescriptor *desc, int x, int y, int c, int w) 00070 { 00071 AVComponentDescriptor comp = desc->comp[c]; 00072 int plane = comp.plane; 00073 int depth = comp.depth_minus1+1; 00074 int step = comp.step_minus1+1; 00075 int flags = desc->flags; 00076 00077 if (flags & PIX_FMT_BITSTREAM) { 00078 int skip = x*step + comp.offset_plus1-1; 00079 uint8_t *p = data[plane] + y*linesize[plane] + (skip>>3); 00080 int shift = 8 - depth - (skip&7); 00081 00082 while (w--) { 00083 *p |= *src++ << shift; 00084 shift -= step; 00085 p -= shift>>3; 00086 shift &= 7; 00087 } 00088 } else { 00089 int shift = comp.shift; 00090 uint8_t *p = data[plane]+ y*linesize[plane] + x*step + comp.offset_plus1-1; 00091 00092 while (w--) { 00093 if (flags & PIX_FMT_BE) { 00094 uint16_t val = AV_RB16(p) | (*src++<<shift); 00095 AV_WB16(p, val); 00096 } else { 00097 uint16_t val = AV_RL16(p) | (*src++<<shift); 00098 AV_WL16(p, val); 00099 } 00100 p+= step; 00101 } 00102 } 00103 } 00104 00105 const AVPixFmtDescriptor av_pix_fmt_descriptors[PIX_FMT_NB] = { 00106 [PIX_FMT_YUV420P] = { 00107 .name = "yuv420p", 00108 .nb_components= 3, 00109 .log2_chroma_w= 1, 00110 .log2_chroma_h= 1, 00111 .comp = { 00112 {0,0,1,0,7}, /* Y */ 00113 {1,0,1,0,7}, /* U */ 00114 {2,0,1,0,7}, /* V */ 00115 }, 00116 }, 00117 [PIX_FMT_YUYV422] = { 00118 .name = "yuyv422", 00119 .nb_components= 3, 00120 .log2_chroma_w= 1, 00121 .log2_chroma_h= 0, 00122 .comp = { 00123 {0,1,1,0,7}, /* Y */ 00124 {0,3,2,0,7}, /* U */ 00125 {0,3,4,0,7}, /* V */ 00126 }, 00127 }, 00128 [PIX_FMT_RGB24] = { 00129 .name = "rgb24", 00130 .nb_components= 3, 00131 .log2_chroma_w= 0, 00132 .log2_chroma_h= 0, 00133 .comp = { 00134 {0,2,1,0,7}, /* R */ 00135 {0,2,2,0,7}, /* G */ 00136 {0,2,3,0,7}, /* B */ 00137 }, 00138 }, 00139 [PIX_FMT_BGR24] = { 00140 .name = "bgr24", 00141 .nb_components= 3, 00142 .log2_chroma_w= 0, 00143 .log2_chroma_h= 0, 00144 .comp = { 00145 {0,2,1,0,7}, /* B */ 00146 {0,2,2,0,7}, /* G */ 00147 {0,2,3,0,7}, /* R */ 00148 }, 00149 }, 00150 [PIX_FMT_YUV422P] = { 00151 .name = "yuv422p", 00152 .nb_components= 3, 00153 .log2_chroma_w= 1, 00154 .log2_chroma_h= 0, 00155 .comp = { 00156 {0,0,1,0,7}, /* Y */ 00157 {1,0,1,0,7}, /* U */ 00158 {2,0,1,0,7}, /* V */ 00159 }, 00160 }, 00161 [PIX_FMT_YUV444P] = { 00162 .name = "yuv444p", 00163 .nb_components= 3, 00164 .log2_chroma_w= 0, 00165 .log2_chroma_h= 0, 00166 .comp = { 00167 {0,0,1,0,7}, /* Y */ 00168 {1,0,1,0,7}, /* U */ 00169 {2,0,1,0,7}, /* V */ 00170 }, 00171 }, 00172 [PIX_FMT_YUV410P] = { 00173 .name = "yuv410p", 00174 .nb_components= 3, 00175 .log2_chroma_w= 2, 00176 .log2_chroma_h= 2, 00177 .comp = { 00178 {0,0,1,0,7}, /* Y */ 00179 {1,0,1,0,7}, /* U */ 00180 {2,0,1,0,7}, /* V */ 00181 }, 00182 }, 00183 [PIX_FMT_YUV411P] = { 00184 .name = "yuv411p", 00185 .nb_components= 3, 00186 .log2_chroma_w= 2, 00187 .log2_chroma_h= 0, 00188 .comp = { 00189 {0,0,1,0,7}, /* Y */ 00190 {1,0,1,0,7}, /* U */ 00191 {2,0,1,0,7}, /* V */ 00192 }, 00193 }, 00194 [PIX_FMT_GRAY8] = { 00195 .name = "gray", 00196 .nb_components= 1, 00197 .log2_chroma_w= 0, 00198 .log2_chroma_h= 0, 00199 .comp = { 00200 {0,0,1,0,7}, /* Y */ 00201 }, 00202 .flags = PIX_FMT_PAL, 00203 }, 00204 [PIX_FMT_MONOWHITE] = { 00205 .name = "monow", 00206 .nb_components= 1, 00207 .log2_chroma_w= 0, 00208 .log2_chroma_h= 0, 00209 .comp = { 00210 {0,0,1,0,0}, /* Y */ 00211 }, 00212 .flags = PIX_FMT_BITSTREAM, 00213 }, 00214 [PIX_FMT_MONOBLACK] = { 00215 .name = "monob", 00216 .nb_components= 1, 00217 .log2_chroma_w= 0, 00218 .log2_chroma_h= 0, 00219 .comp = { 00220 {0,0,1,7,0}, /* Y */ 00221 }, 00222 .flags = PIX_FMT_BITSTREAM, 00223 }, 00224 [PIX_FMT_PAL8] = { 00225 .name = "pal8", 00226 .nb_components= 1, 00227 .log2_chroma_w= 0, 00228 .log2_chroma_h= 0, 00229 .comp = { 00230 {0,0,1,0,7}, 00231 }, 00232 .flags = PIX_FMT_PAL, 00233 }, 00234 [PIX_FMT_YUVJ420P] = { 00235 .name = "yuvj420p", 00236 .nb_components= 3, 00237 .log2_chroma_w= 1, 00238 .log2_chroma_h= 1, 00239 .comp = { 00240 {0,0,1,0,7}, /* Y */ 00241 {1,0,1,0,7}, /* U */ 00242 {2,0,1,0,7}, /* V */ 00243 }, 00244 }, 00245 [PIX_FMT_YUVJ422P] = { 00246 .name = "yuvj422p", 00247 .nb_components= 3, 00248 .log2_chroma_w= 1, 00249 .log2_chroma_h= 0, 00250 .comp = { 00251 {0,0,1,0,7}, /* Y */ 00252 {1,0,1,0,7}, /* U */ 00253 {2,0,1,0,7}, /* V */ 00254 }, 00255 }, 00256 [PIX_FMT_YUVJ444P] = { 00257 .name = "yuvj444p", 00258 .nb_components= 3, 00259 .log2_chroma_w= 0, 00260 .log2_chroma_h= 0, 00261 .comp = { 00262 {0,0,1,0,7}, /* Y */ 00263 {1,0,1,0,7}, /* U */ 00264 {2,0,1,0,7}, /* V */ 00265 }, 00266 }, 00267 [PIX_FMT_XVMC_MPEG2_MC] = { 00268 .name = "xvmcmc", 00269 .flags = PIX_FMT_HWACCEL, 00270 }, 00271 [PIX_FMT_XVMC_MPEG2_IDCT] = { 00272 .name = "xvmcidct", 00273 .flags = PIX_FMT_HWACCEL, 00274 }, 00275 [PIX_FMT_UYVY422] = { 00276 .name = "uyvy422", 00277 .nb_components= 3, 00278 .log2_chroma_w= 1, 00279 .log2_chroma_h= 0, 00280 .comp = { 00281 {0,1,2,0,7}, /* Y */ 00282 {0,3,1,0,7}, /* U */ 00283 {0,3,3,0,7}, /* V */ 00284 }, 00285 }, 00286 [PIX_FMT_UYYVYY411] = { 00287 .name = "uyyvyy411", 00288 .nb_components= 3, 00289 .log2_chroma_w= 2, 00290 .log2_chroma_h= 0, 00291 .comp = { 00292 {0,3,2,0,7}, /* Y */ 00293 {0,5,1,0,7}, /* U */ 00294 {0,5,4,0,7}, /* V */ 00295 }, 00296 }, 00297 [PIX_FMT_BGR8] = { 00298 .name = "bgr8", 00299 .nb_components= 3, 00300 .log2_chroma_w= 0, 00301 .log2_chroma_h= 0, 00302 .comp = { 00303 {0,0,1,6,1}, /* B */ 00304 {0,0,1,3,2}, /* G */ 00305 {0,0,1,0,2}, /* R */ 00306 }, 00307 .flags = PIX_FMT_PAL, 00308 }, 00309 [PIX_FMT_BGR4] = { 00310 .name = "bgr4", 00311 .nb_components= 3, 00312 .log2_chroma_w= 0, 00313 .log2_chroma_h= 0, 00314 .comp = { 00315 {0,3,1,0,0}, /* B */ 00316 {0,3,2,0,1}, /* G */ 00317 {0,3,4,0,0}, /* R */ 00318 }, 00319 .flags = PIX_FMT_BITSTREAM, 00320 }, 00321 [PIX_FMT_BGR4_BYTE] = { 00322 .name = "bgr4_byte", 00323 .nb_components= 3, 00324 .log2_chroma_w= 0, 00325 .log2_chroma_h= 0, 00326 .comp = { 00327 {0,0,1,3,0}, /* B */ 00328 {0,0,1,1,1}, /* G */ 00329 {0,0,1,0,0}, /* R */ 00330 }, 00331 .flags = PIX_FMT_PAL, 00332 }, 00333 [PIX_FMT_RGB8] = { 00334 .name = "rgb8", 00335 .nb_components= 3, 00336 .log2_chroma_w= 0, 00337 .log2_chroma_h= 0, 00338 .comp = { 00339 {0,0,1,6,1}, /* R */ 00340 {0,0,1,3,2}, /* G */ 00341 {0,0,1,0,2}, /* B */ 00342 }, 00343 .flags = PIX_FMT_PAL, 00344 }, 00345 [PIX_FMT_RGB4] = { 00346 .name = "rgb4", 00347 .nb_components= 3, 00348 .log2_chroma_w= 0, 00349 .log2_chroma_h= 0, 00350 .comp = { 00351 {0,3,1,0,0}, /* R */ 00352 {0,3,2,0,1}, /* G */ 00353 {0,3,4,0,0}, /* B */ 00354 }, 00355 .flags = PIX_FMT_BITSTREAM, 00356 }, 00357 [PIX_FMT_RGB4_BYTE] = { 00358 .name = "rgb4_byte", 00359 .nb_components= 3, 00360 .log2_chroma_w= 0, 00361 .log2_chroma_h= 0, 00362 .comp = { 00363 {0,0,1,3,0}, /* R */ 00364 {0,0,1,1,1}, /* G */ 00365 {0,0,1,0,0}, /* B */ 00366 }, 00367 .flags = PIX_FMT_PAL, 00368 }, 00369 [PIX_FMT_NV12] = { 00370 .name = "nv12", 00371 .nb_components= 3, 00372 .log2_chroma_w= 1, 00373 .log2_chroma_h= 1, 00374 .comp = { 00375 {0,0,1,0,7}, /* Y */ 00376 {1,1,1,0,7}, /* U */ 00377 {1,1,2,0,7}, /* V */ 00378 }, 00379 }, 00380 [PIX_FMT_NV21] = { 00381 .name = "nv21", 00382 .nb_components= 3, 00383 .log2_chroma_w= 1, 00384 .log2_chroma_h= 1, 00385 .comp = { 00386 {0,0,1,0,7}, /* Y */ 00387 {1,1,1,0,7}, /* V */ 00388 {1,1,2,0,7}, /* U */ 00389 }, 00390 }, 00391 [PIX_FMT_ARGB] = { 00392 .name = "argb", 00393 .nb_components= 4, 00394 .log2_chroma_w= 0, 00395 .log2_chroma_h= 0, 00396 .comp = { 00397 {0,3,1,0,7}, /* A */ 00398 {0,3,2,0,7}, /* R */ 00399 {0,3,3,0,7}, /* G */ 00400 {0,3,4,0,7}, /* B */ 00401 }, 00402 }, 00403 [PIX_FMT_RGBA] = { 00404 .name = "rgba", 00405 .nb_components= 4, 00406 .log2_chroma_w= 0, 00407 .log2_chroma_h= 0, 00408 .comp = { 00409 {0,3,1,0,7}, /* R */ 00410 {0,3,2,0,7}, /* G */ 00411 {0,3,3,0,7}, /* B */ 00412 {0,3,4,0,7}, /* A */ 00413 }, 00414 }, 00415 [PIX_FMT_ABGR] = { 00416 .name = "abgr", 00417 .nb_components= 4, 00418 .log2_chroma_w= 0, 00419 .log2_chroma_h= 0, 00420 .comp = { 00421 {0,3,1,0,7}, /* A */ 00422 {0,3,2,0,7}, /* B */ 00423 {0,3,3,0,7}, /* G */ 00424 {0,3,4,0,7}, /* R */ 00425 }, 00426 }, 00427 [PIX_FMT_BGRA] = { 00428 .name = "bgra", 00429 .nb_components= 4, 00430 .log2_chroma_w= 0, 00431 .log2_chroma_h= 0, 00432 .comp = { 00433 {0,3,1,0,7}, /* B */ 00434 {0,3,2,0,7}, /* G */ 00435 {0,3,3,0,7}, /* R */ 00436 {0,3,4,0,7}, /* A */ 00437 }, 00438 }, 00439 [PIX_FMT_GRAY16BE] = { 00440 .name = "gray16be", 00441 .nb_components= 1, 00442 .log2_chroma_w= 0, 00443 .log2_chroma_h= 0, 00444 .comp = { 00445 {0,1,1,0,15}, /* Y */ 00446 }, 00447 .flags = PIX_FMT_BE, 00448 }, 00449 [PIX_FMT_GRAY16LE] = { 00450 .name = "gray16le", 00451 .nb_components= 1, 00452 .log2_chroma_w= 0, 00453 .log2_chroma_h= 0, 00454 .comp = { 00455 {0,1,1,0,15}, /* Y */ 00456 }, 00457 }, 00458 [PIX_FMT_YUV440P] = { 00459 .name = "yuv440p", 00460 .nb_components= 3, 00461 .log2_chroma_w= 0, 00462 .log2_chroma_h= 1, 00463 .comp = { 00464 {0,0,1,0,7}, /* Y */ 00465 {1,0,1,0,7}, /* U */ 00466 {2,0,1,0,7}, /* V */ 00467 }, 00468 }, 00469 [PIX_FMT_YUVJ440P] = { 00470 .name = "yuvj440p", 00471 .nb_components= 3, 00472 .log2_chroma_w= 0, 00473 .log2_chroma_h= 1, 00474 .comp = { 00475 {0,0,1,0,7}, /* Y */ 00476 {1,0,1,0,7}, /* U */ 00477 {2,0,1,0,7}, /* V */ 00478 }, 00479 }, 00480 [PIX_FMT_YUVA420P] = { 00481 .name = "yuva420p", 00482 .nb_components= 4, 00483 .log2_chroma_w= 1, 00484 .log2_chroma_h= 1, 00485 .comp = { 00486 {0,0,1,0,7}, /* Y */ 00487 {1,0,1,0,7}, /* U */ 00488 {2,0,1,0,7}, /* V */ 00489 {3,0,1,0,7}, /* A */ 00490 }, 00491 }, 00492 [PIX_FMT_VDPAU_H264] = { 00493 .name = "vdpau_h264", 00494 .log2_chroma_w = 1, 00495 .log2_chroma_h = 1, 00496 .flags = PIX_FMT_HWACCEL, 00497 }, 00498 [PIX_FMT_VDPAU_MPEG1] = { 00499 .name = "vdpau_mpeg1", 00500 .log2_chroma_w = 1, 00501 .log2_chroma_h = 1, 00502 .flags = PIX_FMT_HWACCEL, 00503 }, 00504 [PIX_FMT_VDPAU_MPEG2] = { 00505 .name = "vdpau_mpeg2", 00506 .log2_chroma_w = 1, 00507 .log2_chroma_h = 1, 00508 .flags = PIX_FMT_HWACCEL, 00509 }, 00510 [PIX_FMT_VDPAU_WMV3] = { 00511 .name = "vdpau_wmv3", 00512 .log2_chroma_w = 1, 00513 .log2_chroma_h = 1, 00514 .flags = PIX_FMT_HWACCEL, 00515 }, 00516 [PIX_FMT_VDPAU_VC1] = { 00517 .name = "vdpau_vc1", 00518 .log2_chroma_w = 1, 00519 .log2_chroma_h = 1, 00520 .flags = PIX_FMT_HWACCEL, 00521 }, 00522 [PIX_FMT_VDPAU_MPEG4] = { 00523 .name = "vdpau_mpeg4", 00524 .log2_chroma_w = 1, 00525 .log2_chroma_h = 1, 00526 .flags = PIX_FMT_HWACCEL, 00527 }, 00528 [PIX_FMT_RGB48BE] = { 00529 .name = "rgb48be", 00530 .nb_components= 3, 00531 .log2_chroma_w= 0, 00532 .log2_chroma_h= 0, 00533 .comp = { 00534 {0,5,1,0,15}, /* R */ 00535 {0,5,3,0,15}, /* G */ 00536 {0,5,5,0,15}, /* B */ 00537 }, 00538 .flags = PIX_FMT_BE, 00539 }, 00540 [PIX_FMT_RGB48LE] = { 00541 .name = "rgb48le", 00542 .nb_components= 3, 00543 .log2_chroma_w= 0, 00544 .log2_chroma_h= 0, 00545 .comp = { 00546 {0,5,1,0,15}, /* R */ 00547 {0,5,3,0,15}, /* G */ 00548 {0,5,5,0,15}, /* B */ 00549 }, 00550 }, 00551 [PIX_FMT_RGB565BE] = { 00552 .name = "rgb565be", 00553 .nb_components= 3, 00554 .log2_chroma_w= 0, 00555 .log2_chroma_h= 0, 00556 .comp = { 00557 {0,1,0,3,4}, /* R */ 00558 {0,1,1,5,5}, /* G */ 00559 {0,1,1,0,4}, /* B */ 00560 }, 00561 .flags = PIX_FMT_BE, 00562 }, 00563 [PIX_FMT_RGB565LE] = { 00564 .name = "rgb565le", 00565 .nb_components= 3, 00566 .log2_chroma_w= 0, 00567 .log2_chroma_h= 0, 00568 .comp = { 00569 {0,1,2,3,4}, /* R */ 00570 {0,1,1,5,5}, /* G */ 00571 {0,1,1,0,4}, /* B */ 00572 }, 00573 }, 00574 [PIX_FMT_RGB555BE] = { 00575 .name = "rgb555be", 00576 .nb_components= 3, 00577 .log2_chroma_w= 0, 00578 .log2_chroma_h= 0, 00579 .comp = { 00580 {0,1,0,2,4}, /* R */ 00581 {0,1,1,5,4}, /* G */ 00582 {0,1,1,0,4}, /* B */ 00583 }, 00584 .flags = PIX_FMT_BE, 00585 }, 00586 [PIX_FMT_RGB555LE] = { 00587 .name = "rgb555le", 00588 .nb_components= 3, 00589 .log2_chroma_w= 0, 00590 .log2_chroma_h= 0, 00591 .comp = { 00592 {0,1,2,2,4}, /* R */ 00593 {0,1,1,5,4}, /* G */ 00594 {0,1,1,0,4}, /* B */ 00595 }, 00596 }, 00597 [PIX_FMT_RGB444BE] = { 00598 .name = "rgb444be", 00599 .nb_components= 3, 00600 .log2_chroma_w= 0, 00601 .log2_chroma_h= 0, 00602 .comp = { 00603 {0,1,0,0,3}, /* R */ 00604 {0,1,1,4,3}, /* G */ 00605 {0,1,1,0,3}, /* B */ 00606 }, 00607 .flags = PIX_FMT_BE, 00608 }, 00609 [PIX_FMT_RGB444LE] = { 00610 .name = "rgb444le", 00611 .nb_components= 3, 00612 .log2_chroma_w= 0, 00613 .log2_chroma_h= 0, 00614 .comp = { 00615 {0,1,2,0,3}, /* R */ 00616 {0,1,1,4,3}, /* G */ 00617 {0,1,1,0,3}, /* B */ 00618 }, 00619 }, 00620 [PIX_FMT_BGR565BE] = { 00621 .name = "bgr565be", 00622 .nb_components= 3, 00623 .log2_chroma_w= 0, 00624 .log2_chroma_h= 0, 00625 .comp = { 00626 {0,1,0,3,4}, /* B */ 00627 {0,1,1,5,5}, /* G */ 00628 {0,1,1,0,4}, /* R */ 00629 }, 00630 .flags = PIX_FMT_BE, 00631 }, 00632 [PIX_FMT_BGR565LE] = { 00633 .name = "bgr565le", 00634 .nb_components= 3, 00635 .log2_chroma_w= 0, 00636 .log2_chroma_h= 0, 00637 .comp = { 00638 {0,1,2,3,4}, /* B */ 00639 {0,1,1,5,5}, /* G */ 00640 {0,1,1,0,4}, /* R */ 00641 }, 00642 }, 00643 [PIX_FMT_BGR555BE] = { 00644 .name = "bgr555be", 00645 .nb_components= 3, 00646 .log2_chroma_w= 0, 00647 .log2_chroma_h= 0, 00648 .comp = { 00649 {0,1,0,2,4}, /* B */ 00650 {0,1,1,5,4}, /* G */ 00651 {0,1,1,0,4}, /* R */ 00652 }, 00653 .flags = PIX_FMT_BE, 00654 }, 00655 [PIX_FMT_BGR555LE] = { 00656 .name = "bgr555le", 00657 .nb_components= 3, 00658 .log2_chroma_w= 0, 00659 .log2_chroma_h= 0, 00660 .comp = { 00661 {0,1,2,2,4}, /* B */ 00662 {0,1,1,5,4}, /* G */ 00663 {0,1,1,0,4}, /* R */ 00664 }, 00665 }, 00666 [PIX_FMT_BGR444BE] = { 00667 .name = "bgr444be", 00668 .nb_components= 3, 00669 .log2_chroma_w= 0, 00670 .log2_chroma_h= 0, 00671 .comp = { 00672 {0,1,0,0,3}, /* B */ 00673 {0,1,1,4,3}, /* G */ 00674 {0,1,1,0,3}, /* R */ 00675 }, 00676 .flags = PIX_FMT_BE, 00677 }, 00678 [PIX_FMT_BGR444LE] = { 00679 .name = "bgr444le", 00680 .nb_components= 3, 00681 .log2_chroma_w= 0, 00682 .log2_chroma_h= 0, 00683 .comp = { 00684 {0,1,2,0,3}, /* B */ 00685 {0,1,1,4,3}, /* G */ 00686 {0,1,1,0,3}, /* R */ 00687 }, 00688 }, 00689 [PIX_FMT_VAAPI_MOCO] = { 00690 .name = "vaapi_moco", 00691 .log2_chroma_w = 1, 00692 .log2_chroma_h = 1, 00693 .flags = PIX_FMT_HWACCEL, 00694 }, 00695 [PIX_FMT_VAAPI_IDCT] = { 00696 .name = "vaapi_idct", 00697 .log2_chroma_w = 1, 00698 .log2_chroma_h = 1, 00699 .flags = PIX_FMT_HWACCEL, 00700 }, 00701 [PIX_FMT_VAAPI_VLD] = { 00702 .name = "vaapi_vld", 00703 .log2_chroma_w = 1, 00704 .log2_chroma_h = 1, 00705 .flags = PIX_FMT_HWACCEL, 00706 }, 00707 [PIX_FMT_YUV420P16LE] = { 00708 .name = "yuv420p16le", 00709 .nb_components= 3, 00710 .log2_chroma_w= 1, 00711 .log2_chroma_h= 1, 00712 .comp = { 00713 {0,1,1,0,15}, /* Y */ 00714 {1,1,1,0,15}, /* U */ 00715 {2,1,1,0,15}, /* V */ 00716 }, 00717 }, 00718 [PIX_FMT_YUV420P16BE] = { 00719 .name = "yuv420p16be", 00720 .nb_components= 3, 00721 .log2_chroma_w= 1, 00722 .log2_chroma_h= 1, 00723 .comp = { 00724 {0,1,1,0,15}, /* Y */ 00725 {1,1,1,0,15}, /* U */ 00726 {2,1,1,0,15}, /* V */ 00727 }, 00728 .flags = PIX_FMT_BE, 00729 }, 00730 [PIX_FMT_YUV422P16LE] = { 00731 .name = "yuv422p16le", 00732 .nb_components= 3, 00733 .log2_chroma_w= 1, 00734 .log2_chroma_h= 0, 00735 .comp = { 00736 {0,1,1,0,15}, /* Y */ 00737 {1,1,1,0,15}, /* U */ 00738 {2,1,1,0,15}, /* V */ 00739 }, 00740 }, 00741 [PIX_FMT_YUV422P16BE] = { 00742 .name = "yuv422p16be", 00743 .nb_components= 3, 00744 .log2_chroma_w= 1, 00745 .log2_chroma_h= 0, 00746 .comp = { 00747 {0,1,1,0,15}, /* Y */ 00748 {1,1,1,0,15}, /* U */ 00749 {2,1,1,0,15}, /* V */ 00750 }, 00751 .flags = PIX_FMT_BE, 00752 }, 00753 [PIX_FMT_YUV444P16LE] = { 00754 .name = "yuv444p16le", 00755 .nb_components= 3, 00756 .log2_chroma_w= 0, 00757 .log2_chroma_h= 0, 00758 .comp = { 00759 {0,1,1,0,15}, /* Y */ 00760 {1,1,1,0,15}, /* U */ 00761 {2,1,1,0,15}, /* V */ 00762 }, 00763 }, 00764 [PIX_FMT_YUV444P16BE] = { 00765 .name = "yuv444p16be", 00766 .nb_components= 3, 00767 .log2_chroma_w= 0, 00768 .log2_chroma_h= 0, 00769 .comp = { 00770 {0,1,1,0,15}, /* Y */ 00771 {1,1,1,0,15}, /* U */ 00772 {2,1,1,0,15}, /* V */ 00773 }, 00774 .flags = PIX_FMT_BE, 00775 }, 00776 [PIX_FMT_DXVA2_VLD] = { 00777 .name = "dxva2_vld", 00778 .log2_chroma_w = 1, 00779 .log2_chroma_h = 1, 00780 .flags = PIX_FMT_HWACCEL, 00781 }, 00782 [PIX_FMT_Y400A] = { 00783 .name = "y400a", 00784 .nb_components= 2, 00785 .comp = { 00786 {0,1,1,0,7}, /* Y */ 00787 {0,1,2,0,7}, /* A */ 00788 }, 00789 }, 00790 }; 00791 00792 static enum PixelFormat get_pix_fmt_internal(const char *name) 00793 { 00794 enum PixelFormat pix_fmt; 00795 00796 for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++) 00797 if (av_pix_fmt_descriptors[pix_fmt].name && 00798 !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name)) 00799 return pix_fmt; 00800 00801 return PIX_FMT_NONE; 00802 } 00803 00804 #if HAVE_BIGENDIAN 00805 # define X_NE(be, le) be 00806 #else 00807 # define X_NE(be, le) le 00808 #endif 00809 00810 enum PixelFormat av_get_pix_fmt(const char *name) 00811 { 00812 enum PixelFormat pix_fmt; 00813 00814 if (!strcmp(name, "rgb32")) 00815 name = X_NE("argb", "bgra"); 00816 else if (!strcmp(name, "bgr32")) 00817 name = X_NE("abgr", "rgba"); 00818 00819 pix_fmt = get_pix_fmt_internal(name); 00820 if (pix_fmt == PIX_FMT_NONE) { 00821 char name2[32]; 00822 00823 snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le")); 00824 pix_fmt = get_pix_fmt_internal(name2); 00825 } 00826 return pix_fmt; 00827 } 00828 00829 int av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc) 00830 { 00831 int c, bits = 0; 00832 int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h; 00833 00834 for (c = 0; c < pixdesc->nb_components; c++) { 00835 int s = c==1 || c==2 ? 0 : log2_pixels; 00836 bits += (pixdesc->comp[c].depth_minus1+1) << s; 00837 } 00838 00839 return bits >> log2_pixels; 00840 }