# HG changeset patch # User mstorsjo # Date 1277630705 0 # Node ID 032a8dc03cedcf6e06c3d684c21cf79b7f5eed15 # Parent 19374f2992bf742907439b7c5f4ee07f3d6f5a28 Fix libvorbis encoding with more than 2 channels Patch by James Darnley, james dot darnley at gmail diff -r 19374f2992bf -r 032a8dc03ced Makefile --- a/Makefile Sun Jun 27 02:52:43 2010 +0000 +++ b/Makefile Sun Jun 27 09:25:05 2010 +0000 @@ -540,7 +540,7 @@ libdirac_libschro.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o -OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbis.o +OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbis.o vorbis_data.o OBJS-$(CONFIG_LIBVPX_DECODER) += libvpxdec.o OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o diff -r 19374f2992bf -r 032a8dc03ced libvorbis.c --- a/libvorbis.c Sun Jun 27 02:52:43 2010 +0000 +++ b/libvorbis.c Sun Jun 27 09:25:05 2010 +0000 @@ -28,6 +28,7 @@ #include "avcodec.h" #include "bytestream.h" +#include "vorbis.h" #undef NDEBUG #include @@ -146,16 +147,14 @@ if(data) { int samples = OGGVORBIS_FRAME_SIZE; float **buffer ; + int c, channels = context->vi.channels; buffer = vorbis_analysis_buffer(&context->vd, samples) ; - if(context->vi.channels == 1) { + for (c = 0; c < channels; c++) { + int co = (channels > 8) ? c : + ff_vorbis_encoding_channel_layout_offsets[channels-1][c]; for(l = 0 ; l < samples ; l++) - buffer[0][l]=audio[l]/32768.f; - } else { - for(l = 0 ; l < samples ; l++){ - buffer[0][l]=audio[l*2]/32768.f; - buffer[1][l]=audio[l*2+1]/32768.f; - } + buffer[c][l]=audio[l*channels+co]/32768.f; } vorbis_analysis_wrote(&context->vd, samples) ; } else { diff -r 19374f2992bf -r 032a8dc03ced vorbis.h --- a/vorbis.h Sun Jun 27 02:52:43 2010 +0000 +++ b/vorbis.h Sun Jun 27 09:25:05 2010 +0000 @@ -26,6 +26,7 @@ extern const float ff_vorbis_floor1_inverse_db_table[256]; extern const float * const ff_vorbis_vwin[8]; extern const uint8_t ff_vorbis_channel_layout_offsets[8][8]; +extern const uint8_t ff_vorbis_encoding_channel_layout_offsets[8][8]; extern const int64_t ff_vorbis_channel_layouts[9]; typedef struct { diff -r 19374f2992bf -r 032a8dc03ced vorbis_data.c --- a/vorbis_data.c Sun Jun 27 02:52:43 2010 +0000 +++ b/vorbis_data.c Sun Jun 27 09:25:05 2010 +0000 @@ -32,6 +32,17 @@ { 0, 2, 1, 7, 5, 6, 3, 4}, }; +const uint8_t ff_vorbis_encoding_channel_layout_offsets[8][8] = { + { 0, }, + { 0, 1, }, + { 0, 2, 1, }, + { 0, 1, 2, 3, }, + { 0, 2, 1, 3, 4, }, + { 0, 2, 1, 4, 5, 3, }, + { 0, 2, 1, 5, 6, 4, 3, }, + { 0, 2, 1, 6, 7, 4, 5, 3 } +}; + const int64_t ff_vorbis_channel_layouts[9] = { CH_LAYOUT_MONO, CH_LAYOUT_STEREO,