1 /*****************************************************************************
2 * fourcc.c: fourcc helpers functions
3 *****************************************************************************
4 * Copyright © 2009-2011 Laurent Aimar
6 * Authors: Laurent Aimar <fenrir@videolan.org>
7 * Jean-Baptiste Kempf <jb@videolan.org>
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU Lesser General Public License as published by
11 * the Free Software Foundation; either version 2.1 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public License
20 * along with this program; if not, write to the Free Software Foundation,
21 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
31 #include <vlc_common.h>
32 #include <vlc_fourcc.h>
36 #include "fourcc_tables.h"
38 static int fourcc_cmp(const void *key
, const void *ent
)
40 return memcmp(key
, ent
, 4);
43 static vlc_fourcc_t
Lookup(vlc_fourcc_t fourcc
, const char **restrict dsc
,
44 const struct fourcc_mapping
*mapv
, size_t mapc
,
45 const struct fourcc_desc
*dscv
, size_t dscc
)
47 const struct fourcc_mapping
*mapping
;
48 const struct fourcc_desc
*desc
;
50 mapping
= bsearch(&fourcc
, mapv
, mapc
, sizeof (*mapv
), fourcc_cmp
);
55 desc
= bsearch(&fourcc
, dscv
, dscc
, sizeof (*dscv
), fourcc_cmp
);
59 return mapping
->fourcc
;
62 fourcc
= mapping
->fourcc
;
65 desc
= bsearch(&fourcc
, dscv
, dscc
, sizeof (*dscv
), fourcc_cmp
);
67 return 0; /* Unknown FourCC */
70 return fourcc
; /* Known FourCC (has a description) */
73 static vlc_fourcc_t
LookupVideo(vlc_fourcc_t fourcc
, const char **restrict dsc
)
75 return Lookup(fourcc
, dsc
, mapping_video
,
76 sizeof (mapping_video
) / sizeof (mapping_video
[0]),
77 desc_video
, sizeof (desc_video
) / sizeof (desc_video
[0]));
80 static vlc_fourcc_t
LookupAudio(vlc_fourcc_t fourcc
, const char **restrict dsc
)
82 return Lookup(fourcc
, dsc
, mapping_audio
,
83 sizeof (mapping_audio
) / sizeof (mapping_audio
[0]),
84 desc_audio
, sizeof (desc_audio
) / sizeof (desc_audio
[0]));
87 static vlc_fourcc_t
LookupSpu(vlc_fourcc_t fourcc
, const char **restrict dsc
)
89 return Lookup(fourcc
, dsc
, mapping_spu
,
90 sizeof (mapping_spu
) / sizeof (mapping_spu
[0]),
91 desc_spu
, sizeof (desc_spu
) / sizeof (desc_spu
[0]));
94 static vlc_fourcc_t
LookupCat(vlc_fourcc_t fourcc
, const char **restrict dsc
,
100 return LookupVideo(fourcc
, dsc
);
102 return LookupAudio(fourcc
, dsc
);
104 return LookupSpu(fourcc
, dsc
);
107 vlc_fourcc_t ret
= LookupVideo(fourcc
, dsc
);
109 ret
= LookupAudio(fourcc
, dsc
);
111 ret
= LookupSpu(fourcc
, dsc
);
115 vlc_fourcc_t
vlc_fourcc_GetCodec(int cat
, vlc_fourcc_t fourcc
)
117 vlc_fourcc_t codec
= LookupCat(fourcc
, NULL
, cat
);
118 return codec
? codec
: fourcc
;
121 vlc_fourcc_t
vlc_fourcc_GetCodecFromString( int i_cat
, const char *psz_fourcc
)
123 if( !psz_fourcc
|| strlen(psz_fourcc
) != 4 )
125 return vlc_fourcc_GetCodec( i_cat
,
126 VLC_FOURCC( psz_fourcc
[0], psz_fourcc
[1],
127 psz_fourcc
[2], psz_fourcc
[3] ) );
130 vlc_fourcc_t
vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc
, int i_bits
)
132 const int i_bytes
= ( i_bits
+ 7 ) / 8;
134 if( i_fourcc
== VLC_FOURCC( 'a', 'f', 'l', 't' ) )
139 return VLC_CODEC_FL32
;
141 return VLC_CODEC_FL64
;
146 else if( i_fourcc
== VLC_FOURCC( 'a', 'r', 'a', 'w' ) )
153 return VLC_CODEC_S16L
;
155 return VLC_CODEC_S24L
;
157 return VLC_CODEC_S32L
;
162 else if( i_fourcc
== VLC_FOURCC( 't', 'w', 'o', 's' ) )
169 return VLC_CODEC_S16B
;
171 return VLC_CODEC_S24B
;
173 return VLC_CODEC_S32B
;
178 else if( i_fourcc
== VLC_FOURCC( 's', 'o', 'w', 't' ) )
185 return VLC_CODEC_S16L
;
187 return VLC_CODEC_S24L
;
189 return VLC_CODEC_S32L
;
196 return vlc_fourcc_GetCodec( AUDIO_ES
, i_fourcc
);
200 const char *vlc_fourcc_GetDescription(int cat
, vlc_fourcc_t fourcc
)
204 return LookupCat(fourcc
, &ret
, cat
) ? ret
: "";
209 #define VLC_CODEC_YUV_PLANAR_410 \
210 VLC_CODEC_I410, VLC_CODEC_YV9
212 #define VLC_CODEC_YUV_PLANAR_420 \
213 VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
215 #define VLC_CODEC_YUV_SEMIPLANAR_420 \
216 VLC_CODEC_NV12, VLC_CODEC_NV21
218 #define VLC_CODEC_YUV_PLANAR_420_16 \
219 VLC_CODEC_I420_16L, VLC_CODEC_I420_16B, VLC_CODEC_I420_12L, VLC_CODEC_I420_12B, VLC_CODEC_I420_10L, VLC_CODEC_I420_10B, VLC_CODEC_I420_9L, VLC_CODEC_I420_9B
221 #define VLC_CODEC_YUV_SEMIPLANAR_420_16 \
224 #define VLC_CODEC_YUV_PLANAR_422 \
225 VLC_CODEC_I422, VLC_CODEC_J422
227 #define VLC_CODEC_YUV_SEMIPLANAR_422 \
228 VLC_CODEC_NV16, VLC_CODEC_NV61
230 #define VLC_CODEC_YUV_PLANAR_422_16 \
231 VLC_CODEC_I422_12L, VLC_CODEC_I422_12B, VLC_CODEC_I422_10L, VLC_CODEC_I422_10B, VLC_CODEC_I422_9L, VLC_CODEC_I422_9B
233 #define VLC_CODEC_YUV_PLANAR_440 \
234 VLC_CODEC_I440, VLC_CODEC_J440
236 #define VLC_CODEC_YUV_PLANAR_444 \
237 VLC_CODEC_I444, VLC_CODEC_J444
239 #define VLC_CODEC_YUV_SEMIPLANAR_444 \
240 VLC_CODEC_NV24, VLC_CODEC_NV42
242 #define VLC_CODEC_YUV_PLANAR_444_16 \
243 VLC_CODEC_I444_10L, VLC_CODEC_I444_10B, VLC_CODEC_I444_9L, VLC_CODEC_I444_9B, \
244 VLC_CODEC_I444_16L, VLC_CODEC_I444_16B, VLC_CODEC_I444_12L, VLC_CODEC_I444_12B
246 #define VLC_CODEC_YUV_PACKED \
247 VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
248 VLC_CODEC_UYVY, VLC_CODEC_VYUY
250 #define VLC_CODEC_FALLBACK_420 \
251 VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
252 VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
253 VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
255 static const vlc_fourcc_t p_I420_fallback
[] = {
256 VLC_CODEC_I420
, VLC_CODEC_YV12
, VLC_CODEC_J420
, VLC_CODEC_FALLBACK_420
, 0
258 static const vlc_fourcc_t p_J420_fallback
[] = {
259 VLC_CODEC_J420
, VLC_CODEC_I420
, VLC_CODEC_YV12
, VLC_CODEC_FALLBACK_420
, 0
261 static const vlc_fourcc_t p_YV12_fallback
[] = {
262 VLC_CODEC_YV12
, VLC_CODEC_I420
, VLC_CODEC_J420
, VLC_CODEC_FALLBACK_420
, 0
264 static const vlc_fourcc_t p_NV12_fallback
[] = {
265 VLC_CODEC_NV12
, VLC_CODEC_I420
, VLC_CODEC_J420
, VLC_CODEC_FALLBACK_420
, 0
268 #define VLC_CODEC_FALLBACK_420_16 \
269 VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420
271 static const vlc_fourcc_t p_I420_9L_fallback
[] = {
272 VLC_CODEC_I420_9L
, VLC_CODEC_I420_9B
, VLC_CODEC_FALLBACK_420_16
, 0
274 static const vlc_fourcc_t p_I420_9B_fallback
[] = {
275 VLC_CODEC_I420_9B
, VLC_CODEC_I420_9L
, VLC_CODEC_FALLBACK_420_16
, 0
277 static const vlc_fourcc_t p_I420_10L_fallback
[] = {
278 VLC_CODEC_I420_10L
, VLC_CODEC_I420_10B
, VLC_CODEC_FALLBACK_420_16
, 0
280 static const vlc_fourcc_t p_I420_10B_fallback
[] = {
281 VLC_CODEC_I420_10B
, VLC_CODEC_I420_10L
, VLC_CODEC_FALLBACK_420_16
, 0
283 static const vlc_fourcc_t p_I420_12L_fallback
[] = {
284 VLC_CODEC_I420_12L
, VLC_CODEC_I420_12B
, VLC_CODEC_FALLBACK_420_16
, 0
286 static const vlc_fourcc_t p_I420_12B_fallback
[] = {
287 VLC_CODEC_I420_12B
, VLC_CODEC_I420_12L
, VLC_CODEC_FALLBACK_420_16
, 0
289 static const vlc_fourcc_t p_I420_16L_fallback
[] = {
290 VLC_CODEC_I420_16L
, VLC_CODEC_I420_16B
, VLC_CODEC_FALLBACK_420_16
, 0
292 static const vlc_fourcc_t p_I420_16B_fallback
[] = {
293 VLC_CODEC_I420_16B
, VLC_CODEC_I420_16L
, VLC_CODEC_FALLBACK_420_16
, 0
295 static const vlc_fourcc_t p_P010_fallback
[] = {
296 VLC_CODEC_P010
, VLC_CODEC_FALLBACK_420_16
, 0
300 #define VLC_CODEC_FALLBACK_422 \
301 VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
302 VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
303 VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
305 static const vlc_fourcc_t p_I422_fallback
[] = {
306 VLC_CODEC_I422
, VLC_CODEC_J422
, VLC_CODEC_FALLBACK_422
, 0
308 static const vlc_fourcc_t p_J422_fallback
[] = {
309 VLC_CODEC_J422
, VLC_CODEC_I422
, VLC_CODEC_FALLBACK_422
, 0
312 #define VLC_CODEC_FALLBACK_422_16 \
313 VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422
315 static const vlc_fourcc_t p_I422_9L_fallback
[] = {
316 VLC_CODEC_I422_9L
, VLC_CODEC_I422_9B
, VLC_CODEC_FALLBACK_422_16
, 0
318 static const vlc_fourcc_t p_I422_9B_fallback
[] = {
319 VLC_CODEC_I422_9B
, VLC_CODEC_I422_9L
, VLC_CODEC_FALLBACK_422_16
, 0
321 static const vlc_fourcc_t p_I422_10L_fallback
[] = {
322 VLC_CODEC_I422_10L
, VLC_CODEC_I422_10B
, VLC_CODEC_FALLBACK_422_16
, 0
324 static const vlc_fourcc_t p_I422_10B_fallback
[] = {
325 VLC_CODEC_I422_10B
, VLC_CODEC_I422_10L
, VLC_CODEC_FALLBACK_422_16
, 0
327 static const vlc_fourcc_t p_I422_12L_fallback
[] = {
328 VLC_CODEC_I422_12L
, VLC_CODEC_I422_12B
, VLC_CODEC_FALLBACK_422_16
, 0
330 static const vlc_fourcc_t p_I422_12B_fallback
[] = {
331 VLC_CODEC_I422_12B
, VLC_CODEC_I422_12L
, VLC_CODEC_FALLBACK_422_16
, 0
334 #define VLC_CODEC_FALLBACK_444 \
335 VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
336 VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
337 VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
339 static const vlc_fourcc_t p_I444_fallback
[] = {
340 VLC_CODEC_I444
, VLC_CODEC_J444
, VLC_CODEC_FALLBACK_444
, 0
342 static const vlc_fourcc_t p_J444_fallback
[] = {
343 VLC_CODEC_J444
, VLC_CODEC_I444
, VLC_CODEC_FALLBACK_444
, 0
346 #define VLC_CODEC_FALLBACK_444_16 \
347 VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444
349 static const vlc_fourcc_t p_I444_9L_fallback
[] = {
350 VLC_CODEC_I444_9L
, VLC_CODEC_I444_9B
, VLC_CODEC_FALLBACK_444_16
, 0
352 static const vlc_fourcc_t p_I444_9B_fallback
[] = {
353 VLC_CODEC_I444_9B
, VLC_CODEC_I444_9L
, VLC_CODEC_FALLBACK_444_16
, 0
355 static const vlc_fourcc_t p_I444_10L_fallback
[] = {
356 VLC_CODEC_I444_10L
, VLC_CODEC_I444_10B
, VLC_CODEC_FALLBACK_444_16
, 0
358 static const vlc_fourcc_t p_I444_10B_fallback
[] = {
359 VLC_CODEC_I444_10B
, VLC_CODEC_I444_10L
, VLC_CODEC_FALLBACK_444_16
, 0
361 static const vlc_fourcc_t p_I444_12L_fallback
[] = {
362 VLC_CODEC_I444_12L
, VLC_CODEC_I444_12B
, VLC_CODEC_FALLBACK_444_16
, 0
364 static const vlc_fourcc_t p_I444_12B_fallback
[] = {
365 VLC_CODEC_I444_12B
, VLC_CODEC_I444_12L
, VLC_CODEC_FALLBACK_444_16
, 0
367 static const vlc_fourcc_t p_I444_16L_fallback
[] = {
368 VLC_CODEC_I444_16L
, VLC_CODEC_I444_16B
, VLC_CODEC_FALLBACK_444_16
, 0
370 static const vlc_fourcc_t p_I444_16B_fallback
[] = {
371 VLC_CODEC_I444_16B
, VLC_CODEC_I444_16L
, VLC_CODEC_FALLBACK_444_16
, 0
375 /* Fallbacks for cvpx */
376 static const vlc_fourcc_t p_CVPX_VIDEO_NV12_fallback
[] = {
377 VLC_CODEC_CVPX_NV12
, VLC_CODEC_I420
, 0,
379 static const vlc_fourcc_t p_CVPX_VIDEO_UYVY_fallback
[] = {
380 VLC_CODEC_CVPX_UYVY
, VLC_CODEC_I420
, 0,
382 static const vlc_fourcc_t p_CVPX_VIDEO_I420_fallback
[] = {
383 VLC_CODEC_CVPX_I420
, VLC_CODEC_I420
, 0,
385 static const vlc_fourcc_t p_CVPX_VIDEO_BGRA_fallback
[] = {
386 VLC_CODEC_CVPX_BGRA
, VLC_CODEC_BGRA
, 0,
389 static const vlc_fourcc_t p_VAAPI_420_fallback
[] = {
390 VLC_CODEC_VAAPI_420
, VLC_CODEC_I420
, 0,
393 static const vlc_fourcc_t p_VAAPI_420_10BPP_fallback
[] = {
394 VLC_CODEC_VAAPI_420_10BPP
, VLC_CODEC_I420_10B
, VLC_CODEC_P010
, 0,
397 static const vlc_fourcc_t p_D3D9_OPAQUE_fallback
[] = {
398 VLC_CODEC_D3D9_OPAQUE
, VLC_CODEC_I420
, 0,
401 static const vlc_fourcc_t p_D3D11_OPAQUE_fallback
[] = {
402 VLC_CODEC_D3D11_OPAQUE
, VLC_CODEC_NV12
, 0,
405 static const vlc_fourcc_t p_D3D11_OPAQUE_10B_fallback
[] = {
406 VLC_CODEC_D3D11_OPAQUE_10B
, VLC_CODEC_P010
, 0,
409 static const vlc_fourcc_t p_I440_fallback
[] = {
411 VLC_CODEC_YUV_PLANAR_420
,
412 VLC_CODEC_YUV_PLANAR_422
,
413 VLC_CODEC_YUV_PLANAR_444
,
414 VLC_CODEC_YUV_PACKED
,
415 VLC_CODEC_I411
, VLC_CODEC_YUV_PLANAR_410
, VLC_CODEC_Y211
, 0
418 #define VLC_CODEC_FALLBACK_PACKED \
419 VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
420 VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
421 VLC_CODEC_I411, VLC_CODEC_YUV_PLANAR_410, VLC_CODEC_Y211
423 static const vlc_fourcc_t p_YUYV_fallback
[] = {
428 VLC_CODEC_FALLBACK_PACKED
, 0
430 static const vlc_fourcc_t p_YVYU_fallback
[] = {
435 VLC_CODEC_FALLBACK_PACKED
, 0
437 static const vlc_fourcc_t p_UYVY_fallback
[] = {
442 VLC_CODEC_FALLBACK_PACKED
, 0
444 static const vlc_fourcc_t p_VYUY_fallback
[] = {
449 VLC_CODEC_FALLBACK_PACKED
, 0
452 static const vlc_fourcc_t
*pp_YUV_fallback
[] = {
489 p_CVPX_VIDEO_NV12_fallback
,
490 p_CVPX_VIDEO_UYVY_fallback
,
491 p_CVPX_VIDEO_I420_fallback
,
492 p_VAAPI_420_fallback
,
493 p_VAAPI_420_10BPP_fallback
,
494 p_D3D9_OPAQUE_fallback
,
495 p_D3D11_OPAQUE_fallback
,
496 p_D3D11_OPAQUE_10B_fallback
,
500 static const vlc_fourcc_t p_list_YUV
[] = {
501 VLC_CODEC_YUV_PLANAR_420
,
502 VLC_CODEC_YUV_SEMIPLANAR_420
,
503 VLC_CODEC_YUV_PLANAR_422
,
504 VLC_CODEC_YUV_SEMIPLANAR_422
,
505 VLC_CODEC_YUV_PLANAR_440
,
506 VLC_CODEC_YUV_PLANAR_444
,
507 VLC_CODEC_YUV_SEMIPLANAR_444
,
508 VLC_CODEC_YUV_PACKED
,
509 VLC_CODEC_I411
, VLC_CODEC_YUV_PLANAR_410
, VLC_CODEC_Y211
,
510 VLC_CODEC_YUV_PLANAR_420_16
,
511 VLC_CODEC_YUV_SEMIPLANAR_420_16
,
512 VLC_CODEC_YUV_PLANAR_422_16
,
513 VLC_CODEC_YUV_PLANAR_444_16
,
514 VLC_CODEC_VDPAU_VIDEO_420
,
515 VLC_CODEC_VDPAU_VIDEO_422
,
516 VLC_CODEC_VDPAU_VIDEO_444
,
521 VLC_CODEC_VAAPI_420_10BPP
,
522 VLC_CODEC_D3D9_OPAQUE
,
523 VLC_CODEC_D3D9_OPAQUE_10B
,
524 VLC_CODEC_D3D11_OPAQUE
,
525 VLC_CODEC_D3D11_OPAQUE_10B
,
530 static const vlc_fourcc_t p_RGB32_fallback
[] = {
538 static const vlc_fourcc_t p_RGB24_fallback
[] = {
546 static const vlc_fourcc_t p_RGB16_fallback
[] = {
554 static const vlc_fourcc_t p_RGB15_fallback
[] = {
562 static const vlc_fourcc_t p_RGB8_fallback
[] = {
570 static const vlc_fourcc_t
*pp_RGB_fallback
[] = {
576 p_CVPX_VIDEO_BGRA_fallback
,
583 static const vlc_fourcc_t
*GetFallback( vlc_fourcc_t i_fourcc
,
584 const vlc_fourcc_t
*pp_fallback
[],
585 const vlc_fourcc_t p_list
[] )
587 for( unsigned i
= 0; pp_fallback
[i
]; i
++ )
589 if( pp_fallback
[i
][0] == i_fourcc
)
590 return pp_fallback
[i
];
595 const vlc_fourcc_t
*vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc
)
597 return GetFallback( i_fourcc
, pp_YUV_fallback
, p_list_YUV
);
599 const vlc_fourcc_t
*vlc_fourcc_GetRGBFallback( vlc_fourcc_t i_fourcc
)
601 return GetFallback( i_fourcc
, pp_RGB_fallback
, p_RGB32_fallback
);
604 bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a
, vlc_fourcc_t b
)
606 static const vlc_fourcc_t pp_swapped
[][4] = {
607 { VLC_CODEC_YV12
, VLC_CODEC_I420
, VLC_CODEC_J420
, 0 },
608 { VLC_CODEC_YV9
, VLC_CODEC_I410
, 0 },
612 for( int i
= 0; pp_swapped
[i
][0]; i
++ )
614 if( pp_swapped
[i
][0] == b
)
620 if( pp_swapped
[i
][0] != a
)
622 for( int j
= 1; pp_swapped
[i
][j
]; j
++ )
624 if( pp_swapped
[i
][j
] == b
)
631 bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc
)
633 for( unsigned i
= 0; p_list_YUV
[i
]; i
++ )
635 if( p_list_YUV
[i
] == fcc
)
641 #define PLANAR(n, w_den, h_den, size, bits) \
642 { .plane_count = n, \
643 .p = { {.w = {1, 1}, .h = {1, 1}}, \
644 {.w = {1,w_den}, .h = {1,h_den}}, \
645 {.w = {1,w_den}, .h = {1,h_den}}, \
646 {.w = {1, 1}, .h = {1, 1}} }, \
647 .pixel_size = size, \
650 #define PLANAR_8(n, w_den, h_den) PLANAR(n, w_den, h_den, 1, 8)
651 #define PLANAR_16(n, w_den, h_den, bits) PLANAR(n, w_den, h_den, 2, bits)
653 #define PACKED_FMT(size, bits) \
654 { .plane_count = 1, \
655 .p = { {.w = {1,1}, .h = {1,1}} }, \
656 .pixel_size = size, \
659 /* Zero planes for hardware picture handles. Cannot be manipulated directly. */
661 { .plane_count = 0, \
662 .p = { {.w = {1,1}, .h = {1,1}} }, \
668 vlc_fourcc_t p_fourcc
[4];
669 vlc_chroma_description_t description
;
670 } p_list_chroma_description
[] = {
671 { { VLC_CODEC_I411
}, PLANAR_8(3, 4, 1) },
672 { { VLC_CODEC_YUV_PLANAR_410
}, PLANAR_8(3, 4, 4) },
673 { { VLC_CODEC_YUV_PLANAR_420
}, PLANAR_8(3, 2, 2) },
674 { { VLC_CODEC_NV12
, VLC_CODEC_NV21
}, PLANAR_8(2, 1, 2) },
675 { { VLC_CODEC_YUV_PLANAR_422
}, PLANAR_8(3, 2, 1) },
676 { { VLC_CODEC_NV16
, VLC_CODEC_NV61
}, PLANAR_8(2, 1, 1) },
677 { { VLC_CODEC_YUV_PLANAR_440
}, PLANAR_8(3, 1, 2) },
678 { { VLC_CODEC_YUV_PLANAR_444
}, PLANAR_8(3, 1, 1) },
679 { { VLC_CODEC_YUVA
}, PLANAR_8(4, 1, 1) },
680 { { VLC_CODEC_YUV420A
}, PLANAR_8(4, 2, 2) },
681 { { VLC_CODEC_YUV422A
}, PLANAR_8(4, 2, 1) },
683 { { VLC_CODEC_GBR_PLANAR
}, PLANAR_8(3, 1, 1) },
684 { { VLC_CODEC_GBR_PLANAR_9L
,
685 VLC_CODEC_GBR_PLANAR_9B
}, PLANAR_16(3, 1, 1, 9) },
686 { { VLC_CODEC_GBR_PLANAR_10L
,
687 VLC_CODEC_GBR_PLANAR_10B
}, PLANAR_16(3, 1, 1, 10) },
689 { { VLC_CODEC_I420_16L
,
690 VLC_CODEC_I420_16B
}, PLANAR_16(3, 2, 2, 16) },
691 { { VLC_CODEC_I420_12L
,
692 VLC_CODEC_I420_12B
}, PLANAR_16(3, 2, 2, 12) },
693 { { VLC_CODEC_I420_10L
,
694 VLC_CODEC_I420_10B
}, PLANAR_16(3, 2, 2, 10) },
695 { { VLC_CODEC_I420_9L
,
696 VLC_CODEC_I420_9B
}, PLANAR_16(3, 2, 2, 9) },
697 { { VLC_CODEC_I422_12L
,
698 VLC_CODEC_I422_12B
}, PLANAR_16(3, 2, 1, 12) },
699 { { VLC_CODEC_I422_10L
,
700 VLC_CODEC_I422_10B
}, PLANAR_16(3, 2, 1, 10) },
701 { { VLC_CODEC_I422_9L
,
702 VLC_CODEC_I422_9B
}, PLANAR_16(3, 2, 1, 9) },
703 { { VLC_CODEC_I444_12L
,
704 VLC_CODEC_I444_12B
}, PLANAR_16(3, 1, 1, 12) },
705 { { VLC_CODEC_I444_10L
,
706 VLC_CODEC_I444_10B
}, PLANAR_16(3, 1, 1, 10) },
707 { { VLC_CODEC_I444_9L
,
708 VLC_CODEC_I444_9B
}, PLANAR_16(3, 1, 1, 9) },
709 { { VLC_CODEC_I444_16L
,
710 VLC_CODEC_I444_16B
}, PLANAR_16(3, 1, 1, 16) },
711 { { VLC_CODEC_YUVA_444_10L
,
712 VLC_CODEC_YUVA_444_10B
}, PLANAR_16(4, 1, 1, 10) },
713 { { VLC_CODEC_P010
}, PLANAR_16(2, 1, 2, 10) },
715 { { VLC_CODEC_YUV_PACKED
}, PACKED_FMT(2, 16) },
716 { { VLC_CODEC_RGB8
, VLC_CODEC_GREY
,
717 VLC_CODEC_YUVP
, VLC_CODEC_RGBP
}, PACKED_FMT(1, 8) },
719 { { VLC_CODEC_RGB15
, 0 }, PACKED_FMT(2, 15) },
720 { { VLC_CODEC_RGB12
, 0 }, PACKED_FMT(2, 12) },
721 { { VLC_CODEC_RGB16
, 0 }, PACKED_FMT(2, 16) },
722 { { VLC_CODEC_RGB24
, 0 }, PACKED_FMT(3, 24) },
723 { { VLC_CODEC_RGB32
, 0 }, PACKED_FMT(4, 24) },
724 { { VLC_CODEC_RGBA
, VLC_CODEC_ARGB
,
725 VLC_CODEC_BGRA
, }, PACKED_FMT(4, 32) },
727 { { VLC_CODEC_Y211
, 0 }, { 1, { {{1,4}, {1,1}} }, 4, 32 } },
728 { { VLC_CODEC_XYZ12
, 0 }, PACKED_FMT(6, 48) },
730 { { VLC_CODEC_VDPAU_VIDEO_420
, VLC_CODEC_VDPAU_VIDEO_422
,
731 VLC_CODEC_VDPAU_VIDEO_444
, VLC_CODEC_VDPAU_OUTPUT
},
733 { { VLC_CODEC_ANDROID_OPAQUE
, VLC_CODEC_MMAL_OPAQUE
,
734 VLC_CODEC_D3D9_OPAQUE
, VLC_CODEC_D3D11_OPAQUE
},
736 { { VLC_CODEC_D3D11_OPAQUE_10B
, VLC_CODEC_D3D9_OPAQUE_10B
},
739 { { VLC_CODEC_CVPX_NV12
, VLC_CODEC_CVPX_UYVY
,
740 VLC_CODEC_CVPX_I420
, VLC_CODEC_CVPX_BGRA
},
743 { { VLC_CODEC_VAAPI_420
, VLC_CODEC_VAAPI_420_10BPP
},
746 { { 0 }, FAKE_FMT() }
754 const vlc_chroma_description_t
*vlc_fourcc_GetChromaDescription( vlc_fourcc_t i_fourcc
)
756 for( unsigned i
= 0; p_list_chroma_description
[i
].p_fourcc
[0]; i
++ )
758 const vlc_fourcc_t
*p_fourcc
= p_list_chroma_description
[i
].p_fourcc
;
759 for( unsigned j
= 0; j
< 4 && p_fourcc
[j
] != 0; j
++ )
761 if( p_fourcc
[j
] == i_fourcc
)
762 return &p_list_chroma_description
[i
].description
;