diff --git a/gst-libs/gst/audio/audio-channels.c b/gst-libs/gst/audio/audio-channels.c index 515eb940c3..d648911fda 100644 --- a/gst-libs/gst/audio/audio-channels.c +++ b/gst-libs/gst/audio/audio-channels.c @@ -459,3 +459,56 @@ gst_audio_channel_positions_to_valid_order (GstAudioChannelPosition * position, return TRUE; } + +#define _P(pos) (G_GUINT64_CONSTANT (1) << GST_AUDIO_CHANNEL_POSITION_ ##pos) + +static const guint64 default_masks[] = { + /* 1 channel */ + 0, + /* 2 channels */ + _P (FRONT_LEFT) | _P (FRONT_RIGHT), + /* 3 channels (2.1) */ + _P (FRONT_LEFT) | _P (FRONT_RIGHT) | _P (LFE1), + /* 4 channels (4.0) */ + _P (FRONT_LEFT) | _P (FRONT_RIGHT) | _P (REAR_LEFT) | _P (REAR_RIGHT), + /* 5 channels */ + _P (FRONT_LEFT) | _P (FRONT_RIGHT) | _P (REAR_LEFT) | _P (REAR_RIGHT) + | _P (FRONT_CENTER), + /* 6 channels (5.1) */ + _P (FRONT_LEFT) | + _P (FRONT_RIGHT) | + _P (REAR_LEFT) | _P (REAR_RIGHT) | _P (FRONT_CENTER) | _P (LFE1), + /* 7 channels (6.1) */ + _P (FRONT_LEFT) | + _P (FRONT_RIGHT) | + _P (REAR_LEFT) | + _P (REAR_RIGHT) | _P (FRONT_CENTER) | _P (LFE1) | _P (REAR_CENTER), + /* 8 channels (7.1) */ + _P (FRONT_LEFT) | + _P (FRONT_RIGHT) | + _P (REAR_LEFT) | + _P (REAR_RIGHT) | + _P (FRONT_CENTER) | _P (LFE1) | _P (SIDE_LEFT) | _P (SIDE_RIGHT), +}; + +/** + * gst_audio_channel_get_default_mask: + * @channels: the number of channels + * + * Get the default channel-mask for the given number of channels. + * + * Returns: the default channel-mask for @channels or 0 when there is no default + * mask. + * + * Since: 1.8 + */ +guint64 +gst_audio_channel_get_default_mask (gint channels) +{ + g_return_val_if_fail (channels > 0, 0); + + if (channels > 8) + return 0; + + return default_masks[channels - 1]; +} diff --git a/gst-libs/gst/audio/audio-channels.h b/gst-libs/gst/audio/audio-channels.h index 9481839468..342825bd00 100644 --- a/gst-libs/gst/audio/audio-channels.h +++ b/gst-libs/gst/audio/audio-channels.h @@ -160,6 +160,7 @@ gboolean gst_audio_get_channel_reorder_map (gint channels, const GstAudioChannelPosition * from, const GstAudioChannelPosition * to, gint *reorder_map); +guint64 gst_audio_channel_get_default_mask (gint channels); G_END_DECLS diff --git a/gst-libs/gst/audio/gstaudiodecoder.c b/gst-libs/gst/audio/gstaudiodecoder.c index f4c663afab..744e00e830 100644 --- a/gst-libs/gst/audio/gstaudiodecoder.c +++ b/gst-libs/gst/audio/gstaudiodecoder.c @@ -290,70 +290,6 @@ struct _GstAudioDecoderPrivate gboolean use_default_pad_acceptcaps; }; -//* Default channel layouts taken from audioconvert */ -static const GstAudioChannelPosition default_positions[8][8] = { - /* 1 channel */ - { - GST_AUDIO_CHANNEL_POSITION_MONO, - }, - /* 2 channels */ - { - GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, - }, - /* 3 channels (2.1) */ - { - GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, - GST_AUDIO_CHANNEL_POSITION_LFE1, - }, - /* 4 channels (4.0) */ - { - GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, - GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, - GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, - }, - /* 5 channels */ - { - 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, - }, - /* 6 channels (5.1) */ - { - 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_LFE1, - }, - /* 7 channels (6.1) */ - { - 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_LFE1, - GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, - }, - /* 8 channels (7.1) */ - { - 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_LFE1, - GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, - GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, - } -}; - static void gst_audio_decoder_finalize (GObject * object); static void gst_audio_decoder_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -2069,12 +2005,8 @@ gst_audio_decoder_negotiate_default_caps (GstAudioDecoder * dec) /* Need to add a channel-mask if channels > 2 */ gst_structure_get_int (structure, "channels", &channels); if (channels > 2 && !gst_structure_has_field (structure, "channel-mask")) { - if (channels <= 8) { - channel_mask = 0; - for (i = 0; i < channels; i++) - channel_mask |= - G_GUINT64_CONSTANT (1) << default_positions[channels - 1][i]; - + channel_mask = gst_audio_channel_get_default_mask (channels); + if (channel_mask != 0) { gst_structure_set (structure, "channel-mask", GST_TYPE_BITMASK, channel_mask, NULL); } else { diff --git a/gst/audioconvert/gstaudioconvert.c b/gst/audioconvert/gstaudioconvert.c index 896e293cba..707a07e7f0 100644 --- a/gst/audioconvert/gstaudioconvert.c +++ b/gst/audioconvert/gstaudioconvert.c @@ -346,69 +346,6 @@ gst_audio_convert_transform_caps (GstBaseTransform * btrans, return result; } -static const GstAudioChannelPosition default_positions[8][8] = { - /* 1 channel */ - { - GST_AUDIO_CHANNEL_POSITION_MONO, - }, - /* 2 channels */ - { - GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, - }, - /* 3 channels (2.1) */ - { - GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, - GST_AUDIO_CHANNEL_POSITION_LFE1, - }, - /* 4 channels (4.0) */ - { - GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, - GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, - GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, - GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT, - }, - /* 5 channels */ - { - 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, - }, - /* 6 channels (5.1) */ - { - 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_LFE1, - }, - /* 7 channels (6.1) */ - { - 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_LFE1, - GST_AUDIO_CHANNEL_POSITION_REAR_CENTER, - }, - /* 8 channels (7.1) */ - { - 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_LFE1, - GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, - GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, - } -}; - static gint n_bits_set (guint64 x) { @@ -683,15 +620,9 @@ gst_audio_convert_fixate_channels (GstBaseTransform * base, GstStructure * ins, * and try to add/remove channels from the input layout, or pick a default * layout based on LFE-presence in input layout, but let's save that for * another day) */ - if (out_chans > 0 && out_chans <= G_N_ELEMENTS (default_positions[0])) { - gint i; - + if (out_chans > 0 + && (out_mask = gst_audio_channel_get_default_mask (out_chans))) { GST_DEBUG_OBJECT (base, "using default channel layout as fallback"); - - out_mask = 0; - for (i = 0; i < out_chans; i++) - out_mask |= G_GUINT64_CONSTANT (1) << default_positions[out_chans - 1][i]; - gst_structure_set (outs, "channel-mask", GST_TYPE_BITMASK, out_mask, NULL); } else { GST_ERROR_OBJECT (base, "Have no default layout for %d channels", diff --git a/win32/common/libgstaudio.def b/win32/common/libgstaudio.def index ea0ea84c6c..3892ce5b15 100644 --- a/win32/common/libgstaudio.def +++ b/win32/common/libgstaudio.def @@ -27,6 +27,7 @@ EXPORTS gst_audio_cd_src_add_track gst_audio_cd_src_get_type gst_audio_cd_src_mode_get_type + gst_audio_channel_get_default_mask gst_audio_channel_position_get_type gst_audio_channel_positions_from_mask gst_audio_channel_positions_to_mask