Commit 9577838f authored by James Darnley's avatar James Darnley Committed by Martin Storsjö

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
parent 9b1947c7
...@@ -540,7 +540,7 @@ OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER) += libschroedingerenc.o \ ...@@ -540,7 +540,7 @@ OBJS-$(CONFIG_LIBSCHROEDINGER_ENCODER) += libschroedingerenc.o \
libdirac_libschro.o libdirac_libschro.o
OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o
OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.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_DECODER) += libvpxdec.o
OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o OBJS-$(CONFIG_LIBVPX_ENCODER) += libvpxenc.o
OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "avcodec.h" #include "avcodec.h"
#include "bytestream.h" #include "bytestream.h"
#include "vorbis.h"
#undef NDEBUG #undef NDEBUG
#include <assert.h> #include <assert.h>
...@@ -146,16 +147,14 @@ static int oggvorbis_encode_frame(AVCodecContext *avccontext, ...@@ -146,16 +147,14 @@ static int oggvorbis_encode_frame(AVCodecContext *avccontext,
if(data) { if(data) {
int samples = OGGVORBIS_FRAME_SIZE; int samples = OGGVORBIS_FRAME_SIZE;
float **buffer ; float **buffer ;
int c, channels = context->vi.channels;
buffer = vorbis_analysis_buffer(&context->vd, samples) ; 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++) for(l = 0 ; l < samples ; l++)
buffer[0][l]=audio[l]/32768.f; buffer[c][l]=audio[l*channels+co]/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;
}
} }
vorbis_analysis_wrote(&context->vd, samples) ; vorbis_analysis_wrote(&context->vd, samples) ;
} else { } else {
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
extern const float ff_vorbis_floor1_inverse_db_table[256]; extern const float ff_vorbis_floor1_inverse_db_table[256];
extern const float * const ff_vorbis_vwin[8]; 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_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]; extern const int64_t ff_vorbis_channel_layouts[9];
typedef struct { typedef struct {
......
...@@ -32,6 +32,17 @@ const uint8_t ff_vorbis_channel_layout_offsets[8][8] = { ...@@ -32,6 +32,17 @@ const uint8_t ff_vorbis_channel_layout_offsets[8][8] = {
{ 0, 2, 1, 7, 5, 6, 3, 4}, { 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] = { const int64_t ff_vorbis_channel_layouts[9] = {
CH_LAYOUT_MONO, CH_LAYOUT_MONO,
CH_LAYOUT_STEREO, CH_LAYOUT_STEREO,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment