changeset 25789:5cdba0d1c4cf

Allow overriding the codec_tag for audio codecs, and always override codec_tag for PCM codecs (codec_id from lavf is correct, but the codec_tag may be non-zero and wrong). Also fixes bugzilla #983
author rtogni
date Sun, 20 Jan 2008 12:57:53 +0000
parents 495cbb49fb1b
children 6aad76cd84d3
files libmpdemux/demux_lavf.c
diffstat 1 files changed, 13 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/demux_lavf.c	Sun Jan 20 09:59:55 2008 +0000
+++ b/libmpdemux/demux_lavf.c	Sun Jan 20 12:57:53 2008 +0000
@@ -92,9 +92,6 @@
     { CODEC_ID_MUSEPACK7,         MKTAG('M', 'P', 'C', ' ')},
     { CODEC_ID_MUSEPACK8,         MKTAG('M', 'P', 'C', '8')},
     { CODEC_ID_NELLYMOSER,        MKTAG('N', 'E', 'L', 'L')},    
-    { CODEC_ID_PCM_S24BE,         MKTAG('i', 'n', '2', '4')},
-    { CODEC_ID_PCM_S16BE,         MKTAG('t', 'w', 'o', 's')},
-    { CODEC_ID_PCM_S8,            MKTAG('t', 'w', 'o', 's')},
     { CODEC_ID_ROQ_DPCM,          MKTAG('R', 'o', 'Q', 'A')},
     { CODEC_ID_SHORTEN,           MKTAG('s', 'h', 'r', 'n')},
     { CODEC_ID_TTA,               MKTAG('T', 'T', 'A', '1')},
@@ -106,6 +103,17 @@
 
 const struct AVCodecTag *mp_wav_taglists[] = {codec_wav_tags, mp_wav_tags, 0};
 
+static const AVCodecTag mp_wav_override_tags[] = {
+    { CODEC_ID_PCM_S8,            MKTAG('t', 'w', 'o', 's')},
+    { CODEC_ID_PCM_U8,            0},
+    { CODEC_ID_PCM_S16BE,         MKTAG('t', 'w', 'o', 's')},
+    { CODEC_ID_PCM_S16LE,         0},
+    { CODEC_ID_PCM_S24BE,         MKTAG('i', 'n', '2', '4')},
+    { 0, 0 },
+};
+
+const struct AVCodecTag *mp_wav_override_taglists[] = {mp_wav_override_tags, 0};
+
 static const AVCodecTag mp_bmp_tags[] = {
     { CODEC_ID_AMV,               MKTAG('A', 'M', 'V', 'V')},
     { CODEC_ID_BETHSOFTVID,       MKTAG('B', 'E', 'T', 'H')},
@@ -271,6 +279,8 @@
                 break;
             priv->astreams[priv->audio_streams] = i;
             priv->audio_streams++;
+            // For some formats (like PCM) always trust CODEC_ID_* more than codec_tag
+            codec->codec_tag= av_codec_get_tag(mp_wav_override_taglists, codec->codec_id);
             // mp4a tag is used for all mp4 files no matter what they actually contain
             if(codec->codec_tag == MKTAG('m', 'p', '4', 'a'))
                 codec->codec_tag= 0;