From 8073174ddb97fe8666d8e5bd2062fde22f7f3a6e Mon Sep 17 00:00:00 2001 From: reimar Date: Thu, 10 May 2007 13:58:57 +0000 Subject: Avoid code duplication in mkv demuxer for standard fourcc/extradata handling git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23288 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_mkv.c | 52 ++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 29 deletions(-) (limited to 'libmpdemux/demux_mkv.c') diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index 1e5c84f520..292f5b97b2 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -1798,6 +1798,22 @@ display_create_tracks (demuxer_t *demuxer) } } +typedef struct { + char *id; + int fourcc; + int extradata; +} videocodec_info_t; + +static const videocodec_info_t vinfo[] = { + { MKV_V_MPEG1, mmioFOURCC('m', 'p', 'g', '1'), 0 }, + { MKV_V_MPEG2, mmioFOURCC('m', 'p', 'g', '2'), 0 }, + { MKV_V_MPEG4_SP, mmioFOURCC('m', 'p', '4', 'v'), 1 }, + { MKV_V_MPEG4_ASP, mmioFOURCC('m', 'p', '4', 'v'), 1 }, + { MKV_V_MPEG4_AP, mmioFOURCC('m', 'p', '4', 'v'), 1 }, + { MKV_V_MPEG4_AVC, mmioFOURCC('a', 'v', 'c', '1'), 1 }, + { NULL, 0, 0 } +}; + static int demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid) { @@ -1902,46 +1918,24 @@ demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid) #endif /* USE_QTX_CODECS */ } - else if (!strcmp(track->codec_id, MKV_V_MPEG1)) - { - bih->biCompression = mmioFOURCC('m', 'p', 'g', '1'); - track->reorder_timecodes = !correct_pts; - } - else if (!strcmp(track->codec_id, MKV_V_MPEG2)) - { - bih->biCompression = mmioFOURCC('m', 'p', 'g', '2'); - track->reorder_timecodes = !correct_pts; - } - else if (!strcmp(track->codec_id, MKV_V_MPEG4_SP) || - !strcmp(track->codec_id, MKV_V_MPEG4_ASP) || - !strcmp(track->codec_id, MKV_V_MPEG4_AP)) - { - bih->biCompression = mmioFOURCC('m', 'p', '4', 'v'); - if (track->private_data && (track->private_size > 0)) - { - bih->biSize += track->private_size; - bih = realloc (bih, bih->biSize); - memcpy (bih + 1, track->private_data, track->private_size); - } - track->reorder_timecodes = !correct_pts; - } - else if (!strcmp(track->codec_id, MKV_V_MPEG4_AVC)) + else { - bih->biCompression = mmioFOURCC('a', 'v', 'c', '1'); - if (track->private_data && (track->private_size > 0)) + const videocodec_info_t *vi = vinfo; + while (vi->id && strcmp(vi->id, track->codec_id)) vi++; + bih->biCompression = vi->fourcc; + if (vi->extradata && track->private_data && (track->private_size > 0)) { bih->biSize += track->private_size; bih = realloc (bih, bih->biSize); memcpy (bih + 1, track->private_data, track->private_size); } track->reorder_timecodes = !correct_pts; - } - else - { + if (!vi->id) { mp_msg (MSGT_DEMUX,MSGL_WARN, MSGTR_MPDEMUX_MKV_UnknownCodecID, track->codec_id, track->tnum); free(bih); return 1; + } } } -- cgit v1.2.3