aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-01-18 12:25:44 -0500
committerJustin Ruggles <justin.ruggles@gmail.com>2011-01-18 13:07:17 -0500
commitf61cbc22d3ce8ec0e2644d0fa565413c057deaa0 (patch)
tree5d71346f65355b0aae3cc50ef16c2e4861d25a75
parent1ae02fe03ba4dbdb875a8b8a84abc6a242cd85ca (diff)
downloadffmpeg-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.c29
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");
}
}