vocdec: Don't update codec parameters mid-stream

If we really want to support parameter changes, they need to be
signalled along with the AVPackets as parameter change side data,
not just changing the AVCodecContext parameters when a packet
is demuxed (since there may be other earlier packets yet undecoded).

Something similar was already done for the sample rate in 0883109b2,
but some parameters were left changeable.

This avoids having to recheck the channel count for validity for
each decoded frame in (ad)pcm decoders, unless the decoders
explicitly say that they accept parameter changes.

Reported-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org
Signed-off-by: Martin Storsjö <martin@martin.st>
pull/36/head
Martin Storsjö 11 years ago
parent 0ef1660a63
commit 5bbfe193a0
  1. 10
      libavformat/vocdec.c

@ -91,11 +91,11 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
if (sample_rate) if (sample_rate)
dec->sample_rate = sample_rate; dec->sample_rate = sample_rate;
avpriv_set_pts_info(st, 64, 1, dec->sample_rate); avpriv_set_pts_info(st, 64, 1, dec->sample_rate);
dec->channels = channels;
dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id);
} else } else
avio_skip(pb, 1); avio_skip(pb, 1);
dec->channels = channels;
tmp_codec = avio_r8(pb); tmp_codec = avio_r8(pb);
dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id);
voc->remaining_size -= 2; voc->remaining_size -= 2;
max_size -= 2; max_size -= 2;
channels = 1; channels = 1;
@ -117,10 +117,10 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
if (!dec->sample_rate) { if (!dec->sample_rate) {
dec->sample_rate = avio_rl32(pb); dec->sample_rate = avio_rl32(pb);
avpriv_set_pts_info(st, 64, 1, dec->sample_rate); avpriv_set_pts_info(st, 64, 1, dec->sample_rate);
dec->bits_per_coded_sample = avio_r8(pb);
dec->channels = avio_r8(pb);
} else } else
avio_skip(pb, 4); avio_skip(pb, 6);
dec->bits_per_coded_sample = avio_r8(pb);
dec->channels = avio_r8(pb);
tmp_codec = avio_rl16(pb); tmp_codec = avio_rl16(pb);
avio_skip(pb, 4); avio_skip(pb, 4);
voc->remaining_size -= 12; voc->remaining_size -= 12;

Loading…
Cancel
Save