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 Libav.
6  *
7  * Libav 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  * Libav 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 Libav; 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 #include "pixfmt.h"
25 #include "pixdesc.h"
26 
27 #include "intreadwrite.h"
28 
29 void av_read_image_line(uint16_t *dst, const uint8_t *data[4], const int linesize[4],
30  const AVPixFmtDescriptor *desc, int x, int y, int c, int w,
31  int read_pal_component)
32 {
33  AVComponentDescriptor comp = desc->comp[c];
34  int plane = comp.plane;
35  int depth = comp.depth_minus1 + 1;
36  int mask = (1 << depth) - 1;
37  int shift = comp.shift;
38  int step = comp.step_minus1 + 1;
39  int flags = desc->flags;
40 
41  if (flags & PIX_FMT_BITSTREAM) {
42  int skip = x * step + comp.offset_plus1 - 1;
43  const uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
44  int shift = 8 - depth - (skip & 7);
45 
46  while (w--) {
47  int val = (*p >> shift) & mask;
48  if (read_pal_component)
49  val = data[1][4*val + c];
50  shift -= step;
51  p -= shift >> 3;
52  shift &= 7;
53  *dst++ = val;
54  }
55  } else {
56  const uint8_t *p = data[plane] + y * linesize[plane] + x * step + comp.offset_plus1 - 1;
57  int is_8bit = shift + depth <= 8;
58 
59  if (is_8bit)
60  p += !!(flags & PIX_FMT_BE);
61 
62  while (w--) {
63  int val = is_8bit ? *p :
64  flags & PIX_FMT_BE ? AV_RB16(p) : AV_RL16(p);
65  val = (val >> shift) & mask;
66  if (read_pal_component)
67  val = data[1][4 * val + c];
68  p += step;
69  *dst++ = val;
70  }
71  }
72 }
73 
74 void av_write_image_line(const uint16_t *src, uint8_t *data[4], const int linesize[4],
75  const AVPixFmtDescriptor *desc, int x, int y, int c, int w)
76 {
77  AVComponentDescriptor comp = desc->comp[c];
78  int plane = comp.plane;
79  int depth = comp.depth_minus1 + 1;
80  int step = comp.step_minus1 + 1;
81  int flags = desc->flags;
82 
83  if (flags & PIX_FMT_BITSTREAM) {
84  int skip = x * step + comp.offset_plus1 - 1;
85  uint8_t *p = data[plane] + y * linesize[plane] + (skip >> 3);
86  int shift = 8 - depth - (skip & 7);
87 
88  while (w--) {
89  *p |= *src++ << shift;
90  shift -= step;
91  p -= shift >> 3;
92  shift &= 7;
93  }
94  } else {
95  int shift = comp.shift;
96  uint8_t *p = data[plane] + y * linesize[plane] + x * step + comp.offset_plus1 - 1;
97 
98  if (shift + depth <= 8) {
99  p += !!(flags & PIX_FMT_BE);
100  while (w--) {
101  *p |= (*src++ << shift);
102  p += step;
103  }
104  } else {
105  while (w--) {
106  if (flags & PIX_FMT_BE) {
107  uint16_t val = AV_RB16(p) | (*src++ << shift);
108  AV_WB16(p, val);
109  } else {
110  uint16_t val = AV_RL16(p) | (*src++ << shift);
111  AV_WL16(p, val);
112  }
113  p += step;
114  }
115  }
116  }
117 }
118 
120  [PIX_FMT_YUV420P] = {
121  .name = "yuv420p",
122  .nb_components = 3,
123  .log2_chroma_w = 1,
124  .log2_chroma_h = 1,
125  .comp = {
126  { 0, 0, 1, 0, 7 }, /* Y */
127  { 1, 0, 1, 0, 7 }, /* U */
128  { 2, 0, 1, 0, 7 }, /* V */
129  },
130  .flags = PIX_FMT_PLANAR,
131  },
132  [PIX_FMT_YUYV422] = {
133  .name = "yuyv422",
134  .nb_components = 3,
135  .log2_chroma_w = 1,
136  .log2_chroma_h = 0,
137  .comp = {
138  { 0, 1, 1, 0, 7 }, /* Y */
139  { 0, 3, 2, 0, 7 }, /* U */
140  { 0, 3, 4, 0, 7 }, /* V */
141  },
142  },
143  [PIX_FMT_RGB24] = {
144  .name = "rgb24",
145  .nb_components = 3,
146  .log2_chroma_w = 0,
147  .log2_chroma_h = 0,
148  .comp = {
149  { 0, 2, 1, 0, 7 }, /* R */
150  { 0, 2, 2, 0, 7 }, /* G */
151  { 0, 2, 3, 0, 7 }, /* B */
152  },
153  .flags = PIX_FMT_RGB,
154  },
155  [PIX_FMT_BGR24] = {
156  .name = "bgr24",
157  .nb_components = 3,
158  .log2_chroma_w = 0,
159  .log2_chroma_h = 0,
160  .comp = {
161  { 0, 2, 1, 0, 7 }, /* B */
162  { 0, 2, 2, 0, 7 }, /* G */
163  { 0, 2, 3, 0, 7 }, /* R */
164  },
165  .flags = PIX_FMT_RGB,
166  },
167  [PIX_FMT_YUV422P] = {
168  .name = "yuv422p",
169  .nb_components = 3,
170  .log2_chroma_w = 1,
171  .log2_chroma_h = 0,
172  .comp = {
173  { 0, 0, 1, 0, 7 }, /* Y */
174  { 1, 0, 1, 0, 7 }, /* U */
175  { 2, 0, 1, 0, 7 }, /* V */
176  },
177  .flags = PIX_FMT_PLANAR,
178  },
179  [PIX_FMT_YUV444P] = {
180  .name = "yuv444p",
181  .nb_components = 3,
182  .log2_chroma_w = 0,
183  .log2_chroma_h = 0,
184  .comp = {
185  { 0, 0, 1, 0, 7 }, /* Y */
186  { 1, 0, 1, 0, 7 }, /* U */
187  { 2, 0, 1, 0, 7 }, /* V */
188  },
189  .flags = PIX_FMT_PLANAR,
190  },
191  [PIX_FMT_YUV410P] = {
192  .name = "yuv410p",
193  .nb_components = 3,
194  .log2_chroma_w = 2,
195  .log2_chroma_h = 2,
196  .comp = {
197  { 0, 0, 1, 0, 7 }, /* Y */
198  { 1, 0, 1, 0, 7 }, /* U */
199  { 2, 0, 1, 0, 7 }, /* V */
200  },
201  .flags = PIX_FMT_PLANAR,
202  },
203  [PIX_FMT_YUV411P] = {
204  .name = "yuv411p",
205  .nb_components = 3,
206  .log2_chroma_w = 2,
207  .log2_chroma_h = 0,
208  .comp = {
209  { 0, 0, 1, 0, 7 }, /* Y */
210  { 1, 0, 1, 0, 7 }, /* U */
211  { 2, 0, 1, 0, 7 }, /* V */
212  },
213  .flags = PIX_FMT_PLANAR,
214  },
215  [PIX_FMT_GRAY8] = {
216  .name = "gray",
217  .nb_components = 1,
218  .log2_chroma_w = 0,
219  .log2_chroma_h = 0,
220  .comp = {
221  { 0, 0, 1, 0, 7 }, /* Y */
222  },
223  },
224  [PIX_FMT_MONOWHITE] = {
225  .name = "monow",
226  .nb_components = 1,
227  .log2_chroma_w = 0,
228  .log2_chroma_h = 0,
229  .comp = {
230  { 0, 0, 1, 0, 0 }, /* Y */
231  },
232  .flags = PIX_FMT_BITSTREAM,
233  },
234  [PIX_FMT_MONOBLACK] = {
235  .name = "monob",
236  .nb_components = 1,
237  .log2_chroma_w = 0,
238  .log2_chroma_h = 0,
239  .comp = {
240  { 0, 0, 1, 7, 0 }, /* Y */
241  },
242  .flags = PIX_FMT_BITSTREAM,
243  },
244  [PIX_FMT_PAL8] = {
245  .name = "pal8",
246  .nb_components = 1,
247  .log2_chroma_w = 0,
248  .log2_chroma_h = 0,
249  .comp = {
250  { 0, 0, 1, 0, 7 },
251  },
252  .flags = PIX_FMT_PAL,
253  },
254  [PIX_FMT_YUVJ420P] = {
255  .name = "yuvj420p",
256  .nb_components = 3,
257  .log2_chroma_w = 1,
258  .log2_chroma_h = 1,
259  .comp = {
260  { 0, 0, 1, 0, 7 }, /* Y */
261  { 1, 0, 1, 0, 7 }, /* U */
262  { 2, 0, 1, 0, 7 }, /* V */
263  },
264  .flags = PIX_FMT_PLANAR,
265  },
266  [PIX_FMT_YUVJ422P] = {
267  .name = "yuvj422p",
268  .nb_components = 3,
269  .log2_chroma_w = 1,
270  .log2_chroma_h = 0,
271  .comp = {
272  { 0, 0, 1, 0, 7 }, /* Y */
273  { 1, 0, 1, 0, 7 }, /* U */
274  { 2, 0, 1, 0, 7 }, /* V */
275  },
276  .flags = PIX_FMT_PLANAR,
277  },
278  [PIX_FMT_YUVJ444P] = {
279  .name = "yuvj444p",
280  .nb_components = 3,
281  .log2_chroma_w = 0,
282  .log2_chroma_h = 0,
283  .comp = {
284  {0, 0, 1, 0, 7}, /* Y */
285  {1, 0, 1, 0, 7}, /* U */
286  {2, 0, 1, 0, 7}, /* V */
287  },
288  .flags = PIX_FMT_PLANAR,
289  },
291  .name = "xvmcmc",
292  .flags = PIX_FMT_HWACCEL,
293  },
295  .name = "xvmcidct",
296  .flags = PIX_FMT_HWACCEL,
297  },
298  [PIX_FMT_UYVY422] = {
299  .name = "uyvy422",
300  .nb_components = 3,
301  .log2_chroma_w = 1,
302  .log2_chroma_h = 0,
303  .comp = {
304  { 0, 1, 2, 0, 7 }, /* Y */
305  { 0, 3, 1, 0, 7 }, /* U */
306  { 0, 3, 3, 0, 7 }, /* V */
307  },
308  },
309  [PIX_FMT_UYYVYY411] = {
310  .name = "uyyvyy411",
311  .nb_components = 3,
312  .log2_chroma_w = 2,
313  .log2_chroma_h = 0,
314  .comp = {
315  { 0, 3, 2, 0, 7 }, /* Y */
316  { 0, 5, 1, 0, 7 }, /* U */
317  { 0, 5, 4, 0, 7 }, /* V */
318  },
319  },
320  [PIX_FMT_BGR8] = {
321  .name = "bgr8",
322  .nb_components = 3,
323  .log2_chroma_w = 0,
324  .log2_chroma_h = 0,
325  .comp = {
326  { 0, 0, 1, 6, 1 }, /* B */
327  { 0, 0, 1, 3, 2 }, /* G */
328  { 0, 0, 1, 0, 2 }, /* R */
329  },
330  .flags = PIX_FMT_PAL | PIX_FMT_RGB,
331  },
332  [PIX_FMT_BGR4] = {
333  .name = "bgr4",
334  .nb_components = 3,
335  .log2_chroma_w = 0,
336  .log2_chroma_h = 0,
337  .comp = {
338  { 0, 3, 1, 0, 0 }, /* B */
339  { 0, 3, 2, 0, 1 }, /* G */
340  { 0, 3, 4, 0, 0 }, /* R */
341  },
342  .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
343  },
344  [PIX_FMT_BGR4_BYTE] = {
345  .name = "bgr4_byte",
346  .nb_components = 3,
347  .log2_chroma_w = 0,
348  .log2_chroma_h = 0,
349  .comp = {
350  { 0, 0, 1, 3, 0 }, /* B */
351  { 0, 0, 1, 1, 1 }, /* G */
352  { 0, 0, 1, 0, 0 }, /* R */
353  },
354  .flags = PIX_FMT_PAL | PIX_FMT_RGB,
355  },
356  [PIX_FMT_RGB8] = {
357  .name = "rgb8",
358  .nb_components = 3,
359  .log2_chroma_w = 0,
360  .log2_chroma_h = 0,
361  .comp = {
362  { 0, 0, 1, 6, 1 }, /* R */
363  { 0, 0, 1, 3, 2 }, /* G */
364  { 0, 0, 1, 0, 2 }, /* B */
365  },
366  .flags = PIX_FMT_PAL | PIX_FMT_RGB,
367  },
368  [PIX_FMT_RGB4] = {
369  .name = "rgb4",
370  .nb_components = 3,
371  .log2_chroma_w = 0,
372  .log2_chroma_h = 0,
373  .comp = {
374  { 0, 3, 1, 0, 0 }, /* R */
375  { 0, 3, 2, 0, 1 }, /* G */
376  { 0, 3, 4, 0, 0 }, /* B */
377  },
378  .flags = PIX_FMT_BITSTREAM | PIX_FMT_RGB,
379  },
380  [PIX_FMT_RGB4_BYTE] = {
381  .name = "rgb4_byte",
382  .nb_components = 3,
383  .log2_chroma_w = 0,
384  .log2_chroma_h = 0,
385  .comp = {
386  { 0, 0, 1, 3, 0 }, /* R */
387  { 0, 0, 1, 1, 1 }, /* G */
388  { 0, 0, 1, 0, 0 }, /* B */
389  },
390  .flags = PIX_FMT_PAL | PIX_FMT_RGB,
391  },
392  [PIX_FMT_NV12] = {
393  .name = "nv12",
394  .nb_components = 3,
395  .log2_chroma_w = 1,
396  .log2_chroma_h = 1,
397  .comp = {
398  { 0,0,1,0,7 }, /* Y */
399  { 1,1,1,0,7 }, /* U */
400  { 1,1,2,0,7 }, /* V */
401  },
402  .flags = PIX_FMT_PLANAR,
403  },
404  [PIX_FMT_NV21] = {
405  .name = "nv21",
406  .nb_components = 3,
407  .log2_chroma_w = 1,
408  .log2_chroma_h = 1,
409  .comp = {
410  { 0, 0, 1, 0, 7 }, /* Y */
411  { 1, 1, 1, 0, 7 }, /* V */
412  { 1, 1, 2, 0, 7 }, /* U */
413  },
414  .flags = PIX_FMT_PLANAR,
415  },
416  [PIX_FMT_ARGB] = {
417  .name = "argb",
418  .nb_components = 4,
419  .log2_chroma_w = 0,
420  .log2_chroma_h = 0,
421  .comp = {
422  { 0, 3, 1, 0, 7 }, /* A */
423  { 0, 3, 2, 0, 7 }, /* R */
424  { 0, 3, 3, 0, 7 }, /* G */
425  { 0, 3, 4, 0, 7 }, /* B */
426  },
427  .flags = PIX_FMT_RGB,
428  },
429  [PIX_FMT_RGBA] = {
430  .name = "rgba",
431  .nb_components = 4,
432  .log2_chroma_w = 0,
433  .log2_chroma_h = 0,
434  .comp = {
435  { 0, 3, 1, 0, 7 }, /* R */
436  { 0, 3, 2, 0, 7 }, /* G */
437  { 0, 3, 3, 0, 7 }, /* B */
438  { 0, 3, 4, 0, 7 }, /* A */
439  },
440  .flags = PIX_FMT_RGB,
441  },
442  [PIX_FMT_ABGR] = {
443  .name = "abgr",
444  .nb_components = 4,
445  .log2_chroma_w = 0,
446  .log2_chroma_h = 0,
447  .comp = {
448  { 0, 3, 1, 0, 7 }, /* A */
449  { 0, 3, 2, 0, 7 }, /* B */
450  { 0, 3, 3, 0, 7 }, /* G */
451  { 0, 3, 4, 0, 7 }, /* R */
452  },
453  .flags = PIX_FMT_RGB,
454  },
455  [PIX_FMT_BGRA] = {
456  .name = "bgra",
457  .nb_components = 4,
458  .log2_chroma_w = 0,
459  .log2_chroma_h = 0,
460  .comp = {
461  { 0, 3, 1, 0, 7 }, /* B */
462  { 0, 3, 2, 0, 7 }, /* G */
463  { 0, 3, 3, 0, 7 }, /* R */
464  { 0, 3, 4, 0, 7 }, /* A */
465  },
466  .flags = PIX_FMT_RGB,
467  },
468  [PIX_FMT_GRAY16BE] = {
469  .name = "gray16be",
470  .nb_components = 1,
471  .log2_chroma_w = 0,
472  .log2_chroma_h = 0,
473  .comp = {
474  { 0, 1, 1, 0, 15 }, /* Y */
475  },
476  .flags = PIX_FMT_BE,
477  },
478  [PIX_FMT_GRAY16LE] = {
479  .name = "gray16le",
480  .nb_components = 1,
481  .log2_chroma_w = 0,
482  .log2_chroma_h = 0,
483  .comp = {
484  { 0, 1, 1, 0, 15 }, /* Y */
485  },
486  },
487  [PIX_FMT_YUV440P] = {
488  .name = "yuv440p",
489  .nb_components = 3,
490  .log2_chroma_w = 0,
491  .log2_chroma_h = 1,
492  .comp = {
493  { 0, 0, 1, 0, 7 }, /* Y */
494  { 1, 0, 1, 0, 7 }, /* U */
495  { 2, 0, 1, 0, 7 }, /* V */
496  },
497  .flags = PIX_FMT_PLANAR,
498  },
499  [PIX_FMT_YUVJ440P] = {
500  .name = "yuvj440p",
501  .nb_components = 3,
502  .log2_chroma_w = 0,
503  .log2_chroma_h = 1,
504  .comp = {
505  { 0, 0, 1, 0, 7 }, /* Y */
506  { 1, 0, 1, 0, 7 }, /* U */
507  { 2, 0, 1, 0, 7 }, /* V */
508  },
509  .flags = PIX_FMT_PLANAR,
510  },
511  [PIX_FMT_YUVA420P] = {
512  .name = "yuva420p",
513  .nb_components = 4,
514  .log2_chroma_w = 1,
515  .log2_chroma_h = 1,
516  .comp = {
517  { 0, 0, 1, 0, 7 }, /* Y */
518  { 1, 0, 1, 0, 7 }, /* U */
519  { 2, 0, 1, 0, 7 }, /* V */
520  { 3, 0, 1, 0, 7 }, /* A */
521  },
522  .flags = PIX_FMT_PLANAR,
523  },
524  [PIX_FMT_VDPAU_H264] = {
525  .name = "vdpau_h264",
526  .log2_chroma_w = 1,
527  .log2_chroma_h = 1,
528  .flags = PIX_FMT_HWACCEL,
529  },
530  [PIX_FMT_VDPAU_MPEG1] = {
531  .name = "vdpau_mpeg1",
532  .log2_chroma_w = 1,
533  .log2_chroma_h = 1,
534  .flags = PIX_FMT_HWACCEL,
535  },
536  [PIX_FMT_VDPAU_MPEG2] = {
537  .name = "vdpau_mpeg2",
538  .log2_chroma_w = 1,
539  .log2_chroma_h = 1,
540  .flags = PIX_FMT_HWACCEL,
541  },
542  [PIX_FMT_VDPAU_WMV3] = {
543  .name = "vdpau_wmv3",
544  .log2_chroma_w = 1,
545  .log2_chroma_h = 1,
546  .flags = PIX_FMT_HWACCEL,
547  },
548  [PIX_FMT_VDPAU_VC1] = {
549  .name = "vdpau_vc1",
550  .log2_chroma_w = 1,
551  .log2_chroma_h = 1,
552  .flags = PIX_FMT_HWACCEL,
553  },
554  [PIX_FMT_VDPAU_MPEG4] = {
555  .name = "vdpau_mpeg4",
556  .log2_chroma_w = 1,
557  .log2_chroma_h = 1,
558  .flags = PIX_FMT_HWACCEL,
559  },
560  [PIX_FMT_RGB48BE] = {
561  .name = "rgb48be",
562  .nb_components = 3,
563  .log2_chroma_w = 0,
564  .log2_chroma_h = 0,
565  .comp = {
566  { 0, 5, 1, 0, 15 }, /* R */
567  { 0, 5, 3, 0, 15 }, /* G */
568  { 0, 5, 5, 0, 15 }, /* B */
569  },
570  .flags = PIX_FMT_RGB | PIX_FMT_BE,
571  },
572  [PIX_FMT_RGB48LE] = {
573  .name = "rgb48le",
574  .nb_components = 3,
575  .log2_chroma_w = 0,
576  .log2_chroma_h = 0,
577  .comp = {
578  { 0, 5, 1, 0, 15 }, /* R */
579  { 0, 5, 3, 0, 15 }, /* G */
580  { 0, 5, 5, 0, 15 }, /* B */
581  },
582  .flags = PIX_FMT_RGB,
583  },
584  [PIX_FMT_RGB565BE] = {
585  .name = "rgb565be",
586  .nb_components = 3,
587  .log2_chroma_w = 0,
588  .log2_chroma_h = 0,
589  .comp = {
590  { 0, 1, 0, 3, 4 }, /* R */
591  { 0, 1, 1, 5, 5 }, /* G */
592  { 0, 1, 1, 0, 4 }, /* B */
593  },
594  .flags = PIX_FMT_BE | PIX_FMT_RGB,
595  },
596  [PIX_FMT_RGB565LE] = {
597  .name = "rgb565le",
598  .nb_components = 3,
599  .log2_chroma_w = 0,
600  .log2_chroma_h = 0,
601  .comp = {
602  { 0, 1, 2, 3, 4 }, /* R */
603  { 0, 1, 1, 5, 5 }, /* G */
604  { 0, 1, 1, 0, 4 }, /* B */
605  },
606  .flags = PIX_FMT_RGB,
607  },
608  [PIX_FMT_RGB555BE] = {
609  .name = "rgb555be",
610  .nb_components = 3,
611  .log2_chroma_w = 0,
612  .log2_chroma_h = 0,
613  .comp = {
614  { 0, 1, 0, 2, 4 }, /* R */
615  { 0, 1, 1, 5, 4 }, /* G */
616  { 0, 1, 1, 0, 4 }, /* B */
617  },
618  .flags = PIX_FMT_BE | PIX_FMT_RGB,
619  },
620  [PIX_FMT_RGB555LE] = {
621  .name = "rgb555le",
622  .nb_components = 3,
623  .log2_chroma_w = 0,
624  .log2_chroma_h = 0,
625  .comp = {
626  { 0, 1, 2, 2, 4 }, /* R */
627  { 0, 1, 1, 5, 4 }, /* G */
628  { 0, 1, 1, 0, 4 }, /* B */
629  },
630  .flags = PIX_FMT_RGB,
631  },
632  [PIX_FMT_RGB444BE] = {
633  .name = "rgb444be",
634  .nb_components = 3,
635  .log2_chroma_w = 0,
636  .log2_chroma_h = 0,
637  .comp = {
638  { 0, 1, 0, 0, 3 }, /* R */
639  { 0, 1, 1, 4, 3 }, /* G */
640  { 0, 1, 1, 0, 3 }, /* B */
641  },
642  .flags = PIX_FMT_BE | PIX_FMT_RGB,
643  },
644  [PIX_FMT_RGB444LE] = {
645  .name = "rgb444le",
646  .nb_components = 3,
647  .log2_chroma_w = 0,
648  .log2_chroma_h = 0,
649  .comp = {
650  { 0, 1, 2, 0, 3 }, /* R */
651  { 0, 1, 1, 4, 3 }, /* G */
652  { 0, 1, 1, 0, 3 }, /* B */
653  },
654  .flags = PIX_FMT_RGB,
655  },
656  [PIX_FMT_BGR48BE] = {
657  .name = "bgr48be",
658  .nb_components = 3,
659  .log2_chroma_w = 0,
660  .log2_chroma_h = 0,
661  .comp = {
662  { 0, 5, 1, 0, 15 }, /* B */
663  { 0, 5, 3, 0, 15 }, /* G */
664  { 0, 5, 5, 0, 15 }, /* R */
665  },
666  .flags = PIX_FMT_BE | PIX_FMT_RGB,
667  },
668  [PIX_FMT_BGR48LE] = {
669  .name = "bgr48le",
670  .nb_components = 3,
671  .log2_chroma_w = 0,
672  .log2_chroma_h = 0,
673  .comp = {
674  { 0, 5, 1, 0, 15 }, /* B */
675  { 0, 5, 3, 0, 15 }, /* G */
676  { 0, 5, 5, 0, 15 }, /* R */
677  },
678  .flags = PIX_FMT_RGB,
679  },
680  [PIX_FMT_BGR565BE] = {
681  .name = "bgr565be",
682  .nb_components = 3,
683  .log2_chroma_w = 0,
684  .log2_chroma_h = 0,
685  .comp = {
686  { 0, 1, 0, 3, 4 }, /* B */
687  { 0, 1, 1, 5, 5 }, /* G */
688  { 0, 1, 1, 0, 4 }, /* R */
689  },
690  .flags = PIX_FMT_BE | PIX_FMT_RGB,
691  },
692  [PIX_FMT_BGR565LE] = {
693  .name = "bgr565le",
694  .nb_components = 3,
695  .log2_chroma_w = 0,
696  .log2_chroma_h = 0,
697  .comp = {
698  { 0, 1, 2, 3, 4 }, /* B */
699  { 0, 1, 1, 5, 5 }, /* G */
700  { 0, 1, 1, 0, 4 }, /* R */
701  },
702  .flags = PIX_FMT_RGB,
703  },
704  [PIX_FMT_BGR555BE] = {
705  .name = "bgr555be",
706  .nb_components = 3,
707  .log2_chroma_w = 0,
708  .log2_chroma_h = 0,
709  .comp = {
710  { 0, 1, 0, 2, 4 }, /* B */
711  { 0, 1, 1, 5, 4 }, /* G */
712  { 0, 1, 1, 0, 4 }, /* R */
713  },
714  .flags = PIX_FMT_BE | PIX_FMT_RGB,
715  },
716  [PIX_FMT_BGR555LE] = {
717  .name = "bgr555le",
718  .nb_components = 3,
719  .log2_chroma_w = 0,
720  .log2_chroma_h = 0,
721  .comp = {
722  { 0, 1, 2, 2, 4 }, /* B */
723  { 0, 1, 1, 5, 4 }, /* G */
724  { 0, 1, 1, 0, 4 }, /* R */
725  },
726  .flags = PIX_FMT_RGB,
727  },
728  [PIX_FMT_BGR444BE] = {
729  .name = "bgr444be",
730  .nb_components = 3,
731  .log2_chroma_w = 0,
732  .log2_chroma_h = 0,
733  .comp = {
734  { 0, 1, 0, 0, 3 }, /* B */
735  { 0, 1, 1, 4, 3 }, /* G */
736  { 0, 1, 1, 0, 3 }, /* R */
737  },
738  .flags = PIX_FMT_BE | PIX_FMT_RGB,
739  },
740  [PIX_FMT_BGR444LE] = {
741  .name = "bgr444le",
742  .nb_components = 3,
743  .log2_chroma_w = 0,
744  .log2_chroma_h = 0,
745  .comp = {
746  { 0, 1, 2, 0, 3 }, /* B */
747  { 0, 1, 1, 4, 3 }, /* G */
748  { 0, 1, 1, 0, 3 }, /* R */
749  },
750  .flags = PIX_FMT_RGB,
751  },
752  [PIX_FMT_VAAPI_MOCO] = {
753  .name = "vaapi_moco",
754  .log2_chroma_w = 1,
755  .log2_chroma_h = 1,
756  .flags = PIX_FMT_HWACCEL,
757  },
758  [PIX_FMT_VAAPI_IDCT] = {
759  .name = "vaapi_idct",
760  .log2_chroma_w = 1,
761  .log2_chroma_h = 1,
762  .flags = PIX_FMT_HWACCEL,
763  },
764  [PIX_FMT_VAAPI_VLD] = {
765  .name = "vaapi_vld",
766  .log2_chroma_w = 1,
767  .log2_chroma_h = 1,
768  .flags = PIX_FMT_HWACCEL,
769  },
770  [PIX_FMT_VDA_VLD] = {
771  .name = "vda_vld",
772  .log2_chroma_w = 1,
773  .log2_chroma_h = 1,
774  .flags = PIX_FMT_HWACCEL,
775  },
776  [PIX_FMT_YUV420P9LE] = {
777  .name = "yuv420p9le",
778  .nb_components = 3,
779  .log2_chroma_w = 1,
780  .log2_chroma_h = 1,
781  .comp = {
782  { 0, 1, 1, 0, 8 }, /* Y */
783  { 1, 1, 1, 0, 8 }, /* U */
784  { 2, 1, 1, 0, 8 }, /* V */
785  },
786  .flags = PIX_FMT_PLANAR,
787  },
788  [PIX_FMT_YUV420P9BE] = {
789  .name = "yuv420p9be",
790  .nb_components = 3,
791  .log2_chroma_w = 1,
792  .log2_chroma_h = 1,
793  .comp = {
794  { 0, 1, 1, 0, 8 }, /* Y */
795  { 1, 1, 1, 0, 8 }, /* U */
796  { 2, 1, 1, 0, 8 }, /* V */
797  },
798  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
799  },
800  [PIX_FMT_YUV420P10LE] = {
801  .name = "yuv420p10le",
802  .nb_components = 3,
803  .log2_chroma_w = 1,
804  .log2_chroma_h = 1,
805  .comp = {
806  { 0, 1, 1, 0, 9 }, /* Y */
807  { 1, 1, 1, 0, 9 }, /* U */
808  { 2, 1, 1, 0, 9 }, /* V */
809  },
810  .flags = PIX_FMT_PLANAR,
811  },
812  [PIX_FMT_YUV420P10BE] = {
813  .name = "yuv420p10be",
814  .nb_components = 3,
815  .log2_chroma_w = 1,
816  .log2_chroma_h = 1,
817  .comp = {
818  { 0, 1, 1, 0, 9 }, /* Y */
819  { 1, 1, 1, 0, 9 }, /* U */
820  { 2, 1, 1, 0, 9 }, /* V */
821  },
822  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
823  },
824  [PIX_FMT_YUV420P16LE] = {
825  .name = "yuv420p16le",
826  .nb_components = 3,
827  .log2_chroma_w = 1,
828  .log2_chroma_h = 1,
829  .comp = {
830  { 0, 1, 1, 0, 15 }, /* Y */
831  { 1, 1, 1, 0, 15 }, /* U */
832  { 2, 1, 1, 0, 15 }, /* V */
833  },
834  .flags = PIX_FMT_PLANAR,
835  },
836  [PIX_FMT_YUV420P16BE] = {
837  .name = "yuv420p16be",
838  .nb_components = 3,
839  .log2_chroma_w = 1,
840  .log2_chroma_h = 1,
841  .comp = {
842  { 0, 1, 1, 0, 15 }, /* Y */
843  { 1, 1, 1, 0, 15 }, /* U */
844  { 2, 1, 1, 0, 15 }, /* V */
845  },
846  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
847  },
848  [PIX_FMT_YUV422P9LE] = {
849  .name = "yuv422p9le",
850  .nb_components = 3,
851  .log2_chroma_w = 1,
852  .log2_chroma_h = 0,
853  .comp = {
854  { 0, 1, 1, 0, 8 }, /* Y */
855  { 1, 1, 1, 0, 8 }, /* U */
856  { 2, 1, 1, 0, 8 }, /* V */
857  },
858  .flags = PIX_FMT_PLANAR,
859  },
860  [PIX_FMT_YUV422P9BE] = {
861  .name = "yuv422p9be",
862  .nb_components = 3,
863  .log2_chroma_w = 1,
864  .log2_chroma_h = 0,
865  .comp = {
866  {0,1,1,0,8}, /* Y */
867  {1,1,1,0,8}, /* U */
868  {2,1,1,0,8}, /* V */
869  },
870  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
871  },
872  [PIX_FMT_YUV422P10LE] = {
873  .name = "yuv422p10le",
874  .nb_components = 3,
875  .log2_chroma_w = 1,
876  .log2_chroma_h = 0,
877  .comp = {
878  { 0, 1, 1, 0, 9 }, /* Y */
879  { 1, 1, 1, 0, 9 }, /* U */
880  { 2, 1, 1, 0, 9 }, /* V */
881  },
882  .flags = PIX_FMT_PLANAR,
883  },
884  [PIX_FMT_YUV422P10BE] = {
885  .name = "yuv422p10be",
886  .nb_components = 3,
887  .log2_chroma_w = 1,
888  .log2_chroma_h = 0,
889  .comp = {
890  { 0, 1, 1, 0, 9 }, /* Y */
891  { 1, 1, 1, 0, 9 }, /* U */
892  { 2, 1, 1, 0, 9 }, /* V */
893  },
894  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
895  },
896  [PIX_FMT_YUV422P16LE] = {
897  .name = "yuv422p16le",
898  .nb_components = 3,
899  .log2_chroma_w = 1,
900  .log2_chroma_h = 0,
901  .comp = {
902  { 0, 1, 1, 0, 15 }, /* Y */
903  { 1, 1, 1, 0, 15 }, /* U */
904  { 2, 1, 1, 0, 15 }, /* V */
905  },
906  .flags = PIX_FMT_PLANAR,
907  },
908  [PIX_FMT_YUV422P16BE] = {
909  .name = "yuv422p16be",
910  .nb_components = 3,
911  .log2_chroma_w = 1,
912  .log2_chroma_h = 0,
913  .comp = {
914  { 0, 1, 1, 0, 15 }, /* Y */
915  { 1, 1, 1, 0, 15 }, /* U */
916  { 2, 1, 1, 0, 15 }, /* V */
917  },
918  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
919  },
920  [PIX_FMT_YUV444P16LE] = {
921  .name = "yuv444p16le",
922  .nb_components = 3,
923  .log2_chroma_w = 0,
924  .log2_chroma_h = 0,
925  .comp = {
926  { 0, 1, 1, 0, 15 }, /* Y */
927  { 1, 1, 1, 0, 15 }, /* U */
928  { 2, 1, 1, 0, 15 }, /* V */
929  },
930  .flags = PIX_FMT_PLANAR,
931  },
932  [PIX_FMT_YUV444P16BE] = {
933  .name = "yuv444p16be",
934  .nb_components = 3,
935  .log2_chroma_w = 0,
936  .log2_chroma_h = 0,
937  .comp = {
938  { 0, 1, 1, 0, 15 }, /* Y */
939  { 1, 1, 1, 0, 15 }, /* U */
940  { 2, 1, 1, 0, 15 }, /* V */
941  },
942  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
943  },
944  [PIX_FMT_YUV444P10LE] = {
945  .name = "yuv444p10le",
946  .nb_components = 3,
947  .log2_chroma_w = 0,
948  .log2_chroma_h = 0,
949  .comp = {
950  { 0, 1, 1, 0, 9 }, /* Y */
951  { 1, 1, 1, 0, 9 }, /* U */
952  { 2, 1, 1, 0, 9 }, /* V */
953  },
954  .flags = PIX_FMT_PLANAR,
955  },
956  [PIX_FMT_YUV444P10BE] = {
957  .name = "yuv444p10be",
958  .nb_components = 3,
959  .log2_chroma_w = 0,
960  .log2_chroma_h = 0,
961  .comp = {
962  { 0, 1, 1, 0, 9 }, /* Y */
963  { 1, 1, 1, 0, 9 }, /* U */
964  { 2, 1, 1, 0, 9 }, /* V */
965  },
966  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
967  },
968  [PIX_FMT_YUV444P9LE] = {
969  .name = "yuv444p9le",
970  .nb_components = 3,
971  .log2_chroma_w = 0,
972  .log2_chroma_h = 0,
973  .comp = {
974  { 0, 1, 1, 0, 8 }, /* Y */
975  { 1, 1, 1, 0, 8 }, /* U */
976  { 2, 1, 1, 0, 8 }, /* V */
977  },
978  .flags = PIX_FMT_PLANAR,
979  },
980  [PIX_FMT_YUV444P9BE] = {
981  .name = "yuv444p9be",
982  .nb_components = 3,
983  .log2_chroma_w = 0,
984  .log2_chroma_h = 0,
985  .comp = {
986  { 0, 1, 1, 0, 8 }, /* Y */
987  { 1, 1, 1, 0, 8 }, /* U */
988  { 2, 1, 1, 0, 8 }, /* V */
989  },
990  .flags = PIX_FMT_BE | PIX_FMT_PLANAR,
991  },
992  [PIX_FMT_DXVA2_VLD] = {
993  .name = "dxva2_vld",
994  .log2_chroma_w = 1,
995  .log2_chroma_h = 1,
996  .flags = PIX_FMT_HWACCEL,
997  },
998  [PIX_FMT_Y400A] = {
999  .name = "y400a",
1000  .nb_components = 2,
1001  .comp = {
1002  { 0, 1, 1, 0, 7 }, /* Y */
1003  { 0, 1, 2, 0, 7 }, /* A */
1004  },
1005  },
1006  [PIX_FMT_GBRP] = {
1007  .name = "gbrp",
1008  .nb_components = 3,
1009  .log2_chroma_w = 0,
1010  .log2_chroma_h = 0,
1011  .comp = {
1012  { 0, 0, 1, 0, 7 }, /* G */
1013  { 1, 0, 1, 0, 7 }, /* B */
1014  { 2, 0, 1, 0, 7 }, /* R */
1015  },
1016  .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1017  },
1018  [PIX_FMT_GBRP9LE] = {
1019  .name = "gbrp9le",
1020  .nb_components = 3,
1021  .log2_chroma_w = 0,
1022  .log2_chroma_h = 0,
1023  .comp = {
1024  { 0, 1, 1, 0, 8 }, /* G */
1025  { 1, 1, 1, 0, 8 }, /* B */
1026  { 2, 1, 1, 0, 8 }, /* R */
1027  },
1028  .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1029  },
1030  [PIX_FMT_GBRP9BE] = {
1031  .name = "gbrp9be",
1032  .nb_components = 3,
1033  .log2_chroma_w = 0,
1034  .log2_chroma_h = 0,
1035  .comp = {
1036  { 0, 1, 1, 0, 8 }, /* G */
1037  { 1, 1, 1, 0, 8 }, /* B */
1038  { 2, 1, 1, 0, 8 }, /* R */
1039  },
1040  .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1041  },
1042  [PIX_FMT_GBRP10LE] = {
1043  .name = "gbrp10le",
1044  .nb_components = 3,
1045  .log2_chroma_w = 0,
1046  .log2_chroma_h = 0,
1047  .comp = {
1048  { 0, 1, 1, 0, 9 }, /* G */
1049  { 1, 1, 1, 0, 9 }, /* B */
1050  { 2, 1, 1, 0, 9 }, /* R */
1051  },
1052  .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1053  },
1054  [PIX_FMT_GBRP10BE] = {
1055  .name = "gbrp10be",
1056  .nb_components = 3,
1057  .log2_chroma_w = 0,
1058  .log2_chroma_h = 0,
1059  .comp = {
1060  { 0, 1, 1, 0, 9 }, /* G */
1061  { 1, 1, 1, 0, 9 }, /* B */
1062  { 2, 1, 1, 0, 9 }, /* R */
1063  },
1064  .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1065  },
1066  [PIX_FMT_GBRP16LE] = {
1067  .name = "gbrp16le",
1068  .nb_components = 3,
1069  .log2_chroma_w = 0,
1070  .log2_chroma_h = 0,
1071  .comp = {
1072  { 0, 1, 1, 0, 15 }, /* G */
1073  { 1, 1, 1, 0, 15 }, /* B */
1074  { 2, 1, 1, 0, 15 }, /* R */
1075  },
1076  .flags = PIX_FMT_PLANAR | PIX_FMT_RGB,
1077  },
1078  [PIX_FMT_GBRP16BE] = {
1079  .name = "gbrp16be",
1080  .nb_components = 3,
1081  .log2_chroma_w = 0,
1082  .log2_chroma_h = 0,
1083  .comp = {
1084  { 0, 1, 1, 0, 15 }, /* G */
1085  { 1, 1, 1, 0, 15 }, /* B */
1086  { 2, 1, 1, 0, 15 }, /* R */
1087  },
1088  .flags = PIX_FMT_BE | PIX_FMT_PLANAR | PIX_FMT_RGB,
1089  },
1090 };
1091 
1092 static enum PixelFormat get_pix_fmt_internal(const char *name)
1093 {
1094  enum PixelFormat pix_fmt;
1095 
1096  for (pix_fmt = 0; pix_fmt < PIX_FMT_NB; pix_fmt++)
1097  if (av_pix_fmt_descriptors[pix_fmt].name &&
1098  !strcmp(av_pix_fmt_descriptors[pix_fmt].name, name))
1099  return pix_fmt;
1100 
1101  return PIX_FMT_NONE;
1102 }
1103 
1105 {
1106  return (unsigned)pix_fmt < PIX_FMT_NB ?
1107  av_pix_fmt_descriptors[pix_fmt].name : NULL;
1108 }
1109 
1110 #if HAVE_BIGENDIAN
1111 # define X_NE(be, le) be
1112 #else
1113 # define X_NE(be, le) le
1114 #endif
1115 
1117 {
1118  enum PixelFormat pix_fmt;
1119 
1120  if (!strcmp(name, "rgb32"))
1121  name = X_NE("argb", "bgra");
1122  else if (!strcmp(name, "bgr32"))
1123  name = X_NE("abgr", "rgba");
1124 
1125  pix_fmt = get_pix_fmt_internal(name);
1126  if (pix_fmt == PIX_FMT_NONE) {
1127  char name2[32];
1128 
1129  snprintf(name2, sizeof(name2), "%s%s", name, X_NE("be", "le"));
1130  pix_fmt = get_pix_fmt_internal(name2);
1131  }
1132  return pix_fmt;
1133 }
1134 
1136 {
1137  int c, bits = 0;
1138  int log2_pixels = pixdesc->log2_chroma_w + pixdesc->log2_chroma_h;
1139 
1140  for (c = 0; c < pixdesc->nb_components; c++) {
1141  int s = c == 1 || c == 2 ? 0 : log2_pixels;
1142  bits += (pixdesc->comp[c].depth_minus1 + 1) << s;
1143  }
1144 
1145  return bits >> log2_pixels;
1146 }
1147 
1148 char *av_get_pix_fmt_string (char *buf, int buf_size, enum PixelFormat pix_fmt)
1149 {
1150  /* print header */
1151  if (pix_fmt < 0) {
1152  snprintf (buf, buf_size, "name" " nb_components" " nb_bits");
1153  } else {
1154  const AVPixFmtDescriptor *pixdesc = &av_pix_fmt_descriptors[pix_fmt];
1155  snprintf(buf, buf_size, "%-11s %7d %10d", pixdesc->name,
1156  pixdesc->nb_components, av_get_bits_per_pixel(pixdesc));
1157  }
1158 
1159  return buf;
1160 }