summaryrefslogtreecommitdiff
path: root/libavcodec/libvorbis.c
diff options
context:
space:
mode:
authorJames Darnley <james.darnley@gmail.com>2010-06-27 09:25:05 +0000
committerMartin Storsjö <martin@martin.st>2010-06-27 09:25:05 +0000
commit9577838f2f5439a8dd50ec549d6e21cf88e71b02 (patch)
tree922943267c050cfd871fdd80e10ea1e128c808ab /libavcodec/libvorbis.c
parent9b1947c7f28045bc26459b821a5386a31a84e5a0 (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.c13
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 {