diff options
author | James Darnley <james.darnley@gmail.com> | 2010-06-27 13:25:05 +0400 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2010-06-27 13:25:05 +0400 |
commit | 9577838f2f5439a8dd50ec549d6e21cf88e71b02 (patch) | |
tree | 922943267c050cfd871fdd80e10ea1e128c808ab /libavcodec/libvorbis.c | |
parent | 9b1947c7f28045bc26459b821a5386a31a84e5a0 (diff) |
Fix libvorbis encoding with more than 2 channels
Fixes issue 1325.
Patch by James Darnley, james dot darnley at gmail
Originally committed as revision 23818 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/libvorbis.c')
-rw-r--r-- | libavcodec/libvorbis.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/libavcodec/libvorbis.c b/libavcodec/libvorbis.c index 5926d98fbe..f6872b2001 100644 --- a/libavcodec/libvorbis.c +++ b/libavcodec/libvorbis.c @@ -28,6 +28,7 @@ #include "avcodec.h" #include "bytestream.h" +#include "vorbis.h" #undef NDEBUG #include <assert.h> @@ -146,16 +147,14 @@ static int oggvorbis_encode_frame(AVCodecContext *avccontext, 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 { |