Add a new method to get the default channel-mask.
Use the new method on audiodecoder and audioconvert.
API: gst_audio_channel_get_default_mask()
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];
+}
const GstAudioChannelPosition * from,
const GstAudioChannelPosition * to,
gint *reorder_map);
+guint64 gst_audio_channel_get_default_mask (gint channels);
G_END_DECLS
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);
/* 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 {
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)
{
* 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",
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