mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2025-01-31 01:04:39 +00:00
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
This commit is contained in:
parent
9b1947c7f2
commit
9577838f2f
@ -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 @@
|
|||||||
|
|
||||||
#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,
|
|||||||
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 @@
|
|||||||
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] = {
|
|||||||
{ 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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user