diff options
author | Sebastian Dröge <slomo@circular-chaos.org> | 2008-05-25 16:09:39 +0000 |
---|---|---|
committer | Sebastian Dröge <slomo@circular-chaos.org> | 2008-05-25 16:09:39 +0000 |
commit | 906f398df7be2972b0713026cb8e735382fc260c (patch) | |
tree | da606c8dab4e101d0319e020163ba47d8bd5895d /ext/flac/gstflacdec.c | |
parent | e7e9e21731a8b479d37e46b2e1b96c315b06c67e (diff) |
ext/flac/: Set the channel layout when decoding FLAC files with more than 2 channels as defined by the FLAC spec. Fix...
Original commit message from CVS:
* ext/flac/Makefile.am:
* ext/flac/gstflacdec.c: (gst_flac_dec_write):
Set the channel layout when decoding FLAC files with more than 2
channels as defined by the FLAC spec. Fixes bug #534570.
Also don't try to decode left/side, right/side and mid/side files
as we don't support this at all.
Diffstat (limited to 'ext/flac/gstflacdec.c')
-rw-r--r-- | ext/flac/gstflacdec.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c index fe78c774..d2205187 100644 --- a/ext/flac/gstflacdec.c +++ b/ext/flac/gstflacdec.c @@ -55,9 +55,51 @@ #include <gst/gst-i18n-plugin.h> #include <gst/gsttagsetter.h> #include <gst/base/gsttypefindhelper.h> - +#include <gst/audio/multichannel.h> #include <gst/tag/tag.h> +/* Taken from http://flac.sourceforge.net/format.html#frame_header */ +static const GstAudioChannelPosition channel_positions[8][8] = { + {GST_AUDIO_CHANNEL_POSITION_FRONT_MONO}, + {GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */ + { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, + GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, + GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT} +}; + GST_DEBUG_CATEGORY_STATIC (flacdec_debug); #define GST_CAT_DEFAULT flacdec_debug @@ -1043,6 +1085,13 @@ gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, goto done; } + /* TODO: we don't support left/side, right/side and mid/side */ + if (frame->header.channel_assignment != FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT) { + GST_ERROR_OBJECT (flacdec, "unsupported channel assignment: %s\n", + FLAC__ChannelAssignmentString[frame->header.channel_assignment]); + return GST_FLOW_ERROR; + } + if (!GST_PAD_CAPS (flacdec->srcpad)) { GstCaps *caps; @@ -1057,6 +1106,12 @@ gst_flac_dec_write (GstFlacDec * flacdec, const FLAC__Frame * frame, "rate", G_TYPE_INT, frame->header.sample_rate, "channels", G_TYPE_INT, channels, NULL); + if (channels > 2) { + GstStructure *s = gst_caps_get_structure (caps, 0); + + gst_audio_set_channel_positions (s, channel_positions[channels - 1]); + } + flacdec->depth = depth; flacdec->width = width; flacdec->channels = channels; |