From 70596d04a84f013eeadc2aa465a8a2be29afded5 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 22 Mar 2006 11:06:08 +0000 Subject: [PATCH] cleanup codec_id mapping (untested) Originally committed as revision 5195 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/matroska.c | 139 +++++++++++++++-------------------------- 1 file changed, 49 insertions(+), 90 deletions(-) diff --git a/libavformat/matroska.c b/libavformat/matroska.c index 2c92431e71..0e5bb005b4 100644 --- a/libavformat/matroska.c +++ b/libavformat/matroska.c @@ -182,32 +182,46 @@ typedef enum { * Matroska Codec IDs. Strings. */ +typedef struct CodecTags{ + char *str; + enum CodecID id; +}CodecTags; + #define MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC "V_MS/VFW/FOURCC" -#define MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED "V_UNCOMPRESSED" -#define MATROSKA_CODEC_ID_VIDEO_MPEG4_SP "V_MPEG4/ISO/SP" -#define MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP "V_MPEG4/ISO/ASP" -#define MATROSKA_CODEC_ID_VIDEO_MPEG4_AP "V_MPEG4/ISO/AP" -#define MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC "V_MPEG4/ISO/AVC" -#define MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3 "V_MPEG4/MS/V3" -#define MATROSKA_CODEC_ID_VIDEO_MPEG1 "V_MPEG1" -#define MATROSKA_CODEC_ID_VIDEO_MPEG2 "V_MPEG2" -#define MATROSKA_CODEC_ID_VIDEO_MJPEG "V_MJPEG" +#define MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM" + +CodecTags codec_tags[]={ +// {"V_MS/VFW/FOURCC" , CODEC_ID_NONE}, + {"V_UNCOMPRESSED" , CODEC_ID_RAWVIDEO}, + {"V_MPEG4/ISO/SP" , CODEC_ID_MPEG4}, + {"V_MPEG4/ISO/ASP" , CODEC_ID_MPEG4}, + {"V_MPEG4/ISO/AP" , CODEC_ID_MPEG4}, + {"V_MPEG4/ISO/AVC" , CODEC_ID_H264}, + {"V_MPEG4/MS/V3" , CODEC_ID_MSMPEG4V3}, + {"V_MPEG1" , CODEC_ID_MPEG1VIDEO}, + {"V_MPEG2" , CODEC_ID_MPEG2VIDEO}, + {"V_MJPEG" , CODEC_ID_MJPEG}, + {"V_REAL/RV10" , CODEC_ID_RV10}, + {"V_REAL/RV20" , CODEC_ID_RV20}, + {"V_REAL/RV30" , CODEC_ID_RV30}, + {"V_REAL/RV40" , CODEC_ID_RV40}, /* TODO: Real/Quicktime */ -#define MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM" -#define MATROSKA_CODEC_ID_AUDIO_MPEG1_L1 "A_MPEG/L1" -#define MATROSKA_CODEC_ID_AUDIO_MPEG1_L2 "A_MPEG/L2" -#define MATROSKA_CODEC_ID_AUDIO_MPEG1_L3 "A_MPEG/L3" -#define MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE "A_PCM/INT/BIG" -#define MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE "A_PCM/INT/LIT" -#define MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT "A_PCM/FLOAT/IEEE" -#define MATROSKA_CODEC_ID_AUDIO_AC3 "A_AC3" -#define MATROSKA_CODEC_ID_AUDIO_DTS "A_DTS" -#define MATROSKA_CODEC_ID_AUDIO_VORBIS "A_VORBIS" -#define MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM" -#define MATROSKA_CODEC_ID_AUDIO_MPEG2 "A_AAC/MPEG2/" -#define MATROSKA_CODEC_ID_AUDIO_MPEG4 "A_AAC/MPEG4/" +// {"A_MS/ACM" , CODEC_ID_NONE}, + {"A_MPEG/L1" , CODEC_ID_MP3}, + {"A_MPEG/L2" , CODEC_ID_MP3}, + {"A_MPEG/L3" , CODEC_ID_MP3}, + {"A_PCM/INT/BIG" , CODEC_ID_PCM_U16BE}, + {"A_PCM/INT/LIT" , CODEC_ID_PCM_U16LE}, +// {"A_PCM/FLOAT/IEEE" , CODEC_ID_NONE}, + {"A_AC3" , CODEC_ID_AC3}, + {"A_DTS" , CODEC_ID_DTS}, + {"A_VORBIS" , CODEC_ID_VORBIS}, + {"A_AAC/MPEG2/" , CODEC_ID_AAC}, + {"A_AAC/MPEG4/" , CODEC_ID_AAC}, + {NULL , CODEC_ID_NONE} /* TODO: AC3-9/10 (?), Real, Musepack, Quicktime */ +}; /* max. depth in the EBML tree structure */ #define EBML_MAX_DEPTH 16 @@ -2125,14 +2139,14 @@ matroska_read_header (AVFormatContext *s, /* Have we found a cluster? */ if (res == 1) { - int i; - enum CodecID codec_id; + int i, j; + enum CodecID codec_id= CODEC_ID_NONE; MatroskaTrack *track; AVStream *st; - void *extradata = NULL; - int extradata_size = 0; for (i = 0; i < matroska->num_tracks; i++) { + void *extradata = NULL; + int extradata_size = 0; track = matroska->tracks[i]; /* libavformat does not really support subtitles. @@ -2141,6 +2155,13 @@ matroska_read_header (AVFormatContext *s, (track->codec_id == NULL)) continue; + for(j=0; codec_tags[j].str; j++){ + if(!strcmp(codec_tags[j].str, track->codec_id)){ + codec_id= codec_tags[j].id; + break; + } + } + /* Set the FourCC from the CodecID. */ /* This is the MS compatibility mode which stores a * BITMAPINFOHEADER in the CodecPrivate. */ @@ -2156,27 +2177,7 @@ matroska_read_header (AVFormatContext *s, (p[2] << 16) | (p[1] << 8) | p[0]; codec_id = codec_get_bmp_id(((MatroskaVideoTrack *)track)->fourcc); - } else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MPEG4_SP) || - !strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP) || - !strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MPEG4_AP)) - codec_id = CODEC_ID_MPEG4; - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC)) - codec_id = CODEC_ID_H264; -/* else if (!strcmp(track->codec_id, */ -/* MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED)) */ -/* codec_id = CODEC_ID_???; */ - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3)) - codec_id = CODEC_ID_MSMPEG4V3; - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MPEG1) || - !strcmp(track->codec_id, - MATROSKA_CODEC_ID_VIDEO_MPEG2)) - codec_id = CODEC_ID_MPEG2VIDEO; + } /* This is the MS compatibility mode which stores a * WAVEFORMATEX in the CodecPrivate. */ @@ -2192,49 +2193,7 @@ matroska_read_header (AVFormatContext *s, tag = (p[1] << 8) | p[0]; codec_id = codec_get_wav_id(tag); - } else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_MPEG1_L1) || - !strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_MPEG1_L2) || - !strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_MPEG1_L3)) - codec_id = CODEC_ID_MP3; - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE)) - codec_id = CODEC_ID_PCM_U16BE; - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE)) - codec_id = CODEC_ID_PCM_U16LE; -/* else if (!strcmp(track->codec_id, */ -/* MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT)) */ -/* codec_id = CODEC_ID_PCM_???; */ - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_AC3)) - codec_id = CODEC_ID_AC3; - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_DTS)) - codec_id = CODEC_ID_DTS; - /* No such codec id so far. */ -/* else if (!strcmp(track->codec_id, */ -/* MATROSKA_CODEC_ID_AUDIO_DTS)) */ -/* codec_id = CODEC_ID_DTS; */ - else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_VORBIS)) { - extradata_size = track->codec_priv_size; - if(extradata_size) { - extradata = av_malloc(extradata_size); - if(extradata == NULL) - return AVERROR_NOMEM; - memcpy(extradata, track->codec_priv, extradata_size); - } - codec_id = CODEC_ID_VORBIS; - } else if (!strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_MPEG2) || - !strcmp(track->codec_id, - MATROSKA_CODEC_ID_AUDIO_MPEG4)) - codec_id = CODEC_ID_AAC; - else - codec_id = CODEC_ID_NONE; + } if (codec_id == CODEC_ID_NONE) { av_log(matroska->ctx, AV_LOG_INFO,