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,
 };