FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pixdesc.c
Go to the documentation of this file.
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 
22 #include <stdio.h>
23 #include <string.h>
24 
25 #include "avassert.h"
26 #include "common.h"
27 #include "pixfmt.h"
28 #include "pixdesc.h"
29 #include "internal.h"
30 #include "intreadwrite.h"
31 #include "avstring.h"
32 #include "version.h"
33 
34 void av_read_image_line(uint16_t *dst,
35  const uint8_t *data[4], const int linesize[4],
36  const AVPixFmtDescriptor *desc,
37  int x, int y, int c, int w,
38  int read_pal_component)
39 {
41  int plane = comp.plane;
42  int depth = comp.depth_minus1 + 1;
43  int mask = (1 << depth) - 1;
44  int shift = comp.shift;
45  int step = comp.step_minus1 + 1;
46  int flags = desc->flags;
47 
48  if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
49  int skip = x * step + comp.offset_plus1 - 1;
50  const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
51  int shift = 8 - depth - (skip & 7);
52 
53  while (w--) {
54  int val = (*p >> shift) & mask;
55  if (read_pal_component)
56  val = data[1][4*val + c];
57  shift -= step;
58  p -= shift >> 3;
59  shift &= 7;
60  *dst++ = val;
61  }
62  } else {
63  const uint8_t *p = data[plane] + y * linesize[plane] +
64  x * step + comp.offset_plus1 - 1;
65  int is_8bit = shift + depth <= 8;
66 
67  if (is_8bit)
68  p += !!(flags & AV_PIX_FMT_FLAG_BE);
69 
70  while (w--) {
71  int val = is_8bit ? *p :
72  flags & AV_PIX_FMT_FLAG_BE ? AV_RB16(p) : AV_RL16(p);
73  val = (val >> shift) & mask;
74  if (read_pal_component)
75  val = data[1][4 * val + c];
76  p += step;
77  *dst++ = val;
78  }
79  }
80 }
81 
82 void av_write_image_line(const uint16_t *src,
83  uint8_t *data[4], const int linesize[4],
84  const AVPixFmtDescriptor *desc,
85  int x, int y, int c, int w)
86 {
88  int plane = comp.plane;
89  int depth = comp.depth_minus1 + 1;
90  int step = comp.step_minus1 + 1;
91  int flags = desc->flags;
92 
93  if (flags & AV_PIX_FMT_FLAG_BITSTREAM) {
94  int skip = x * step + comp.offset_plus1 - 1;
95  uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
96  int shift = 8 - depth - (skip & 7);
97 
98  while (w--) {
99  *p |= *src++ << shift;
100  shift -= step;
101  p -= shift >> 3;
102  shift &= 7;
103  }
104  } else {
105  int shift = comp.shift;
106  uint8_t *p = data[plane] + y * linesize[plane] +
107  x * step + comp.offset_plus1 - 1;
108 
109  if (shift + depth <= 8) {
110  p += !!(flags & AV_PIX_FMT_FLAG_BE);
111  while (w--) {
112  *p |= (*src++ << shift);
113  p += step;
114  }
115  } else {
116  while (w--) {
117  if (flags & AV_PIX_FMT_FLAG_BE) {
118  uint16_t val = AV_RB16(p) | (*src++ << shift);
119  AV_WB16(p, val);
120  } else {
121  uint16_t val = AV_RL16(p) | (*src++ << shift);
122  AV_WL16(p, val);
123  }
124  p += step;
125  }
126  }
127  }
128 }
129 
130 #if !FF_API_PIX_FMT_DESC
131 static
132 #endif
134  [AV_PIX_FMT_YUV420P] = {
135  .name = "yuv420p",
136  .nb_components = 3,
137  .log2_chroma_w = 1,
138  .log2_chroma_h = 1,
139  .comp = {
140  { 0, 0, 1, 0, 7 }, /* Y */
141  { 1, 0, 1, 0, 7 }, /* U */
142  { 2, 0, 1, 0, 7 }, /* V */
143  },
144  .flags = AV_PIX_FMT_FLAG_PLANAR,
145  },
146  [AV_PIX_FMT_YUYV422] = {
147  .name = "yuyv422",
148  .nb_components = 3,
149  .log2_chroma_w = 1,
150  .log2_chroma_h = 0,
151  .comp = {
152  { 0, 1, 1, 0, 7 }, /* Y */
153  { 0, 3, 2, 0, 7 }, /* U */
154  { 0, 3, 4, 0, 7 }, /* V */
155  },
156  },
157  [AV_PIX_FMT_YVYU422] = {
158  .name = "yvyu422",
159  .nb_components = 3,
160  .log2_chroma_w = 1,
161  .log2_chroma_h = 0,
162  .comp = {
163  { 0, 1, 1, 0, 7 }, /* Y */
164  { 0, 3, 2, 0, 7 }, /* V */
165  { 0, 3, 4, 0, 7 }, /* U */
166  },
167  },
168  [AV_PIX_FMT_RGB24] = {
169  .name = "rgb24",
170  .nb_components = 3,
171  .log2_chroma_w = 0,
172  .log2_chroma_h = 0,
173  .comp = {
174  { 0, 2, 1, 0, 7 }, /* R */
175  { 0, 2, 2, 0, 7 }, /* G */
176  { 0, 2, 3, 0, 7 }, /* B */
177  },
178  .flags = AV_PIX_FMT_FLAG_RGB,
179  },
180  [AV_PIX_FMT_BGR24] = {
181  .name = "bgr24",
182  .nb_components = 3,
183  .log2_chroma_w = 0,
184  .log2_chroma_h = 0,
185  .comp = {
186  { 0, 2, 3, 0, 7 }, /* R */
187  { 0, 2, 2, 0, 7 }, /* G */
188  { 0, 2, 1, 0, 7 }, /* B */
189  },
190  .flags = AV_PIX_FMT_FLAG_RGB,
191  },
192  [AV_PIX_FMT_YUV422P] = {
193  .name = "yuv422p",
194  .nb_components = 3,
195  .log2_chroma_w = 1,
196  .log2_chroma_h = 0,
197  .comp = {
198  { 0, 0, 1, 0, 7 }, /* Y */
199  { 1, 0, 1, 0, 7 }, /* U */
200  { 2, 0, 1, 0, 7 }, /* V */
201  },
202  .flags = AV_PIX_FMT_FLAG_PLANAR,
203  },
204  [AV_PIX_FMT_YUV444P] = {
205  .name = "yuv444p",
206  .nb_components = 3,
207  .log2_chroma_w = 0,
208  .log2_chroma_h = 0,
209  .comp = {
210  { 0, 0, 1, 0, 7 }, /* Y */
211  { 1, 0, 1, 0, 7 }, /* U */
212  { 2, 0, 1, 0, 7 }, /* V */
213  },
214  .flags = AV_PIX_FMT_FLAG_PLANAR,
215  },
216  [AV_PIX_FMT_YUV410P] = {
217  .name = "yuv410p",
218  .nb_components = 3,
219  .log2_chroma_w = 2,
220  .log2_chroma_h = 2,
221  .comp = {
222  { 0, 0, 1, 0, 7 }, /* Y */
223  { 1, 0, 1, 0, 7 }, /* U */
224  { 2, 0, 1, 0, 7 }, /* V */
225  },
226  .flags = AV_PIX_FMT_FLAG_PLANAR,
227  },
228  [AV_PIX_FMT_YUV411P] = {
229  .name = "yuv411p",
230  .nb_components = 3,
231  .log2_chroma_w = 2,
232  .log2_chroma_h = 0,
233  .comp = {
234  { 0, 0, 1, 0, 7 }, /* Y */
235  { 1, 0, 1, 0, 7 }, /* U */
236  { 2, 0, 1, 0, 7 }, /* V */
237  },
238  .flags = AV_PIX_FMT_FLAG_PLANAR,
239  },
240  [AV_PIX_FMT_YUVJ411P] = {
241  .name = "yuvj411p",
242  .nb_components = 3,
243  .log2_chroma_w = 2,
244  .log2_chroma_h = 0,
245  .comp = {
246  { 0, 0, 1, 0, 7 }, /* Y */
247  { 1, 0, 1, 0, 7 }, /* U */
248  { 2, 0, 1, 0, 7 }, /* V */
249  },
250  .flags = AV_PIX_FMT_FLAG_PLANAR,
251  },
252  [AV_PIX_FMT_GRAY8] = {
253  .name = "gray",
254  .nb_components = 1,
255  .log2_chroma_w = 0,
256  .log2_chroma_h = 0,
257  .comp = {
258  { 0, 0, 1, 0, 7 }, /* Y */
259  },
260  .flags = AV_PIX_FMT_FLAG_PSEUDOPAL,
261  },
263  .name = "monow",
264  .nb_components = 1,
265  .log2_chroma_w = 0,
266  .log2_chroma_h = 0,
267  .comp = {
268  { 0, 0, 1, 0, 0 }, /* Y */
269  },
270  .flags = AV_PIX_FMT_FLAG_BITSTREAM,
271  },
273  .name = "monob",
274  .nb_components = 1,
275  .log2_chroma_w = 0,
276  .log2_chroma_h = 0,
277  .comp = {
278  { 0, 0, 1, 7, 0 }, /* Y */
279  },
280  .flags = AV_PIX_FMT_FLAG_BITSTREAM,
281  },
282  [AV_PIX_FMT_PAL8] = {
283  .name = "pal8",
284  .nb_components = 1,
285  .log2_chroma_w = 0,
286  .log2_chroma_h = 0,
287  .comp = {
288  { 0, 0, 1, 0, 7 },
289  },
290  .flags = AV_PIX_FMT_FLAG_PAL,
291  },
292  [AV_PIX_FMT_YUVJ420P] = {
293  .name = "yuvj420p",
294  .nb_components = 3,
295  .log2_chroma_w = 1,
296  .log2_chroma_h = 1,
297  .comp = {
298  { 0, 0, 1, 0, 7 }, /* Y */
299  { 1, 0, 1, 0, 7 }, /* U */
300  { 2, 0, 1, 0, 7 }, /* V */
301  },
302  .flags = AV_PIX_FMT_FLAG_PLANAR,
303  },
304  [AV_PIX_FMT_YUVJ422P] = {
305  .name = "yuvj422p",
306  .nb_components = 3,
307  .log2_chroma_w = 1,
308  .log2_chroma_h = 0,
309  .comp = {
310  { 0, 0, 1, 0, 7 }, /* Y */
311  { 1, 0, 1, 0, 7 }, /* U */
312  { 2, 0, 1, 0, 7 }, /* V */
313  },
314  .flags = AV_PIX_FMT_FLAG_PLANAR,
315  },
316  [AV_PIX_FMT_YUVJ444P] = {
317  .name = "yuvj444p",
318  .nb_components = 3,
319  .log2_chroma_w = 0,
320  .log2_chroma_h = 0,
321  .comp = {
322  { 0, 0, 1, 0, 7 }, /* Y */
323  { 1, 0, 1, 0, 7 }, /* U */
324  { 2, 0, 1, 0, 7 }, /* V */
325  },
326  .flags = AV_PIX_FMT_FLAG_PLANAR,
327  },
328 #if FF_API_XVMC
330  .name = "xvmcmc",
331  .flags = AV_PIX_FMT_FLAG_HWACCEL,
332  },
334  .name = "xvmcidct",
335  .flags = AV_PIX_FMT_FLAG_HWACCEL,
336  },
337 #endif /* FF_API_XVMC */
338 #if !FF_API_XVMC
339  [AV_PIX_FMT_XVMC] = {
340  .name = "xvmc",
341  .flags = AV_PIX_FMT_FLAG_HWACCEL,
342  },
343 #endif /* !FF_API_XVMC */
344  [AV_PIX_FMT_UYVY422] = {
345  .name = "uyvy422",
346  .nb_components = 3,
347  .log2_chroma_w = 1,
348  .log2_chroma_h = 0,
349  .comp = {
350  { 0, 1, 2, 0, 7 }, /* Y */
351  { 0, 3, 1, 0, 7 }, /* U */
352  { 0, 3, 3, 0, 7 }, /* V */
353  },
354  },
356  .name = "uyyvyy411",
357  .nb_components = 3,
358  .log2_chroma_w = 2,
359  .log2_chroma_h = 0,
360  .comp = {
361  { 0, 3, 2, 0, 7 }, /* Y */
362  { 0, 5, 1, 0, 7 }, /* U */
363  { 0, 5, 4, 0, 7 }, /* V */
364  },
365  },
366  [AV_PIX_FMT_BGR8] = {
367  .name = "bgr8",
368  .nb_components = 3,
369  .log2_chroma_w = 0,
370  .log2_chroma_h = 0,
371  .comp = {
372  { 0, 0, 1, 0, 2 }, /* R */
373  { 0, 0, 1, 3, 2 }, /* G */
374  { 0, 0, 1, 6, 1 }, /* B */
375  },
377  },
378  [AV_PIX_FMT_BGR4] = {
379  .name = "bgr4",
380  .nb_components = 3,
381  .log2_chroma_w = 0,
382  .log2_chroma_h = 0,
383  .comp = {
384  { 0, 3, 4, 0, 0 }, /* R */
385  { 0, 3, 2, 0, 1 }, /* G */
386  { 0, 3, 1, 0, 0 }, /* B */
387  },
389  },
391  .name = "bgr4_byte",
392  .nb_components = 3,
393  .log2_chroma_w = 0,
394  .log2_chroma_h = 0,
395  .comp = {
396  { 0, 0, 1, 0, 0 }, /* R */
397  { 0, 0, 1, 1, 1 }, /* G */
398  { 0, 0, 1, 3, 0 }, /* B */
399  },
401  },
402  [AV_PIX_FMT_RGB8] = {
403  .name = "rgb8",
404  .nb_components = 3,
405  .log2_chroma_w = 0,
406  .log2_chroma_h = 0,
407  .comp = {
408  { 0, 0, 1, 6, 1 }, /* R */
409  { 0, 0, 1, 3, 2 }, /* G */
410  { 0, 0, 1, 0, 2 }, /* B */
411  },
413  },
414  [AV_PIX_FMT_RGB4] = {
415  .name = "rgb4",
416  .nb_components = 3,
417  .log2_chroma_w = 0,
418  .log2_chroma_h = 0,
419  .comp = {
420  { 0, 3, 1, 0, 0 }, /* R */
421  { 0, 3, 2, 0, 1 }, /* G */
422  { 0, 3, 4, 0, 0 }, /* B */
423  },
425  },
427  .name = "rgb4_byte",
428  .nb_components = 3,
429  .log2_chroma_w = 0,
430  .log2_chroma_h = 0,
431  .comp = {
432  { 0, 0, 1, 3, 0 }, /* R */
433  { 0, 0, 1, 1, 1 }, /* G */
434  { 0, 0, 1, 0, 0 }, /* B */
435  },
437  },
438  [AV_PIX_FMT_NV12] = {
439  .name = "nv12",
440  .nb_components = 3,
441  .log2_chroma_w = 1,
442  .log2_chroma_h = 1,
443  .comp = {
444  { 0, 0, 1, 0, 7 }, /* Y */
445  { 1, 1, 1, 0, 7 }, /* U */
446  { 1, 1, 2, 0, 7 }, /* V */
447  },
448  .flags = AV_PIX_FMT_FLAG_PLANAR,
449  },
450  [AV_PIX_FMT_NV21] = {
451  .name = "nv21",
452  .nb_components = 3,
453  .log2_chroma_w = 1,
454  .log2_chroma_h = 1,
455  .comp = {
456  { 0, 0, 1, 0, 7 }, /* Y */
457  { 1, 1, 2, 0, 7 }, /* U */
458  { 1, 1, 1, 0, 7 }, /* V */
459  },
460  .flags = AV_PIX_FMT_FLAG_PLANAR,
461  },
462  [AV_PIX_FMT_ARGB] = {
463  .name = "argb",
464  .nb_components = 4,
465  .log2_chroma_w = 0,
466  .log2_chroma_h = 0,
467  .comp = {
468  { 0, 3, 2, 0, 7 }, /* R */
469  { 0, 3, 3, 0, 7 }, /* G */
470  { 0, 3, 4, 0, 7 }, /* B */
471  { 0, 3, 1, 0, 7 }, /* A */
472  },
474  },
475  [AV_PIX_FMT_RGBA] = {
476  .name = "rgba",
477  .nb_components = 4,
478  .log2_chroma_w = 0,
479  .log2_chroma_h = 0,
480  .comp = {
481  { 0, 3, 1, 0, 7 }, /* R */
482  { 0, 3, 2, 0, 7 }, /* G */
483  { 0, 3, 3, 0, 7 }, /* B */
484  { 0, 3, 4, 0, 7 }, /* A */
485  },
487  },
488  [AV_PIX_FMT_ABGR] = {
489  .name = "abgr",
490  .nb_components = 4,
491  .log2_chroma_w = 0,
492  .log2_chroma_h = 0,
493  .comp = {
494  { 0, 3, 4, 0, 7 }, /* R */
495  { 0, 3, 3, 0, 7 }, /* G */
496  { 0, 3, 2, 0, 7 }, /* B */
497  { 0, 3, 1, 0, 7 }, /* A */
498  },
500  },
501  [AV_PIX_FMT_BGRA] = {
502  .name = "bgra",
503  .nb_components = 4,
504  .log2_chroma_w = 0,
505  .log2_chroma_h = 0,
506  .comp = {
507  { 0, 3, 3, 0, 7 }, /* R */
508  { 0, 3, 2, 0, 7 }, /* G */
509  { 0, 3, 1, 0, 7 }, /* B */
510  { 0, 3, 4, 0, 7 }, /* A */
511  },
513  },
514  [AV_PIX_FMT_0RGB] = {
515  .name = "0rgb",
516  .nb_components= 3,
517  .log2_chroma_w= 0,
518  .log2_chroma_h= 0,
519  .comp = {
520  { 0, 3, 2, 0, 7 }, /* R */
521  { 0, 3, 3, 0, 7 }, /* G */
522  { 0, 3, 4, 0, 7 }, /* B */
523  },
524  .flags = AV_PIX_FMT_FLAG_RGB,
525  },
526  [AV_PIX_FMT_RGB0] = {
527  .name = "rgb0",
528  .nb_components= 3,
529  .log2_chroma_w= 0,
530  .log2_chroma_h= 0,
531  .comp = {
532  { 0, 3, 1, 0, 7 }, /* R */
533  { 0, 3, 2, 0, 7 }, /* G */
534  { 0, 3, 3, 0, 7 }, /* B */
535  },
536  .flags = AV_PIX_FMT_FLAG_RGB,
537  },
538  [AV_PIX_FMT_0BGR] = {
539  .name = "0bgr",
540  .nb_components= 3,
541  .log2_chroma_w= 0,
542  .log2_chroma_h= 0,
543  .comp = {
544  { 0, 3, 4, 0, 7 }, /* R */
545  { 0, 3, 3, 0, 7 }, /* G */
546  { 0, 3, 2, 0, 7 }, /* B */
547  },
548  .flags = AV_PIX_FMT_FLAG_RGB,
549  },
550  [AV_PIX_FMT_BGR0] = {
551  .name = "bgr0",
552  .nb_components= 3,
553  .log2_chroma_w= 0,
554  .log2_chroma_h= 0,
555  .comp = {
556  { 0, 3, 3, 0, 7 }, /* R */
557  { 0, 3, 2, 0, 7 }, /* G */
558  { 0, 3, 1, 0, 7 }, /* B */
559  },
560  .flags = AV_PIX_FMT_FLAG_RGB,
561  },
562  [AV_PIX_FMT_GRAY16BE] = {
563  .name = "gray16be",
564  .nb_components = 1,
565  .log2_chroma_w = 0,
566  .log2_chroma_h = 0,
567  .comp = {
568  { 0, 1, 1, 0, 15 }, /* Y */
569  },
570  .flags = AV_PIX_FMT_FLAG_BE,
571  },
572  [AV_PIX_FMT_GRAY16LE] = {
573  .name = "gray16le",
574  .nb_components = 1,
575  .log2_chroma_w = 0,
576  .log2_chroma_h = 0,
577  .comp = {
578  { 0, 1, 1, 0, 15 }, /* Y */
579  },
580  },
581  [AV_PIX_FMT_YUV440P] = {
582  .name = "yuv440p",
583  .nb_components = 3,
584  .log2_chroma_w = 0,
585  .log2_chroma_h = 1,
586  .comp = {
587  { 0, 0, 1, 0, 7 }, /* Y */
588  { 1, 0, 1, 0, 7 }, /* U */
589  { 2, 0, 1, 0, 7 }, /* V */
590  },
591  .flags = AV_PIX_FMT_FLAG_PLANAR,
592  },
593  [AV_PIX_FMT_YUVJ440P] = {
594  .name = "yuvj440p",
595  .nb_components = 3,
596  .log2_chroma_w = 0,
597  .log2_chroma_h = 1,
598  .comp = {
599  { 0, 0, 1, 0, 7 }, /* Y */
600  { 1, 0, 1, 0, 7 }, /* U */
601  { 2, 0, 1, 0, 7 }, /* V */
602  },
603  .flags = AV_PIX_FMT_FLAG_PLANAR,
604  },
605  [AV_PIX_FMT_YUVA420P] = {
606  .name = "yuva420p",
607  .nb_components = 4,
608  .log2_chroma_w = 1,
609  .log2_chroma_h = 1,
610  .comp = {
611  { 0, 0, 1, 0, 7 }, /* Y */
612  { 1, 0, 1, 0, 7 }, /* U */
613  { 2, 0, 1, 0, 7 }, /* V */
614  { 3, 0, 1, 0, 7 }, /* A */
615  },
617  },
618  [AV_PIX_FMT_YUVA422P] = {
619  .name = "yuva422p",
620  .nb_components = 4,
621  .log2_chroma_w = 1,
622  .log2_chroma_h = 0,
623  .comp = {
624  { 0, 0, 1, 0, 7 }, /* Y */
625  { 1, 0, 1, 0, 7 }, /* U */
626  { 2, 0, 1, 0, 7 }, /* V */
627  { 3, 0, 1, 0, 7 }, /* A */
628  },
630  },
631  [AV_PIX_FMT_YUVA444P] = {
632  .name = "yuva444p",
633  .nb_components = 4,
634  .log2_chroma_w = 0,
635  .log2_chroma_h = 0,
636  .comp = {
637  { 0, 0, 1, 0, 7 }, /* Y */
638  { 1, 0, 1, 0, 7 }, /* U */
639  { 2, 0, 1, 0, 7 }, /* V */
640  { 3, 0, 1, 0, 7 }, /* A */
641  },
643  },
645  .name = "yuva420p9be",
646  .nb_components = 4,
647  .log2_chroma_w = 1,
648  .log2_chroma_h = 1,
649  .comp = {
650  { 0, 1, 1, 0, 8 }, /* Y */
651  { 1, 1, 1, 0, 8 }, /* U */
652  { 2, 1, 1, 0, 8 }, /* V */
653  { 3, 1, 1, 0, 8 }, /* A */
654  },
656  },
658  .name = "yuva420p9le",
659  .nb_components = 4,
660  .log2_chroma_w = 1,
661  .log2_chroma_h = 1,
662  .comp = {
663  { 0, 1, 1, 0, 8 }, /* Y */
664  { 1, 1, 1, 0, 8 }, /* U */
665  { 2, 1, 1, 0, 8 }, /* V */
666  { 3, 1, 1, 0, 8 }, /* A */
667  },
669  },
671  .name = "yuva422p9be",
672  .nb_components = 4,
673  .log2_chroma_w = 1,
674  .log2_chroma_h = 0,
675  .comp = {
676  { 0, 1, 1, 0, 8 }, /* Y */
677  { 1, 1, 1, 0, 8 }, /* U */
678  { 2, 1, 1, 0, 8 }, /* V */
679  { 3, 1, 1, 0, 8 }, /* A */
680  },
682  },
684  .name = "yuva422p9le",
685  .nb_components = 4,
686  .log2_chroma_w = 1,
687  .log2_chroma_h = 0,
688  .comp = {
689  { 0, 1, 1, 0, 8 }, /* Y */
690  { 1, 1, 1, 0, 8 }, /* U */
691  { 2, 1, 1, 0, 8 }, /* V */
692  { 3, 1, 1, 0, 8 }, /* A */
693  },
695  },
697  .name = "yuva444p9be",
698  .nb_components = 4,
699  .log2_chroma_w = 0,
700  .log2_chroma_h = 0,
701  .comp = {
702  { 0, 1, 1, 0, 8 }, /* Y */
703  { 1, 1, 1, 0, 8 }, /* U */
704  { 2, 1, 1, 0, 8 }, /* V */
705  { 3, 1, 1, 0, 8 }, /* A */
706  },
708  },
710  .name = "yuva444p9le",
711  .nb_components = 4,
712  .log2_chroma_w = 0,
713  .log2_chroma_h = 0,
714  .comp = {
715  { 0, 1, 1, 0, 8 }, /* Y */
716  { 1, 1, 1, 0, 8 }, /* U */
717  { 2, 1, 1, 0, 8 }, /* V */
718  { 3, 1, 1, 0, 8 }, /* A */
719  },
721  },
723  .name = "yuva420p10be",
724  .nb_components = 4,
725  .log2_chroma_w = 1,
726  .log2_chroma_h = 1,
727  .comp = {
728  { 0, 1, 1, 0, 9 }, /* Y */
729  { 1, 1, 1, 0, 9 }, /* U */
730  { 2, 1, 1, 0, 9 }, /* V */
731  { 3, 1, 1, 0, 9 }, /* A */
732  },
734  },
736  .name = "yuva420p10le",
737  .nb_components = 4,
738  .log2_chroma_w = 1,
739  .log2_chroma_h = 1,
740  .comp = {
741  { 0, 1, 1, 0, 9 }, /* Y */
742  { 1, 1, 1, 0, 9 }, /* U */
743  { 2, 1, 1, 0, 9 }, /* V */
744  { 3, 1, 1, 0, 9 }, /* A */
745  },
747  },
749  .name = "yuva422p10be",
750  .nb_components = 4,
751  .log2_chroma_w = 1,
752  .log2_chroma_h = 0,
753  .comp = {
754  { 0, 1, 1, 0, 9 }, /* Y */
755  { 1, 1, 1, 0, 9 }, /* U */
756  { 2, 1, 1, 0, 9 }, /* V */
757  { 3, 1, 1, 0, 9 }, /* A */
758  },
760  },
762  .name = "yuva422p10le",
763  .nb_components = 4,
764  .log2_chroma_w = 1,
765  .log2_chroma_h = 0,
766  .comp = {
767  { 0, 1, 1, 0, 9 }, /* Y */
768  { 1, 1, 1, 0, 9 }, /* U */
769  { 2, 1, 1, 0, 9 }, /* V */
770  { 3, 1, 1, 0, 9 }, /* A */
771  },
773  },
775  .name = "yuva444p10be",
776  .nb_components = 4,
777  .log2_chroma_w = 0,
778  .log2_chroma_h = 0,
779  .comp = {
780  { 0, 1, 1, 0, 9 }, /* Y */
781  { 1, 1, 1, 0, 9 }, /* U */
782  { 2, 1, 1, 0, 9 }, /* V */
783  { 3, 1, 1, 0, 9 }, /* A */
784  },
786  },
788  .name = "yuva444p10le",
789  .nb_components = 4,
790  .log2_chroma_w = 0,
791  .log2_chroma_h = 0,
792  .comp = {
793  { 0, 1, 1, 0, 9 }, /* Y */
794  { 1, 1, 1, 0, 9 }, /* U */
795  { 2, 1, 1, 0, 9 }, /* V */
796  { 3, 1, 1, 0, 9 }, /* A */
797  },
799  },
801  .name = "yuva420p16be",
802  .nb_components = 4,
803  .log2_chroma_w = 1,
804  .log2_chroma_h = 1,
805  .comp = {
806  { 0, 1, 1, 0, 15 }, /* Y */
807  { 1, 1, 1, 0, 15 }, /* U */
808  { 2, 1, 1, 0, 15 }, /* V */
809  { 3, 1, 1, 0, 15 }, /* A */
810  },
812  },
814  .name = "yuva420p16le",
815  .nb_components = 4,
816  .log2_chroma_w = 1,
817  .log2_chroma_h = 1,
818  .comp = {
819  { 0, 1, 1, 0, 15 }, /* Y */
820  { 1, 1, 1, 0, 15 }, /* U */
821  { 2, 1, 1, 0, 15 }, /* V */
822  { 3, 1, 1, 0, 15 }, /* A */
823  },
825  },
827  .name = "yuva422p16be",
828  .nb_components = 4,
829  .log2_chroma_w = 1,
830  .log2_chroma_h = 0,
831  .comp = {
832  { 0, 1, 1, 0, 15 }, /* Y */
833  { 1, 1, 1, 0, 15 }, /* U */
834  { 2, 1, 1, 0, 15 }, /* V */
835  { 3, 1, 1, 0, 15 }, /* A */
836  },
838  },
840  .name = "yuva422p16le",
841  .nb_components = 4,
842  .log2_chroma_w = 1,
843  .log2_chroma_h = 0,
844  .comp = {
845  { 0, 1, 1, 0, 15 }, /* Y */
846  { 1, 1, 1, 0, 15 }, /* U */
847  { 2, 1, 1, 0, 15 }, /* V */
848  { 3, 1, 1, 0, 15 }, /* A */
849  },
851  },
853  .name = "yuva444p16be",
854  .nb_components = 4,
855  .log2_chroma_w = 0,
856  .log2_chroma_h = 0,
857  .comp = {
858  { 0, 1, 1, 0, 15 }, /* Y */
859  { 1, 1, 1, 0, 15 }, /* U */
860  { 2, 1, 1, 0, 15 }, /* V */
861  { 3, 1, 1, 0, 15 }, /* A */
862  },
864  },
866  .name = "yuva444p16le",
867  .nb_components = 4,
868  .log2_chroma_w = 0,
869  .log2_chroma_h = 0,
870  .comp = {
871  { 0, 1, 1, 0, 15 }, /* Y */
872  { 1, 1, 1, 0, 15 }, /* U */
873  { 2, 1, 1, 0, 15 }, /* V */
874  { 3, 1, 1, 0, 15 }, /* A */
875  },
877  },
878 #if FF_API_VDPAU
880  .name = "vdpau_h264",
881  .log2_chroma_w = 1,
882  .log2_chroma_h = 1,
883  .flags = AV_PIX_FMT_FLAG_HWACCEL,
884  },
886  .name = "vdpau_mpeg1",
887  .log2_chroma_w = 1,
888  .log2_chroma_h = 1,
889  .flags = AV_PIX_FMT_FLAG_HWACCEL,
890  },
892  .name = "vdpau_mpeg2",
893  .log2_chroma_w = 1,
894  .log2_chroma_h = 1,
895  .flags = AV_PIX_FMT_FLAG_HWACCEL,
896  },
898  .name = "vdpau_wmv3",
899  .log2_chroma_w = 1,
900  .log2_chroma_h = 1,
901  .flags = AV_PIX_FMT_FLAG_HWACCEL,
902  },
904  .name = "vdpau_vc1",
905  .log2_chroma_w = 1,
906  .log2_chroma_h = 1,
907  .flags = AV_PIX_FMT_FLAG_HWACCEL,
908  },
910  .name = "vdpau_mpeg4",
911  .log2_chroma_w = 1,
912  .log2_chroma_h = 1,
913  .flags = AV_PIX_FMT_FLAG_HWACCEL,
914  },
915 #endif
916  [AV_PIX_FMT_RGB48BE] = {
917  .name = "rgb48be",
918  .nb_components = 3,
919  .log2_chroma_w = 0,
920  .log2_chroma_h = 0,
921  .comp = {
922  { 0, 5, 1, 0, 15 }, /* R */
923  { 0, 5, 3, 0, 15 }, /* G */
924  { 0, 5, 5, 0, 15 }, /* B */
925  },
927  },
928  [AV_PIX_FMT_RGB48LE] = {
929  .name = "rgb48le",
930  .nb_components = 3,
931  .log2_chroma_w = 0,
932  .log2_chroma_h = 0,
933  .comp = {
934  { 0, 5, 1, 0, 15 }, /* R */
935  { 0, 5, 3, 0, 15 }, /* G */
936  { 0, 5, 5, 0, 15 }, /* B */
937  },
938  .flags = AV_PIX_FMT_FLAG_RGB,
939  },
940  [AV_PIX_FMT_RGBA64BE] = {
941  .name = "rgba64be",
942  .nb_components = 4,
943  .log2_chroma_w = 0,
944  .log2_chroma_h = 0,
945  .comp = {
946  { 0, 7, 1, 0, 15 }, /* R */
947  { 0, 7, 3, 0, 15 }, /* G */
948  { 0, 7, 5, 0, 15 }, /* B */
949  { 0, 7, 7, 0, 15 }, /* A */
950  },
952  },
953  [AV_PIX_FMT_RGBA64LE] = {
954  .name = "rgba64le",
955  .nb_components = 4,
956  .log2_chroma_w = 0,
957  .log2_chroma_h = 0,
958  .comp = {
959  { 0, 7, 1, 0, 15 }, /* R */
960  { 0, 7, 3, 0, 15 }, /* G */
961  { 0, 7, 5, 0, 15 }, /* B */
962  { 0, 7, 7, 0, 15 }, /* A */
963  },
965  },
966  [AV_PIX_FMT_RGB565BE] = {
967  .name = "rgb565be",
968  .nb_components = 3,
969  .log2_chroma_w = 0,
970  .log2_chroma_h = 0,
971  .comp = {
972  { 0, 1, 0, 3, 4 }, /* R */
973  { 0, 1, 1, 5, 5 }, /* G */
974  { 0, 1, 1, 0, 4 }, /* B */
975  },
977  },
978  [AV_PIX_FMT_RGB565LE] = {
979  .name = "rgb565le",
980  .nb_components = 3,
981  .log2_chroma_w = 0,
982  .log2_chroma_h = 0,
983  .comp = {
984  { 0, 1, 2, 3, 4 }, /* R */
985  { 0, 1, 1, 5, 5 }, /* G */
986  { 0, 1, 1, 0, 4 }, /* B */
987  },
988  .flags = AV_PIX_FMT_FLAG_RGB,
989  },
990  [AV_PIX_FMT_RGB555BE] = {
991  .name = "rgb555be",
992  .nb_components = 3,
993  .log2_chroma_w = 0,
994  .log2_chroma_h = 0,
995  .comp = {
996  { 0, 1, 0, 2, 4 }, /* R */
997  { 0, 1, 1, 5, 4 }, /* G */
998  { 0, 1, 1, 0, 4 }, /* B */
999  },
1001  },
1002  [AV_PIX_FMT_RGB555LE] = {
1003  .name = "rgb555le",
1004  .nb_components = 3,
1005  .log2_chroma_w = 0,
1006  .log2_chroma_h = 0,
1007  .comp = {
1008  { 0, 1, 2, 2, 4 }, /* R */
1009  { 0, 1, 1, 5, 4 }, /* G */
1010  { 0, 1, 1, 0, 4 }, /* B */
1011  },
1012  .flags = AV_PIX_FMT_FLAG_RGB,
1013  },
1014  [AV_PIX_FMT_RGB444BE] = {
1015  .name = "rgb444be",
1016  .nb_components = 3,
1017  .log2_chroma_w = 0,
1018  .log2_chroma_h = 0,
1019  .comp = {
1020  { 0, 1, 0, 0, 3 }, /* R */
1021  { 0, 1, 1, 4, 3 }, /* G */
1022  { 0, 1, 1, 0, 3 }, /* B */
1023  },
1025  },
1026  [AV_PIX_FMT_RGB444LE] = {
1027  .name = "rgb444le",
1028  .nb_components = 3,
1029  .log2_chroma_w = 0,
1030  .log2_chroma_h = 0,
1031  .comp = {
1032  { 0, 1, 2, 0, 3 }, /* R */
1033  { 0, 1, 1, 4, 3 }, /* G */
1034  { 0, 1, 1, 0, 3 }, /* B */
1035  },
1036  .flags = AV_PIX_FMT_FLAG_RGB,
1037  },
1038  [AV_PIX_FMT_BGR48BE] = {
1039  .name = "bgr48be",
1040  .nb_components = 3,
1041  .log2_chroma_w = 0,
1042  .log2_chroma_h = 0,
1043  .comp = {
1044  { 0, 5, 5, 0, 15 }, /* R */
1045  { 0, 5, 3, 0, 15 }, /* G */
1046  { 0, 5, 1, 0, 15 }, /* B */
1047  },
1049  },
1050  [AV_PIX_FMT_BGR48LE] = {
1051  .name = "bgr48le",
1052  .nb_components = 3,
1053  .log2_chroma_w = 0,
1054  .log2_chroma_h = 0,
1055  .comp = {
1056  { 0, 5, 5, 0, 15 }, /* R */
1057  { 0, 5, 3, 0, 15 }, /* G */
1058  { 0, 5, 1, 0, 15 }, /* B */
1059  },
1060  .flags = AV_PIX_FMT_FLAG_RGB,
1061  },
1062  [AV_PIX_FMT_BGRA64BE] = {
1063  .name = "bgra64be",
1064  .nb_components = 4,
1065  .log2_chroma_w = 0,
1066  .log2_chroma_h = 0,
1067  .comp = {
1068  { 0, 7, 5, 0, 15 }, /* R */
1069  { 0, 7, 3, 0, 15 }, /* G */
1070  { 0, 7, 1, 0, 15 }, /* B */
1071  { 0, 7, 7, 0, 15 }, /* A */
1072  },
1074  },
1075  [AV_PIX_FMT_BGRA64LE] = {
1076  .name = "bgra64le",
1077  .nb_components = 4,
1078  .log2_chroma_w = 0,
1079  .log2_chroma_h = 0,
1080  .comp = {
1081  { 0, 7, 5, 0, 15 }, /* R */
1082  { 0, 7, 3, 0, 15 }, /* G */
1083  { 0, 7, 1, 0, 15 }, /* B */
1084  { 0, 7, 7, 0, 15 }, /* A */
1085  },
1087  },
1088  [AV_PIX_FMT_BGR565BE] = {
1089  .name = "bgr565be",
1090  .nb_components = 3,
1091  .log2_chroma_w = 0,
1092  .log2_chroma_h = 0,
1093  .comp = {
1094  { 0, 1, 1, 0, 4 }, /* R */
1095  { 0, 1, 1, 5, 5 }, /* G */
1096  { 0, 1, 0, 3, 4 }, /* B */
1097  },
1099  },
1100  [AV_PIX_FMT_BGR565LE] = {
1101  .name = "bgr565le",
1102  .nb_components = 3,
1103  .log2_chroma_w = 0,
1104  .log2_chroma_h = 0,
1105  .comp = {
1106  { 0, 1, 1, 0, 4 }, /* R */
1107  { 0, 1, 1, 5, 5 }, /* G */
1108  { 0, 1, 2, 3, 4 }, /* B */
1109  },
1110  .flags = AV_PIX_FMT_FLAG_RGB,
1111  },
1112  [AV_PIX_FMT_BGR555BE] = {
1113  .name = "bgr555be",
1114  .nb_components = 3,
1115  .log2_chroma_w = 0,
1116  .log2_chroma_h = 0,
1117  .comp = {
1118  { 0, 1, 1, 0, 4 }, /* R */
1119  { 0, 1, 1, 5, 4 }, /* G */
1120  { 0, 1, 0, 2, 4 }, /* B */
1121  },
1123  },
1124  [AV_PIX_FMT_BGR555LE] = {
1125  .name = "bgr555le",
1126  .nb_components = 3,
1127  .log2_chroma_w = 0,
1128  .log2_chroma_h = 0,
1129  .comp = {
1130  { 0, 1, 1, 0, 4 }, /* R */
1131  { 0, 1, 1, 5, 4 }, /* G */
1132  { 0, 1, 2, 2, 4 }, /* B */
1133  },
1134  .flags = AV_PIX_FMT_FLAG_RGB,
1135  },
1136  [AV_PIX_FMT_BGR444BE] = {
1137  .name = "bgr444be",
1138  .nb_components = 3,
1139  .log2_chroma_w = 0,
1140  .log2_chroma_h = 0,
1141  .comp = {
1142  { 0, 1, 1, 0, 3 }, /* R */
1143  { 0, 1, 1, 4, 3 }, /* G */
1144  { 0, 1, 0, 0, 3 }, /* B */
1145  },
1147  },
1148  [AV_PIX_FMT_BGR444LE] = {
1149  .name = "bgr444le",
1150  .nb_components = 3,
1151  .log2_chroma_w = 0,
1152  .log2_chroma_h = 0,
1153  .comp = {
1154  { 0, 1, 1, 0, 3 }, /* R */
1155  { 0, 1, 1, 4, 3 }, /* G */
1156  { 0, 1, 2, 0, 3 }, /* B */
1157  },
1158  .flags = AV_PIX_FMT_FLAG_RGB,
1159  },
1160  [AV_PIX_FMT_VAAPI_MOCO] = {
1161  .name = "vaapi_moco",
1162  .log2_chroma_w = 1,
1163  .log2_chroma_h = 1,
1164  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1165  },
1166  [AV_PIX_FMT_VAAPI_IDCT] = {
1167  .name = "vaapi_idct",
1168  .log2_chroma_w = 1,
1169  .log2_chroma_h = 1,
1170  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1171  },
1172  [AV_PIX_FMT_VAAPI_VLD] = {
1173  .name = "vaapi_vld",
1174  .log2_chroma_w = 1,
1175  .log2_chroma_h = 1,
1176  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1177  },
1178  [AV_PIX_FMT_YUV420P9LE] = {
1179  .name = "yuv420p9le",
1180  .nb_components = 3,
1181  .log2_chroma_w = 1,
1182  .log2_chroma_h = 1,
1183  .comp = {
1184  { 0, 1, 1, 0, 8 }, /* Y */
1185  { 1, 1, 1, 0, 8 }, /* U */
1186  { 2, 1, 1, 0, 8 }, /* V */
1187  },
1188  .flags = AV_PIX_FMT_FLAG_PLANAR,
1189  },
1190  [AV_PIX_FMT_YUV420P9BE] = {
1191  .name = "yuv420p9be",
1192  .nb_components = 3,
1193  .log2_chroma_w = 1,
1194  .log2_chroma_h = 1,
1195  .comp = {
1196  { 0, 1, 1, 0, 8 }, /* Y */
1197  { 1, 1, 1, 0, 8 }, /* U */
1198  { 2, 1, 1, 0, 8 }, /* V */
1199  },
1201  },
1203  .name = "yuv420p10le",
1204  .nb_components = 3,
1205  .log2_chroma_w = 1,
1206  .log2_chroma_h = 1,
1207  .comp = {
1208  { 0, 1, 1, 0, 9 }, /* Y */
1209  { 1, 1, 1, 0, 9 }, /* U */
1210  { 2, 1, 1, 0, 9 }, /* V */
1211  },
1212  .flags = AV_PIX_FMT_FLAG_PLANAR,
1213  },
1215  .name = "yuv420p10be",
1216  .nb_components = 3,
1217  .log2_chroma_w = 1,
1218  .log2_chroma_h = 1,
1219  .comp = {
1220  { 0, 1, 1, 0, 9 }, /* Y */
1221  { 1, 1, 1, 0, 9 }, /* U */
1222  { 2, 1, 1, 0, 9 }, /* V */
1223  },
1225  },
1227  .name = "yuv420p12le",
1228  .nb_components = 3,
1229  .log2_chroma_w = 1,
1230  .log2_chroma_h = 1,
1231  .comp = {
1232  { 0, 1, 1, 0, 11 }, /* Y */
1233  { 1, 1, 1, 0, 11 }, /* U */
1234  { 2, 1, 1, 0, 11 }, /* V */
1235  },
1236  .flags = AV_PIX_FMT_FLAG_PLANAR,
1237  },
1239  .name = "yuv420p12be",
1240  .nb_components = 3,
1241  .log2_chroma_w = 1,
1242  .log2_chroma_h = 1,
1243  .comp = {
1244  { 0, 1, 1, 0, 11 }, /* Y */
1245  { 1, 1, 1, 0, 11 }, /* U */
1246  { 2, 1, 1, 0, 11 }, /* V */
1247  },
1249  },
1251  .name = "yuv420p14le",
1252  .nb_components = 3,
1253  .log2_chroma_w = 1,
1254  .log2_chroma_h = 1,
1255  .comp = {
1256  { 0, 1, 1, 0, 13 }, /* Y */
1257  { 1, 1, 1, 0, 13 }, /* U */
1258  { 2, 1, 1, 0, 13 }, /* V */
1259  },
1260  .flags = AV_PIX_FMT_FLAG_PLANAR,
1261  },
1263  .name = "yuv420p14be",
1264  .nb_components = 3,
1265  .log2_chroma_w = 1,
1266  .log2_chroma_h = 1,
1267  .comp = {
1268  { 0, 1, 1, 0, 13 }, /* Y */
1269  { 1, 1, 1, 0, 13 }, /* U */
1270  { 2, 1, 1, 0, 13 }, /* V */
1271  },
1273  },
1275  .name = "yuv420p16le",
1276  .nb_components = 3,
1277  .log2_chroma_w = 1,
1278  .log2_chroma_h = 1,
1279  .comp = {
1280  { 0, 1, 1, 0, 15 }, /* Y */
1281  { 1, 1, 1, 0, 15 }, /* U */
1282  { 2, 1, 1, 0, 15 }, /* V */
1283  },
1284  .flags = AV_PIX_FMT_FLAG_PLANAR,
1285  },
1287  .name = "yuv420p16be",
1288  .nb_components = 3,
1289  .log2_chroma_w = 1,
1290  .log2_chroma_h = 1,
1291  .comp = {
1292  { 0, 1, 1, 0, 15 }, /* Y */
1293  { 1, 1, 1, 0, 15 }, /* U */
1294  { 2, 1, 1, 0, 15 }, /* V */
1295  },
1297  },
1298  [AV_PIX_FMT_YUV422P9LE] = {
1299  .name = "yuv422p9le",
1300  .nb_components = 3,
1301  .log2_chroma_w = 1,
1302  .log2_chroma_h = 0,
1303  .comp = {
1304  { 0, 1, 1, 0, 8 }, /* Y */
1305  { 1, 1, 1, 0, 8 }, /* U */
1306  { 2, 1, 1, 0, 8 }, /* V */
1307  },
1308  .flags = AV_PIX_FMT_FLAG_PLANAR,
1309  },
1310  [AV_PIX_FMT_YUV422P9BE] = {
1311  .name = "yuv422p9be",
1312  .nb_components = 3,
1313  .log2_chroma_w = 1,
1314  .log2_chroma_h = 0,
1315  .comp = {
1316  { 0, 1, 1, 0, 8 }, /* Y */
1317  { 1, 1, 1, 0, 8 }, /* U */
1318  { 2, 1, 1, 0, 8 }, /* V */
1319  },
1321  },
1323  .name = "yuv422p10le",
1324  .nb_components = 3,
1325  .log2_chroma_w = 1,
1326  .log2_chroma_h = 0,
1327  .comp = {
1328  { 0, 1, 1, 0, 9 }, /* Y */
1329  { 1, 1, 1, 0, 9 }, /* U */
1330  { 2, 1, 1, 0, 9 }, /* V */
1331  },
1332  .flags = AV_PIX_FMT_FLAG_PLANAR,
1333  },
1335  .name = "yuv422p10be",
1336  .nb_components = 3,
1337  .log2_chroma_w = 1,
1338  .log2_chroma_h = 0,
1339  .comp = {
1340  { 0, 1, 1, 0, 9 }, /* Y */
1341  { 1, 1, 1, 0, 9 }, /* U */
1342  { 2, 1, 1, 0, 9 }, /* V */
1343  },
1345  },
1347  .name = "yuv422p12le",
1348  .nb_components = 3,
1349  .log2_chroma_w = 1,
1350  .log2_chroma_h = 0,
1351  .comp = {
1352  { 0, 1, 1, 0, 11 }, /* Y */
1353  { 1, 1, 1, 0, 11 }, /* U */
1354  { 2, 1, 1, 0, 11 }, /* V */
1355  },
1356  .flags = AV_PIX_FMT_FLAG_PLANAR,
1357  },
1359  .name = "yuv422p12be",
1360  .nb_components = 3,
1361  .log2_chroma_w = 1,
1362  .log2_chroma_h = 0,
1363  .comp = {
1364  { 0, 1, 1, 0, 11 }, /* Y */
1365  { 1, 1, 1, 0, 11 }, /* U */
1366  { 2, 1, 1, 0, 11 }, /* V */
1367  },
1369  },
1371  .name = "yuv422p14le",
1372  .nb_components = 3,
1373  .log2_chroma_w = 1,
1374  .log2_chroma_h = 0,
1375  .comp = {
1376  { 0, 1, 1, 0, 13 }, /* Y */
1377  { 1, 1, 1, 0, 13 }, /* U */
1378  { 2, 1, 1, 0, 13 }, /* V */
1379  },
1380  .flags = AV_PIX_FMT_FLAG_PLANAR,
1381  },
1383  .name = "yuv422p14be",
1384  .nb_components = 3,
1385  .log2_chroma_w = 1,
1386  .log2_chroma_h = 0,
1387  .comp = {
1388  { 0, 1, 1, 0, 13 }, /* Y */
1389  { 1, 1, 1, 0, 13 }, /* U */
1390  { 2, 1, 1, 0, 13 }, /* V */
1391  },
1393  },
1395  .name = "yuv422p16le",
1396  .nb_components = 3,
1397  .log2_chroma_w = 1,
1398  .log2_chroma_h = 0,
1399  .comp = {
1400  { 0, 1, 1, 0, 15 }, /* Y */
1401  { 1, 1, 1, 0, 15 }, /* U */
1402  { 2, 1, 1, 0, 15 }, /* V */
1403  },
1404  .flags = AV_PIX_FMT_FLAG_PLANAR,
1405  },
1407  .name = "yuv422p16be",
1408  .nb_components = 3,
1409  .log2_chroma_w = 1,
1410  .log2_chroma_h = 0,
1411  .comp = {
1412  { 0, 1, 1, 0, 15 }, /* Y */
1413  { 1, 1, 1, 0, 15 }, /* U */
1414  { 2, 1, 1, 0, 15 }, /* V */
1415  },
1417  },
1419  .name = "yuv444p16le",
1420  .nb_components = 3,
1421  .log2_chroma_w = 0,
1422  .log2_chroma_h = 0,
1423  .comp = {
1424  { 0, 1, 1, 0, 15 }, /* Y */
1425  { 1, 1, 1, 0, 15 }, /* U */
1426  { 2, 1, 1, 0, 15 }, /* V */
1427  },
1428  .flags = AV_PIX_FMT_FLAG_PLANAR,
1429  },
1431  .name = "yuv444p16be",
1432  .nb_components = 3,
1433  .log2_chroma_w = 0,
1434  .log2_chroma_h = 0,
1435  .comp = {
1436  { 0, 1, 1, 0, 15 }, /* Y */
1437  { 1, 1, 1, 0, 15 }, /* U */
1438  { 2, 1, 1, 0, 15 }, /* V */
1439  },
1441  },
1443  .name = "yuv444p10le",
1444  .nb_components = 3,
1445  .log2_chroma_w = 0,
1446  .log2_chroma_h = 0,
1447  .comp = {
1448  { 0, 1, 1, 0, 9 }, /* Y */
1449  { 1, 1, 1, 0, 9 }, /* U */
1450  { 2, 1, 1, 0, 9 }, /* V */
1451  },
1452  .flags = AV_PIX_FMT_FLAG_PLANAR,
1453  },
1455  .name = "yuv444p10be",
1456  .nb_components = 3,
1457  .log2_chroma_w = 0,
1458  .log2_chroma_h = 0,
1459  .comp = {
1460  { 0, 1, 1, 0, 9 }, /* Y */
1461  { 1, 1, 1, 0, 9 }, /* U */
1462  { 2, 1, 1, 0, 9 }, /* V */
1463  },
1465  },
1466  [AV_PIX_FMT_YUV444P9LE] = {
1467  .name = "yuv444p9le",
1468  .nb_components = 3,
1469  .log2_chroma_w = 0,
1470  .log2_chroma_h = 0,
1471  .comp = {
1472  { 0, 1, 1, 0, 8 }, /* Y */
1473  { 1, 1, 1, 0, 8 }, /* U */
1474  { 2, 1, 1, 0, 8 }, /* V */
1475  },
1476  .flags = AV_PIX_FMT_FLAG_PLANAR,
1477  },
1478  [AV_PIX_FMT_YUV444P9BE] = {
1479  .name = "yuv444p9be",
1480  .nb_components = 3,
1481  .log2_chroma_w = 0,
1482  .log2_chroma_h = 0,
1483  .comp = {
1484  { 0, 1, 1, 0, 8 }, /* Y */
1485  { 1, 1, 1, 0, 8 }, /* U */
1486  { 2, 1, 1, 0, 8 }, /* V */
1487  },
1489  },
1491  .name = "yuv444p12le",
1492  .nb_components = 3,
1493  .log2_chroma_w = 0,
1494  .log2_chroma_h = 0,
1495  .comp = {
1496  { 0, 1, 1, 0, 11 }, /* Y */
1497  { 1, 1, 1, 0, 11 }, /* U */
1498  { 2, 1, 1, 0, 11 }, /* V */
1499  },
1500  .flags = AV_PIX_FMT_FLAG_PLANAR,
1501  },
1503  .name = "yuv444p12be",
1504  .nb_components = 3,
1505  .log2_chroma_w = 0,
1506  .log2_chroma_h = 0,
1507  .comp = {
1508  { 0, 1, 1, 0, 11 }, /* Y */
1509  { 1, 1, 1, 0, 11 }, /* U */
1510  { 2, 1, 1, 0, 11 }, /* V */
1511  },
1513  },
1515  .name = "yuv444p14le",
1516  .nb_components = 3,
1517  .log2_chroma_w = 0,
1518  .log2_chroma_h = 0,
1519  .comp = {
1520  { 0, 1, 1, 0, 13 }, /* Y */
1521  { 1, 1, 1, 0, 13 }, /* U */
1522  { 2, 1, 1, 0, 13 }, /* V */
1523  },
1524  .flags = AV_PIX_FMT_FLAG_PLANAR,
1525  },
1527  .name = "yuv444p14be",
1528  .nb_components = 3,
1529  .log2_chroma_w = 0,
1530  .log2_chroma_h = 0,
1531  .comp = {
1532  { 0, 1, 1, 0, 13 }, /* Y */
1533  { 1, 1, 1, 0, 13 }, /* U */
1534  { 2, 1, 1, 0, 13 }, /* V */
1535  },
1537  },
1538  [AV_PIX_FMT_DXVA2_VLD] = {
1539  .name = "dxva2_vld",
1540  .log2_chroma_w = 1,
1541  .log2_chroma_h = 1,
1542  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1543  },
1544  [AV_PIX_FMT_VDA_VLD] = {
1545  .name = "vda_vld",
1546  .log2_chroma_w = 1,
1547  .log2_chroma_h = 1,
1548  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1549  },
1550  [AV_PIX_FMT_GRAY8A] = {
1551  .name = "gray8a",
1552  .nb_components = 2,
1553  .comp = {
1554  { 0, 1, 1, 0, 7 }, /* Y */
1555  { 0, 1, 2, 0, 7 }, /* A */
1556  },
1557  .flags = AV_PIX_FMT_FLAG_ALPHA,
1558  },
1559  [AV_PIX_FMT_GBRP] = {
1560  .name = "gbrp",
1561  .nb_components = 3,
1562  .log2_chroma_w = 0,
1563  .log2_chroma_h = 0,
1564  .comp = {
1565  { 2, 0, 1, 0, 7 }, /* R */
1566  { 0, 0, 1, 0, 7 }, /* G */
1567  { 1, 0, 1, 0, 7 }, /* B */
1568  },
1570  },
1571  [AV_PIX_FMT_GBRP9LE] = {
1572  .name = "gbrp9le",
1573  .nb_components = 3,
1574  .log2_chroma_w = 0,
1575  .log2_chroma_h = 0,
1576  .comp = {
1577  { 2, 1, 1, 0, 8 }, /* R */
1578  { 0, 1, 1, 0, 8 }, /* G */
1579  { 1, 1, 1, 0, 8 }, /* B */
1580  },
1582  },
1583  [AV_PIX_FMT_GBRP9BE] = {
1584  .name = "gbrp9be",
1585  .nb_components = 3,
1586  .log2_chroma_w = 0,
1587  .log2_chroma_h = 0,
1588  .comp = {
1589  { 2, 1, 1, 0, 8 }, /* R */
1590  { 0, 1, 1, 0, 8 }, /* G */
1591  { 1, 1, 1, 0, 8 }, /* B */
1592  },
1594  },
1595  [AV_PIX_FMT_GBRP10LE] = {
1596  .name = "gbrp10le",
1597  .nb_components = 3,
1598  .log2_chroma_w = 0,
1599  .log2_chroma_h = 0,
1600  .comp = {
1601  { 2, 1, 1, 0, 9 }, /* R */
1602  { 0, 1, 1, 0, 9 }, /* G */
1603  { 1, 1, 1, 0, 9 }, /* B */
1604  },
1606  },
1607  [AV_PIX_FMT_GBRP10BE] = {
1608  .name = "gbrp10be",
1609  .nb_components = 3,
1610  .log2_chroma_w = 0,
1611  .log2_chroma_h = 0,
1612  .comp = {
1613  { 2, 1, 1, 0, 9 }, /* R */
1614  { 0, 1, 1, 0, 9 }, /* G */
1615  { 1, 1, 1, 0, 9 }, /* B */
1616  },
1618  },
1619  [AV_PIX_FMT_GBRP12LE] = {
1620  .name = "gbrp12le",
1621  .nb_components = 3,
1622  .log2_chroma_w = 0,
1623  .log2_chroma_h = 0,
1624  .comp = {
1625  { 2, 1, 1, 0, 11 }, /* R */
1626  { 0, 1, 1, 0, 11 }, /* G */
1627  { 1, 1, 1, 0, 11 }, /* B */
1628  },
1630  },
1631  [AV_PIX_FMT_GBRP12BE] = {
1632  .name = "gbrp12be",
1633  .nb_components = 3,
1634  .log2_chroma_w = 0,
1635  .log2_chroma_h = 0,
1636  .comp = {
1637  { 2, 1, 1, 0, 11 }, /* R */
1638  { 0, 1, 1, 0, 11 }, /* G */
1639  { 1, 1, 1, 0, 11 }, /* B */
1640  },
1642  },
1643  [AV_PIX_FMT_GBRP14LE] = {
1644  .name = "gbrp14le",
1645  .nb_components = 3,
1646  .log2_chroma_w = 0,
1647  .log2_chroma_h = 0,
1648  .comp = {
1649  { 2, 1, 1, 0, 13 }, /* R */
1650  { 0, 1, 1, 0, 13 }, /* G */
1651  { 1, 1, 1, 0, 13 }, /* B */
1652  },
1654  },
1655  [AV_PIX_FMT_GBRP14BE] = {
1656  .name = "gbrp14be",
1657  .nb_components = 3,
1658  .log2_chroma_w = 0,
1659  .log2_chroma_h = 0,
1660  .comp = {
1661  { 2, 1, 1, 0, 13 }, /* R */
1662  { 0, 1, 1, 0, 13 }, /* G */
1663  { 1, 1, 1, 0, 13 }, /* B */
1664  },
1666  },
1667  [AV_PIX_FMT_GBRP16LE] = {
1668  .name = "gbrp16le",
1669  .nb_components = 3,
1670  .log2_chroma_w = 0,
1671  .log2_chroma_h = 0,
1672  .comp = {
1673  { 2, 1, 1, 0, 15 }, /* R */
1674  { 0, 1, 1, 0, 15 }, /* G */
1675  { 1, 1, 1, 0, 15 }, /* B */
1676  },
1678  },
1679  [AV_PIX_FMT_GBRP16BE] = {
1680  .name = "gbrp16be",
1681  .nb_components = 3,
1682  .log2_chroma_w = 0,
1683  .log2_chroma_h = 0,
1684  .comp = {
1685  { 2, 1, 1, 0, 15 }, /* R */
1686  { 0, 1, 1, 0, 15 }, /* G */
1687  { 1, 1, 1, 0, 15 }, /* B */
1688  },
1690  },
1691  [AV_PIX_FMT_GBRAP] = {
1692  .name = "gbrap",
1693  .nb_components = 4,
1694  .log2_chroma_w = 0,
1695  .log2_chroma_h = 0,
1696  .comp = {
1697  { 2, 0, 1, 0, 7 }, /* R */
1698  { 0, 0, 1, 0, 7 }, /* G */
1699  { 1, 0, 1, 0, 7 }, /* B */
1700  { 3, 0, 1, 0, 7 }, /* A */
1701  },
1703  },
1704  [AV_PIX_FMT_GBRAP16LE] = {
1705  .name = "gbrap16le",
1706  .nb_components = 4,
1707  .log2_chroma_w = 0,
1708  .log2_chroma_h = 0,
1709  .comp = {
1710  { 2, 1, 1, 0, 15 }, /* R */
1711  { 0, 1, 1, 0, 15 }, /* G */
1712  { 1, 1, 1, 0, 15 }, /* B */
1713  { 3, 1, 1, 0, 15 }, /* A */
1714  },
1716  },
1717  [AV_PIX_FMT_GBRAP16BE] = {
1718  .name = "gbrap16be",
1719  .nb_components = 4,
1720  .log2_chroma_w = 0,
1721  .log2_chroma_h = 0,
1722  .comp = {
1723  { 2, 1, 1, 0, 15 }, /* R */
1724  { 0, 1, 1, 0, 15 }, /* G */
1725  { 1, 1, 1, 0, 15 }, /* B */
1726  { 3, 1, 1, 0, 15 }, /* A */
1727  },
1729  },
1730  [AV_PIX_FMT_VDPAU] = {
1731  .name = "vdpau",
1732  .log2_chroma_w = 1,
1733  .log2_chroma_h = 1,
1734  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1735  },
1736  [AV_PIX_FMT_XYZ12LE] = {
1737  .name = "xyz12le",
1738  .nb_components = 3,
1739  .log2_chroma_w = 0,
1740  .log2_chroma_h = 0,
1741  .comp = {
1742  { 0, 5, 1, 4, 11 }, /* X */
1743  { 0, 5, 3, 4, 11 }, /* Y */
1744  { 0, 5, 5, 4, 11 }, /* Z */
1745  },
1746  /*.flags = -- not used*/
1747  },
1748  [AV_PIX_FMT_XYZ12BE] = {
1749  .name = "xyz12be",
1750  .nb_components = 3,
1751  .log2_chroma_w = 0,
1752  .log2_chroma_h = 0,
1753  .comp = {
1754  { 0, 5, 1, 4, 11 }, /* X */
1755  { 0, 5, 3, 4, 11 }, /* Y */
1756  { 0, 5, 5, 4, 11 }, /* Z */
1757  },
1758  .flags = AV_PIX_FMT_FLAG_BE,
1759  },
1760 
1761 #define BAYER8_DESC_COMMON \
1762  .nb_components= 3, \
1763  .log2_chroma_w= 0, \
1764  .log2_chroma_h= 0, \
1765  .comp = { \
1766  {0,0,0,0,1}, \
1767  {0,0,0,0,3}, \
1768  {0,0,0,0,1}, \
1769  }, \
1770 
1771 #define BAYER16_DESC_COMMON \
1772  .nb_components= 3, \
1773  .log2_chroma_w= 0, \
1774  .log2_chroma_h= 0, \
1775  .comp = { \
1776  {0,1,0,0, 3}, \
1777  {0,1,0,0, 7}, \
1778  {0,1,0,0, 3}, \
1779  }, \
1780 
1782  .name = "bayer_bggr8",
1784  .flags = AV_PIX_FMT_FLAG_RGB,
1785  },
1787  .name = "bayer_bggr16le",
1789  .flags = AV_PIX_FMT_FLAG_RGB,
1790  },
1792  .name = "bayer_bggr16be",
1795  },
1797  .name = "bayer_rggb8",
1799  .flags = AV_PIX_FMT_FLAG_RGB,
1800  },
1802  .name = "bayer_rggb16le",
1804  .flags = AV_PIX_FMT_FLAG_RGB,
1805  },
1807  .name = "bayer_rggb16be",
1810  },
1812  .name = "bayer_gbrg8",
1814  .flags = AV_PIX_FMT_FLAG_RGB,
1815  },
1817  .name = "bayer_gbrg16le",
1819  .flags = AV_PIX_FMT_FLAG_RGB,
1820  },
1822  .name = "bayer_gbrg16be",
1825  },
1827  .name = "bayer_grbg8",
1829  .flags = AV_PIX_FMT_FLAG_RGB,
1830  },
1832  .name = "bayer_grbg16le",
1834  .flags = AV_PIX_FMT_FLAG_RGB,
1835  },
1837  .name = "bayer_grbg16be",
1840  },
1841  [AV_PIX_FMT_NV16] = {
1842  .name = "nv16",
1843  .nb_components = 3,
1844  .log2_chroma_w = 1,
1845  .log2_chroma_h = 0,
1846  .comp = {
1847  { 0, 0, 1, 0, 7 }, /* Y */
1848  { 1, 1, 1, 0, 7 }, /* U */
1849  { 1, 1, 2, 0, 7 }, /* V */
1850  },
1851  .flags = AV_PIX_FMT_FLAG_PLANAR,
1852  },
1853  [AV_PIX_FMT_NV20LE] = {
1854  .name = "nv20le",
1855  .nb_components = 3,
1856  .log2_chroma_w = 1,
1857  .log2_chroma_h = 0,
1858  .comp = {
1859  { 0, 1, 1, 0, 9 }, /* Y */
1860  { 1, 3, 1, 0, 9 }, /* U */
1861  { 1, 3, 3, 0, 9 }, /* V */
1862  },
1863  .flags = AV_PIX_FMT_FLAG_PLANAR,
1864  },
1865  [AV_PIX_FMT_NV20BE] = {
1866  .name = "nv20be",
1867  .nb_components = 3,
1868  .log2_chroma_w = 1,
1869  .log2_chroma_h = 0,
1870  .comp = {
1871  { 0, 1, 1, 0, 9 }, /* Y */
1872  { 1, 3, 1, 0, 9 }, /* U */
1873  { 1, 3, 3, 0, 9 }, /* V */
1874  },
1876  },
1877  [AV_PIX_FMT_VDA] = {
1878  .name = "vda",
1879  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1880  },
1881 };
1882 
1884 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1885 {
1886  enum AVPixelFormat pix_fmt;
1887 
1888  for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1889  if (av_pix_fmt_descriptors[pix_fmt].name &&
1890  !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1891  return pix_fmt;
1892 
1893  return AV_PIX_FMT_NONE;
1894 }
1895 
1897 {
1898  return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1899  av_pix_fmt_descriptors[pix_fmt].name : NULL;
1900 }
1901 
1902 #if HAVE_BIGENDIAN
1903 # define X_NE(be, le) be
1904 #else
1905 # define X_NE(be, le) le
1906 #endif
1907 
1909 {
1910  enum AVPixelFormat pix_fmt;
1911 
1912  if (!strcmp(name, "rgb32"))
1913  name = X_NE("argb", "bgra");
1914  else if (!strcmp(name, "bgr32"))
1915  name = X_NE("abgr", "rgba");
1916 
1917  pix_fmt = get_pix_fmt_internal(name);
1918  if (pix_fmt == AV_PIX_FMT_NONE) {
1919  char name2[32];
1920 
1921  snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1922  pix_fmt = get_pix_fmt_internal(name2);
1923  }
1924  return pix_fmt;
1925 }
1926 
1928 {
1929  int c, bits = 0;
1930  int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1931 
1932  for (c = 0; c < pixdesc->nb_components; c++) {
1933  int s = c == 1 || c == 2 ? 0 : log2_pixels;
1934  bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1935  }
1936 
1937  return bits >> log2_pixels;
1938 }
1939 
1941 {
1942  int c, bits = 0;
1943  int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1944  int steps[4] = {0};
1945 
1946  for (c = 0; c < pixdesc->nb_components; c++) {
1947  const AVComponentDescriptor *comp = &pixdesc->comp[c];
1948  int s = c == 1 || c == 2 ? 0 : log2_pixels;
1949  steps[comp->plane] = (comp->step_minus1 + 1) << s;
1950  }
1951  for (c = 0; c < 4; c++)
1952  bits += steps[c];
1953 
1954  if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
1955  bits *= 8;
1956 
1957  return bits >> log2_pixels;
1958 }
1959 
1960 char *av_get_pix_fmt_string(char *buf, int buf_size,
1961  enum AVPixelFormat pix_fmt)
1962 {
1963  /* print header */
1964  if (pix_fmt < 0) {
1965  snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1966  } else {
1967  const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1968  snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1969  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1970  }
1971 
1972  return buf;
1973 }
1974 
1976 {
1977  if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
1978  return NULL;
1979  return &av_pix_fmt_descriptors[pix_fmt];
1980 }
1981 
1983 {
1984  if (!prev)
1985  return &av_pix_fmt_descriptors[0];
1986  while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
1987  prev++;
1988  if (prev->name)
1989  return prev;
1990  }
1991  return NULL;
1992 }
1993 
1995 {
1996  if (desc < av_pix_fmt_descriptors ||
1997  desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
1998  return AV_PIX_FMT_NONE;
1999 
2000  return desc - av_pix_fmt_descriptors;
2001 }
2003 
2005  int *h_shift, int *v_shift)
2006 {
2007  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2008  if (!desc)
2009  return AVERROR(ENOSYS);
2010  *h_shift = desc->log2_chroma_w;
2011  *v_shift = desc->log2_chroma_h;
2012 
2013  return 0;
2014 }
2015 
2017 {
2018  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2019  int i, planes[4] = { 0 }, ret = 0;
2020 
2021  if (!desc)
2022  return AVERROR(EINVAL);
2023 
2024  for (i = 0; i < desc->nb_components; i++)
2025  planes[desc->comp[i].plane] = 1;
2026  for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
2027  ret += planes[i];
2028  return ret;
2029 }
2030 
2032  int i, j;
2033 
2034  for (i=0; i<FF_ARRAY_ELEMS(av_pix_fmt_descriptors); i++) {
2035  const AVPixFmtDescriptor *d = &av_pix_fmt_descriptors[i];
2036  uint8_t fill[4][8+6+3] = {{0}};
2037  uint8_t *data[4] = {fill[0], fill[1], fill[2], fill[3]};
2038  int linesize[4] = {0,0,0,0};
2039  uint16_t tmp[2];
2040 
2041  if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
2042  continue;
2043 // av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
2044  av_assert0(d->log2_chroma_w <= 3);
2045  av_assert0(d->log2_chroma_h <= 3);
2046  av_assert0(d->nb_components <= 4);
2047  av_assert0(d->name && d->name[0]);
2048  av_assert0((d->nb_components==4 || d->nb_components==2) == !!(d->flags & AV_PIX_FMT_FLAG_ALPHA));
2049  av_assert2(av_get_pix_fmt(d->name) == i);
2050 
2051  for (j=0; j<FF_ARRAY_ELEMS(d->comp); j++) {
2052  const AVComponentDescriptor *c = &d->comp[j];
2053  if(j>=d->nb_components) {
2054  av_assert0(!c->plane && !c->step_minus1 && !c->offset_plus1 && !c->shift && !c->depth_minus1);
2055  continue;
2056  }
2057  if (d->flags & AV_PIX_FMT_FLAG_BITSTREAM) {
2059  } else {
2060  av_assert0(8*(c->step_minus1+1) >= c->depth_minus1+1);
2061  }
2062  if (!strncmp(d->name, "bayer_", 6))
2063  continue;
2064  av_read_image_line(tmp, (void*)data, linesize, d, 0, 0, j, 2, 0);
2065  av_assert0(tmp[0] == 0 && tmp[1] == 0);
2066  tmp[0] = tmp[1] = (1<<(c->depth_minus1 + 1)) - 1;
2067  av_write_image_line(tmp, data, linesize, d, 0, 0, j, 2);
2068  }
2069  }
2070 }
2071 
2072 
2074 {
2075  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2076  char name[16];
2077  int i;
2078 
2079  if (!desc || strlen(desc->name) < 2)
2080  return AV_PIX_FMT_NONE;
2081  av_strlcpy(name, desc->name, sizeof(name));
2082  i = strlen(name) - 2;
2083  if (strcmp(name + i, "be") && strcmp(name + i, "le"))
2084  return AV_PIX_FMT_NONE;
2085 
2086  name[i] ^= 'b' ^ 'l';
2087 
2088  return get_pix_fmt_internal(name);
2089 }
2090 
2091 #define FF_COLOR_NA -1
2092 #define FF_COLOR_RGB 0 /**< RGB color space */
2093 #define FF_COLOR_GRAY 1 /**< gray color space */
2094 #define FF_COLOR_YUV 2 /**< YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
2095 #define FF_COLOR_YUV_JPEG 3 /**< YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
2096 
2097 #define pixdesc_has_alpha(pixdesc) \
2098  ((pixdesc)->nb_components == 2 || (pixdesc)->nb_components == 4 || (pixdesc)->flags & AV_PIX_FMT_FLAG_PAL)
2099 
2100 
2101 static int get_color_type(const AVPixFmtDescriptor *desc) {
2102  if (desc->flags & AV_PIX_FMT_FLAG_PAL)
2103  return FF_COLOR_RGB;
2104 
2105  if(desc->nb_components == 1 || desc->nb_components == 2)
2106  return FF_COLOR_GRAY;
2107 
2108  if(desc->name && !strncmp(desc->name, "yuvj", 4))
2109  return FF_COLOR_YUV_JPEG;
2110 
2111  if(desc->flags & AV_PIX_FMT_FLAG_RGB)
2112  return FF_COLOR_RGB;
2113 
2114  if(desc->nb_components == 0)
2115  return FF_COLOR_NA;
2116 
2117  return FF_COLOR_YUV;
2118 }
2119 
2120 static int get_pix_fmt_depth(int *min, int *max, enum AVPixelFormat pix_fmt)
2121 {
2122  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2123  int i;
2124 
2125  if (!desc || !desc->nb_components) {
2126  *min = *max = 0;
2127  return AVERROR(EINVAL);
2128  }
2129 
2130  *min = INT_MAX, *max = -INT_MAX;
2131  for (i = 0; i < desc->nb_components; i++) {
2132  *min = FFMIN(desc->comp[i].depth_minus1+1, *min);
2133  *max = FFMAX(desc->comp[i].depth_minus1+1, *max);
2134  }
2135  return 0;
2136 }
2137 
2138 static int get_pix_fmt_score(enum AVPixelFormat dst_pix_fmt,
2139  enum AVPixelFormat src_pix_fmt,
2140  unsigned *lossp, unsigned consider)
2141 {
2142  const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(src_pix_fmt);
2143  const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(dst_pix_fmt);
2144  int src_color, dst_color;
2145  int src_min_depth, src_max_depth, dst_min_depth, dst_max_depth;
2146  int ret, loss, i, nb_components;
2147  int score = INT_MAX - 1;
2148 
2149  if (dst_pix_fmt >= AV_PIX_FMT_NB || dst_pix_fmt <= AV_PIX_FMT_NONE)
2150  return ~0;
2151 
2152  /* compute loss */
2153  *lossp = loss = 0;
2154 
2155  if (dst_pix_fmt == src_pix_fmt)
2156  return INT_MAX;
2157 
2158  if ((ret = get_pix_fmt_depth(&src_min_depth, &src_max_depth, src_pix_fmt)) < 0)
2159  return ret;
2160  if ((ret = get_pix_fmt_depth(&dst_min_depth, &dst_max_depth, dst_pix_fmt)) < 0)
2161  return ret;
2162 
2163  src_color = get_color_type(src_desc);
2164  dst_color = get_color_type(dst_desc);
2165  if (dst_pix_fmt == AV_PIX_FMT_PAL8)
2166  nb_components = FFMIN(src_desc->nb_components, 4);
2167  else
2168  nb_components = FFMIN(src_desc->nb_components, dst_desc->nb_components);
2169 
2170  for (i = 0; i < nb_components; i++) {
2171  int depth_minus1 = (dst_pix_fmt == AV_PIX_FMT_PAL8) ? 7/nb_components : dst_desc->comp[i].depth_minus1;
2172  if (src_desc->comp[i].depth_minus1 > depth_minus1 && (consider & FF_LOSS_DEPTH)) {
2173  loss |= FF_LOSS_DEPTH;
2174  score -= 65536 >> depth_minus1;
2175  }
2176  }
2177 
2178  if (consider & FF_LOSS_RESOLUTION) {
2179  if (dst_desc->log2_chroma_w > src_desc->log2_chroma_w) {
2180  loss |= FF_LOSS_RESOLUTION;
2181  score -= 256 << dst_desc->log2_chroma_w;
2182  }
2183  if (dst_desc->log2_chroma_h > src_desc->log2_chroma_h) {
2184  loss |= FF_LOSS_RESOLUTION;
2185  score -= 256 << dst_desc->log2_chroma_h;
2186  }
2187  // don't favor 422 over 420 if downsampling is needed, because 420 has much better support on the decoder side
2188  if (dst_desc->log2_chroma_w == 1 && src_desc->log2_chroma_w == 0 &&
2189  dst_desc->log2_chroma_h == 1 && src_desc->log2_chroma_h == 0 ) {
2190  score += 512;
2191  }
2192  }
2193 
2194  if(consider & FF_LOSS_COLORSPACE)
2195  switch(dst_color) {
2196  case FF_COLOR_RGB:
2197  if (src_color != FF_COLOR_RGB &&
2198  src_color != FF_COLOR_GRAY)
2199  loss |= FF_LOSS_COLORSPACE;
2200  break;
2201  case FF_COLOR_GRAY:
2202  if (src_color != FF_COLOR_GRAY)
2203  loss |= FF_LOSS_COLORSPACE;
2204  break;
2205  case FF_COLOR_YUV:
2206  if (src_color != FF_COLOR_YUV)
2207  loss |= FF_LOSS_COLORSPACE;
2208  break;
2209  case FF_COLOR_YUV_JPEG:
2210  if (src_color != FF_COLOR_YUV_JPEG &&
2211  src_color != FF_COLOR_YUV &&
2212  src_color != FF_COLOR_GRAY)
2213  loss |= FF_LOSS_COLORSPACE;
2214  break;
2215  default:
2216  /* fail safe test */
2217  if (src_color != dst_color)
2218  loss |= FF_LOSS_COLORSPACE;
2219  break;
2220  }
2221  if(loss & FF_LOSS_COLORSPACE)
2222  score -= (nb_components * 65536) >> FFMIN(dst_desc->comp[0].depth_minus1, src_desc->comp[0].depth_minus1);
2223 
2224  if (dst_color == FF_COLOR_GRAY &&
2225  src_color != FF_COLOR_GRAY && (consider & FF_LOSS_CHROMA)) {
2226  loss |= FF_LOSS_CHROMA;
2227  score -= 2 * 65536;
2228  }
2229  if (!pixdesc_has_alpha(dst_desc) && (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))) {
2230  loss |= FF_LOSS_ALPHA;
2231  score -= 65536;
2232  }
2233  if (dst_pix_fmt == AV_PIX_FMT_PAL8 && (consider & FF_LOSS_COLORQUANT) &&
2234  (src_pix_fmt != AV_PIX_FMT_PAL8 && (src_color != FF_COLOR_GRAY || (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))))) {
2235  loss |= FF_LOSS_COLORQUANT;
2236  score -= 65536;
2237  }
2238 
2239  *lossp = loss;
2240  return score;
2241 }
2242 
2243 int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
2244  enum AVPixelFormat src_pix_fmt,
2245  int has_alpha)
2246 {
2247  int loss;
2248  int ret = get_pix_fmt_score(dst_pix_fmt, src_pix_fmt, &loss, has_alpha ? ~0 : ~FF_LOSS_ALPHA);
2249  if (ret < 0)
2250  return ret;
2251  return loss;
2252 }
2253 
2254 enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
2255  enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
2256 {
2257  enum AVPixelFormat dst_pix_fmt;
2258  int loss1, loss2, loss_mask;
2259  const AVPixFmtDescriptor *desc1 = av_pix_fmt_desc_get(dst_pix_fmt1);
2260  const AVPixFmtDescriptor *desc2 = av_pix_fmt_desc_get(dst_pix_fmt2);
2261  int score1, score2;
2262 
2263  loss_mask= loss_ptr?~*loss_ptr:~0; /* use loss mask if provided */
2264  if(!has_alpha)
2265  loss_mask &= ~FF_LOSS_ALPHA;
2266 
2267  score1 = get_pix_fmt_score(dst_pix_fmt1, src_pix_fmt, &loss1, loss_mask);
2268  score2 = get_pix_fmt_score(dst_pix_fmt2, src_pix_fmt, &loss2, loss_mask);
2269 
2270  if (score1 == score2) {
2272  dst_pix_fmt = av_get_padded_bits_per_pixel(desc2) < av_get_padded_bits_per_pixel(desc1) ? dst_pix_fmt2 : dst_pix_fmt1;
2273  } else {
2274  dst_pix_fmt = desc2->nb_components < desc1->nb_components ? dst_pix_fmt2 : dst_pix_fmt1;
2275  }
2276  } else {
2277  dst_pix_fmt = score1 < score2 ? dst_pix_fmt2 : dst_pix_fmt1;
2278  }
2279 
2280  if (loss_ptr)
2281  *loss_ptr = av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
2282  return dst_pix_fmt;
2283 }
2284 
2285 #ifdef TEST
2286 
2287 int main(void){
2288  int i;
2289  int err=0;
2290  int skip = 0;
2291 
2292  for (i=0; i<AV_PIX_FMT_NB*2; i++) {
2293  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
2294  if(!desc || !desc->name) {
2295  skip ++;
2296  continue;
2297  }
2298  if (skip) {
2299  av_log(NULL, AV_LOG_INFO, "%3d unused pixel format values\n", skip);
2300  skip = 0;
2301  }
2302  av_log(NULL, AV_LOG_INFO, "pix fmt %s avg_bpp:%d colortype:%d\n", desc->name, av_get_padded_bits_per_pixel(desc), get_color_type(desc));
2303  if ((!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)) != (desc->nb_components != 2 && desc->nb_components != 4)) {
2304  av_log(NULL, AV_LOG_ERROR, "Alpha flag mismatch\n");
2305  err = 1;
2306  }
2307  }
2308  return err;
2309 }
2310 
2311 #endif