diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-01-18 12:25:44 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-01-18 13:07:17 -0500 |
commit | f61cbc22d3ce8ec0e2644d0fa565413c057deaa0 (patch) | |
tree | 5d71346f65355b0aae3cc50ef16c2e4861d25a75 | |
parent | 1ae02fe03ba4dbdb875a8b8a84abc6a242cd85ca (diff) | |
download | ffmpeg-f61cbc22d3ce8ec0e2644d0fa565413c057deaa0.tar.gz |
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.
-rw-r--r-- | libavformat/vocdec.c | 29 |
1 files changed, 16 insertions, 13 deletions
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"); } } |