From c564d5b2c978b12baeee974827ef755248884e07 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Tue, 7 Jan 2014 22:04:20 -0300 Subject: [PATCH] tests: videodecoder: add check for serialization of events Tests that events are properly serialized with buffers, also checks that the usual events are sent (stream start, caps, segment and eos). --- tests/check/libs/videodecoder.c | 166 +++++++++++++++++++++++++++++--- 1 file changed, 154 insertions(+), 12 deletions(-) diff --git a/tests/check/libs/videodecoder.c b/tests/check/libs/videodecoder.c index 0644ffa5d4..7fb82a0c35 100644 --- a/tests/check/libs/videodecoder.c +++ b/tests/check/libs/videodecoder.c @@ -29,6 +29,7 @@ static GstPad *mysrcpad, *mysinkpad; static GstElement *dec; +static GList *events = NULL; #define TEST_VIDEO_WIDTH 640 #define TEST_VIDEO_HEIGHT 480 @@ -133,6 +134,13 @@ gst_video_decoder_tester_init (GstVideoDecoderTester * tester) { } +static gboolean +_mysinkpad_event (GstPad * pad, GstObject * parent, GstEvent * event) +{ + events = g_list_append (events, event); + return TRUE; +} + static void setup_videodecodertester (void) { @@ -150,6 +158,8 @@ 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 @@ -162,20 +172,10 @@ cleanup_videodecodertest (void) gst_check_teardown_element (dec); } -#define NUM_BUFFERS 1000 -GST_START_TEST (videodecoder_playback) +static void +send_startup_events (void) { - GstSegment segment; GstCaps *caps; - GstBuffer *buffer; - guint64 i; - GList *iter; - - setup_videodecodertester (); - - gst_pad_set_active (mysrcpad, TRUE); - 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"))); @@ -187,6 +187,24 @@ GST_START_TEST (videodecoder_playback) 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; + GstBuffer *buffer; + guint64 i; + GList *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))); @@ -243,6 +261,129 @@ GST_START_TEST (videodecoder_playback) 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) { @@ -251,6 +392,7 @@ 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; }