From: <sl...@ke...> - 2008-05-25 16:09:49
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: slomo Date: Sun May 25 2008 16:09:54 UTC Log message: * 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. Modified files: . : ChangeLog ext/flac : Makefile.am gstflacdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3486&r2=1.3487 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ext/flac/Makefile.am.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ext/flac/gstflacdec.c.diff?r1=1.90&r2=1.91 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3486 retrieving revision 1.3487 diff -u -d -r1.3486 -r1.3487 --- ChangeLog 24 May 2008 12:55:37 -0000 1.3486 +++ ChangeLog 25 May 2008 16:09:38 -0000 1.3487 @@ -1,3 +1,13 @@ +2008-05-25 Sebastian Dröge <sl...@ci...> + + * 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. 2008-05-24 Tim-Philipp Müller <tim.muller at collabora co uk> * configure.ac: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/ext/flac/Makefile.am,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- Makefile.am 20 Jun 2006 19:40:29 -0000 1.18 +++ Makefile.am 25 May 2008 16:09:39 -0000 1.19 @@ -4,6 +4,7 @@ libgstflac_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) libgstflac_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \ + -lgstaudio-$(GST_MAJORMINOR) \ $(GST_BASE_LIBS) $(GST_LIBS) $(FLAC_LIBS) libgstflac_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) Index: gstflacdec.c RCS file: /cvs/gstreamer/gst-plugins-good/ext/flac/gstflacdec.c,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- gstflacdec.c 2 Feb 2008 19:47:50 -0000 1.90 +++ gstflacdec.c 25 May 2008 16:09:39 -0000 1.91 @@ -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_REAR_LEFT, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, { + GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, + GST_AUDIO_CHANNEL_POSITION_LFE, + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, + /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */ + { + GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, + GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, { + 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 @@ 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 @@ "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; |