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 "avstring.h"
27 #include "common.h"
28 #include "pixfmt.h"
29 #include "pixdesc.h"
30 #include "internal.h"
31 #include "intreadwrite.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  .alias = "gray8,y8",
262  },
264  .name = "monow",
265  .nb_components = 1,
266  .log2_chroma_w = 0,
267  .log2_chroma_h = 0,
268  .comp = {
269  { 0, 0, 1, 0, 0 }, /* Y */
270  },
271  .flags = AV_PIX_FMT_FLAG_BITSTREAM,
272  },
274  .name = "monob",
275  .nb_components = 1,
276  .log2_chroma_w = 0,
277  .log2_chroma_h = 0,
278  .comp = {
279  { 0, 0, 1, 7, 0 }, /* Y */
280  },
281  .flags = AV_PIX_FMT_FLAG_BITSTREAM,
282  },
283  [AV_PIX_FMT_PAL8] = {
284  .name = "pal8",
285  .nb_components = 1,
286  .log2_chroma_w = 0,
287  .log2_chroma_h = 0,
288  .comp = {
289  { 0, 0, 1, 0, 7 },
290  },
291  .flags = AV_PIX_FMT_FLAG_PAL,
292  },
293  [AV_PIX_FMT_YUVJ420P] = {
294  .name = "yuvj420p",
295  .nb_components = 3,
296  .log2_chroma_w = 1,
297  .log2_chroma_h = 1,
298  .comp = {
299  { 0, 0, 1, 0, 7 }, /* Y */
300  { 1, 0, 1, 0, 7 }, /* U */
301  { 2, 0, 1, 0, 7 }, /* V */
302  },
303  .flags = AV_PIX_FMT_FLAG_PLANAR,
304  },
305  [AV_PIX_FMT_YUVJ422P] = {
306  .name = "yuvj422p",
307  .nb_components = 3,
308  .log2_chroma_w = 1,
309  .log2_chroma_h = 0,
310  .comp = {
311  { 0, 0, 1, 0, 7 }, /* Y */
312  { 1, 0, 1, 0, 7 }, /* U */
313  { 2, 0, 1, 0, 7 }, /* V */
314  },
315  .flags = AV_PIX_FMT_FLAG_PLANAR,
316  },
317  [AV_PIX_FMT_YUVJ444P] = {
318  .name = "yuvj444p",
319  .nb_components = 3,
320  .log2_chroma_w = 0,
321  .log2_chroma_h = 0,
322  .comp = {
323  { 0, 0, 1, 0, 7 }, /* Y */
324  { 1, 0, 1, 0, 7 }, /* U */
325  { 2, 0, 1, 0, 7 }, /* V */
326  },
327  .flags = AV_PIX_FMT_FLAG_PLANAR,
328  },
329 #if FF_API_XVMC
331  .name = "xvmcmc",
332  .flags = AV_PIX_FMT_FLAG_HWACCEL,
333  },
335  .name = "xvmcidct",
336  .flags = AV_PIX_FMT_FLAG_HWACCEL,
337  },
338 #endif /* FF_API_XVMC */
339 #if !FF_API_XVMC
340  [AV_PIX_FMT_XVMC] = {
341  .name = "xvmc",
342  .flags = AV_PIX_FMT_FLAG_HWACCEL,
343  },
344 #endif /* !FF_API_XVMC */
345  [AV_PIX_FMT_UYVY422] = {
346  .name = "uyvy422",
347  .nb_components = 3,
348  .log2_chroma_w = 1,
349  .log2_chroma_h = 0,
350  .comp = {
351  { 0, 1, 2, 0, 7 }, /* Y */
352  { 0, 3, 1, 0, 7 }, /* U */
353  { 0, 3, 3, 0, 7 }, /* V */
354  },
355  },
357  .name = "uyyvyy411",
358  .nb_components = 3,
359  .log2_chroma_w = 2,
360  .log2_chroma_h = 0,
361  .comp = {
362  { 0, 3, 2, 0, 7 }, /* Y */
363  { 0, 5, 1, 0, 7 }, /* U */
364  { 0, 5, 4, 0, 7 }, /* V */
365  },
366  },
367  [AV_PIX_FMT_BGR8] = {
368  .name = "bgr8",
369  .nb_components = 3,
370  .log2_chroma_w = 0,
371  .log2_chroma_h = 0,
372  .comp = {
373  { 0, 0, 1, 0, 2 }, /* R */
374  { 0, 0, 1, 3, 2 }, /* G */
375  { 0, 0, 1, 6, 1 }, /* B */
376  },
378  },
379  [AV_PIX_FMT_BGR4] = {
380  .name = "bgr4",
381  .nb_components = 3,
382  .log2_chroma_w = 0,
383  .log2_chroma_h = 0,
384  .comp = {
385  { 0, 3, 4, 0, 0 }, /* R */
386  { 0, 3, 2, 0, 1 }, /* G */
387  { 0, 3, 1, 0, 0 }, /* B */
388  },
390  },
392  .name = "bgr4_byte",
393  .nb_components = 3,
394  .log2_chroma_w = 0,
395  .log2_chroma_h = 0,
396  .comp = {
397  { 0, 0, 1, 0, 0 }, /* R */
398  { 0, 0, 1, 1, 1 }, /* G */
399  { 0, 0, 1, 3, 0 }, /* B */
400  },
402  },
403  [AV_PIX_FMT_RGB8] = {
404  .name = "rgb8",
405  .nb_components = 3,
406  .log2_chroma_w = 0,
407  .log2_chroma_h = 0,
408  .comp = {
409  { 0, 0, 1, 6, 1 }, /* R */
410  { 0, 0, 1, 3, 2 }, /* G */
411  { 0, 0, 1, 0, 2 }, /* B */
412  },
414  },
415  [AV_PIX_FMT_RGB4] = {
416  .name = "rgb4",
417  .nb_components = 3,
418  .log2_chroma_w = 0,
419  .log2_chroma_h = 0,
420  .comp = {
421  { 0, 3, 1, 0, 0 }, /* R */
422  { 0, 3, 2, 0, 1 }, /* G */
423  { 0, 3, 4, 0, 0 }, /* B */
424  },
426  },
428  .name = "rgb4_byte",
429  .nb_components = 3,
430  .log2_chroma_w = 0,
431  .log2_chroma_h = 0,
432  .comp = {
433  { 0, 0, 1, 3, 0 }, /* R */
434  { 0, 0, 1, 1, 1 }, /* G */
435  { 0, 0, 1, 0, 0 }, /* B */
436  },
438  },
439  [AV_PIX_FMT_NV12] = {
440  .name = "nv12",
441  .nb_components = 3,
442  .log2_chroma_w = 1,
443  .log2_chroma_h = 1,
444  .comp = {
445  { 0, 0, 1, 0, 7 }, /* Y */
446  { 1, 1, 1, 0, 7 }, /* U */
447  { 1, 1, 2, 0, 7 }, /* V */
448  },
449  .flags = AV_PIX_FMT_FLAG_PLANAR,
450  },
451  [AV_PIX_FMT_NV21] = {
452  .name = "nv21",
453  .nb_components = 3,
454  .log2_chroma_w = 1,
455  .log2_chroma_h = 1,
456  .comp = {
457  { 0, 0, 1, 0, 7 }, /* Y */
458  { 1, 1, 2, 0, 7 }, /* U */
459  { 1, 1, 1, 0, 7 }, /* V */
460  },
461  .flags = AV_PIX_FMT_FLAG_PLANAR,
462  },
463  [AV_PIX_FMT_ARGB] = {
464  .name = "argb",
465  .nb_components = 4,
466  .log2_chroma_w = 0,
467  .log2_chroma_h = 0,
468  .comp = {
469  { 0, 3, 2, 0, 7 }, /* R */
470  { 0, 3, 3, 0, 7 }, /* G */
471  { 0, 3, 4, 0, 7 }, /* B */
472  { 0, 3, 1, 0, 7 }, /* A */
473  },
475  },
476  [AV_PIX_FMT_RGBA] = {
477  .name = "rgba",
478  .nb_components = 4,
479  .log2_chroma_w = 0,
480  .log2_chroma_h = 0,
481  .comp = {
482  { 0, 3, 1, 0, 7 }, /* R */
483  { 0, 3, 2, 0, 7 }, /* G */
484  { 0, 3, 3, 0, 7 }, /* B */
485  { 0, 3, 4, 0, 7 }, /* A */
486  },
488  },
489  [AV_PIX_FMT_ABGR] = {
490  .name = "abgr",
491  .nb_components = 4,
492  .log2_chroma_w = 0,
493  .log2_chroma_h = 0,
494  .comp = {
495  { 0, 3, 4, 0, 7 }, /* R */
496  { 0, 3, 3, 0, 7 }, /* G */
497  { 0, 3, 2, 0, 7 }, /* B */
498  { 0, 3, 1, 0, 7 }, /* A */
499  },
501  },
502  [AV_PIX_FMT_BGRA] = {
503  .name = "bgra",
504  .nb_components = 4,
505  .log2_chroma_w = 0,
506  .log2_chroma_h = 0,
507  .comp = {
508  { 0, 3, 3, 0, 7 }, /* R */
509  { 0, 3, 2, 0, 7 }, /* G */
510  { 0, 3, 1, 0, 7 }, /* B */
511  { 0, 3, 4, 0, 7 }, /* A */
512  },
514  },
515  [AV_PIX_FMT_0RGB] = {
516  .name = "0rgb",
517  .nb_components= 3,
518  .log2_chroma_w= 0,
519  .log2_chroma_h= 0,
520  .comp = {
521  { 0, 3, 2, 0, 7 }, /* R */
522  { 0, 3, 3, 0, 7 }, /* G */
523  { 0, 3, 4, 0, 7 }, /* B */
524  },
525  .flags = AV_PIX_FMT_FLAG_RGB,
526  },
527  [AV_PIX_FMT_RGB0] = {
528  .name = "rgb0",
529  .nb_components= 3,
530  .log2_chroma_w= 0,
531  .log2_chroma_h= 0,
532  .comp = {
533  { 0, 3, 1, 0, 7 }, /* R */
534  { 0, 3, 2, 0, 7 }, /* G */
535  { 0, 3, 3, 0, 7 }, /* B */
536  },
537  .flags = AV_PIX_FMT_FLAG_RGB,
538  },
539  [AV_PIX_FMT_0BGR] = {
540  .name = "0bgr",
541  .nb_components= 3,
542  .log2_chroma_w= 0,
543  .log2_chroma_h= 0,
544  .comp = {
545  { 0, 3, 4, 0, 7 }, /* R */
546  { 0, 3, 3, 0, 7 }, /* G */
547  { 0, 3, 2, 0, 7 }, /* B */
548  },
549  .flags = AV_PIX_FMT_FLAG_RGB,
550  },
551  [AV_PIX_FMT_BGR0] = {
552  .name = "bgr0",
553  .nb_components= 3,
554  .log2_chroma_w= 0,
555  .log2_chroma_h= 0,
556  .comp = {
557  { 0, 3, 3, 0, 7 }, /* R */
558  { 0, 3, 2, 0, 7 }, /* G */
559  { 0, 3, 1, 0, 7 }, /* B */
560  },
561  .flags = AV_PIX_FMT_FLAG_RGB,
562  },
563  [AV_PIX_FMT_GRAY16BE] = {
564  .name = "gray16be",
565  .nb_components = 1,
566  .log2_chroma_w = 0,
567  .log2_chroma_h = 0,
568  .comp = {
569  { 0, 1, 1, 0, 15 }, /* Y */
570  },
571  .flags = AV_PIX_FMT_FLAG_BE,
572  .alias = "y16be",
573  },
574  [AV_PIX_FMT_GRAY16LE] = {
575  .name = "gray16le",
576  .nb_components = 1,
577  .log2_chroma_w = 0,
578  .log2_chroma_h = 0,
579  .comp = {
580  { 0, 1, 1, 0, 15 }, /* Y */
581  },
582  .alias = "y16le",
583  },
584  [AV_PIX_FMT_YUV440P] = {
585  .name = "yuv440p",
586  .nb_components = 3,
587  .log2_chroma_w = 0,
588  .log2_chroma_h = 1,
589  .comp = {
590  { 0, 0, 1, 0, 7 }, /* Y */
591  { 1, 0, 1, 0, 7 }, /* U */
592  { 2, 0, 1, 0, 7 }, /* V */
593  },
594  .flags = AV_PIX_FMT_FLAG_PLANAR,
595  },
596  [AV_PIX_FMT_YUVJ440P] = {
597  .name = "yuvj440p",
598  .nb_components = 3,
599  .log2_chroma_w = 0,
600  .log2_chroma_h = 1,
601  .comp = {
602  { 0, 0, 1, 0, 7 }, /* Y */
603  { 1, 0, 1, 0, 7 }, /* U */
604  { 2, 0, 1, 0, 7 }, /* V */
605  },
606  .flags = AV_PIX_FMT_FLAG_PLANAR,
607  },
608  [AV_PIX_FMT_YUVA420P] = {
609  .name = "yuva420p",
610  .nb_components = 4,
611  .log2_chroma_w = 1,
612  .log2_chroma_h = 1,
613  .comp = {
614  { 0, 0, 1, 0, 7 }, /* Y */
615  { 1, 0, 1, 0, 7 }, /* U */
616  { 2, 0, 1, 0, 7 }, /* V */
617  { 3, 0, 1, 0, 7 }, /* A */
618  },
620  },
621  [AV_PIX_FMT_YUVA422P] = {
622  .name = "yuva422p",
623  .nb_components = 4,
624  .log2_chroma_w = 1,
625  .log2_chroma_h = 0,
626  .comp = {
627  { 0, 0, 1, 0, 7 }, /* Y */
628  { 1, 0, 1, 0, 7 }, /* U */
629  { 2, 0, 1, 0, 7 }, /* V */
630  { 3, 0, 1, 0, 7 }, /* A */
631  },
633  },
634  [AV_PIX_FMT_YUVA444P] = {
635  .name = "yuva444p",
636  .nb_components = 4,
637  .log2_chroma_w = 0,
638  .log2_chroma_h = 0,
639  .comp = {
640  { 0, 0, 1, 0, 7 }, /* Y */
641  { 1, 0, 1, 0, 7 }, /* U */
642  { 2, 0, 1, 0, 7 }, /* V */
643  { 3, 0, 1, 0, 7 }, /* A */
644  },
646  },
648  .name = "yuva420p9be",
649  .nb_components = 4,
650  .log2_chroma_w = 1,
651  .log2_chroma_h = 1,
652  .comp = {
653  { 0, 1, 1, 0, 8 }, /* Y */
654  { 1, 1, 1, 0, 8 }, /* U */
655  { 2, 1, 1, 0, 8 }, /* V */
656  { 3, 1, 1, 0, 8 }, /* A */
657  },
659  },
661  .name = "yuva420p9le",
662  .nb_components = 4,
663  .log2_chroma_w = 1,
664  .log2_chroma_h = 1,
665  .comp = {
666  { 0, 1, 1, 0, 8 }, /* Y */
667  { 1, 1, 1, 0, 8 }, /* U */
668  { 2, 1, 1, 0, 8 }, /* V */
669  { 3, 1, 1, 0, 8 }, /* A */
670  },
672  },
674  .name = "yuva422p9be",
675  .nb_components = 4,
676  .log2_chroma_w = 1,
677  .log2_chroma_h = 0,
678  .comp = {
679  { 0, 1, 1, 0, 8 }, /* Y */
680  { 1, 1, 1, 0, 8 }, /* U */
681  { 2, 1, 1, 0, 8 }, /* V */
682  { 3, 1, 1, 0, 8 }, /* A */
683  },
685  },
687  .name = "yuva422p9le",
688  .nb_components = 4,
689  .log2_chroma_w = 1,
690  .log2_chroma_h = 0,
691  .comp = {
692  { 0, 1, 1, 0, 8 }, /* Y */
693  { 1, 1, 1, 0, 8 }, /* U */
694  { 2, 1, 1, 0, 8 }, /* V */
695  { 3, 1, 1, 0, 8 }, /* A */
696  },
698  },
700  .name = "yuva444p9be",
701  .nb_components = 4,
702  .log2_chroma_w = 0,
703  .log2_chroma_h = 0,
704  .comp = {
705  { 0, 1, 1, 0, 8 }, /* Y */
706  { 1, 1, 1, 0, 8 }, /* U */
707  { 2, 1, 1, 0, 8 }, /* V */
708  { 3, 1, 1, 0, 8 }, /* A */
709  },
711  },
713  .name = "yuva444p9le",
714  .nb_components = 4,
715  .log2_chroma_w = 0,
716  .log2_chroma_h = 0,
717  .comp = {
718  { 0, 1, 1, 0, 8 }, /* Y */
719  { 1, 1, 1, 0, 8 }, /* U */
720  { 2, 1, 1, 0, 8 }, /* V */
721  { 3, 1, 1, 0, 8 }, /* A */
722  },
724  },
726  .name = "yuva420p10be",
727  .nb_components = 4,
728  .log2_chroma_w = 1,
729  .log2_chroma_h = 1,
730  .comp = {
731  { 0, 1, 1, 0, 9 }, /* Y */
732  { 1, 1, 1, 0, 9 }, /* U */
733  { 2, 1, 1, 0, 9 }, /* V */
734  { 3, 1, 1, 0, 9 }, /* A */
735  },
737  },
739  .name = "yuva420p10le",
740  .nb_components = 4,
741  .log2_chroma_w = 1,
742  .log2_chroma_h = 1,
743  .comp = {
744  { 0, 1, 1, 0, 9 }, /* Y */
745  { 1, 1, 1, 0, 9 }, /* U */
746  { 2, 1, 1, 0, 9 }, /* V */
747  { 3, 1, 1, 0, 9 }, /* A */
748  },
750  },
752  .name = "yuva422p10be",
753  .nb_components = 4,
754  .log2_chroma_w = 1,
755  .log2_chroma_h = 0,
756  .comp = {
757  { 0, 1, 1, 0, 9 }, /* Y */
758  { 1, 1, 1, 0, 9 }, /* U */
759  { 2, 1, 1, 0, 9 }, /* V */
760  { 3, 1, 1, 0, 9 }, /* A */
761  },
763  },
765  .name = "yuva422p10le",
766  .nb_components = 4,
767  .log2_chroma_w = 1,
768  .log2_chroma_h = 0,
769  .comp = {
770  { 0, 1, 1, 0, 9 }, /* Y */
771  { 1, 1, 1, 0, 9 }, /* U */
772  { 2, 1, 1, 0, 9 }, /* V */
773  { 3, 1, 1, 0, 9 }, /* A */
774  },
776  },
778  .name = "yuva444p10be",
779  .nb_components = 4,
780  .log2_chroma_w = 0,
781  .log2_chroma_h = 0,
782  .comp = {
783  { 0, 1, 1, 0, 9 }, /* Y */
784  { 1, 1, 1, 0, 9 }, /* U */
785  { 2, 1, 1, 0, 9 }, /* V */
786  { 3, 1, 1, 0, 9 }, /* A */
787  },
789  },
791  .name = "yuva444p10le",
792  .nb_components = 4,
793  .log2_chroma_w = 0,
794  .log2_chroma_h = 0,
795  .comp = {
796  { 0, 1, 1, 0, 9 }, /* Y */
797  { 1, 1, 1, 0, 9 }, /* U */
798  { 2, 1, 1, 0, 9 }, /* V */
799  { 3, 1, 1, 0, 9 }, /* A */
800  },
802  },
804  .name = "yuva420p16be",
805  .nb_components = 4,
806  .log2_chroma_w = 1,
807  .log2_chroma_h = 1,
808  .comp = {
809  { 0, 1, 1, 0, 15 }, /* Y */
810  { 1, 1, 1, 0, 15 }, /* U */
811  { 2, 1, 1, 0, 15 }, /* V */
812  { 3, 1, 1, 0, 15 }, /* A */
813  },
815  },
817  .name = "yuva420p16le",
818  .nb_components = 4,
819  .log2_chroma_w = 1,
820  .log2_chroma_h = 1,
821  .comp = {
822  { 0, 1, 1, 0, 15 }, /* Y */
823  { 1, 1, 1, 0, 15 }, /* U */
824  { 2, 1, 1, 0, 15 }, /* V */
825  { 3, 1, 1, 0, 15 }, /* A */
826  },
828  },
830  .name = "yuva422p16be",
831  .nb_components = 4,
832  .log2_chroma_w = 1,
833  .log2_chroma_h = 0,
834  .comp = {
835  { 0, 1, 1, 0, 15 }, /* Y */
836  { 1, 1, 1, 0, 15 }, /* U */
837  { 2, 1, 1, 0, 15 }, /* V */
838  { 3, 1, 1, 0, 15 }, /* A */
839  },
841  },
843  .name = "yuva422p16le",
844  .nb_components = 4,
845  .log2_chroma_w = 1,
846  .log2_chroma_h = 0,
847  .comp = {
848  { 0, 1, 1, 0, 15 }, /* Y */
849  { 1, 1, 1, 0, 15 }, /* U */
850  { 2, 1, 1, 0, 15 }, /* V */
851  { 3, 1, 1, 0, 15 }, /* A */
852  },
854  },
856  .name = "yuva444p16be",
857  .nb_components = 4,
858  .log2_chroma_w = 0,
859  .log2_chroma_h = 0,
860  .comp = {
861  { 0, 1, 1, 0, 15 }, /* Y */
862  { 1, 1, 1, 0, 15 }, /* U */
863  { 2, 1, 1, 0, 15 }, /* V */
864  { 3, 1, 1, 0, 15 }, /* A */
865  },
867  },
869  .name = "yuva444p16le",
870  .nb_components = 4,
871  .log2_chroma_w = 0,
872  .log2_chroma_h = 0,
873  .comp = {
874  { 0, 1, 1, 0, 15 }, /* Y */
875  { 1, 1, 1, 0, 15 }, /* U */
876  { 2, 1, 1, 0, 15 }, /* V */
877  { 3, 1, 1, 0, 15 }, /* A */
878  },
880  },
881 #if FF_API_VDPAU
883  .name = "vdpau_h264",
884  .log2_chroma_w = 1,
885  .log2_chroma_h = 1,
886  .flags = AV_PIX_FMT_FLAG_HWACCEL,
887  },
889  .name = "vdpau_mpeg1",
890  .log2_chroma_w = 1,
891  .log2_chroma_h = 1,
892  .flags = AV_PIX_FMT_FLAG_HWACCEL,
893  },
895  .name = "vdpau_mpeg2",
896  .log2_chroma_w = 1,
897  .log2_chroma_h = 1,
898  .flags = AV_PIX_FMT_FLAG_HWACCEL,
899  },
901  .name = "vdpau_wmv3",
902  .log2_chroma_w = 1,
903  .log2_chroma_h = 1,
904  .flags = AV_PIX_FMT_FLAG_HWACCEL,
905  },
907  .name = "vdpau_vc1",
908  .log2_chroma_w = 1,
909  .log2_chroma_h = 1,
910  .flags = AV_PIX_FMT_FLAG_HWACCEL,
911  },
913  .name = "vdpau_mpeg4",
914  .log2_chroma_w = 1,
915  .log2_chroma_h = 1,
916  .flags = AV_PIX_FMT_FLAG_HWACCEL,
917  },
918 #endif
919  [AV_PIX_FMT_RGB48BE] = {
920  .name = "rgb48be",
921  .nb_components = 3,
922  .log2_chroma_w = 0,
923  .log2_chroma_h = 0,
924  .comp = {
925  { 0, 5, 1, 0, 15 }, /* R */
926  { 0, 5, 3, 0, 15 }, /* G */
927  { 0, 5, 5, 0, 15 }, /* B */
928  },
930  },
931  [AV_PIX_FMT_RGB48LE] = {
932  .name = "rgb48le",
933  .nb_components = 3,
934  .log2_chroma_w = 0,
935  .log2_chroma_h = 0,
936  .comp = {
937  { 0, 5, 1, 0, 15 }, /* R */
938  { 0, 5, 3, 0, 15 }, /* G */
939  { 0, 5, 5, 0, 15 }, /* B */
940  },
941  .flags = AV_PIX_FMT_FLAG_RGB,
942  },
943  [AV_PIX_FMT_RGBA64BE] = {
944  .name = "rgba64be",
945  .nb_components = 4,
946  .log2_chroma_w = 0,
947  .log2_chroma_h = 0,
948  .comp = {
949  { 0, 7, 1, 0, 15 }, /* R */
950  { 0, 7, 3, 0, 15 }, /* G */
951  { 0, 7, 5, 0, 15 }, /* B */
952  { 0, 7, 7, 0, 15 }, /* A */
953  },
955  },
956  [AV_PIX_FMT_RGBA64LE] = {
957  .name = "rgba64le",
958  .nb_components = 4,
959  .log2_chroma_w = 0,
960  .log2_chroma_h = 0,
961  .comp = {
962  { 0, 7, 1, 0, 15 }, /* R */
963  { 0, 7, 3, 0, 15 }, /* G */
964  { 0, 7, 5, 0, 15 }, /* B */
965  { 0, 7, 7, 0, 15 }, /* A */
966  },
968  },
969  [AV_PIX_FMT_RGB565BE] = {
970  .name = "rgb565be",
971  .nb_components = 3,
972  .log2_chroma_w = 0,
973  .log2_chroma_h = 0,
974  .comp = {
975  { 0, 1, 0, 3, 4 }, /* R */
976  { 0, 1, 1, 5, 5 }, /* G */
977  { 0, 1, 1, 0, 4 }, /* B */
978  },
980  },
981  [AV_PIX_FMT_RGB565LE] = {
982  .name = "rgb565le",
983  .nb_components = 3,
984  .log2_chroma_w = 0,
985  .log2_chroma_h = 0,
986  .comp = {
987  { 0, 1, 2, 3, 4 }, /* R */
988  { 0, 1, 1, 5, 5 }, /* G */
989  { 0, 1, 1, 0, 4 }, /* B */
990  },
991  .flags = AV_PIX_FMT_FLAG_RGB,
992  },
993  [AV_PIX_FMT_RGB555BE] = {
994  .name = "rgb555be",
995  .nb_components = 3,
996  .log2_chroma_w = 0,
997  .log2_chroma_h = 0,
998  .comp = {
999  { 0, 1, 0, 2, 4 }, /* R */
1000  { 0, 1, 1, 5, 4 }, /* G */
1001  { 0, 1, 1, 0, 4 }, /* B */
1002  },
1004  },
1005  [AV_PIX_FMT_RGB555LE] = {
1006  .name = "rgb555le",
1007  .nb_components = 3,
1008  .log2_chroma_w = 0,
1009  .log2_chroma_h = 0,
1010  .comp = {
1011  { 0, 1, 2, 2, 4 }, /* R */
1012  { 0, 1, 1, 5, 4 }, /* G */
1013  { 0, 1, 1, 0, 4 }, /* B */
1014  },
1015  .flags = AV_PIX_FMT_FLAG_RGB,
1016  },
1017  [AV_PIX_FMT_RGB444BE] = {
1018  .name = "rgb444be",
1019  .nb_components = 3,
1020  .log2_chroma_w = 0,
1021  .log2_chroma_h = 0,
1022  .comp = {
1023  { 0, 1, 0, 0, 3 }, /* R */
1024  { 0, 1, 1, 4, 3 }, /* G */
1025  { 0, 1, 1, 0, 3 }, /* B */
1026  },
1028  },
1029  [AV_PIX_FMT_RGB444LE] = {
1030  .name = "rgb444le",
1031  .nb_components = 3,
1032  .log2_chroma_w = 0,
1033  .log2_chroma_h = 0,
1034  .comp = {
1035  { 0, 1, 2, 0, 3 }, /* R */
1036  { 0, 1, 1, 4, 3 }, /* G */
1037  { 0, 1, 1, 0, 3 }, /* B */
1038  },
1039  .flags = AV_PIX_FMT_FLAG_RGB,
1040  },
1041  [AV_PIX_FMT_BGR48BE] = {
1042  .name = "bgr48be",
1043  .nb_components = 3,
1044  .log2_chroma_w = 0,
1045  .log2_chroma_h = 0,
1046  .comp = {
1047  { 0, 5, 5, 0, 15 }, /* R */
1048  { 0, 5, 3, 0, 15 }, /* G */
1049  { 0, 5, 1, 0, 15 }, /* B */
1050  },
1052  },
1053  [AV_PIX_FMT_BGR48LE] = {
1054  .name = "bgr48le",
1055  .nb_components = 3,
1056  .log2_chroma_w = 0,
1057  .log2_chroma_h = 0,
1058  .comp = {
1059  { 0, 5, 5, 0, 15 }, /* R */
1060  { 0, 5, 3, 0, 15 }, /* G */
1061  { 0, 5, 1, 0, 15 }, /* B */
1062  },
1063  .flags = AV_PIX_FMT_FLAG_RGB,
1064  },
1065  [AV_PIX_FMT_BGRA64BE] = {
1066  .name = "bgra64be",
1067  .nb_components = 4,
1068  .log2_chroma_w = 0,
1069  .log2_chroma_h = 0,
1070  .comp = {
1071  { 0, 7, 5, 0, 15 }, /* R */
1072  { 0, 7, 3, 0, 15 }, /* G */
1073  { 0, 7, 1, 0, 15 }, /* B */
1074  { 0, 7, 7, 0, 15 }, /* A */
1075  },
1077  },
1078  [AV_PIX_FMT_BGRA64LE] = {
1079  .name = "bgra64le",
1080  .nb_components = 4,
1081  .log2_chroma_w = 0,
1082  .log2_chroma_h = 0,
1083  .comp = {
1084  { 0, 7, 5, 0, 15 }, /* R */
1085  { 0, 7, 3, 0, 15 }, /* G */
1086  { 0, 7, 1, 0, 15 }, /* B */
1087  { 0, 7, 7, 0, 15 }, /* A */
1088  },
1090  },
1091  [AV_PIX_FMT_BGR565BE] = {
1092  .name = "bgr565be",
1093  .nb_components = 3,
1094  .log2_chroma_w = 0,
1095  .log2_chroma_h = 0,
1096  .comp = {
1097  { 0, 1, 1, 0, 4 }, /* R */
1098  { 0, 1, 1, 5, 5 }, /* G */
1099  { 0, 1, 0, 3, 4 }, /* B */
1100  },
1102  },
1103  [AV_PIX_FMT_BGR565LE] = {
1104  .name = "bgr565le",
1105  .nb_components = 3,
1106  .log2_chroma_w = 0,
1107  .log2_chroma_h = 0,
1108  .comp = {
1109  { 0, 1, 1, 0, 4 }, /* R */
1110  { 0, 1, 1, 5, 5 }, /* G */
1111  { 0, 1, 2, 3, 4 }, /* B */
1112  },
1113  .flags = AV_PIX_FMT_FLAG_RGB,
1114  },
1115  [AV_PIX_FMT_BGR555BE] = {
1116  .name = "bgr555be",
1117  .nb_components = 3,
1118  .log2_chroma_w = 0,
1119  .log2_chroma_h = 0,
1120  .comp = {
1121  { 0, 1, 1, 0, 4 }, /* R */
1122  { 0, 1, 1, 5, 4 }, /* G */
1123  { 0, 1, 0, 2, 4 }, /* B */
1124  },
1126  },
1127  [AV_PIX_FMT_BGR555LE] = {
1128  .name = "bgr555le",
1129  .nb_components = 3,
1130  .log2_chroma_w = 0,
1131  .log2_chroma_h = 0,
1132  .comp = {
1133  { 0, 1, 1, 0, 4 }, /* R */
1134  { 0, 1, 1, 5, 4 }, /* G */
1135  { 0, 1, 2, 2, 4 }, /* B */
1136  },
1137  .flags = AV_PIX_FMT_FLAG_RGB,
1138  },
1139  [AV_PIX_FMT_BGR444BE] = {
1140  .name = "bgr444be",
1141  .nb_components = 3,
1142  .log2_chroma_w = 0,
1143  .log2_chroma_h = 0,
1144  .comp = {
1145  { 0, 1, 1, 0, 3 }, /* R */
1146  { 0, 1, 1, 4, 3 }, /* G */
1147  { 0, 1, 0, 0, 3 }, /* B */
1148  },
1150  },
1151  [AV_PIX_FMT_BGR444LE] = {
1152  .name = "bgr444le",
1153  .nb_components = 3,
1154  .log2_chroma_w = 0,
1155  .log2_chroma_h = 0,
1156  .comp = {
1157  { 0, 1, 1, 0, 3 }, /* R */
1158  { 0, 1, 1, 4, 3 }, /* G */
1159  { 0, 1, 2, 0, 3 }, /* B */
1160  },
1161  .flags = AV_PIX_FMT_FLAG_RGB,
1162  },
1163  [AV_PIX_FMT_VAAPI_MOCO] = {
1164  .name = "vaapi_moco",
1165  .log2_chroma_w = 1,
1166  .log2_chroma_h = 1,
1167  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1168  },
1169  [AV_PIX_FMT_VAAPI_IDCT] = {
1170  .name = "vaapi_idct",
1171  .log2_chroma_w = 1,
1172  .log2_chroma_h = 1,
1173  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1174  },
1175  [AV_PIX_FMT_VAAPI_VLD] = {
1176  .name = "vaapi_vld",
1177  .log2_chroma_w = 1,
1178  .log2_chroma_h = 1,
1179  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1180  },
1181  [AV_PIX_FMT_YUV420P9LE] = {
1182  .name = "yuv420p9le",
1183  .nb_components = 3,
1184  .log2_chroma_w = 1,
1185  .log2_chroma_h = 1,
1186  .comp = {
1187  { 0, 1, 1, 0, 8 }, /* Y */
1188  { 1, 1, 1, 0, 8 }, /* U */
1189  { 2, 1, 1, 0, 8 }, /* V */
1190  },
1191  .flags = AV_PIX_FMT_FLAG_PLANAR,
1192  },
1193  [AV_PIX_FMT_YUV420P9BE] = {
1194  .name = "yuv420p9be",
1195  .nb_components = 3,
1196  .log2_chroma_w = 1,
1197  .log2_chroma_h = 1,
1198  .comp = {
1199  { 0, 1, 1, 0, 8 }, /* Y */
1200  { 1, 1, 1, 0, 8 }, /* U */
1201  { 2, 1, 1, 0, 8 }, /* V */
1202  },
1204  },
1206  .name = "yuv420p10le",
1207  .nb_components = 3,
1208  .log2_chroma_w = 1,
1209  .log2_chroma_h = 1,
1210  .comp = {
1211  { 0, 1, 1, 0, 9 }, /* Y */
1212  { 1, 1, 1, 0, 9 }, /* U */
1213  { 2, 1, 1, 0, 9 }, /* V */
1214  },
1215  .flags = AV_PIX_FMT_FLAG_PLANAR,
1216  },
1218  .name = "yuv420p10be",
1219  .nb_components = 3,
1220  .log2_chroma_w = 1,
1221  .log2_chroma_h = 1,
1222  .comp = {
1223  { 0, 1, 1, 0, 9 }, /* Y */
1224  { 1, 1, 1, 0, 9 }, /* U */
1225  { 2, 1, 1, 0, 9 }, /* V */
1226  },
1228  },
1230  .name = "yuv420p12le",
1231  .nb_components = 3,
1232  .log2_chroma_w = 1,
1233  .log2_chroma_h = 1,
1234  .comp = {
1235  { 0, 1, 1, 0, 11 }, /* Y */
1236  { 1, 1, 1, 0, 11 }, /* U */
1237  { 2, 1, 1, 0, 11 }, /* V */
1238  },
1239  .flags = AV_PIX_FMT_FLAG_PLANAR,
1240  },
1242  .name = "yuv420p12be",
1243  .nb_components = 3,
1244  .log2_chroma_w = 1,
1245  .log2_chroma_h = 1,
1246  .comp = {
1247  { 0, 1, 1, 0, 11 }, /* Y */
1248  { 1, 1, 1, 0, 11 }, /* U */
1249  { 2, 1, 1, 0, 11 }, /* V */
1250  },
1252  },
1254  .name = "yuv420p14le",
1255  .nb_components = 3,
1256  .log2_chroma_w = 1,
1257  .log2_chroma_h = 1,
1258  .comp = {
1259  { 0, 1, 1, 0, 13 }, /* Y */
1260  { 1, 1, 1, 0, 13 }, /* U */
1261  { 2, 1, 1, 0, 13 }, /* V */
1262  },
1263  .flags = AV_PIX_FMT_FLAG_PLANAR,
1264  },
1266  .name = "yuv420p14be",
1267  .nb_components = 3,
1268  .log2_chroma_w = 1,
1269  .log2_chroma_h = 1,
1270  .comp = {
1271  { 0, 1, 1, 0, 13 }, /* Y */
1272  { 1, 1, 1, 0, 13 }, /* U */
1273  { 2, 1, 1, 0, 13 }, /* V */
1274  },
1276  },
1278  .name = "yuv420p16le",
1279  .nb_components = 3,
1280  .log2_chroma_w = 1,
1281  .log2_chroma_h = 1,
1282  .comp = {
1283  { 0, 1, 1, 0, 15 }, /* Y */
1284  { 1, 1, 1, 0, 15 }, /* U */
1285  { 2, 1, 1, 0, 15 }, /* V */
1286  },
1287  .flags = AV_PIX_FMT_FLAG_PLANAR,
1288  },
1290  .name = "yuv420p16be",
1291  .nb_components = 3,
1292  .log2_chroma_w = 1,
1293  .log2_chroma_h = 1,
1294  .comp = {
1295  { 0, 1, 1, 0, 15 }, /* Y */
1296  { 1, 1, 1, 0, 15 }, /* U */
1297  { 2, 1, 1, 0, 15 }, /* V */
1298  },
1300  },
1301  [AV_PIX_FMT_YUV422P9LE] = {
1302  .name = "yuv422p9le",
1303  .nb_components = 3,
1304  .log2_chroma_w = 1,
1305  .log2_chroma_h = 0,
1306  .comp = {
1307  { 0, 1, 1, 0, 8 }, /* Y */
1308  { 1, 1, 1, 0, 8 }, /* U */
1309  { 2, 1, 1, 0, 8 }, /* V */
1310  },
1311  .flags = AV_PIX_FMT_FLAG_PLANAR,
1312  },
1313  [AV_PIX_FMT_YUV422P9BE] = {
1314  .name = "yuv422p9be",
1315  .nb_components = 3,
1316  .log2_chroma_w = 1,
1317  .log2_chroma_h = 0,
1318  .comp = {
1319  { 0, 1, 1, 0, 8 }, /* Y */
1320  { 1, 1, 1, 0, 8 }, /* U */
1321  { 2, 1, 1, 0, 8 }, /* V */
1322  },
1324  },
1326  .name = "yuv422p10le",
1327  .nb_components = 3,
1328  .log2_chroma_w = 1,
1329  .log2_chroma_h = 0,
1330  .comp = {
1331  { 0, 1, 1, 0, 9 }, /* Y */
1332  { 1, 1, 1, 0, 9 }, /* U */
1333  { 2, 1, 1, 0, 9 }, /* V */
1334  },
1335  .flags = AV_PIX_FMT_FLAG_PLANAR,
1336  },
1338  .name = "yuv422p10be",
1339  .nb_components = 3,
1340  .log2_chroma_w = 1,
1341  .log2_chroma_h = 0,
1342  .comp = {
1343  { 0, 1, 1, 0, 9 }, /* Y */
1344  { 1, 1, 1, 0, 9 }, /* U */
1345  { 2, 1, 1, 0, 9 }, /* V */
1346  },
1348  },
1350  .name = "yuv422p12le",
1351  .nb_components = 3,
1352  .log2_chroma_w = 1,
1353  .log2_chroma_h = 0,
1354  .comp = {
1355  { 0, 1, 1, 0, 11 }, /* Y */
1356  { 1, 1, 1, 0, 11 }, /* U */
1357  { 2, 1, 1, 0, 11 }, /* V */
1358  },
1359  .flags = AV_PIX_FMT_FLAG_PLANAR,
1360  },
1362  .name = "yuv422p12be",
1363  .nb_components = 3,
1364  .log2_chroma_w = 1,
1365  .log2_chroma_h = 0,
1366  .comp = {
1367  { 0, 1, 1, 0, 11 }, /* Y */
1368  { 1, 1, 1, 0, 11 }, /* U */
1369  { 2, 1, 1, 0, 11 }, /* V */
1370  },
1372  },
1374  .name = "yuv422p14le",
1375  .nb_components = 3,
1376  .log2_chroma_w = 1,
1377  .log2_chroma_h = 0,
1378  .comp = {
1379  { 0, 1, 1, 0, 13 }, /* Y */
1380  { 1, 1, 1, 0, 13 }, /* U */
1381  { 2, 1, 1, 0, 13 }, /* V */
1382  },
1383  .flags = AV_PIX_FMT_FLAG_PLANAR,
1384  },
1386  .name = "yuv422p14be",
1387  .nb_components = 3,
1388  .log2_chroma_w = 1,
1389  .log2_chroma_h = 0,
1390  .comp = {
1391  { 0, 1, 1, 0, 13 }, /* Y */
1392  { 1, 1, 1, 0, 13 }, /* U */
1393  { 2, 1, 1, 0, 13 }, /* V */
1394  },
1396  },
1398  .name = "yuv422p16le",
1399  .nb_components = 3,
1400  .log2_chroma_w = 1,
1401  .log2_chroma_h = 0,
1402  .comp = {
1403  { 0, 1, 1, 0, 15 }, /* Y */
1404  { 1, 1, 1, 0, 15 }, /* U */
1405  { 2, 1, 1, 0, 15 }, /* V */
1406  },
1407  .flags = AV_PIX_FMT_FLAG_PLANAR,
1408  },
1410  .name = "yuv422p16be",
1411  .nb_components = 3,
1412  .log2_chroma_w = 1,
1413  .log2_chroma_h = 0,
1414  .comp = {
1415  { 0, 1, 1, 0, 15 }, /* Y */
1416  { 1, 1, 1, 0, 15 }, /* U */
1417  { 2, 1, 1, 0, 15 }, /* V */
1418  },
1420  },
1422  .name = "yuv444p16le",
1423  .nb_components = 3,
1424  .log2_chroma_w = 0,
1425  .log2_chroma_h = 0,
1426  .comp = {
1427  { 0, 1, 1, 0, 15 }, /* Y */
1428  { 1, 1, 1, 0, 15 }, /* U */
1429  { 2, 1, 1, 0, 15 }, /* V */
1430  },
1431  .flags = AV_PIX_FMT_FLAG_PLANAR,
1432  },
1434  .name = "yuv444p16be",
1435  .nb_components = 3,
1436  .log2_chroma_w = 0,
1437  .log2_chroma_h = 0,
1438  .comp = {
1439  { 0, 1, 1, 0, 15 }, /* Y */
1440  { 1, 1, 1, 0, 15 }, /* U */
1441  { 2, 1, 1, 0, 15 }, /* V */
1442  },
1444  },
1446  .name = "yuv444p10le",
1447  .nb_components = 3,
1448  .log2_chroma_w = 0,
1449  .log2_chroma_h = 0,
1450  .comp = {
1451  { 0, 1, 1, 0, 9 }, /* Y */
1452  { 1, 1, 1, 0, 9 }, /* U */
1453  { 2, 1, 1, 0, 9 }, /* V */
1454  },
1455  .flags = AV_PIX_FMT_FLAG_PLANAR,
1456  },
1458  .name = "yuv444p10be",
1459  .nb_components = 3,
1460  .log2_chroma_w = 0,
1461  .log2_chroma_h = 0,
1462  .comp = {
1463  { 0, 1, 1, 0, 9 }, /* Y */
1464  { 1, 1, 1, 0, 9 }, /* U */
1465  { 2, 1, 1, 0, 9 }, /* V */
1466  },
1468  },
1469  [AV_PIX_FMT_YUV444P9LE] = {
1470  .name = "yuv444p9le",
1471  .nb_components = 3,
1472  .log2_chroma_w = 0,
1473  .log2_chroma_h = 0,
1474  .comp = {
1475  { 0, 1, 1, 0, 8 }, /* Y */
1476  { 1, 1, 1, 0, 8 }, /* U */
1477  { 2, 1, 1, 0, 8 }, /* V */
1478  },
1479  .flags = AV_PIX_FMT_FLAG_PLANAR,
1480  },
1481  [AV_PIX_FMT_YUV444P9BE] = {
1482  .name = "yuv444p9be",
1483  .nb_components = 3,
1484  .log2_chroma_w = 0,
1485  .log2_chroma_h = 0,
1486  .comp = {
1487  { 0, 1, 1, 0, 8 }, /* Y */
1488  { 1, 1, 1, 0, 8 }, /* U */
1489  { 2, 1, 1, 0, 8 }, /* V */
1490  },
1492  },
1494  .name = "yuv444p12le",
1495  .nb_components = 3,
1496  .log2_chroma_w = 0,
1497  .log2_chroma_h = 0,
1498  .comp = {
1499  { 0, 1, 1, 0, 11 }, /* Y */
1500  { 1, 1, 1, 0, 11 }, /* U */
1501  { 2, 1, 1, 0, 11 }, /* V */
1502  },
1503  .flags = AV_PIX_FMT_FLAG_PLANAR,
1504  },
1506  .name = "yuv444p12be",
1507  .nb_components = 3,
1508  .log2_chroma_w = 0,
1509  .log2_chroma_h = 0,
1510  .comp = {
1511  { 0, 1, 1, 0, 11 }, /* Y */
1512  { 1, 1, 1, 0, 11 }, /* U */
1513  { 2, 1, 1, 0, 11 }, /* V */
1514  },
1516  },
1518  .name = "yuv444p14le",
1519  .nb_components = 3,
1520  .log2_chroma_w = 0,
1521  .log2_chroma_h = 0,
1522  .comp = {
1523  { 0, 1, 1, 0, 13 }, /* Y */
1524  { 1, 1, 1, 0, 13 }, /* U */
1525  { 2, 1, 1, 0, 13 }, /* V */
1526  },
1527  .flags = AV_PIX_FMT_FLAG_PLANAR,
1528  },
1530  .name = "yuv444p14be",
1531  .nb_components = 3,
1532  .log2_chroma_w = 0,
1533  .log2_chroma_h = 0,
1534  .comp = {
1535  { 0, 1, 1, 0, 13 }, /* Y */
1536  { 1, 1, 1, 0, 13 }, /* U */
1537  { 2, 1, 1, 0, 13 }, /* V */
1538  },
1540  },
1541  [AV_PIX_FMT_DXVA2_VLD] = {
1542  .name = "dxva2_vld",
1543  .log2_chroma_w = 1,
1544  .log2_chroma_h = 1,
1545  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1546  },
1547  [AV_PIX_FMT_VDA_VLD] = {
1548  .name = "vda_vld",
1549  .log2_chroma_w = 1,
1550  .log2_chroma_h = 1,
1551  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1552  },
1553  [AV_PIX_FMT_YA8] = {
1554  .name = "ya8",
1555  .nb_components = 2,
1556  .comp = {
1557  { 0, 1, 1, 0, 7 }, /* Y */
1558  { 0, 1, 2, 0, 7 }, /* A */
1559  },
1560  .flags = AV_PIX_FMT_FLAG_ALPHA,
1561  .alias = "gray8a",
1562  },
1563  [AV_PIX_FMT_YA16LE] = {
1564  .name = "ya16le",
1565  .nb_components = 2,
1566  .comp = {
1567  { 0, 3, 1, 0, 15 }, /* Y */
1568  { 0, 3, 3, 0, 15 }, /* A */
1569  },
1570  .flags = AV_PIX_FMT_FLAG_ALPHA,
1571  },
1572  [AV_PIX_FMT_YA16BE] = {
1573  .name = "ya16be",
1574  .nb_components = 2,
1575  .comp = {
1576  { 0, 3, 1, 0, 15 }, /* Y */
1577  { 0, 3, 3, 0, 15 }, /* A */
1578  },
1580  },
1581  [AV_PIX_FMT_GBRP] = {
1582  .name = "gbrp",
1583  .nb_components = 3,
1584  .log2_chroma_w = 0,
1585  .log2_chroma_h = 0,
1586  .comp = {
1587  { 2, 0, 1, 0, 7 }, /* R */
1588  { 0, 0, 1, 0, 7 }, /* G */
1589  { 1, 0, 1, 0, 7 }, /* B */
1590  },
1592  },
1593  [AV_PIX_FMT_GBRP9LE] = {
1594  .name = "gbrp9le",
1595  .nb_components = 3,
1596  .log2_chroma_w = 0,
1597  .log2_chroma_h = 0,
1598  .comp = {
1599  { 2, 1, 1, 0, 8 }, /* R */
1600  { 0, 1, 1, 0, 8 }, /* G */
1601  { 1, 1, 1, 0, 8 }, /* B */
1602  },
1604  },
1605  [AV_PIX_FMT_GBRP9BE] = {
1606  .name = "gbrp9be",
1607  .nb_components = 3,
1608  .log2_chroma_w = 0,
1609  .log2_chroma_h = 0,
1610  .comp = {
1611  { 2, 1, 1, 0, 8 }, /* R */
1612  { 0, 1, 1, 0, 8 }, /* G */
1613  { 1, 1, 1, 0, 8 }, /* B */
1614  },
1616  },
1617  [AV_PIX_FMT_GBRP10LE] = {
1618  .name = "gbrp10le",
1619  .nb_components = 3,
1620  .log2_chroma_w = 0,
1621  .log2_chroma_h = 0,
1622  .comp = {
1623  { 2, 1, 1, 0, 9 }, /* R */
1624  { 0, 1, 1, 0, 9 }, /* G */
1625  { 1, 1, 1, 0, 9 }, /* B */
1626  },
1628  },
1629  [AV_PIX_FMT_GBRP10BE] = {
1630  .name = "gbrp10be",
1631  .nb_components = 3,
1632  .log2_chroma_w = 0,
1633  .log2_chroma_h = 0,
1634  .comp = {
1635  { 2, 1, 1, 0, 9 }, /* R */
1636  { 0, 1, 1, 0, 9 }, /* G */
1637  { 1, 1, 1, 0, 9 }, /* B */
1638  },
1640  },
1641  [AV_PIX_FMT_GBRP12LE] = {
1642  .name = "gbrp12le",
1643  .nb_components = 3,
1644  .log2_chroma_w = 0,
1645  .log2_chroma_h = 0,
1646  .comp = {
1647  { 2, 1, 1, 0, 11 }, /* R */
1648  { 0, 1, 1, 0, 11 }, /* G */
1649  { 1, 1, 1, 0, 11 }, /* B */
1650  },
1652  },
1653  [AV_PIX_FMT_GBRP12BE] = {
1654  .name = "gbrp12be",
1655  .nb_components = 3,
1656  .log2_chroma_w = 0,
1657  .log2_chroma_h = 0,
1658  .comp = {
1659  { 2, 1, 1, 0, 11 }, /* R */
1660  { 0, 1, 1, 0, 11 }, /* G */
1661  { 1, 1, 1, 0, 11 }, /* B */
1662  },
1664  },
1665  [AV_PIX_FMT_GBRP14LE] = {
1666  .name = "gbrp14le",
1667  .nb_components = 3,
1668  .log2_chroma_w = 0,
1669  .log2_chroma_h = 0,
1670  .comp = {
1671  { 2, 1, 1, 0, 13 }, /* R */
1672  { 0, 1, 1, 0, 13 }, /* G */
1673  { 1, 1, 1, 0, 13 }, /* B */
1674  },
1676  },
1677  [AV_PIX_FMT_GBRP14BE] = {
1678  .name = "gbrp14be",
1679  .nb_components = 3,
1680  .log2_chroma_w = 0,
1681  .log2_chroma_h = 0,
1682  .comp = {
1683  { 2, 1, 1, 0, 13 }, /* R */
1684  { 0, 1, 1, 0, 13 }, /* G */
1685  { 1, 1, 1, 0, 13 }, /* B */
1686  },
1688  },
1689  [AV_PIX_FMT_GBRP16LE] = {
1690  .name = "gbrp16le",
1691  .nb_components = 3,
1692  .log2_chroma_w = 0,
1693  .log2_chroma_h = 0,
1694  .comp = {
1695  { 2, 1, 1, 0, 15 }, /* R */
1696  { 0, 1, 1, 0, 15 }, /* G */
1697  { 1, 1, 1, 0, 15 }, /* B */
1698  },
1700  },
1701  [AV_PIX_FMT_GBRP16BE] = {
1702  .name = "gbrp16be",
1703  .nb_components = 3,
1704  .log2_chroma_w = 0,
1705  .log2_chroma_h = 0,
1706  .comp = {
1707  { 2, 1, 1, 0, 15 }, /* R */
1708  { 0, 1, 1, 0, 15 }, /* G */
1709  { 1, 1, 1, 0, 15 }, /* B */
1710  },
1712  },
1713  [AV_PIX_FMT_GBRAP] = {
1714  .name = "gbrap",
1715  .nb_components = 4,
1716  .log2_chroma_w = 0,
1717  .log2_chroma_h = 0,
1718  .comp = {
1719  { 2, 0, 1, 0, 7 }, /* R */
1720  { 0, 0, 1, 0, 7 }, /* G */
1721  { 1, 0, 1, 0, 7 }, /* B */
1722  { 3, 0, 1, 0, 7 }, /* A */
1723  },
1726  },
1727  [AV_PIX_FMT_GBRAP16LE] = {
1728  .name = "gbrap16le",
1729  .nb_components = 4,
1730  .log2_chroma_w = 0,
1731  .log2_chroma_h = 0,
1732  .comp = {
1733  { 2, 1, 1, 0, 15 }, /* R */
1734  { 0, 1, 1, 0, 15 }, /* G */
1735  { 1, 1, 1, 0, 15 }, /* B */
1736  { 3, 1, 1, 0, 15 }, /* A */
1737  },
1740  },
1741  [AV_PIX_FMT_GBRAP16BE] = {
1742  .name = "gbrap16be",
1743  .nb_components = 4,
1744  .log2_chroma_w = 0,
1745  .log2_chroma_h = 0,
1746  .comp = {
1747  { 2, 1, 1, 0, 15 }, /* R */
1748  { 0, 1, 1, 0, 15 }, /* G */
1749  { 1, 1, 1, 0, 15 }, /* B */
1750  { 3, 1, 1, 0, 15 }, /* A */
1751  },
1754  },
1755  [AV_PIX_FMT_VDPAU] = {
1756  .name = "vdpau",
1757  .log2_chroma_w = 1,
1758  .log2_chroma_h = 1,
1759  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1760  },
1761  [AV_PIX_FMT_XYZ12LE] = {
1762  .name = "xyz12le",
1763  .nb_components = 3,
1764  .log2_chroma_w = 0,
1765  .log2_chroma_h = 0,
1766  .comp = {
1767  { 0, 5, 1, 4, 11 }, /* X */
1768  { 0, 5, 3, 4, 11 }, /* Y */
1769  { 0, 5, 5, 4, 11 }, /* Z */
1770  },
1771  /*.flags = -- not used*/
1772  },
1773  [AV_PIX_FMT_XYZ12BE] = {
1774  .name = "xyz12be",
1775  .nb_components = 3,
1776  .log2_chroma_w = 0,
1777  .log2_chroma_h = 0,
1778  .comp = {
1779  { 0, 5, 1, 4, 11 }, /* X */
1780  { 0, 5, 3, 4, 11 }, /* Y */
1781  { 0, 5, 5, 4, 11 }, /* Z */
1782  },
1783  .flags = AV_PIX_FMT_FLAG_BE,
1784  },
1785 
1786 #define BAYER8_DESC_COMMON \
1787  .nb_components= 3, \
1788  .log2_chroma_w= 0, \
1789  .log2_chroma_h= 0, \
1790  .comp = { \
1791  {0,0,0,0,1}, \
1792  {0,0,0,0,3}, \
1793  {0,0,0,0,1}, \
1794  }, \
1795 
1796 #define BAYER16_DESC_COMMON \
1797  .nb_components= 3, \
1798  .log2_chroma_w= 0, \
1799  .log2_chroma_h= 0, \
1800  .comp = { \
1801  {0,1,0,0, 3}, \
1802  {0,1,0,0, 7}, \
1803  {0,1,0,0, 3}, \
1804  }, \
1805 
1807  .name = "bayer_bggr8",
1809  .flags = AV_PIX_FMT_FLAG_RGB,
1810  },
1812  .name = "bayer_bggr16le",
1814  .flags = AV_PIX_FMT_FLAG_RGB,
1815  },
1817  .name = "bayer_bggr16be",
1820  },
1822  .name = "bayer_rggb8",
1824  .flags = AV_PIX_FMT_FLAG_RGB,
1825  },
1827  .name = "bayer_rggb16le",
1829  .flags = AV_PIX_FMT_FLAG_RGB,
1830  },
1832  .name = "bayer_rggb16be",
1835  },
1837  .name = "bayer_gbrg8",
1839  .flags = AV_PIX_FMT_FLAG_RGB,
1840  },
1842  .name = "bayer_gbrg16le",
1844  .flags = AV_PIX_FMT_FLAG_RGB,
1845  },
1847  .name = "bayer_gbrg16be",
1850  },
1852  .name = "bayer_grbg8",
1854  .flags = AV_PIX_FMT_FLAG_RGB,
1855  },
1857  .name = "bayer_grbg16le",
1859  .flags = AV_PIX_FMT_FLAG_RGB,
1860  },
1862  .name = "bayer_grbg16be",
1865  },
1866  [AV_PIX_FMT_NV16] = {
1867  .name = "nv16",
1868  .nb_components = 3,
1869  .log2_chroma_w = 1,
1870  .log2_chroma_h = 0,
1871  .comp = {
1872  { 0, 0, 1, 0, 7 }, /* Y */
1873  { 1, 1, 1, 0, 7 }, /* U */
1874  { 1, 1, 2, 0, 7 }, /* V */
1875  },
1876  .flags = AV_PIX_FMT_FLAG_PLANAR,
1877  },
1878  [AV_PIX_FMT_NV20LE] = {
1879  .name = "nv20le",
1880  .nb_components = 3,
1881  .log2_chroma_w = 1,
1882  .log2_chroma_h = 0,
1883  .comp = {
1884  { 0, 1, 1, 0, 9 }, /* Y */
1885  { 1, 3, 1, 0, 9 }, /* U */
1886  { 1, 3, 3, 0, 9 }, /* V */
1887  },
1888  .flags = AV_PIX_FMT_FLAG_PLANAR,
1889  },
1890  [AV_PIX_FMT_NV20BE] = {
1891  .name = "nv20be",
1892  .nb_components = 3,
1893  .log2_chroma_w = 1,
1894  .log2_chroma_h = 0,
1895  .comp = {
1896  { 0, 1, 1, 0, 9 }, /* Y */
1897  { 1, 3, 1, 0, 9 }, /* U */
1898  { 1, 3, 3, 0, 9 }, /* V */
1899  },
1901  },
1902  [AV_PIX_FMT_VDA] = {
1903  .name = "vda",
1904  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1905  },
1906  [AV_PIX_FMT_QSV] = {
1907  .name = "qsv",
1908  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1909  },
1910  [AV_PIX_FMT_MMAL] = {
1911  .name = "mmal",
1912  .flags = AV_PIX_FMT_FLAG_HWACCEL,
1913  },
1914 };
1915 
1916 static const char *color_range_names[AVCOL_RANGE_NB] = {
1917  "unknown", "tv", "pc",
1918 };
1919 
1920 static const char *color_primaries_names[AVCOL_PRI_NB] = {
1921  "reserved", "bt709", "unknown", "reserved", "bt470m",
1922  "bt470bg", "smpte170m", "smpte240m", "film", "bt2020",
1923 };
1924 
1925 static const char *color_transfer_names[AVCOL_TRC_NB] = {
1926  "reserved", "bt709", "unknown", "reserved", "bt470m",
1927  "bt470bg", "smpte170m", "smpte240m", "linear", "log100",
1928  "log316", "iec61966-2-4", "bt1361e", "iec61966-2-1",
1929  "bt2020-10", "bt2020-20",
1930 };
1931 
1932 static const char *color_space_names[AVCOL_SPC_NB] = {
1933  "gbr", "bt709", "unknown", "reserved", "fcc",
1934  "bt470bg", "smpte170m", "smpte240m", "ycgco",
1935  "bt2020nc", "bt2020c",
1936 };
1937 
1939  "unspecified", "left", "center", "topleft",
1940  "top", "bottomleft", "bottom",
1941 };
1942 
1944 static enum AVPixelFormat get_pix_fmt_internal(const char *name)
1945 {
1946  enum AVPixelFormat pix_fmt;
1947 
1948  for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++)
1949  if (av_pix_fmt_descriptors[pix_fmt].name &&
1950  (!strcmp(av_pix_fmt_descriptors[pix_fmt].name, name) ||
1951  av_match_name(name, av_pix_fmt_descriptors[pix_fmt].alias)))
1952  return pix_fmt;
1953 
1954  return AV_PIX_FMT_NONE;
1955 }
1956 
1958 {
1959  return (unsigned)pix_fmt < AV_PIX_FMT_NB ?
1960  av_pix_fmt_descriptors[pix_fmt].name : NULL;
1961 }
1962 
1963 #if HAVE_BIGENDIAN
1964 # define X_NE(be, le) be
1965 #else
1966 # define X_NE(be, le) le
1967 #endif
1968 
1970 {
1971  enum AVPixelFormat pix_fmt;
1972 
1973  if (!strcmp(name, "rgb32"))
1974  name = X_NE("argb", "bgra");
1975  else if (!strcmp(name, "bgr32"))
1976  name = X_NE("abgr", "rgba");
1977 
1978  pix_fmt = get_pix_fmt_internal(name);
1979  if (pix_fmt == AV_PIX_FMT_NONE) {
1980  char name2[32];
1981 
1982  snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1983  pix_fmt = get_pix_fmt_internal(name2);
1984  }
1985  return pix_fmt;
1986 }
1987 
1989 {
1990  int c, bits = 0;
1991  int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1992 
1993  for (c = 0; c < pixdesc->nb_components; c++) {
1994  int s = c == 1 || c == 2 ? 0 : log2_pixels;
1995  bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1996  }
1997 
1998  return bits >> log2_pixels;
1999 }
2000 
2002 {
2003  int c, bits = 0;
2004  int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
2005  int steps[4] = {0};
2006 
2007  for (c = 0; c < pixdesc->nb_components; c++) {
2008  const AVComponentDescriptor *comp = &pixdesc->comp[c];
2009  int s = c == 1 || c == 2 ? 0 : log2_pixels;
2010  steps[comp->plane] = (comp->step_minus1 + 1) << s;
2011  }
2012  for (c = 0; c < 4; c++)
2013  bits += steps[c];
2014 
2015  if(!(pixdesc->flags & AV_PIX_FMT_FLAG_BITSTREAM))
2016  bits *= 8;
2017 
2018  return bits >> log2_pixels;
2019 }
2020 
2021 char *av_get_pix_fmt_string(char *buf, int buf_size,
2022  enum AVPixelFormat pix_fmt)
2023 {
2024  /* print header */
2025  if (pix_fmt < 0) {
2026  snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
2027  } else {
2028  const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
2029  snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
2030  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
2031  }
2032 
2033  return buf;
2034 }
2035 
2037 {
2038  if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
2039  return NULL;
2040  return &av_pix_fmt_descriptors[pix_fmt];
2041 }
2042 
2044 {
2045  if (!prev)
2046  return &av_pix_fmt_descriptors[0];
2047  while (prev - av_pix_fmt_descriptors < FF_ARRAY_ELEMS(av_pix_fmt_descriptors) - 1) {
2048  prev++;
2049  if (prev->name)
2050  return prev;
2051  }
2052  return NULL;
2053 }
2054 
2056 {
2057  if (desc < av_pix_fmt_descriptors ||
2058  desc >= av_pix_fmt_descriptors + FF_ARRAY_ELEMS(av_pix_fmt_descriptors))
2059  return AV_PIX_FMT_NONE;
2060 
2061  return desc - av_pix_fmt_descriptors;
2062 }
2063 
2065  int *h_shift, int *v_shift)
2066 {
2067  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2068  if (!desc)
2069  return AVERROR(ENOSYS);
2070  *h_shift = desc->log2_chroma_w;
2071  *v_shift = desc->log2_chroma_h;
2072 
2073  return 0;
2074 }
2075 
2077 {
2078  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2079  int i, planes[4] = { 0 }, ret = 0;
2080 
2081  if (!desc)
2082  return AVERROR(EINVAL);
2083 
2084  for (i = 0; i < desc->nb_components; i++)
2085  planes[desc->comp[i].plane] = 1;
2086  for (i = 0; i < FF_ARRAY_ELEMS(planes); i++)
2087  ret += planes[i];
2088  return ret;
2089 }
2090 
2092  int i, j;
2093 
2094  for (i=0; i<FF_ARRAY_ELEMS(av_pix_fmt_descriptors); i++) {
2095  const AVPixFmtDescriptor *d = &av_pix_fmt_descriptors[i];
2096  uint8_t fill[4][8+6+3] = {{0}};
2097  uint8_t *data[4] = {fill[0], fill[1], fill[2], fill[3]};
2098  int linesize[4] = {0,0,0,0};
2099  uint16_t tmp[2];
2100 
2101  if (!d->name && !d->nb_components && !d->log2_chroma_w && !d->log2_chroma_h && !d->flags)
2102  continue;
2103 // av_log(NULL, AV_LOG_DEBUG, "Checking: %s\n", d->name);
2104  av_assert0(d->log2_chroma_w <= 3);
2105  av_assert0(d->log2_chroma_h <= 3);
2106  av_assert0(d->nb_components <= 4);
2107  av_assert0(d->name && d->name[0]);
2108  av_assert0((d->nb_components==4 || d->nb_components==2) == !!(d->flags & AV_PIX_FMT_FLAG_ALPHA));
2109  av_assert2(av_get_pix_fmt(d->name) == i);
2110 
2111  for (j=0; j<FF_ARRAY_ELEMS(d->comp); j++) {
2112  const AVComponentDescriptor *c = &d->comp[j];
2113  if(j>=d->nb_components) {
2114  av_assert0(!c->plane && !c->step_minus1 && !c->offset_plus1 && !c->shift && !c->depth_minus1);
2115  continue;
2116  }
2117  if (d->flags & AV_PIX_FMT_FLAG_BITSTREAM) {
2119  } else {
2120  av_assert0(8*(c->step_minus1+1) >= c->depth_minus1+1);
2121  }
2122  if (!strncmp(d->name, "bayer_", 6))
2123  continue;
2124  av_read_image_line(tmp, (void*)data, linesize, d, 0, 0, j, 2, 0);
2125  av_assert0(tmp[0] == 0 && tmp[1] == 0);
2126  tmp[0] = tmp[1] = (1<<(c->depth_minus1 + 1)) - 1;
2127  av_write_image_line(tmp, data, linesize, d, 0, 0, j, 2);
2128  }
2129  }
2130 }
2132 
2133 
2135 {
2136  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2137  char name[16];
2138  int i;
2139 
2140  if (!desc || strlen(desc->name) < 2)
2141  return AV_PIX_FMT_NONE;
2142  av_strlcpy(name, desc->name, sizeof(name));
2143  i = strlen(name) - 2;
2144  if (strcmp(name + i, "be") && strcmp(name + i, "le"))
2145  return AV_PIX_FMT_NONE;
2146 
2147  name[i] ^= 'b' ^ 'l';
2148 
2149  return get_pix_fmt_internal(name);
2150 }
2151 
2152 #define FF_COLOR_NA -1
2153 #define FF_COLOR_RGB 0 /**< RGB color space */
2154 #define FF_COLOR_GRAY 1 /**< gray color space */
2155 #define FF_COLOR_YUV 2 /**< YUV color space. 16 <= Y <= 235, 16 <= U, V <= 240 */
2156 #define FF_COLOR_YUV_JPEG 3 /**< YUV color space. 0 <= Y <= 255, 0 <= U, V <= 255 */
2157 
2158 #define pixdesc_has_alpha(pixdesc) \
2159  ((pixdesc)->nb_components == 2 || (pixdesc)->nb_components == 4 || (pixdesc)->flags & AV_PIX_FMT_FLAG_PAL)
2160 
2161 
2162 static int get_color_type(const AVPixFmtDescriptor *desc) {
2163  if (desc->flags & AV_PIX_FMT_FLAG_PAL)
2164  return FF_COLOR_RGB;
2165 
2166  if(desc->nb_components == 1 || desc->nb_components == 2)
2167  return FF_COLOR_GRAY;
2168 
2169  if(desc->name && !strncmp(desc->name, "yuvj", 4))
2170  return FF_COLOR_YUV_JPEG;
2171 
2172  if(desc->flags & AV_PIX_FMT_FLAG_RGB)
2173  return FF_COLOR_RGB;
2174 
2175  if(desc->nb_components == 0)
2176  return FF_COLOR_NA;
2177 
2178  return FF_COLOR_YUV;
2179 }
2180 
2181 static int get_pix_fmt_depth(int *min, int *max, enum AVPixelFormat pix_fmt)
2182 {
2183  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
2184  int i;
2185 
2186  if (!desc || !desc->nb_components) {
2187  *min = *max = 0;
2188  return AVERROR(EINVAL);
2189  }
2190 
2191  *min = INT_MAX, *max = -INT_MAX;
2192  for (i = 0; i < desc->nb_components; i++) {
2193  *min = FFMIN(desc->comp[i].depth_minus1+1, *min);
2194  *max = FFMAX(desc->comp[i].depth_minus1+1, *max);
2195  }
2196  return 0;
2197 }
2198 
2199 static int get_pix_fmt_score(enum AVPixelFormat dst_pix_fmt,
2200  enum AVPixelFormat src_pix_fmt,
2201  unsigned *lossp, unsigned consider)
2202 {
2203  const AVPixFmtDescriptor *src_desc = av_pix_fmt_desc_get(src_pix_fmt);
2204  const AVPixFmtDescriptor *dst_desc = av_pix_fmt_desc_get(dst_pix_fmt);
2205  int src_color, dst_color;
2206  int src_min_depth, src_max_depth, dst_min_depth, dst_max_depth;
2207  int ret, loss, i, nb_components;
2208  int score = INT_MAX - 1;
2209 
2210  if (dst_pix_fmt >= AV_PIX_FMT_NB || dst_pix_fmt <= AV_PIX_FMT_NONE)
2211  return ~0;
2212 
2213  /* compute loss */
2214  *lossp = loss = 0;
2215 
2216  if (dst_pix_fmt == src_pix_fmt)
2217  return INT_MAX;
2218 
2219  if ((ret = get_pix_fmt_depth(&src_min_depth, &src_max_depth, src_pix_fmt)) < 0)
2220  return ret;
2221  if ((ret = get_pix_fmt_depth(&dst_min_depth, &dst_max_depth, dst_pix_fmt)) < 0)
2222  return ret;
2223 
2224  src_color = get_color_type(src_desc);
2225  dst_color = get_color_type(dst_desc);
2226  if (dst_pix_fmt == AV_PIX_FMT_PAL8)
2227  nb_components = FFMIN(src_desc->nb_components, 4);
2228  else
2229  nb_components = FFMIN(src_desc->nb_components, dst_desc->nb_components);
2230 
2231  for (i = 0; i < nb_components; i++) {
2232  int depth_minus1 = (dst_pix_fmt == AV_PIX_FMT_PAL8) ? 7/nb_components : dst_desc->comp[i].depth_minus1;
2233  if (src_desc->comp[i].depth_minus1 > depth_minus1 && (consider & FF_LOSS_DEPTH)) {
2234  loss |= FF_LOSS_DEPTH;
2235  score -= 65536 >> depth_minus1;
2236  }
2237  }
2238 
2239  if (consider & FF_LOSS_RESOLUTION) {
2240  if (dst_desc->log2_chroma_w > src_desc->log2_chroma_w) {
2241  loss |= FF_LOSS_RESOLUTION;
2242  score -= 256 << dst_desc->log2_chroma_w;
2243  }
2244  if (dst_desc->log2_chroma_h > src_desc->log2_chroma_h) {
2245  loss |= FF_LOSS_RESOLUTION;
2246  score -= 256 << dst_desc->log2_chroma_h;
2247  }
2248  // don't favor 422 over 420 if downsampling is needed, because 420 has much better support on the decoder side
2249  if (dst_desc->log2_chroma_w == 1 && src_desc->log2_chroma_w == 0 &&
2250  dst_desc->log2_chroma_h == 1 && src_desc->log2_chroma_h == 0 ) {
2251  score += 512;
2252  }
2253  }
2254 
2255  if(consider & FF_LOSS_COLORSPACE)
2256  switch(dst_color) {
2257  case FF_COLOR_RGB:
2258  if (src_color != FF_COLOR_RGB &&
2259  src_color != FF_COLOR_GRAY)
2260  loss |= FF_LOSS_COLORSPACE;
2261  break;
2262  case FF_COLOR_GRAY:
2263  if (src_color != FF_COLOR_GRAY)
2264  loss |= FF_LOSS_COLORSPACE;
2265  break;
2266  case FF_COLOR_YUV:
2267  if (src_color != FF_COLOR_YUV)
2268  loss |= FF_LOSS_COLORSPACE;
2269  break;
2270  case FF_COLOR_YUV_JPEG:
2271  if (src_color != FF_COLOR_YUV_JPEG &&
2272  src_color != FF_COLOR_YUV &&
2273  src_color != FF_COLOR_GRAY)
2274  loss |= FF_LOSS_COLORSPACE;
2275  break;
2276  default:
2277  /* fail safe test */
2278  if (src_color != dst_color)
2279  loss |= FF_LOSS_COLORSPACE;
2280  break;
2281  }
2282  if(loss & FF_LOSS_COLORSPACE)
2283  score -= (nb_components * 65536) >> FFMIN(dst_desc->comp[0].depth_minus1, src_desc->comp[0].depth_minus1);
2284 
2285  if (dst_color == FF_COLOR_GRAY &&
2286  src_color != FF_COLOR_GRAY && (consider & FF_LOSS_CHROMA)) {
2287  loss |= FF_LOSS_CHROMA;
2288  score -= 2 * 65536;
2289  }
2290  if (!pixdesc_has_alpha(dst_desc) && (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))) {
2291  loss |= FF_LOSS_ALPHA;
2292  score -= 65536;
2293  }
2294  if (dst_pix_fmt == AV_PIX_FMT_PAL8 && (consider & FF_LOSS_COLORQUANT) &&
2295  (src_pix_fmt != AV_PIX_FMT_PAL8 && (src_color != FF_COLOR_GRAY || (pixdesc_has_alpha(src_desc) && (consider & FF_LOSS_ALPHA))))) {
2296  loss |= FF_LOSS_COLORQUANT;
2297  score -= 65536;
2298  }
2299 
2300  *lossp = loss;
2301  return score;
2302 }
2303 
2304 int av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,
2305  enum AVPixelFormat src_pix_fmt,
2306  int has_alpha)
2307 {
2308  int loss;
2309  int ret = get_pix_fmt_score(dst_pix_fmt, src_pix_fmt, &loss, has_alpha ? ~0 : ~FF_LOSS_ALPHA);
2310  if (ret < 0)
2311  return ret;
2312  return loss;
2313 }
2314 
2315 enum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,
2316  enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr)
2317 {
2318  enum AVPixelFormat dst_pix_fmt;
2319  int loss1, loss2, loss_mask;
2320  const AVPixFmtDescriptor *desc1 = av_pix_fmt_desc_get(dst_pix_fmt1);
2321  const AVPixFmtDescriptor *desc2 = av_pix_fmt_desc_get(dst_pix_fmt2);
2322  int score1, score2;
2323 
2324  loss_mask= loss_ptr?~*loss_ptr:~0; /* use loss mask if provided */
2325  if(!has_alpha)
2326  loss_mask &= ~FF_LOSS_ALPHA;
2327 
2328  score1 = get_pix_fmt_score(dst_pix_fmt1, src_pix_fmt, &loss1, loss_mask);
2329  score2 = get_pix_fmt_score(dst_pix_fmt2, src_pix_fmt, &loss2, loss_mask);
2330 
2331  if (score1 == score2) {
2333  dst_pix_fmt = av_get_padded_bits_per_pixel(desc2) < av_get_padded_bits_per_pixel(desc1) ? dst_pix_fmt2 : dst_pix_fmt1;
2334  } else {
2335  dst_pix_fmt = desc2->nb_components < desc1->nb_components ? dst_pix_fmt2 : dst_pix_fmt1;
2336  }
2337  } else {
2338  dst_pix_fmt = score1 < score2 ? dst_pix_fmt2 : dst_pix_fmt1;
2339  }
2340 
2341  if (loss_ptr)
2342  *loss_ptr = av_get_pix_fmt_loss(dst_pix_fmt, src_pix_fmt, has_alpha);
2343  return dst_pix_fmt;
2344 }
2345 
2346 const char *av_color_range_name(enum AVColorRange range)
2347 {
2348  return (unsigned) range < AVCOL_RANGE_NB ?
2349  color_range_names[range] : NULL;
2350 }
2351 
2352 const char *av_color_primaries_name(enum AVColorPrimaries primaries)
2353 {
2354  return (unsigned) primaries < AVCOL_PRI_NB ?
2355  color_primaries_names[primaries] : NULL;
2356 }
2357 
2359 {
2360  return (unsigned) transfer < AVCOL_TRC_NB ?
2361  color_transfer_names[transfer] : NULL;
2362 }
2363 
2364 const char *av_color_space_name(enum AVColorSpace space)
2365 {
2366  return (unsigned) space < AVCOL_SPC_NB ?
2367  color_space_names[space] : NULL;
2368 }
2369 
2370 const char *av_chroma_location_name(enum AVChromaLocation location)
2371 {
2372  return (unsigned) location < AVCHROMA_LOC_NB ?
2373  chroma_location_names[location] : NULL;
2374 }
2375 
2376 #ifdef TEST
2377 
2378 int main(void){
2379  int i;
2380  int err=0;
2381  int skip = 0;
2382 
2383  for (i=0; i<AV_PIX_FMT_NB*2; i++) {
2384  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
2385  if(!desc || !desc->name) {
2386  skip ++;
2387  continue;
2388  }
2389  if (skip) {
2390  av_log(NULL, AV_LOG_INFO, "%3d unused pixel format values\n", skip);
2391  skip = 0;
2392  }
2393  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));
2394  if ((!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)) != (desc->nb_components != 2 && desc->nb_components != 4)) {
2395  av_log(NULL, AV_LOG_ERROR, "Alpha flag mismatch\n");
2396  err = 1;
2397  }
2398  }
2399  return err;
2400 }
2401 
2402 #endif
2403