From be753b49517303b34913ad225f2aec7cd6e4d934 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Thu, 24 Dec 2015 18:49:39 -0300 Subject: tests: hls_demux: add tests for seeking segment Tests that check that the segment sent after a seek is correct. Allows testing that multiple seeking flags work as expected --- tests/check/elements/adaptive_demux_common.c | 17 ++++- tests/check/elements/hls_demux.c | 106 +++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/check/elements/adaptive_demux_common.c b/tests/check/elements/adaptive_demux_common.c index e3c41995b..18db46649 100644 --- a/tests/check/elements/adaptive_demux_common.c +++ b/tests/check/elements/adaptive_demux_common.c @@ -365,16 +365,25 @@ testSeekAdaptiveAppSinkEvent (GstAdaptiveDemuxTestEngine * engine, && gst_event_get_seqnum (event) == gst_event_get_seqnum (testData->seek_event)) { const GstSegment *seek_segment; + GstSeekType start_type, stop_type; + + gst_event_parse_seek (testData->seek_event, NULL, NULL, NULL, &start_type, + NULL, &stop_type, NULL); gst_event_parse_segment (event, &seek_segment); fail_unless (seek_segment->format == testOutputStreamData->post_seek_segment.format); fail_unless (seek_segment->rate == testOutputStreamData->post_seek_segment.rate); - fail_unless (seek_segment->start == - testOutputStreamData->post_seek_segment.start); - fail_unless (seek_segment->stop == - testOutputStreamData->post_seek_segment.stop); + if (start_type != GST_SEEK_TYPE_NONE) { + fail_unless (seek_segment->start == + testOutputStreamData->post_seek_segment.start); + } + if (stop_type != GST_SEEK_TYPE_NONE) { + fail_unless (seek_segment->stop == + testOutputStreamData->post_seek_segment.stop); + } + fail_unless (seek_segment->base == testOutputStreamData->post_seek_segment.base); fail_unless (seek_segment->time == diff --git a/tests/check/elements/hls_demux.c b/tests/check/elements/hls_demux.c index 8953458ba..d1f532db9 100644 --- a/tests/check/elements/hls_demux.c +++ b/tests/check/elements/hls_demux.c @@ -393,6 +393,108 @@ GST_START_TEST (testSeek) GST_END_TEST; +static void +run_seek_position_test (gdouble rate, guint64 seek_start, GstSeekType stop_type, + guint64 seek_stop, GstSeekFlags flags, guint64 segment_start, + guint64 segment_stop, gint segments) +{ + const guint segment_size = 60 * TS_PACKET_LEN; + const gchar *manifest = + "#EXTM3U \n" + "#EXT-X-TARGETDURATION:1\n" + "#EXTINF:1,Test\n" "001.ts\n" + "#EXTINF:1,Test\n" "002.ts\n" + "#EXTINF:1,Test\n" "003.ts\n" + "#EXTINF:1,Test\n" "004.ts\n" "#EXT-X-ENDLIST\n"; + GstHlsDemuxTestInputData inputTestData[] = { + {"http://unit.test/media.m3u8", (guint8 *) manifest, 0}, + {"http://unit.test/001.ts", NULL, segment_size}, + {"http://unit.test/002.ts", NULL, segment_size}, + {"http://unit.test/003.ts", NULL, segment_size}, + {"http://unit.test/004.ts", NULL, segment_size}, + {NULL, NULL, 0}, + }; + GstAdaptiveDemuxTestExpectedOutput outputTestData[] = { + {"src_0", segment_size * segments, NULL}, + {NULL, 0, NULL} + }; + GstTestHTTPSrcCallbacks http_src_callbacks = { 0 }; + GstAdaptiveDemuxTestCase *engineTestData; + GstHlsDemuxTestCase hlsTestCase = { 0 }; + GByteArray *mpeg_ts = NULL; + + engineTestData = gst_adaptive_demux_test_case_new (); + mpeg_ts = setup_test_variables (inputTestData, outputTestData, + &hlsTestCase, engineTestData, segment_size); + + http_src_callbacks.src_start = gst_hlsdemux_test_src_start; + http_src_callbacks.src_create = gst_hlsdemux_test_src_create; + + /* FIXME hack to avoid having a 0 seqnum */ + gst_util_seqnum_next (); + + /* Seek to 1.5s, expect it to start from 1s */ + engineTestData->threshold_for_seek = 20 * TS_PACKET_LEN; + engineTestData->seek_event = + gst_event_new_seek (rate, GST_FORMAT_TIME, flags, GST_SEEK_TYPE_SET, + seek_start, stop_type, seek_stop); + gst_segment_init (&outputTestData[0].post_seek_segment, GST_FORMAT_TIME); + outputTestData[0].post_seek_segment.rate = rate; + outputTestData[0].post_seek_segment.start = segment_start; + outputTestData[0].post_seek_segment.time = segment_start; + outputTestData[0].post_seek_segment.stop = segment_stop; + outputTestData[0].segment_verification_needed = TRUE; + + gst_test_http_src_install_callbacks (&http_src_callbacks, &hlsTestCase); + gst_adaptive_demux_test_seek (DEMUX_ELEMENT_NAME, + inputTestData[0].uri, engineTestData); + + TESTCASE_UNREF_BOILERPLATE; +} + + +GST_START_TEST (testSeekKeyUnitPosition) +{ + /* Seek to 1.5s with key unit, it should go back to 1.0s. 3 segments will be + * pushed */ + run_seek_position_test (1.0, 1500 * GST_MSECOND, GST_SEEK_TYPE_NONE, 0, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT, 1000 * GST_MSECOND, -1, 3); +} + +GST_END_TEST; + +GST_START_TEST (testSeekPosition) +{ + /* Seek to 1.5s without key unit, it should keep the 1.5s, but still push + * from the 1st segment, so 3 segments will be + * pushed */ + run_seek_position_test (1.0, 1500 * GST_MSECOND, GST_SEEK_TYPE_NONE, 0, + GST_SEEK_FLAG_FLUSH, 1500 * GST_MSECOND, -1, 3); +} + +GST_END_TEST; + +GST_START_TEST (testSeekSnapBeforePosition) +{ + /* Seek to 1.5s, snap before, it go to 1s */ + run_seek_position_test (1.0, 1500 * GST_MSECOND, GST_SEEK_TYPE_NONE, 0, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SNAP_BEFORE, 1000 * GST_MSECOND, -1, + 3); +} + +GST_END_TEST; + + +GST_START_TEST (testSeekSnapAfterPosition) +{ + /* Seek to 1.5s with snap after, it should move to 2s */ + run_seek_position_test (1.0, 1500 * GST_MSECOND, GST_SEEK_TYPE_NONE, 0, + GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SNAP_AFTER, 2000 * GST_MSECOND, -1, + 2); +} + +GST_END_TEST; + static void testDownloadErrorMessageCallback (GstAdaptiveDemuxTestEngine * engine, GstMessage * msg, gpointer user_data) @@ -590,6 +692,10 @@ hls_demux_suite (void) tcase_add_test (tc_basicTest, testFragmentNotFound); tcase_add_test (tc_basicTest, testFragmentDownloadError); tcase_add_test (tc_basicTest, testSeek); + tcase_add_test (tc_basicTest, testSeekKeyUnitPosition); + tcase_add_test (tc_basicTest, testSeekPosition); + tcase_add_test (tc_basicTest, testSeekSnapBeforePosition); + tcase_add_test (tc_basicTest, testSeekSnapAfterPosition); tcase_add_unchecked_fixture (tc_basicTest, gst_adaptive_demux_test_setup, gst_adaptive_demux_test_teardown); -- cgit v1.2.1