GST_END_TEST;
-static GstPadProbeReturn
-drop_buffers (GstPad * pad, GstPadProbeInfo * info, gpointer unused)
-{
- return GST_PAD_PROBE_DROP;
-}
-
GST_START_TEST (issue_concatenation)
{
- GstPad *srcpad1, *srcpad2, *sinkpad, *funnel_sink1, *funnel_sink2;
- GstElement *src1, *src2, *sink, *funnel;
+ GstPad *srcpad1, *srcpad2, *sinkpad, *fakemixer_sink1, *fakemixer_sink2;
+ GstElement *src1, *src2, *sink, *fakemixer;
GstValidateRunner *runner;
GstValidatePadMonitor *srcpad_monitor1, *srcpad_monitor2, *sinkpad_monitor;
- GstValidatePadMonitor *funnel_sink_monitor1, *funnel_sink_monitor2;
- GstSegment segment;
+ GstValidatePadMonitor *fakemixer_sink_monitor1, *fakemixer_sink_monitor2;
GList *reports;
gint n_reports;
- gulong probe_id1, probe_id2;
fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS", "subchain", TRUE));
runner = gst_validate_runner_new ();
- src1 = create_and_monitor_element ("fakesrc", "fakesrc1", runner);
- src2 = create_and_monitor_element ("fakesrc", "fakesrc2", runner);
- funnel = create_and_monitor_element ("funnel", "funnel", runner);
+ src1 = create_and_monitor_element ("fakesrc2", NULL, runner);
+ src2 = create_and_monitor_element ("fakesrc2", NULL, runner);
+ fakemixer = create_and_monitor_element ("fakemixer", "fakemixer", runner);
sink = create_and_monitor_element ("fakesink", "fakesink", runner);
srcpad1 = gst_element_get_static_pad (src1, "src");
srcpad_monitor1 = g_object_get_data (G_OBJECT (srcpad1), "validate-monitor");
srcpad2 = gst_element_get_static_pad (src2, "src");
srcpad_monitor2 = g_object_get_data (G_OBJECT (srcpad2), "validate-monitor");
- funnel_sink1 = gst_element_get_request_pad (funnel, "sink_%u");
- funnel_sink_monitor1 =
- g_object_get_data (G_OBJECT (funnel_sink1), "validate-monitor");
- funnel_sink2 = gst_element_get_request_pad (funnel, "sink_%u");
- funnel_sink_monitor2 =
- g_object_get_data (G_OBJECT (funnel_sink2), "validate-monitor");
+ fakemixer_sink1 = gst_element_get_request_pad (fakemixer, "sink_%u");
+ fakemixer_sink_monitor1 =
+ g_object_get_data (G_OBJECT (fakemixer_sink1), "validate-monitor");
+ fakemixer_sink2 = gst_element_get_request_pad (fakemixer, "sink_%u");
+ fakemixer_sink_monitor2 =
+ g_object_get_data (G_OBJECT (fakemixer_sink2), "validate-monitor");
sinkpad = gst_element_get_static_pad (sink, "sink");
sinkpad_monitor = g_object_get_data (G_OBJECT (sinkpad), "validate-monitor");
- fail_unless (gst_element_link (funnel, sink));
- fail_unless (gst_pad_link (srcpad1, funnel_sink1) == GST_PAD_LINK_OK);
- fail_unless (gst_pad_link (srcpad2, funnel_sink2) == GST_PAD_LINK_OK);
-
- /* There's gonna be some clunkiness in here because of funnel */
- probe_id1 = gst_pad_add_probe (srcpad1,
- GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST |
- GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, (GstPadProbeCallback) drop_buffers,
- NULL, NULL);
- probe_id2 =
- gst_pad_add_probe (srcpad2,
- GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST |
- GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, (GstPadProbeCallback) drop_buffers,
- NULL, NULL);
+ fail_unless (gst_element_link (fakemixer, sink));
+ fail_unless (gst_pad_link (srcpad1, fakemixer_sink1) == GST_PAD_LINK_OK);
+ fail_unless (gst_pad_link (srcpad2, fakemixer_sink2) == GST_PAD_LINK_OK);
/* We want to handle the src behaviour ourselves */
fail_unless (gst_pad_activate_mode (srcpad1, GST_PAD_MODE_PUSH, TRUE));
fail_unless (gst_pad_activate_mode (srcpad2, GST_PAD_MODE_PUSH, TRUE));
- /* Setup all needed events */
- gst_segment_init (&segment, GST_FORMAT_TIME);
- segment.start = 0;
- segment.stop = GST_SECOND;
-
- fail_unless (gst_pad_push_event (srcpad1,
- gst_event_new_stream_start ("the-stream")));
- fail_unless (gst_pad_push_event (srcpad1, gst_event_new_segment (&segment)));
-
- fail_unless (gst_pad_push_event (srcpad2,
- gst_event_new_stream_start ("the-stream")));
- fail_unless (gst_pad_push_event (srcpad2, gst_event_new_segment (&segment)));
+ gst_check_setup_events_with_stream_id (srcpad1, fakemixer, NULL,
+ GST_FORMAT_TIME, "stream1");
+ gst_check_setup_events_with_stream_id (srcpad2, fakemixer, NULL,
+ GST_FORMAT_TIME, "stream2");
- fail_unless_equals_int (gst_element_set_state (funnel, GST_STATE_PLAYING),
+ fail_unless_equals_int (gst_element_set_state (fakemixer, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
fail_unless_equals_int (gst_element_set_state (sink, GST_STATE_PLAYING),
GST_STATE_CHANGE_ASYNC);
sinkpad_monitor);
fail_unless_equals_int (n_reports, 1);
n_reports = gst_validate_reporter_get_reports_count ((GstValidateReporter *)
- funnel_sink_monitor1);
+ fakemixer_sink_monitor1);
fail_unless_equals_int (n_reports, 1);
- /* But not the pad monitor of the other funnel sink */
+ /* But not the pad monitor of the other fakemixer sink */
n_reports = gst_validate_reporter_get_reports_count ((GstValidateReporter *)
- funnel_sink_monitor2);
+ fakemixer_sink_monitor2);
fail_unless_equals_int (n_reports, 0);
n_reports = gst_validate_reporter_get_reports_count ((GstValidateReporter *)
srcpad_monitor2);
fail_unless_equals_int (n_reports, 0);
- /* Once again but on the other funnel sink */
+ /* Once again but on the other fakemixer sink */
fail_unless (gst_pad_push_event (srcpad2, gst_event_new_flush_stop (TRUE)));
/* The runner now sees two reports */
sinkpad_monitor);
fail_unless_equals_int (n_reports, 1);
n_reports = gst_validate_reporter_get_reports_count ((GstValidateReporter *)
- funnel_sink_monitor1);
+ fakemixer_sink_monitor1);
fail_unless_equals_int (n_reports, 1);
n_reports = gst_validate_reporter_get_reports_count ((GstValidateReporter *)
- funnel_sink_monitor2);
+ fakemixer_sink_monitor2);
fail_unless_equals_int (n_reports, 1);
n_reports = gst_validate_reporter_get_reports_count ((GstValidateReporter *)
srcpad_monitor2);
/* clean up */
fail_unless (gst_pad_activate_mode (srcpad1, GST_PAD_MODE_PUSH, FALSE));
fail_unless (gst_pad_activate_mode (srcpad2, GST_PAD_MODE_PUSH, FALSE));
- fail_unless_equals_int (gst_element_set_state (funnel, GST_STATE_NULL),
+ fail_unless_equals_int (gst_element_set_state (fakemixer, GST_STATE_NULL),
GST_STATE_CHANGE_SUCCESS);
fail_unless_equals_int (gst_element_set_state (sink, GST_STATE_NULL),
GST_STATE_CHANGE_SUCCESS);
- gst_pad_remove_probe (srcpad1, probe_id1);
- gst_pad_remove_probe (srcpad2, probe_id2);
-
/* The reporter, the runner */
_check_reports_refcount (srcpad1, 2);
/* The reporter, the master report */
- _check_reports_refcount (funnel_sink1, 2);
+ _check_reports_refcount (fakemixer_sink1, 2);
free_element_monitor (src1);
free_element_monitor (src2);
- free_element_monitor (funnel);
+ free_element_monitor (fakemixer);
free_element_monitor (sink);
gst_object_unref (srcpad1);
gst_object_unref (srcpad2);
gst_object_unref (sinkpad);
- gst_object_unref (funnel_sink1);
- gst_object_unref (funnel_sink2);
- check_destroyed (funnel, funnel_sink1, funnel_sink2, NULL);
+ gst_object_unref (fakemixer_sink1);
+ gst_object_unref (fakemixer_sink2);
+ check_destroyed (fakemixer, fakemixer_sink1, fakemixer_sink2, NULL);
check_destroyed (src1, srcpad1, NULL);
check_destroyed (src2, srcpad2, NULL);
check_destroyed (sink, sinkpad, NULL);
suite_add_tcase (s, tc_chain);
gst_validate_init ();
+ fake_elements_register ();
tcase_add_test (tc_chain, buffer_before_segment);
tcase_add_test (tc_chain, buffer_outside_segment);
GST_END_TEST;
-static GstPadProbeReturn
-drop_buffers (GstPad * pad, GstPadProbeInfo * info, gpointer unused)
-{
- return GST_PAD_PROBE_DROP;
-}
-
static void
_create_issues (GstValidateRunner * runner)
{
GstPad *srcpad1, *srcpad2, *sinkpad, *funnel_sink1, *funnel_sink2;
- GstElement *src1, *src2, *sink, *funnel;
+ GstElement *src1, *src2, *sink, *fakemixer;
GstSegment segment;
- gulong probe_id1, probe_id2;
- src1 = create_and_monitor_element ("fakesrc", "fakesrc1", runner);
- src2 = create_and_monitor_element ("fakesrc", "fakesrc2", runner);
- funnel = create_and_monitor_element ("funnel", "funnel", runner);
+ src1 = create_and_monitor_element ("fakesrc2", "fakesrc1", runner);
+ src2 = create_and_monitor_element ("fakesrc2", "fakesrc2", runner);
+ fakemixer = create_and_monitor_element ("fakemixer", "fakemixer", runner);
sink = create_and_monitor_element ("fakesink", "fakesink", runner);
srcpad1 = gst_element_get_static_pad (src1, "src");
srcpad2 = gst_element_get_static_pad (src2, "src");
- funnel_sink1 = gst_element_get_request_pad (funnel, "sink_%u");
- funnel_sink2 = gst_element_get_request_pad (funnel, "sink_%u");
+ funnel_sink1 = gst_element_get_request_pad (fakemixer, "sink_%u");
+ funnel_sink2 = gst_element_get_request_pad (fakemixer, "sink_%u");
sinkpad = gst_element_get_static_pad (sink, "sink");
- fail_unless (gst_element_link (funnel, sink));
+ fail_unless (gst_element_link (fakemixer, sink));
fail_unless (gst_pad_link (srcpad1, funnel_sink1) == GST_PAD_LINK_OK);
fail_unless (gst_pad_link (srcpad2, funnel_sink2) == GST_PAD_LINK_OK);
- /* There's gonna be some clunkiness in here because of funnel */
- probe_id1 = gst_pad_add_probe (srcpad1,
- GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
- (GstPadProbeCallback) drop_buffers, NULL, NULL);
- probe_id2 = gst_pad_add_probe (srcpad2,
- GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_BUFFER_LIST | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
- (GstPadProbeCallback) drop_buffers, NULL, NULL);
-
/* We want to handle the src behaviour ourselves */
fail_unless (gst_pad_activate_mode (srcpad1, GST_PAD_MODE_PUSH, TRUE));
fail_unless (gst_pad_activate_mode (srcpad2, GST_PAD_MODE_PUSH, TRUE));
gst_event_new_stream_start ("the-stream")));
fail_unless (gst_pad_push_event (srcpad2, gst_event_new_segment (&segment)));
- fail_unless_equals_int (gst_element_set_state (funnel, GST_STATE_PLAYING),
+ fail_unless_equals_int (gst_element_set_state (fakemixer, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
fail_unless_equals_int (gst_element_set_state (sink, GST_STATE_PLAYING),
GST_STATE_CHANGE_ASYNC);
_gst_check_expecting_log = TRUE;
fail_unless (gst_pad_push_event (srcpad1, gst_event_new_flush_stop (TRUE)));
- /* Once again but on the other funnel sink */
+ /* Once again but on the other fakemixer sink */
fail_unless (gst_pad_push_event (srcpad2, gst_event_new_flush_stop (TRUE)));
/* clean up */
fail_unless (gst_pad_activate_mode (srcpad1, GST_PAD_MODE_PUSH, FALSE));
fail_unless (gst_pad_activate_mode (srcpad2, GST_PAD_MODE_PUSH, FALSE));
- fail_unless_equals_int (gst_element_set_state (funnel, GST_STATE_NULL),
+ fail_unless_equals_int (gst_element_set_state (fakemixer, GST_STATE_NULL),
GST_STATE_CHANGE_SUCCESS);
fail_unless_equals_int (gst_element_set_state (sink, GST_STATE_NULL),
GST_STATE_CHANGE_SUCCESS);
- gst_pad_remove_probe (srcpad1, probe_id1);
- gst_pad_remove_probe (srcpad2, probe_id2);
-
gst_object_unref (srcpad1);
gst_object_unref (srcpad2);
gst_object_unref (sinkpad);
gst_object_unref (funnel_sink1);
gst_object_unref (funnel_sink2);
- check_destroyed (funnel, funnel_sink1, funnel_sink2, NULL);
+ check_destroyed (fakemixer, funnel_sink1, funnel_sink2, NULL);
check_destroyed (src1, srcpad1, NULL);
check_destroyed (src2, srcpad2, NULL);
check_destroyed (sink, sinkpad, NULL);
fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS", "all", TRUE));
runner = gst_validate_runner_new ();
_create_issues (runner);
- /* One report for each pad monitor, plus one for funnel src and fakesink sink */
+ /* One report for each pad monitor, plus one for fakemixer src and fakesink sink */
fail_unless_equals_int (gst_validate_runner_get_reports_count (runner), 8);
g_object_unref (runner);
}
{
GstValidateRunner *runner;
- fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS", "none,fakesrc1:synthetic",
- TRUE));
+ fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS",
+ "none,fakesrc1:synthetic", TRUE));
runner = gst_validate_runner_new ();
_create_issues (runner);
/* One issue should go through the none filter */
fail_unless_equals_int (gst_validate_runner_get_reports_count (runner), 5);
g_object_unref (runner);
- fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS", "subchain,sink:monitor",
- TRUE));
+ fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS",
+ "subchain,sink:monitor", TRUE));
runner = gst_validate_runner_new ();
_create_issues (runner);
/* 3 issues because both fake sources will have subsequent subchains of
g_object_unref (runner);
fail_unless (g_setenv ("GST_VALIDATE_REPORTING_DETAILS",
- "synthetic,fakesrc1:subchain,fakesrc2:subchain,funnel*::src*:monitor",
+ "synthetic,fakesrc1:subchain,fakesrc2:subchain,fakemixer*::src*:monitor",
TRUE));
runner = gst_validate_runner_new ();
_create_issues (runner);
- /* 4 issues because the funnel sink issues will be concatenated with the
- * fakesrc issues, the funnel src will report its issue separately, and the
+ /* 4 issues because the fakemixer sink issues will be concatenated with the
+ * fakesrc issues, the fakemixer src will report its issue separately, and the
* sink will not find a report immediately upstream */
fail_unless_equals_int (gst_validate_runner_get_reports_count (runner), 4);
g_object_unref (runner);
suite_add_tcase (s, tc_chain);
gst_validate_init ();
+ fake_elements_register ();
tcase_add_test (tc_chain, test_report_levels);
tcase_add_test (tc_chain, test_global_levels);
g_object_unref (G_OBJECT (monitor));
}
+/******************************************
+ * Fake decoder *
+ ******************************************/
static GstStaticPadTemplate fake_decoder_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
{
return GST_ELEMENT (g_object_new (FAKE_DECODER_TYPE, NULL));
}
+
+/******************************************
+ * Fake mixer *
+ ******************************************/
+static GstElementClass *fake_mixer_parent_class = NULL;
+
+static GstStaticPadTemplate fake_mixer_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("something")
+ );
+
+static GstStaticPadTemplate fake_mixer_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink_%u",
+ GST_PAD_SINK,
+ GST_PAD_REQUEST,
+ GST_STATIC_CAPS ("something")
+ );
+
+static gboolean
+_mixer_event (GstPad * pad, GstObject * obj, GstEvent * event)
+{
+ FakeMixer *self = FAKE_MIXER (obj);
+
+ switch (event->type) {
+ case GST_EVENT_STREAM_START:
+ if (g_atomic_int_compare_and_exchange (&self->sent_stream_start, FALSE,
+ TRUE)) {
+ return gst_pad_event_default (pad, obj, event);
+ } else {
+ gst_event_unref (event);
+ return TRUE;
+ }
+ case GST_EVENT_SEGMENT:
+ if (g_atomic_int_compare_and_exchange (&self->sent_segment, FALSE, TRUE)) {
+ return gst_pad_event_default (pad, obj, event);
+ } else {
+ gst_event_unref (event);
+ return TRUE;
+ }
+ default:
+ return gst_pad_event_default (pad, obj, event);
+ }
+}
+
+static GstFlowReturn
+_mixer_chain (GstPad * pad, GstObject * self, GstBuffer * buffer)
+{
+ gst_buffer_unref (buffer);
+
+ return FAKE_MIXER (self)->return_value;
+}
+
+static GstPad *
+_request_new_pad (GstElement * element,
+ GstPadTemplate * templ, const gchar * req_name, const GstCaps * caps)
+{
+ GstPad *pad;
+ GstPadTemplate *pad_template;
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS
+ (element)), "sink_%u");
+ pad = gst_pad_new_from_template (pad_template, req_name);
+
+ gst_pad_set_chain_function (pad, _mixer_chain);
+ gst_pad_set_event_function (pad, _mixer_event);
+
+ gst_element_add_pad (element, pad);
+
+ return pad;
+}
+
+static void
+fake_mixer_init (FakeMixer * self, FakeMixerClass * g_class)
+{
+ GstPad *pad;
+ GstElement *element = GST_ELEMENT (self);
+ GstPadTemplate *pad_template;
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
+ pad = gst_pad_new_from_template (pad_template, "src");
+ gst_element_add_pad (element, pad);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink");
+
+ self->return_value = GST_FLOW_OK;
+}
+
+static void
+fake_mixer_class_init (FakeMixerClass * self_class)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (self_class);
+
+ fake_mixer_parent_class = g_type_class_peek_parent (self_class);
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fake_mixer_src_template));
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fake_mixer_sink_template));
+ gst_element_class_set_static_metadata (gstelement_class,
+ "Fake mixer", "Mixer", "Some mixer", "Thibault Saunier");
+
+ gstelement_class->request_new_pad = GST_DEBUG_FUNCPTR (_request_new_pad);
+}
+
+GType
+fake_mixer_get_type (void)
+{
+ static volatile gsize type = 0;
+
+ if (g_once_init_enter (&type)) {
+ GType _type;
+ static const GTypeInfo info = {
+ sizeof (FakeMixerClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) fake_mixer_class_init,
+ NULL,
+ NULL,
+ sizeof (FakeMixer),
+ 0,
+ (GInstanceInitFunc) fake_mixer_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT, "FakeMixer", &info, 0);
+ g_once_init_leave (&type, _type);
+ }
+ return type;
+}
+
+GstElement *
+fake_mixer_new (void)
+{
+ return GST_ELEMENT (g_object_new (FAKE_MIXER_TYPE, NULL));
+}
+
+/******************************************
+ * Fake Source *
+ *******************************************/
+static GstElementClass *fake_src_parent_class = NULL;
+
+static GstStaticPadTemplate fake_src_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ GST_STATIC_CAPS ("something")
+ );
+
+static void
+fake_src_init (FakeSrc * self, FakeSrcClass * g_class)
+{
+ GstPad *pad;
+ GstElement *element = GST_ELEMENT (self);
+ GstPadTemplate *pad_template;
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
+ pad = gst_pad_new_from_template (pad_template, "src");
+ gst_element_add_pad (element, pad);
+
+ pad_template =
+ gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink");
+
+ self->return_value = GST_FLOW_OK;
+}
+
+static void
+fake_src_class_init (FakeSrcClass * self_class)
+{
+ GstElementClass *gstelement_class = GST_ELEMENT_CLASS (self_class);
+
+ fake_src_parent_class = g_type_class_peek_parent (self_class);
+
+ gst_element_class_add_pad_template (gstelement_class,
+ gst_static_pad_template_get (&fake_src_src_template));
+ gst_element_class_set_static_metadata (gstelement_class,
+ "Fake src", "Source", "Some src", "Thibault Saunier");
+}
+
+GType
+fake_src_get_type (void)
+{
+ static volatile gsize type = 0;
+
+ if (g_once_init_enter (&type)) {
+ GType _type;
+ static const GTypeInfo info = {
+ sizeof (FakeSrcClass),
+ NULL,
+ NULL,
+ (GClassInitFunc) fake_src_class_init,
+ NULL,
+ NULL,
+ sizeof (FakeSrc),
+ 0,
+ (GInstanceInitFunc) fake_src_init,
+ };
+
+ _type = g_type_register_static (GST_TYPE_ELEMENT, "FakeSrc", &info, 0);
+ g_once_init_leave (&type, _type);
+ }
+ return type;
+}
+
+GstElement *
+fake_src_new (void)
+{
+ return GST_ELEMENT (g_object_new (FAKE_SRC_TYPE, NULL));
+}
+
+
+void
+fake_elements_register (void)
+{
+ gst_element_register (NULL, "fakemixer", 0, FAKE_MIXER_TYPE);
+ gst_element_register (NULL, "fakedecoder", 0, FAKE_DECODER_TYPE);
+ gst_element_register (NULL, "fakedemuxer", 0, FAKE_DEMUXER_TYPE);
+ gst_element_register (NULL, "fakesrc2", 0, FAKE_SRC_TYPE);
+}
GType fake_decoder_get_type (void);
GstElement * fake_decoder_new (void);
+typedef struct {
+ GstElement parent;
+
+ GstFlowReturn return_value;
+
+ /* <private> */
+ gboolean sent_stream_start;
+ gboolean sent_segment;
+} FakeMixer;
+
+typedef struct {
+ GstElementClass parent;
+} FakeMixerClass;
+
+#define FAKE_MIXER_TYPE (fake_mixer_get_type ())
+#define FAKE_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FAKE_MIXER_TYPE, FakeMixer))
+#define FAKE_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FAKE_MIXER_TYPE, FakeMixerClass))
+#define IS_FAKE_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FAKE_MIXER_TYPE))
+#define IS_FAKE_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FAKE_MIXER_TYPE))
+#define FAKE_MIXER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FAKE_MIXER_TYPE, FakeMixerClass))
+
+GType fake_mixer_get_type (void);
+GstElement * fake_mixer_new (void);
+
+typedef struct {
+ GstElement parent;
+
+ GstFlowReturn return_value;
+
+} FakeSrc;
+
+typedef struct {
+ GstElementClass parent;
+} FakeSrcClass;
+
+#define FAKE_SRC_TYPE (fake_src_get_type ())
+#define FAKE_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FAKE_SRC_TYPE, FakeSrc))
+#define FAKE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FAKE_SRC_TYPE, FakeSrcClass))
+#define IS_FAKE_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FAKE_SRC_TYPE))
+#define IS_FAKE_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FAKE_SRC_TYPE))
+#define FAKE_SRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FAKE_SRC_TYPE, FakeSrcClass))
+
+GType fake_src_get_type (void);
+GstElement * fake_src_new (void);
+
+void fake_elements_register (void);
+
G_END_DECLS
#endif /* _GST_VALIDATE_TEST_UTILS */