[FFmpeg-cvslog] r20148 - in trunk/libavcodec: vorbis.h vorbis_data.c vorbis_dec.c
superdump
subversion
Fri Oct 2 14:59:37 CEST 2009
Author: superdump
Date: Fri Oct 2 14:59:37 2009
New Revision: 20148
Log:
Add vorbis channel layout support according to those defined in the Vorbis I
specification
Modified:
trunk/libavcodec/vorbis.h
trunk/libavcodec/vorbis_data.c
trunk/libavcodec/vorbis_dec.c
Modified: trunk/libavcodec/vorbis.h
==============================================================================
--- trunk/libavcodec/vorbis.h Fri Oct 2 10:42:00 2009 (r20147)
+++ trunk/libavcodec/vorbis.h Fri Oct 2 14:59:37 2009 (r20148)
@@ -25,6 +25,8 @@
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[6][6];
+extern const int64_t ff_vorbis_channel_layouts[7];
typedef struct {
uint_fast16_t x;
Modified: trunk/libavcodec/vorbis_data.c
==============================================================================
--- trunk/libavcodec/vorbis_data.c Fri Oct 2 10:42:00 2009 (r20147)
+++ trunk/libavcodec/vorbis_data.c Fri Oct 2 14:59:37 2009 (r20148)
@@ -21,6 +21,25 @@
#include "dsputil.h"
#include "vorbis.h"
+const uint8_t ff_vorbis_channel_layout_offsets[6][6] = {
+ { 0, },
+ { 0, 1, },
+ { 0, 2, 1, },
+ { 0, 1, 2, 3, },
+ { 0, 2, 1, 3, 4, },
+ { 0, 2, 1, 5, 3, 4, }
+};
+
+const int64_t ff_vorbis_channel_layouts[7] = {
+ CH_LAYOUT_MONO,
+ CH_LAYOUT_STEREO,
+ CH_LAYOUT_SURROUND,
+ CH_LAYOUT_QUAD,
+ CH_LAYOUT_5POINT0_BACK,
+ CH_LAYOUT_5POINT1_BACK,
+ 0
+};
+
DECLARE_ALIGNED_16(static const float, vwin64[32]) = {
0.0009460463F, 0.0085006468F, 0.0235352254F, 0.0458950567F,
0.0753351908F, 0.1115073077F, 0.1539457973F, 0.2020557475F,
Modified: trunk/libavcodec/vorbis_dec.c
==============================================================================
--- trunk/libavcodec/vorbis_dec.c Fri Oct 2 10:42:00 2009 (r20147)
+++ trunk/libavcodec/vorbis_dec.c Fri Oct 2 14:59:37 2009 (r20148)
@@ -1012,6 +1012,11 @@ static av_cold int vorbis_decode_init(AV
return -1;
}
+ if (vc->audio_channels > 6)
+ avccontext->channel_layout = 0;
+ else
+ avccontext->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1];
+
avccontext->channels = vc->audio_channels;
avccontext->sample_rate = vc->audio_samplerate;
avccontext->frame_size = FFMIN(vc->blocksize[0], vc->blocksize[1]) >> 2;
@@ -1643,8 +1648,15 @@ static int vorbis_decode_frame(AVCodecCo
AV_DEBUG("parsed %d bytes %d bits, returned %d samples (*ch*bits) \n", get_bits_count(gb)/8, get_bits_count(gb)%8, len);
+ if (vc->audio_channels > 6) {
for (i = 0; i < vc->audio_channels; i++)
channel_ptrs[i] = vc->channel_floors + i * len;
+ } else {
+ for (i = 0; i < vc->audio_channels; i++)
+ channel_ptrs[i] = vc->channel_floors +
+ len * ff_vorbis_channel_layout_offsets[vc->audio_channels - 1][i];
+ }
+
vc->dsp.float_to_int16_interleave(data, channel_ptrs, len, vc->audio_channels);
*data_size = len * 2 * vc->audio_channels;
@@ -1672,5 +1684,6 @@ AVCodec vorbis_decoder = {
vorbis_decode_close,
vorbis_decode_frame,
.long_name = NULL_IF_CONFIG_SMALL("Vorbis"),
+ .channel_layouts = ff_vorbis_channel_layouts,
};
More information about the ffmpeg-cvslog
mailing list