adder: use the collect_pads_query func

We were setting the query-func on the sink-pad, which got overwritten when
adding the new pad to collect pads. Instead register our query-func with the
collect pads object. This fixes filter caps. Add a test for it.
This commit is contained in:
Stefan Sauer 2013-02-13 21:08:48 +01:00
parent abfa8678ec
commit cff9fccc69
2 changed files with 60 additions and 11 deletions

View file

@ -112,8 +112,8 @@ static gboolean gst_adder_setcaps (GstAdder * adder, GstPad * pad,
GstCaps * caps); GstCaps * caps);
static gboolean gst_adder_src_query (GstPad * pad, GstObject * parent, static gboolean gst_adder_src_query (GstPad * pad, GstObject * parent,
GstQuery * query); GstQuery * query);
static gboolean gst_adder_sink_query (GstPad * pad, GstObject * parent, static gboolean gst_adder_sink_query (GstCollectPads * pads,
GstQuery * query); GstCollectData * pad, GstQuery * query, gpointer user_data);
static gboolean gst_adder_src_event (GstPad * pad, GstObject * parent, static gboolean gst_adder_src_event (GstPad * pad, GstObject * parent,
GstEvent * event); GstEvent * event);
static gboolean gst_adder_sink_event (GstCollectPads * pads, static gboolean gst_adder_sink_event (GstCollectPads * pads,
@ -218,7 +218,8 @@ gst_adder_sink_getcaps (GstPad * pad, GstCaps * filter)
} }
static gboolean static gboolean
gst_adder_sink_query (GstPad * pad, GstObject * parent, GstQuery * query) gst_adder_sink_query (GstCollectPads * pads, GstCollectData * pad,
GstQuery * query, gpointer user_data)
{ {
gboolean res = FALSE; gboolean res = FALSE;
@ -228,16 +229,17 @@ gst_adder_sink_query (GstPad * pad, GstObject * parent, GstQuery * query)
GstCaps *filter, *caps; GstCaps *filter, *caps;
gst_query_parse_caps (query, &filter); gst_query_parse_caps (query, &filter);
caps = gst_adder_sink_getcaps (pad, filter); caps = gst_adder_sink_getcaps (pad->pad, filter);
gst_query_set_caps_result (query, caps); gst_query_set_caps_result (query, caps);
gst_caps_unref (caps); gst_caps_unref (caps);
res = TRUE; res = TRUE;
break; break;
} }
default: default:
res = gst_pad_query_default (pad, parent, query); res = gst_collect_pads_query_default (pads, pad, query, FALSE);
break; break;
} }
return res; return res;
} }
@ -868,11 +870,6 @@ gst_adder_class_init (GstAdderClass * klass)
gobject_class->get_property = gst_adder_get_property; gobject_class->get_property = gst_adder_get_property;
gobject_class->dispose = gst_adder_dispose; gobject_class->dispose = gst_adder_dispose;
/**
* GstAdder:caps:
*
* Since: 0.10.24
*/
g_object_class_install_property (gobject_class, PROP_FILTER_CAPS, g_object_class_install_property (gobject_class, PROP_FILTER_CAPS,
g_param_spec_boxed ("caps", "Target caps", g_param_spec_boxed ("caps", "Target caps",
"Set target format for mixing (NULL means ANY). " "Set target format for mixing (NULL means ANY). "
@ -926,6 +923,8 @@ gst_adder_init (GstAdder * adder)
GST_DEBUG_FUNCPTR (gst_adder_do_clip), adder); GST_DEBUG_FUNCPTR (gst_adder_do_clip), adder);
gst_collect_pads_set_event_function (adder->collect, gst_collect_pads_set_event_function (adder->collect,
GST_DEBUG_FUNCPTR (gst_adder_sink_event), adder); GST_DEBUG_FUNCPTR (gst_adder_sink_event), adder);
gst_collect_pads_set_query_function (adder->collect,
GST_DEBUG_FUNCPTR (gst_adder_sink_query), adder);
} }
static void static void
@ -1024,7 +1023,6 @@ gst_adder_request_new_pad (GstElement * element, GstPadTemplate * templ,
GST_DEBUG_OBJECT (adder, "request new pad %s", name); GST_DEBUG_OBJECT (adder, "request new pad %s", name);
g_free (name); g_free (name);
gst_pad_set_query_function (newpad, GST_DEBUG_FUNCPTR (gst_adder_sink_query));
gst_collect_pads_add_pad (adder->collect, newpad, sizeof (GstCollectData), gst_collect_pads_add_pad (adder->collect, newpad, sizeof (GstCollectData),
NULL, TRUE); NULL, TRUE);

View file

@ -76,6 +76,56 @@ GST_START_TEST (test_caps)
GST_END_TEST; GST_END_TEST;
/* check that caps set on the property are honoured */
GST_START_TEST (test_filter_caps)
{
GstElement *pipeline, *src, *adder, *sink;
GstStateChangeReturn state_res;
GstCaps *filter_caps, *caps;
GstPad *pad;
filter_caps = gst_caps_new_simple ("audio/x-raw",
"format", G_TYPE_STRING, "F32LE",
"layout", G_TYPE_STRING, "interleaved",
"rate", G_TYPE_INT, 44100, "channels", G_TYPE_INT, 1, NULL);
/* build pipeline */
pipeline = gst_pipeline_new ("pipeline");
src = gst_element_factory_make ("audiotestsrc", NULL);
g_object_set (src, "wave", 4, NULL); /* silence */
adder = gst_element_factory_make ("adder", NULL);
g_object_set (adder, "caps", filter_caps, NULL);
sink = gst_element_factory_make ("fakesink", "sink");
gst_bin_add_many (GST_BIN (pipeline), src, adder, sink, NULL);
fail_unless (gst_element_link_many (src, adder, sink, NULL));
/* prepare playing */
state_res = gst_element_set_state (pipeline, GST_STATE_PAUSED);
fail_unless_equals_int (state_res, GST_STATE_CHANGE_ASYNC);
/* wait for preroll */
state_res = gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
fail_unless_equals_int (state_res, GST_STATE_CHANGE_SUCCESS);
/* check caps on fakesink */
pad = gst_element_get_static_pad (sink, "sink");
caps = gst_pad_get_current_caps (pad);
fail_unless (caps != NULL);
GST_INFO_OBJECT (pipeline, "received caps: %" GST_PTR_FORMAT, caps);
fail_unless (gst_caps_is_equal_fixed (caps, filter_caps));
gst_caps_unref (caps);
gst_object_unref (pad);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
gst_caps_unref (filter_caps);
}
GST_END_TEST;
static void static void
message_received (GstBus * bus, GstMessage * message, GstPipeline * bin) message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
{ {
@ -1028,6 +1078,7 @@ adder_suite (void)
suite_add_tcase (s, tc_chain); suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_caps); tcase_add_test (tc_chain, test_caps);
tcase_add_test (tc_chain, test_filter_caps);
tcase_add_test (tc_chain, test_event); tcase_add_test (tc_chain, test_event);
tcase_add_test (tc_chain, test_play_twice); tcase_add_test (tc_chain, test_play_twice);
tcase_add_test (tc_chain, test_play_twice_then_add_and_play_again); tcase_add_test (tc_chain, test_play_twice_then_add_and_play_again);