vocdec: Don't update codec parameters mid-stream

Message ID 1378975350-54031-1-git-send-email-martin@martin.st
State Committed
Commit 5bbfe193a0a41bd2adb648c8c3f6901a575734a2
Headers show

Commit Message

Martin Storsjö Sept. 12, 2013, 8:42 a.m.
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
---
 libavformat/vocdec.c |   10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

Comments

Kostya Shishkov Sept. 12, 2013, 8:45 a.m. | #1
On Thu, Sep 12, 2013 at 11:42:30AM +0300, Martin Storsjö wrote:
> 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
> ---
>  libavformat/vocdec.c |   10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)

looks reasonable - most of the old formats were not supposed to have
parameters changed anyway

Patch

diff --git a/libavformat/vocdec.c b/libavformat/vocdec.c
index 4e06513..2fb8440 100644
--- a/libavformat/vocdec.c
+++ b/libavformat/vocdec.c
@@ -91,11 +91,11 @@  ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
                 if (sample_rate)
                     dec->sample_rate = 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
                 avio_skip(pb, 1);
-            dec->channels = channels;
             tmp_codec = avio_r8(pb);
-            dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id);
             voc->remaining_size -= 2;
             max_size -= 2;
             channels = 1;
@@ -117,10 +117,10 @@  ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size)
             if (!dec->sample_rate) {
                 dec->sample_rate = avio_rl32(pb);
                 avpriv_set_pts_info(st, 64, 1, dec->sample_rate);
+                dec->bits_per_coded_sample = avio_r8(pb);
+                dec->channels = avio_r8(pb);
             } else
-                avio_skip(pb, 4);
-            dec->bits_per_coded_sample = avio_r8(pb);
-            dec->channels = avio_r8(pb);
+                avio_skip(pb, 6);
             tmp_codec = avio_rl16(pb);
             avio_skip(pb, 4);
             voc->remaining_size -= 12;