Mercurial > libavcodec.hg
diff vorbis_dec.c @ 10347:93abbe76b5cc libavcodec
Add vorbis channel layout support according to those defined in the Vorbis I
specification
author | superdump |
---|---|
date | Fri, 02 Oct 2009 12:59:37 +0000 |
parents | 7bfcc66f807d |
children | 24a069f83049 |
line wrap: on
line diff
--- a/vorbis_dec.c Fri Oct 02 08:42:00 2009 +0000 +++ b/vorbis_dec.c Fri Oct 02 12:59:37 2009 +0000 @@ -1012,6 +1012,11 @@ return -1; } + if (vc->audio_channels > 6) + 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; avccontext->frame_size = FFMIN(vc->blocksize[0], vc->blocksize[1]) >> 2; @@ -1643,8 +1648,15 @@ AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len); + if (vc->audio_channels > 6) { for (i = 0; i < vc->audio_channels; i++) channel_ptrs[i] = vc->channel_floors + i * len; + } else { + for (i = 0; i < vc->audio_channels; i++) + channel_ptrs[i] = vc->channel_floors + + len * ff_vorbis_channel_layout_offsets[vc->audio_channels - 1][i]; + } + vc->dsp.float_to_int16_interleave(data, channel_ptrs, len, vc->audio_channels); *data_size = len * 2 * vc->audio_channels; @@ -1672,5 +1684,6 @@ vorbis_decode_close, vorbis_decode_frame, .long_name = NULL_IF_CONFIG_SMALL("Vorbis"), + .channel_layouts = ff_vorbis_channel_layouts, };