mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
wasapi: Fixed corner-cases in mapping of channel mask
'channel-mask' field should not be put in caps if channel mask is 0x0 Mapping WASAPI channel mask to GST equivalent was going only over first nChannels elements of wasapi_to_gst_pos array, translating, for example, WASAPI's 0x63f to GST's 0x3f instead of 0xc3f. When 'channel-mask' is specified as NULL, it signifies that there's need to do downmix or upmix and it makes caps negotiation with audioconvert element impossible. Just omit it. Signed-off-by: Nirbheek Chauhan <nirbheek@centricular.com>
This commit is contained in:
parent
f710b36ac4
commit
60146e3097
1 changed files with 15 additions and 6 deletions
|
@ -695,7 +695,7 @@ static guint64
|
||||||
gst_wasapi_util_waveformatex_to_channel_mask (WAVEFORMATEXTENSIBLE * format,
|
gst_wasapi_util_waveformatex_to_channel_mask (WAVEFORMATEXTENSIBLE * format,
|
||||||
GstAudioChannelPosition ** out_position)
|
GstAudioChannelPosition ** out_position)
|
||||||
{
|
{
|
||||||
int ii;
|
int ii, ch;
|
||||||
guint64 mask = 0;
|
guint64 mask = 0;
|
||||||
WORD nChannels = format->Format.nChannels;
|
WORD nChannels = format->Format.nChannels;
|
||||||
DWORD dwChannelMask = format->dwChannelMask;
|
DWORD dwChannelMask = format->dwChannelMask;
|
||||||
|
@ -719,14 +719,19 @@ gst_wasapi_util_waveformatex_to_channel_mask (WAVEFORMATEXTENSIBLE * format,
|
||||||
|
|
||||||
/* Map WASAPI's channel mask to Gstreamer's channel mask and positions.
|
/* Map WASAPI's channel mask to Gstreamer's channel mask and positions.
|
||||||
* If the no. of bits in the mask > nChannels, we will ignore the extra. */
|
* If the no. of bits in the mask > nChannels, we will ignore the extra. */
|
||||||
for (ii = 0; ii < nChannels; ii++) {
|
for (ii = 0, ch = 0; ii < G_N_ELEMENTS (wasapi_to_gst_pos) && ch < nChannels;
|
||||||
|
ii++) {
|
||||||
if (!(dwChannelMask & wasapi_to_gst_pos[ii].wasapi_pos))
|
if (!(dwChannelMask & wasapi_to_gst_pos[ii].wasapi_pos))
|
||||||
/* Non-positional or unknown position, warn? */
|
/* no match, try next */
|
||||||
continue;
|
continue;
|
||||||
mask |= G_GUINT64_CONSTANT (1) << wasapi_to_gst_pos[ii].gst_pos;
|
mask |= G_GUINT64_CONSTANT (1) << wasapi_to_gst_pos[ii].gst_pos;
|
||||||
pos[ii] = wasapi_to_gst_pos[ii].gst_pos;
|
pos[ch++] = wasapi_to_gst_pos[ii].gst_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX: Warn if some channel masks couldn't be mapped? */
|
||||||
|
|
||||||
|
GST_DEBUG ("Converted WASAPI mask 0x%x -> 0x%x", dwChannelMask, mask);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (out_position)
|
if (out_position)
|
||||||
*out_position = pos;
|
*out_position = pos;
|
||||||
|
@ -773,8 +778,12 @@ gst_wasapi_util_parse_waveformatex (WAVEFORMATEXTENSIBLE * format,
|
||||||
gst_structure_set (s,
|
gst_structure_set (s,
|
||||||
"format", G_TYPE_STRING, afmt,
|
"format", G_TYPE_STRING, afmt,
|
||||||
"channels", G_TYPE_INT, format->Format.nChannels,
|
"channels", G_TYPE_INT, format->Format.nChannels,
|
||||||
"rate", G_TYPE_INT, format->Format.nSamplesPerSec,
|
"rate", G_TYPE_INT, format->Format.nSamplesPerSec, NULL);
|
||||||
"channel-mask", GST_TYPE_BITMASK, channel_mask, NULL);
|
|
||||||
|
if (channel_mask) {
|
||||||
|
gst_structure_set (s,
|
||||||
|
"channel-mask", GST_TYPE_BITMASK, channel_mask, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
Loading…
Reference in a new issue