interleave: make channel-poisitions property a GValueArray again
Or perhaps it should just be a guint64 channel mask, which would be nicer in C, but more awkward for bindings (even more so since we can't add a flags type for it, since that only supports guint size flags). Fixes wavenc unit test. https://bugzilla.gnome.org/show_bug.cgi?id=669643
This commit is contained in:
parent
acca0e77f1
commit
fa5edd2680
@ -57,10 +57,6 @@
|
|||||||
* </refsect2>
|
* </refsect2>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* FIXME 0.11: suppress warnings for deprecated API such as GValueArray
|
|
||||||
* with newer GLib versions (>= 2.31.0) */
|
|
||||||
#define GLIB_DISABLE_DEPRECATION_WARNINGS
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#endif
|
||||||
@ -239,12 +235,12 @@ gst_interleave_finalize (GObject * object)
|
|||||||
|
|
||||||
if (self->channel_positions
|
if (self->channel_positions
|
||||||
&& self->channel_positions != self->input_channel_positions) {
|
&& self->channel_positions != self->input_channel_positions) {
|
||||||
g_array_free (self->channel_positions, TRUE);
|
g_value_array_free (self->channel_positions);
|
||||||
self->channel_positions = NULL;
|
self->channel_positions = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self->input_channel_positions) {
|
if (self->input_channel_positions) {
|
||||||
g_array_free (self->input_channel_positions, TRUE);
|
g_value_array_free (self->input_channel_positions);
|
||||||
self->input_channel_positions = NULL;
|
self->input_channel_positions = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,21 +250,21 @@ gst_interleave_finalize (GObject * object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_interleave_check_channel_positions (GArray * positions)
|
gst_interleave_check_channel_positions (GValueArray * positions)
|
||||||
{
|
{
|
||||||
gint i;
|
gint i;
|
||||||
guint channels;
|
guint channels;
|
||||||
GstAudioChannelPosition *pos;
|
GstAudioChannelPosition *pos;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
GValue val;
|
|
||||||
|
|
||||||
channels = positions->len;
|
channels = positions->n_values;
|
||||||
pos = g_new (GstAudioChannelPosition, channels);
|
pos = g_new (GstAudioChannelPosition, channels);
|
||||||
|
|
||||||
for (i = 0; i < channels; i++) {
|
for (i = 0; i < channels; i++) {
|
||||||
val = g_array_index (positions, GValue, i);
|
GValue *val;
|
||||||
pos[i] = g_value_get_enum (&val);
|
|
||||||
g_value_reset (&val);
|
val = g_value_array_get_nth (positions, i);
|
||||||
|
pos[i] = g_value_get_enum (val);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = gst_audio_check_valid_channel_positions (pos, channels, FALSE);
|
ret = gst_audio_check_valid_channel_positions (pos, channels, FALSE);
|
||||||
@ -282,15 +278,16 @@ gst_interleave_set_channel_positions (GstInterleave * self, GstStructure * s)
|
|||||||
{
|
{
|
||||||
gint i;
|
gint i;
|
||||||
guint64 channel_mask = 0;
|
guint64 channel_mask = 0;
|
||||||
GValue val;
|
|
||||||
|
|
||||||
if (self->channel_positions && self->channels == self->channel_positions->len
|
if (self->channel_positions != NULL &&
|
||||||
|
self->channels == self->channel_positions->n_values
|
||||||
&& gst_interleave_check_channel_positions (self->channel_positions)) {
|
&& gst_interleave_check_channel_positions (self->channel_positions)) {
|
||||||
GST_DEBUG_OBJECT (self, "Using provided channel positions");
|
GST_DEBUG_OBJECT (self, "Using provided channel positions");
|
||||||
for (i = 0; i < self->channels; i++) {
|
for (i = 0; i < self->channels; i++) {
|
||||||
val = g_array_index (self->channel_positions, GValue, i);
|
GValue *val;
|
||||||
channel_mask |= G_GUINT64_CONSTANT (1) << g_value_get_enum (&val);
|
|
||||||
g_value_reset (&val);
|
val = g_value_array_get_nth (self->channel_positions, i);
|
||||||
|
channel_mask |= G_GUINT64_CONSTANT (1) << g_value_get_enum (val);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_WARNING_OBJECT (self, "Using NONE channel positions");
|
GST_WARNING_OBJECT (self, "Using NONE channel positions");
|
||||||
@ -345,8 +342,13 @@ gst_interleave_class_init (GstInterleaveClass * klass)
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
g_object_class_install_property (gobject_class, PROP_CHANNEL_POSITIONS,
|
g_object_class_install_property (gobject_class, PROP_CHANNEL_POSITIONS,
|
||||||
g_param_spec_boxed ("channel-positions", "Channel positions",
|
g_param_spec_value_array ("channel-positions", "Channel positions",
|
||||||
"Channel position of the n-th output", G_TYPE_ARRAY,
|
"Channel positions used on the output",
|
||||||
|
g_param_spec_enum ("channel-position", "Channel position",
|
||||||
|
"Channel position of the n-th input",
|
||||||
|
GST_TYPE_AUDIO_CHANNEL_POSITION,
|
||||||
|
GST_AUDIO_CHANNEL_POSITION_NONE,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS),
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -390,7 +392,7 @@ gst_interleave_init (GstInterleave * self)
|
|||||||
gst_collect_pads2_set_function (self->collect,
|
gst_collect_pads2_set_function (self->collect,
|
||||||
(GstCollectPads2Function) gst_interleave_collected, self);
|
(GstCollectPads2Function) gst_interleave_collected, self);
|
||||||
|
|
||||||
self->input_channel_positions = g_array_new (FALSE, TRUE, sizeof (GValue));
|
self->input_channel_positions = g_value_array_new (0);
|
||||||
self->channel_positions_from_input = TRUE;
|
self->channel_positions_from_input = TRUE;
|
||||||
self->channel_positions = self->input_channel_positions;
|
self->channel_positions = self->input_channel_positions;
|
||||||
}
|
}
|
||||||
@ -400,22 +402,16 @@ gst_interleave_set_property (GObject * object, guint prop_id,
|
|||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstInterleave *self = GST_INTERLEAVE (object);
|
GstInterleave *self = GST_INTERLEAVE (object);
|
||||||
int i;
|
|
||||||
GArray *arr;
|
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_CHANNEL_POSITIONS:
|
case PROP_CHANNEL_POSITIONS:
|
||||||
if (self->channel_positions &&
|
if (self->channel_positions &&
|
||||||
self->channel_positions != self->input_channel_positions)
|
self->channel_positions != self->input_channel_positions)
|
||||||
g_array_free (self->channel_positions, TRUE);
|
g_value_array_free (self->channel_positions);
|
||||||
|
|
||||||
arr = g_value_get_boxed (value);
|
self->channel_positions = g_value_dup_boxed (value);
|
||||||
self->channel_positions = g_array_new (FALSE, TRUE, sizeof (GValue));
|
|
||||||
for (i = 0; i < arr->len; i++)
|
|
||||||
g_array_append_val (self->channel_positions, g_array_index (arr, GValue,
|
|
||||||
i));
|
|
||||||
self->channel_positions_from_input = FALSE;
|
self->channel_positions_from_input = FALSE;
|
||||||
self->channels = self->channel_positions->len;
|
self->channels = self->channel_positions->n_values;
|
||||||
break;
|
break;
|
||||||
case PROP_CHANNEL_POSITIONS_FROM_INPUT:
|
case PROP_CHANNEL_POSITIONS_FROM_INPUT:
|
||||||
self->channel_positions_from_input = g_value_get_boolean (value);
|
self->channel_positions_from_input = g_value_get_boolean (value);
|
||||||
@ -423,7 +419,7 @@ gst_interleave_set_property (GObject * object, guint prop_id,
|
|||||||
if (self->channel_positions_from_input) {
|
if (self->channel_positions_from_input) {
|
||||||
if (self->channel_positions &&
|
if (self->channel_positions &&
|
||||||
self->channel_positions != self->input_channel_positions)
|
self->channel_positions != self->input_channel_positions)
|
||||||
g_array_free (self->channel_positions, TRUE);
|
g_value_array_free (self->channel_positions);
|
||||||
self->channel_positions = self->input_channel_positions;
|
self->channel_positions = self->input_channel_positions;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -493,7 +489,7 @@ gst_interleave_request_new_pad (GstElement * element, GstPadTemplate * templ,
|
|||||||
g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
|
g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
|
||||||
g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_NONE);
|
g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_NONE);
|
||||||
self->input_channel_positions =
|
self->input_channel_positions =
|
||||||
g_array_append_val (self->input_channel_positions, val);
|
g_value_array_append (self->input_channel_positions, &val);
|
||||||
g_value_unset (&val);
|
g_value_unset (&val);
|
||||||
|
|
||||||
/* Update the src caps if we already have them */
|
/* Update the src caps if we already have them */
|
||||||
@ -549,7 +545,7 @@ gst_interleave_release_pad (GstElement * element, GstPad * pad)
|
|||||||
g_atomic_int_add (&self->channels, -1);
|
g_atomic_int_add (&self->channels, -1);
|
||||||
|
|
||||||
position = GST_INTERLEAVE_PAD_CAST (pad)->channel;
|
position = GST_INTERLEAVE_PAD_CAST (pad)->channel;
|
||||||
g_array_remove_index (self->input_channel_positions, position);
|
g_value_array_remove (self->input_channel_positions, position);
|
||||||
|
|
||||||
/* Update channel numbers */
|
/* Update channel numbers */
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
@ -764,7 +760,7 @@ gst_interleave_sink_setcaps (GstInterleave * self, GstPad * pad,
|
|||||||
|
|
||||||
if (self->channel_positions_from_input
|
if (self->channel_positions_from_input
|
||||||
&& GST_AUDIO_INFO_CHANNELS (&info) == 1) {
|
&& GST_AUDIO_INFO_CHANNELS (&info) == 1) {
|
||||||
val = &g_array_index (self->input_channel_positions, GValue, channel);
|
val = g_value_array_get_nth (self->input_channel_positions, channel);
|
||||||
g_value_set_enum (val, GST_AUDIO_INFO_POSITION (&info, 0));
|
g_value_set_enum (val, GST_AUDIO_INFO_POSITION (&info, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,8 +56,8 @@ struct _GstInterleave
|
|||||||
gint rate;
|
gint rate;
|
||||||
gint width;
|
gint width;
|
||||||
|
|
||||||
GArray* channel_positions;
|
GValueArray *channel_positions;
|
||||||
GArray* input_channel_positions;
|
GValueArray *input_channel_positions;
|
||||||
gboolean channel_positions_from_input;
|
gboolean channel_positions_from_input;
|
||||||
|
|
||||||
GstCaps *sinkcaps;
|
GstCaps *sinkcaps;
|
||||||
|
@ -662,7 +662,7 @@ GST_START_TEST (test_interleave_2ch_pipeline_custom_chanpos)
|
|||||||
GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
|
GstElement *pipeline, *queue, *src1, *src2, *interleave, *sink;
|
||||||
GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
|
GstPad *sinkpad0, *sinkpad1, *tmp, *tmp2;
|
||||||
GstMessage *msg;
|
GstMessage *msg;
|
||||||
GArray *arr;
|
GValueArray *arr;
|
||||||
GValue val = { 0, };
|
GValue val = { 0, };
|
||||||
|
|
||||||
have_data = 0;
|
have_data = 0;
|
||||||
@ -693,18 +693,18 @@ GST_START_TEST (test_interleave_2ch_pipeline_custom_chanpos)
|
|||||||
interleave = gst_element_factory_make ("interleave", "interleave");
|
interleave = gst_element_factory_make ("interleave", "interleave");
|
||||||
fail_unless (interleave != NULL);
|
fail_unless (interleave != NULL);
|
||||||
g_object_set (interleave, "channel-positions-from-input", FALSE, NULL);
|
g_object_set (interleave, "channel-positions-from-input", FALSE, NULL);
|
||||||
arr = g_array_new (FALSE, TRUE, sizeof (GValue));
|
arr = g_value_array_new (2);
|
||||||
|
|
||||||
g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
|
g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
|
||||||
g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER);
|
g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER);
|
||||||
g_array_append_val (arr, val);
|
g_value_array_append (arr, &val);
|
||||||
g_value_reset (&val);
|
g_value_reset (&val);
|
||||||
g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER);
|
g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_CENTER);
|
||||||
g_array_append_val (arr, val);
|
g_value_array_append (arr, &val);
|
||||||
g_value_unset (&val);
|
g_value_unset (&val);
|
||||||
|
|
||||||
g_object_set (interleave, "channel-positions", arr, NULL);
|
g_object_set (interleave, "channel-positions", arr, NULL);
|
||||||
g_array_free (arr, TRUE);
|
g_value_array_free (arr);
|
||||||
gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave));
|
gst_bin_add (GST_BIN (pipeline), gst_object_ref (interleave));
|
||||||
|
|
||||||
sinkpad0 = gst_element_get_request_pad (interleave, "sink_%u");
|
sinkpad0 = gst_element_get_request_pad (interleave, "sink_%u");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user