Revise check for codec id in voc demuxer.
authorJustin Ruggles <justin.ruggles@gmail.com>
Tue, 18 Jan 2011 17:25:44 +0000 (12:25 -0500)
committerJustin Ruggles <justin.ruggles@gmail.com>
Tue, 18 Jan 2011 18:07:17 +0000 (13:07 -0500)
This fixes demuxing of packets that do not contain a codec tag and come before the codec_id has been set.

libavformat/vocdec.c

index 7cc37f0..59c84b7 100644 (file)
@@ -68,7 +68,7 @@ voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
     AVCodecContext *dec = st->codec;
     ByteIOContext *pb = s->pb;
     VocType type;
-    int size, tmp_codec;
+    int size, tmp_codec=-1;
     int sample_rate = 0;
     int channels = 1;
 
@@ -90,11 +90,7 @@ voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
             if (sample_rate)
                 dec->sample_rate = sample_rate;
             dec->channels = channels;
-            tmp_codec = ff_codec_get_id(ff_voc_codec_tags, get_byte(pb));
-            if (dec->codec_id == CODEC_ID_NONE)
-                dec->codec_id = tmp_codec;
-            else if (dec->codec_id != tmp_codec)
-                av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
+            tmp_codec = get_byte(pb);
             dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id);
             voc->remaining_size -= 2;
             max_size -= 2;
@@ -117,11 +113,7 @@ voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
             dec->sample_rate = get_le32(pb);
             dec->bits_per_coded_sample = get_byte(pb);
             dec->channels = get_byte(pb);
-            tmp_codec = ff_codec_get_id(ff_voc_codec_tags, get_le16(pb));
-            if (dec->codec_id == CODEC_ID_NONE)
-                dec->codec_id = tmp_codec;
-            else if (dec->codec_id != tmp_codec)
-                av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
+            tmp_codec = get_le16(pb);
             url_fskip(pb, 4);
             voc->remaining_size -= 12;
             max_size -= 12;
@@ -133,9 +125,20 @@ voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
             voc->remaining_size = 0;
             break;
         }
+    }
+
+    if (tmp_codec >= 0) {
+        tmp_codec = ff_codec_get_id(ff_voc_codec_tags, tmp_codec);
+        if (dec->codec_id == CODEC_ID_NONE)
+            dec->codec_id = tmp_codec;
+        else if (dec->codec_id != tmp_codec)
+            av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
         if (dec->codec_id == CODEC_ID_NONE) {
-            av_log(s, AV_LOG_ERROR, "Invalid codec_id\n");
-            if (s->audio_codec_id == CODEC_ID_NONE) return AVERROR(EINVAL);
+            if (s->audio_codec_id == CODEC_ID_NONE) {
+                av_log(s, AV_LOG_ERROR, "unknown codec tag\n");
+                return AVERROR(EINVAL);
+            }
+            av_log(s, AV_LOG_WARNING, "unknown codec tag\n");
         }
     }