changeset 23270:f094c9256137

Avoid code duplication in mkv demuxer for standard fourcc/extradata handling
author reimar
date Thu, 10 May 2007 13:58:57 +0000
parents 6606c4f5c78c
children 85ad4dd0e439
files libmpdemux/demux_mkv.c
diffstat 1 files changed, 23 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_mkv.c	Thu May 10 11:43:39 2007 +0000
+++ b/libmpdemux/demux_mkv.c	Thu May 10 13:58:57 2007 +0000
@@ -1798,6 +1798,22 @@
     }
 }
 
+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 @@
 #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))
+      else
         {
-          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))
+          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 (!strcmp(track->codec_id, MKV_V_MPEG4_AVC))
-        {
-          bih->biCompression = mmioFOURCC('a', 'v', 'c', '1');
-          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 (!vi->id) {
           mp_msg (MSGT_DEMUX,MSGL_WARN, MSGTR_MPDEMUX_MKV_UnknownCodecID,
                   track->codec_id, track->tnum);
           free(bih);
           return 1;
+          }
         }
     }