/*****************************************************************************
* fourcc.c: fourcc helpers functions
*****************************************************************************
- * Copyright (C) 2003-2004 the VideoLAN team
+ * Copyright (C) 2009 Laurent Aimar
* $Id$
*
* Authors: Laurent Aimar <fenrir@videolan.org>
/* */
static const entry_t p_list_video[] = {
- B(VLC_CODEC_MP1V, "MPEG-1 Video"),
+
+ B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
+ A("mpgv"),
A("mp1v"),
A("mpeg"),
A("mpg1"),
- E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
-
- B(VLC_CODEC_MP2V, "MPEG-2 Video"),
A("mp2v"),
A("MPEG"),
A("mpg2"),
+
+ E("PIM1", "Pinnacle DC1000 (MPEG-1 Video)"),
+
E("hdv1", "HDV 720p30 (MPEG-2 Video)"),
E("hdv2", "Sony HDV (MPEG-2 Video)"),
E("hdv3", "FCP HDV (MPEG-2 Video)"),
E("mx4p", "MPEG2 IMX PAL 625/50 40mb/s (FCP)"),
E("mx3n", "MPEG2 IMX NTSC 525/60 30mb/s (FCP)"),
E("mx3p", "MPEG2 IMX NTSC 625/50 30mb/s (FCP)"),
- E("xdv2", "XDCAM HD 1080i60"),
+
+ E("xdv1", "XDCAM HD"),
+ E("xdv2", "XDCAM HD 1080i60 35mb/s"),
+ E("xdv3", "XDCAM HD 1080i50 35mb/s"),
+ E("xdv4", "XDCAM HD"),
+ E("xdv5", "XDCAM HD"),
+ E("xdv6", "XDCAM HD 1080p24 35mb/s"),
+ E("xdv7", "XDCAM HD 1080p25 35mb/s"),
+ E("xdv8", "XDCAM HD 1080p30 35mb/s"),
+ E("xdv9", "XDCAM HD"),
+
+ E("xdva", "XDCAM"),
+ E("xdvb", "XDCAM"),
+ E("xdvc", "XDCAM"),
+ E("xdvd", "XDCAM"),
+ E("xdve", "XDCAM"),
+ E("xdvf", "XDCAM"),
+
+ E("xd5a", "XDCAM"),
+ E("xd5b", "XDCAM"),
+ E("xd5c", "XDCAM"),
+ E("xd5d", "XDCAM"),
+ E("xd5e", "XDCAM"),
+ E("xd5f", "XDCAM"),
+ E("xd59", "XDCAM"),
+
E("AVmp", "AVID IMX PAL"),
+ E("MMES", "Matrox MPEG-2"),
+ E("mmes", "Matrox MPEG-2"),
+ E("PIM2", "Pinnacle MPEG-2"),
+ E("LMP2", "Lead MPEG-2"),
- B(VLC_CODEC_MPGV, "MPEG-1/2 Video"),
- A("mpgv"),
+ E("VCR2", "ATI VCR-2"),
B(VLC_CODEC_MP4V, "MPEG-4 Video"),
A("mp4v"),
A("mp4s"),
A("M4S2"),
A("m4s2"),
- A("mp4v"),
A("MP4V"),
A("\x04\x00\x00\x00"),
A("m4cc"),
A("FMP4"),
A("fmp4"),
A("DCOD"),
- A("fmp4"),
A("MVXM"),
A("PM4V"),
- A("fmp4"),
A("M4T3"),
A("GEOX"),
A("DMK2"),
A("div5"),
A("DIV6"),
A("div6"),
+ E("divf", "DivX 4.12"),
+ E("DIVF", "DivX 4.12"),
/* Cool Codec */
A("COL1"),
A("col1"),
/* who knows? */
A("3VID"),
A("3vid"),
+ A("DVX3"),
/* Sorenson v1 */
B(VLC_CODEC_SVQ1, "SVQ-1 (Sorenson Video v1)"),
/* Flash (H263) variant */
B(VLC_CODEC_FLV1, "Flash Video"),
A("FLV1"),
+ A("flv "),
/* H261 */
B(VLC_CODEC_H261, "H.261"),
A("JFIF"),
A("JPGL"),
A("AVDJ"),
+ A("MMJP"),
+ A("QIVG"),
/* AVID MJPEG */
E("AVRn", "Avid Motion JPEG"),
+ E("AVDJ", "Avid Motion JPEG"),
E("ADJV", "Avid Motion JPEG"),
E("dmb1", "Motion JPEG OpenDML Video"),
+ E("ijpg", "Intergraph JPEG Video"),
E("IJPG", "Intergraph JPEG Video"),
E("ACDV", "ACD Systems Digital"),
+ E("SLMJ", "SL M-JPEG"),
B(VLC_CODEC_MJPGB, "Motion JPEG B Video"),
A("mjpb"),
/* DV */
B(VLC_CODEC_DV, "DV Video"),
A("dv "),
- A("dvsd"),
A("dvsl"),
A("DVSD"),
+ A("dvsd"),
+ A("DVCS"),
+ A("dvcs"),
A("dvhd"),
A("dvhp"),
A("dvhq"),
A("dvc "),
A("dv25"),
A("dvh1"),
+ A("dvs1"),
E("dvcp", "DV Video PAL"),
E("dvp ", "DV Video Pro"),
E("dvpp", "DV Video Pro PAL"),
+ E("dv50", "DV Video C Pro 50"),
E("dv5p", "DV Video C Pro 50 PAL"),
E("dv5n", "DV Video C Pro 50 NTSC"),
E("AVdv", "AVID DV"),
E("CDVC", "Canopus DV Video"),
E("cdvc", "Canopus DV Video"),
E("CDVH", "Canopus DV Video"),
+ E("cdvh", "Canopus DV Video"),
/* Windows Media Video */
B(VLC_CODEC_WMV1, "Windows Media Video 7"),
B(VLC_CODEC_VP3, "On2's VP3 Video"),
A("VP3 "),
A("VP30"),
+ A("vp30"),
A("VP31"),
A("vp31"),
B(VLC_CODEC_RPZA, "Apple Video"),
A("rpza"),
A("azpr"),
+ A("RPZA"),
+ A("AZPR"),
B(VLC_CODEC_SMC, "Apple graphics"),
A("smc "),
/* Duck TrueMotion */
B(VLC_CODEC_TRUEMOTION1, "Duck TrueMotion v1 Video"),
A("DUCK"),
+ A("PVEZ"),
B(VLC_CODEC_TRUEMOTION2, "Duck TrueMotion v2.0 Video"),
A("TM20"),
B(VLC_CODEC_VIXL, "Miro/Pinnacle VideoXL Video"),
A("VIXL"),
+ A("XIXL"),
E("PIXL", "Pinnacle VideoXL Video"),
B(VLC_CODEC_LOCO, "LOCO Video"),
B(VLC_CODEC_CAVS, "Chinese AVS"),
A("CAVS"),
A("AVs2"),
+ A("avs2"),
/* */
B(VLC_CODEC_DNXHD, "DNxHD"),
A("cyuv"),
A("CYUV"),
+ B(VLC_CODEC_V210, "10-bit 4:2:2 Component YCbCr"),
+ A("v210"),
+
/* Videogames Codecs */
/* Interplay MVE */
B(VLC_CODEC_ADPCM_G726, "G.726 ADPCM Audio"),
A("g726"),
+ /* G.726 ADPCM */
+ B(VLC_CODEC_ADPCM_SWF, "Flash ADPCM Audio"),
+ A("SWFa"),
+
+
/* AMR */
B(VLC_CODEC_AMR_NB, "AMR narrow band"),
A("samr"),
B(VLC_CODEC_MLP, "MLP/TrueHD Audio"),
A("mlp "),
+ B(VLC_CODEC_TRUEHD, "TrueHD Audio"),
+ A("trhd"),
+
B(VLC_CODEC_QCELP, "QCELP Audio"),
A("Qclp"),
B(VLC_CODEC_DVD_LPCM, "DVD LPCM Audio"),
A("lpcm"),
+ B(VLC_CODEC_DVDA_LPCM, "DVD-Audio LPCM Audio"),
+ A("apcm"),
+
B(VLC_CODEC_BD_LPCM, "BD LPCM Audio"),
A("bpcm"),
B(VLC_CODEC_TELETEXT, "Teletext"),
A("telx"),
- B(VLC_CODEC_TELETEXT, "Kate subtiles"),
+ B(VLC_CODEC_KATE, "Kate subtitles"),
A("kate"),
B(VLC_CODEC_CMML, "CMML annotations/metadata"),
return CreateFourcc( e.p_class );
}
+vlc_fourcc_t vlc_fourcc_GetCodecFromString( int i_cat, const char *psz_fourcc )
+{
+ if( !psz_fourcc || strlen(psz_fourcc) != 4 )
+ return 0;
+ return vlc_fourcc_GetCodec( i_cat,
+ VLC_FOURCC( psz_fourcc[0], psz_fourcc[1],
+ psz_fourcc[2], psz_fourcc[3] ) );
+}
+
+vlc_fourcc_t vlc_fourcc_GetCodecAudio( vlc_fourcc_t i_fourcc, int i_bits )
+{
+ const int i_bytes = ( i_bits + 7 ) / 8;
+
+ if( i_fourcc == VLC_FOURCC( 'a', 'f', 'l', 't' ) )
+ {
+ switch( i_bytes )
+ {
+ case 4:
+ return VLC_CODEC_FL32;
+ case 8:
+ return VLC_CODEC_FL64;
+ default:
+ return 0;
+ }
+ }
+ else if( i_fourcc == VLC_FOURCC( 'a', 'r', 'a', 'w' ) ||
+ i_fourcc == VLC_FOURCC( 'p', 'c', 'm', ' ' ) )
+ {
+ switch( i_bytes )
+ {
+ case 1:
+ return VLC_CODEC_U8;
+ case 2:
+ return VLC_CODEC_S16L;
+ case 3:
+ return VLC_CODEC_S24L;
+ break;
+ case 4:
+ return VLC_CODEC_S32L;
+ default:
+ return 0;
+ }
+ }
+ else if( i_fourcc == VLC_FOURCC( 't', 'w', 'o', 's' ) )
+ {
+ switch( i_bytes )
+ {
+ case 1:
+ return VLC_CODEC_S8;
+ case 2:
+ return VLC_CODEC_S16B;
+ case 3:
+ return VLC_CODEC_S24B;
+ case 4:
+ return VLC_CODEC_S32B;
+ default:
+ return 0;
+ }
+ }
+ else if( i_fourcc == VLC_FOURCC( 's', 'o', 'w', 't' ) )
+ {
+ switch( i_bytes )
+ {
+ case 1:
+ return VLC_CODEC_S8;
+ case 2:
+ return VLC_CODEC_S16L;
+ case 3:
+ return VLC_CODEC_S24L;
+ case 4:
+ return VLC_CODEC_S32L;
+ default:
+ return 0;
+ }
+ }
+ else
+ {
+ return vlc_fourcc_GetCodec( AUDIO_ES, i_fourcc );
+ }
+}
+
/* */
const char *vlc_fourcc_GetDescription( int i_cat, vlc_fourcc_t i_fourcc )
{
return e.psz_description;
}
+
+/* */
+#define VLC_CODEC_YUV_PLANAR_420 \
+ VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420
+
+#define VLC_CODEC_YUV_PLANAR_422 \
+ VLC_CODEC_I422, VLC_CODEC_J422
+
+#define VLC_CODEC_YUV_PLANAR_440 \
+ VLC_CODEC_I440, VLC_CODEC_J440
+
+#define VLC_CODEC_YUV_PLANAR_444 \
+ VLC_CODEC_I444, VLC_CODEC_J444
+
+#define VLC_CODEC_YUV_PACKED \
+ VLC_CODEC_YUYV, VLC_CODEC_YVYU, \
+ VLC_CODEC_UYVY, VLC_CODEC_VYUY
+
+#define VLC_CODEC_FALLBACK_420 \
+ VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
+ VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
+ VLC_CODEC_I411, VLC_CODEC_I410, VLC_CODEC_Y211
+
+static const vlc_fourcc_t p_I420_fallback[] = {
+ VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
+};
+static const vlc_fourcc_t p_J420_fallback[] = {
+ VLC_CODEC_J420, VLC_CODEC_I420, VLC_CODEC_YV12, VLC_CODEC_FALLBACK_420, 0
+};
+static const vlc_fourcc_t p_YV12_fallback[] = {
+ VLC_CODEC_YV12, VLC_CODEC_I420, VLC_CODEC_J420, VLC_CODEC_FALLBACK_420, 0
+};
+
+#define VLC_CODEC_FALLBACK_422 \
+ VLC_CODEC_YUV_PACKED, VLC_CODEC_YUV_PLANAR_420, \
+ VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
+ VLC_CODEC_I411, VLC_CODEC_I410, VLC_CODEC_Y211
+
+static const vlc_fourcc_t p_I422_fallback[] = {
+ VLC_CODEC_I422, VLC_CODEC_J422, VLC_CODEC_FALLBACK_422, 0
+};
+static const vlc_fourcc_t p_J422_fallback[] = {
+ VLC_CODEC_J422, VLC_CODEC_I422, VLC_CODEC_FALLBACK_422, 0
+};
+
+#define VLC_CODEC_FALLBACK_444 \
+ VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PACKED, \
+ VLC_CODEC_YUV_PLANAR_420, VLC_CODEC_YUV_PLANAR_440, \
+ VLC_CODEC_I411, VLC_CODEC_I410, VLC_CODEC_Y211
+
+static const vlc_fourcc_t p_I444_fallback[] = {
+ VLC_CODEC_I444, VLC_CODEC_J444, VLC_CODEC_FALLBACK_444, 0
+};
+static const vlc_fourcc_t p_J444_fallback[] = {
+ VLC_CODEC_J444, VLC_CODEC_I444, VLC_CODEC_FALLBACK_444, 0
+};
+
+static const vlc_fourcc_t p_I440_fallback[] = {
+ VLC_CODEC_I440,
+ VLC_CODEC_YUV_PLANAR_420,
+ VLC_CODEC_YUV_PLANAR_422,
+ VLC_CODEC_YUV_PLANAR_444,
+ VLC_CODEC_YUV_PACKED,
+ VLC_CODEC_I411, VLC_CODEC_I410, VLC_CODEC_Y211, 0
+};
+
+#define VLC_CODEC_FALLBACK_PACKED \
+ VLC_CODEC_YUV_PLANAR_422, VLC_CODEC_YUV_PLANAR_420, \
+ VLC_CODEC_YUV_PLANAR_444, VLC_CODEC_YUV_PLANAR_440, \
+ VLC_CODEC_I411, VLC_CODEC_I410, VLC_CODEC_Y211
+
+static const vlc_fourcc_t p_YUYV_fallback[] = {
+ VLC_CODEC_YUYV,
+ VLC_CODEC_YVYU,
+ VLC_CODEC_UYVY,
+ VLC_CODEC_VYUY,
+ VLC_CODEC_FALLBACK_PACKED, 0
+};
+static const vlc_fourcc_t p_YVYU_fallback[] = {
+ VLC_CODEC_YVYU,
+ VLC_CODEC_YUYV,
+ VLC_CODEC_UYVY,
+ VLC_CODEC_VYUY,
+ VLC_CODEC_FALLBACK_PACKED, 0
+};
+static const vlc_fourcc_t p_UYVY_fallback[] = {
+ VLC_CODEC_UYVY,
+ VLC_CODEC_VYUY,
+ VLC_CODEC_YUYV,
+ VLC_CODEC_YVYU,
+ VLC_CODEC_FALLBACK_PACKED, 0
+};
+static const vlc_fourcc_t p_VYUY_fallback[] = {
+ VLC_CODEC_VYUY,
+ VLC_CODEC_UYVY,
+ VLC_CODEC_YUYV,
+ VLC_CODEC_YVYU,
+ VLC_CODEC_FALLBACK_PACKED, 0
+};
+
+static const vlc_fourcc_t *pp_YUV_fallback[] = {
+ p_YV12_fallback,
+ p_I420_fallback,
+ p_J420_fallback,
+ p_I422_fallback,
+ p_J422_fallback,
+ p_I444_fallback,
+ p_J444_fallback,
+ p_I440_fallback,
+ p_YUYV_fallback,
+ p_YVYU_fallback,
+ p_UYVY_fallback,
+ p_VYUY_fallback,
+ NULL,
+};
+
+static const vlc_fourcc_t p_list_YUV[] = {
+ VLC_CODEC_YUV_PLANAR_420,
+ VLC_CODEC_YUV_PLANAR_422,
+ VLC_CODEC_YUV_PLANAR_440,
+ VLC_CODEC_YUV_PLANAR_444,
+ VLC_CODEC_YUV_PACKED,
+ VLC_CODEC_I411, VLC_CODEC_I410, VLC_CODEC_Y211,
+ 0,
+};
+
+const vlc_fourcc_t *vlc_fourcc_GetYUVFallback( vlc_fourcc_t i_fourcc )
+{
+ for( unsigned i = 0; pp_YUV_fallback[i]; i++ )
+ {
+ if( pp_YUV_fallback[i][0] == i_fourcc )
+ return pp_YUV_fallback[i];
+ }
+ return p_list_YUV;
+}
+
+bool vlc_fourcc_AreUVPlanesSwapped( vlc_fourcc_t a, vlc_fourcc_t b )
+{
+ return (((a == VLC_CODEC_I420 || a == VLC_CODEC_J420) && b == VLC_CODEC_YV12) ||
+ ((b == VLC_CODEC_I420 || b == VLC_CODEC_J420) && a == VLC_CODEC_YV12));
+}
+
+#if 0
+static inline bool vlc_fourcc_IsYUV(vlc_fourcc_t fcc)
+{
+ for( unsigned i = 0; p_list_YUV[i]; i++ )
+ {
+ if( p_list_YUV[i] == fcc )
+ return true;
+ }
+ return false;
+}
+#endif