From 8e466b73d89a1af18863222438cca1fcfac6c2ab Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Thu, 24 Dec 2015 13:06:13 +0100 Subject: [PATCH] avcodecmap: Add special mapping for mono channel layouts In ffmpeg this is the same as FRONT_CENTER, but we distinguish between FRONT_CENTER and MONO in GStreamer. Add an explicit mapping for this special case in the translations functions. https://bugzilla.gnome.org/show_bug.cgi?id=759846 --- ext/libav/gstavcodecmap.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ext/libav/gstavcodecmap.c b/ext/libav/gstavcodecmap.c index 14686dd..11a9ed2 100644 --- a/ext/libav/gstavcodecmap.c +++ b/ext/libav/gstavcodecmap.c @@ -99,6 +99,9 @@ gst_ffmpeg_channel_positions_to_layout (GstAudioChannelPosition * pos, if (!pos) return 0; + if (channels == 1 && pos[0] == GST_AUDIO_CHANNEL_POSITION_MONO) + return AV_CH_LAYOUT_MONO; + for (i = 0; i < channels; i++) { for (j = 0; j < G_N_ELEMENTS (_ff_to_gst_layout); j++) { if (_ff_to_gst_layout[j].gst == pos[i]) { @@ -127,6 +130,15 @@ gst_ffmpeg_channel_layout_to_gst (guint64 channel_layout, gint channels, } else { guint i, j; + /* Special path for mono, as AV_CH_LAYOUT_MONO is the same + * as FRONT_CENTER but we distinguish between the two in + * GStreamer + */ + if (channels == 1 && channel_layout == AV_CH_LAYOUT_MONO) { + pos[0] = GST_AUDIO_CHANNEL_POSITION_MONO; + return TRUE; + } + for (i = 0; i < 64; i++) { if ((channel_layout & (G_GUINT64_CONSTANT (1) << i)) != 0) { nchannels++; -- 2.7.4