static GstPad *mysrcpad, *mysinkpad;
static GstElement *dec;
+static GList *events = NULL;
#define TEST_VIDEO_WIDTH 640
#define TEST_VIDEO_HEIGHT 480
{
}
+static gboolean
+_mysinkpad_event (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+ events = g_list_append (events, event);
+ return TRUE;
+}
+
static void
setup_videodecodertester (void)
{
dec = g_object_new (GST_VIDEO_DECODER_TESTER_TYPE, NULL);
mysrcpad = gst_check_setup_src_pad (dec, &srctemplate);
mysinkpad = gst_check_setup_sink_pad (dec, &sinktemplate);
+
+ gst_pad_set_event_function (mysinkpad, _mysinkpad_event);
}
static void
gst_check_teardown_element (dec);
}
+static void
+send_startup_events (void)
+{
+ GstCaps *caps;
+
+ fail_unless (gst_pad_push_event (mysrcpad,
+ gst_event_new_stream_start ("randomvalue")));
+
+ /* push caps */
+ caps =
+ gst_caps_new_simple ("video/x-test-custom", "width", G_TYPE_INT,
+ TEST_VIDEO_WIDTH, "height", G_TYPE_INT, TEST_VIDEO_HEIGHT, "framerate",
+ GST_TYPE_FRACTION, TEST_VIDEO_FPS_N, TEST_VIDEO_FPS_D, NULL);
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_caps (caps)));
+
+}
+
#define NUM_BUFFERS 1000
GST_START_TEST (videodecoder_playback)
{
GstSegment segment;
- GstCaps *caps;
GstBuffer *buffer;
guint64 i;
GList *iter;
gst_element_set_state (dec, GST_STATE_PLAYING);
gst_pad_set_active (mysinkpad, TRUE);
- fail_unless (gst_pad_push_event (mysrcpad,
- gst_event_new_stream_start ("randomvalue")));
-
- /* push caps */
- caps =
- gst_caps_new_simple ("video/x-test-custom", "width", G_TYPE_INT,
- TEST_VIDEO_WIDTH, "height", G_TYPE_INT, TEST_VIDEO_HEIGHT, "framerate",
- GST_TYPE_FRACTION, TEST_VIDEO_FPS_N, TEST_VIDEO_FPS_D, NULL);
- fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_caps (caps)));
+ send_startup_events ();
/* push a new segment */
gst_segment_init (&segment, GST_FORMAT_TIME);
GST_END_TEST;
+
+GST_START_TEST (videodecoder_playback_with_events)
+{
+ GstSegment segment;
+ GstBuffer *buffer;
+ guint64 i;
+ GList *iter;
+ GList *events_iter;
+
+ setup_videodecodertester ();
+
+ gst_pad_set_active (mysrcpad, TRUE);
+ gst_element_set_state (dec, GST_STATE_PLAYING);
+ gst_pad_set_active (mysinkpad, TRUE);
+
+ send_startup_events ();
+
+ /* push a new segment */
+ gst_segment_init (&segment, GST_FORMAT_TIME);
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
+
+ /* push buffers, the data is actually a number so we can track them */
+ for (i = 0; i < NUM_BUFFERS; i++) {
+ if (i % 10 == 0) {
+ GstTagList *tags;
+
+ tags = gst_tag_list_new (GST_TAG_TRACK_NUMBER, i, NULL);
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_tag (tags)));
+ } else {
+ guint64 *data = g_malloc (sizeof (guint64));
+
+ *data = i;
+
+ buffer = gst_buffer_new_wrapped (data, sizeof (guint64));
+
+ GST_BUFFER_PTS (buffer) =
+ gst_util_uint64_scale_round (i, GST_SECOND * TEST_VIDEO_FPS_D,
+ TEST_VIDEO_FPS_N);
+ GST_BUFFER_DURATION (buffer) =
+ gst_util_uint64_scale_round (GST_SECOND, TEST_VIDEO_FPS_D,
+ TEST_VIDEO_FPS_N);
+
+ fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK);
+ }
+ }
+
+ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
+
+ events_iter = events;
+ /* make sure the usual events have been received */
+ {
+ GstEvent *sstart = events_iter->data;
+ fail_unless (GST_EVENT_TYPE (sstart) == GST_EVENT_STREAM_START);
+ events_iter = g_list_next (events_iter);
+ }
+ {
+ GstEvent *caps_event = events_iter->data;
+ fail_unless (GST_EVENT_TYPE (caps_event) == GST_EVENT_CAPS);
+ events_iter = g_list_next (events_iter);
+ }
+ {
+ GstEvent *segment_event = events_iter->data;
+ fail_unless (GST_EVENT_TYPE (segment_event) == GST_EVENT_SEGMENT);
+ events_iter = g_list_next (events_iter);
+ }
+
+ /* check that all buffers were received by our source pad */
+ iter = buffers;
+ for (i = 0; i < NUM_BUFFERS; i++) {
+ if (i % 10 == 0) {
+ guint tag_v;
+ GstEvent *tag_event = events_iter->data;
+ GstTagList *taglist = NULL;
+
+ gst_event_parse_tag (tag_event, &taglist);
+
+ fail_unless (gst_tag_list_get_uint (taglist, GST_TAG_TRACK_NUMBER,
+ &tag_v));
+ fail_unless (tag_v == i);
+
+ events_iter = g_list_next (events_iter);
+ } else {
+ GstMapInfo map;
+ guint64 num;
+
+ buffer = iter->data;
+
+ gst_buffer_map (buffer, &map, GST_MAP_READ);
+
+ num = *(guint64 *) map.data;
+ fail_unless (i == num);
+ fail_unless (GST_BUFFER_PTS (buffer) == gst_util_uint64_scale_round (i,
+ GST_SECOND * TEST_VIDEO_FPS_D, TEST_VIDEO_FPS_N));
+ fail_unless (GST_BUFFER_DURATION (buffer) ==
+ gst_util_uint64_scale_round (GST_SECOND, TEST_VIDEO_FPS_D,
+ TEST_VIDEO_FPS_N));
+
+ gst_buffer_unmap (buffer, &map);
+ iter = g_list_next (iter);
+ }
+ }
+ fail_unless (iter == NULL);
+
+ /* check that EOS was received */
+ {
+ GstEvent *eos = events_iter->data;
+
+ fail_unless (GST_EVENT_TYPE (eos) == GST_EVENT_EOS);
+ events_iter = g_list_next (events_iter);
+ }
+
+ fail_unless (events_iter == NULL);
+
+ g_list_free_full (buffers, (GDestroyNotify) gst_buffer_unref);
+ g_list_free_full (events, (GDestroyNotify) gst_event_unref);
+ buffers = NULL;
+ events = NULL;
+
+ cleanup_videodecodertest ();
+}
+
+GST_END_TEST;
+
static Suite *
gst_videodecoder_suite (void)
{
suite_add_tcase (s, tc);
tcase_add_test (tc, videodecoder_playback);
+ tcase_add_test (tc, videodecoder_playback_with_events);
return s;
}