Browse Source

vorbisdec: handle midstream parameter changes

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n1.2
Michael Niedermayer 12 years ago
parent
commit
e9ffee23f3
1 changed files with 39 additions and 0 deletions
  1. +39
    -0
      libavcodec/vorbisdec.c

+ 39
- 0
libavcodec/vorbisdec.c View File

@@ -1659,6 +1659,45 @@ static int vorbis_decode_frame(AVCodecContext *avccontext, void *data,

av_dlog(NULL, "packet length %d \n", buf_size);

if (*buf == 1 && buf_size > 7) {
init_get_bits(gb, buf+1, buf_size*8 - 8);
vorbis_free(vc);
if ((ret = vorbis_parse_id_hdr(vc))) {
av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n");
vorbis_free(vc);
return ret;
}

if (vc->audio_channels > 8)
avccontext->channel_layout = 0;
else
avccontext->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1];

avccontext->channels = vc->audio_channels;
avccontext->sample_rate = vc->audio_samplerate;
return buf_size;
}

if (*buf == 3 && buf_size > 7) {
av_log(avccontext, AV_LOG_DEBUG, "Ignoring comment header\n");
return buf_size;
}

if (*buf == 5 && buf_size > 7 && vc->channel_residues && !vc->modes) {
init_get_bits(gb, buf+1, buf_size*8 - 8);
if ((ret = vorbis_parse_setup_hdr(vc))) {
av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n");
vorbis_free(vc);
return ret;
}
return buf_size;
}

if (!vc->channel_residues || !vc->modes) {
av_log(avccontext, AV_LOG_ERROR, "Data packet before valid headers\n");
return AVERROR_INVALIDDATA;
}

/* get output buffer */
vc->frame.nb_samples = vc->blocksize[1] / 2;
if ((ret = ff_get_buffer(avccontext, &vc->frame)) < 0) {


Loading…
Cancel
Save