From f61cbc22d3ce8ec0e2644d0fa565413c057deaa0 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Tue, 18 Jan 2011 12:25:44 -0500 Subject: Revise check for codec id in voc demuxer. This fixes demuxing of packets that do not contain a codec tag and come before the codec_id has been set. --- libavformat/vocdec.c | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'libavformat/vocdec.c') diff --git a/libavformat/vocdec.c b/libavformat/vocdec.c index 7cc37f0323..59c84b7056 100644 --- a/libavformat/vocdec.c +++ b/libavformat/vocdec.c @@ -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"); } } -- cgit v1.2.3