From d699dc615ee629e64180be685c7b068b5b7ffa12 Mon Sep 17 00:00:00 2001 From: Josep Torra Date: Sat, 20 May 2017 17:09:52 +0200 Subject: [PATCH] osxaudio: fixes playback of mono streams with no channel-mask field in caps Fixes a negotiation error seen when trying to playback of a .MOV file with a mono AAC audio stream decoded by avcdec_aac that doesn't set channel-mask field but sink was requiring channel-mask=0x3. --- sys/osxaudio/gstosxcoreaudio.c | 35 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/sys/osxaudio/gstosxcoreaudio.c b/sys/osxaudio/gstosxcoreaudio.c index d516e6d20e..5d3b882d98 100644 --- a/sys/osxaudio/gstosxcoreaudio.c +++ b/sys/osxaudio/gstosxcoreaudio.c @@ -644,24 +644,33 @@ gst_core_audio_probe_caps (GstCoreAudio * core_audio, GstCaps * in_caps) * e.g. if you push 5.1-surround audio to a stereo configuration, * the left and right channels will be played accordingly, * and the rest will be dropped. */ - - if (channels == 1 || (channels == 2 && - (channel_mask == 0 || channel_mask == STEREO_CHANNEL_MASK))) { - + if (channels == 1) { + /* If have mono, then also offer stereo since CoreAudio downmixes to it */ + GstStructure *stereo = gst_structure_copy (out_s); + gst_structure_remove_field (out_s, "channel-mask"); + gst_structure_set (stereo, "channels", G_TYPE_INT, 2, + "channel-mask", GST_TYPE_BITMASK, STEREO_CHANNEL_MASK, NULL); + gst_caps_append_structure (caps, stereo); + gst_caps_append_structure (caps, out_s); + } else if (channels == 2 && (channel_mask == 0 + || channel_mask == STEREO_CHANNEL_MASK)) { /* If have stereo channels, then also offer mono since CoreAudio - * upmixes it. If mono, then also offer stereo since CoreAudio - * downmixes to it */ + * upmixes it. */ + GstStructure *mono = gst_structure_copy (out_s); + gst_structure_set (mono, "channels", G_TYPE_INT, 1, NULL); + gst_structure_remove_field (mono, "channel-mask"); + gst_structure_set (out_s, "channel-mask", GST_TYPE_BITMASK, + STEREO_CHANNEL_MASK, NULL); - gst_structure_set (out_s, "channels", GST_TYPE_INT_RANGE, 1, 2, NULL); - - if (channels == 1) - gst_structure_set (out_s, "channel-mask", GST_TYPE_BITMASK, - STEREO_CHANNEL_MASK, NULL); + gst_caps_append_structure (caps, out_s); + gst_caps_append_structure (caps, mono); + } else { + /* Otherwhise just add the caps */ + gst_caps_append_structure (caps, out_s); } - - gst_caps_append_structure (caps, out_s); } } + GST_DEBUG_OBJECT (core_audio, "Probed caps:%" GST_PTR_FORMAT, caps); return caps; }