static void run_seek_position_test (gdouble rate, GstSeekType start_type, 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, start_type, 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; }
static void run_seek_position_test (gdouble rate, GstSeekType start_type, guint64 seek_start, GstSeekType stop_type, guint64 seek_stop, GstSeekFlags flags, guint64 segment_start, guint64 segment_stop, gint segments) { const gchar *mpd = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" " xmlns=\"urn:mpeg:DASH:schema:MPD:2011\"" " xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\"" " xmlns:yt=\"http://youtube.com/yt/2012/10/10\"" " profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\"" " type=\"static\"" " minBufferTime=\"PT1.500S\"" " mediaPresentationDuration=\"PT135.743S\">" " <Period>" " <AdaptationSet " " mimeType=\"audio/mp4\" minBandwidth=\"128000\" " " maxBandwidth=\"128000\" segmentAlignment=\"true\">" " <SegmentTemplate timescale=\"48000\" " " initialization=\"init-$RepresentationID$.mp4\" " " media=\"$RepresentationID$-$Number$.mp4\" " " startNumber=\"1\">" " <SegmentTimeline>" " <S t=\"0\" d=\"48000\" /> " " <S d=\"48000\" /> " " <S d=\"48000\" /> " " <S d=\"48000\" /> " " </SegmentTimeline>" " </SegmentTemplate>" " <Representation id=\"audio\" bandwidth=\"128000\" " " codecs=\"mp4a.40.2\" audioSamplingRate=\"48000\"> " " <AudioChannelConfiguration " " schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\"" " value=\"2\"> " " </AudioChannelConfiguration> " " </Representation></AdaptationSet></Period></MPD>"; GstDashDemuxTestInputData inputTestData[] = { {"http://unit.test/test.mpd", (guint8 *) mpd, 0}, {"http://unit.test/init-audio.mp4", NULL, 10000}, {"http://unit.test/audio-1.mp4", NULL, 10000}, {"http://unit.test/audio-2.mp4", NULL, 10000}, {"http://unit.test/audio-3.mp4", NULL, 10000}, {"http://unit.test/audio-4.mp4", NULL, 10000}, {NULL, NULL, 0}, }; GstTestHTTPSrcCallbacks http_src_callbacks = { 0 }; GstAdaptiveDemuxTestExpectedOutput outputTestData[] = { /* 1 from the init segment */ {"audio_00", (1 + segments) * 10000, NULL}, }; GstAdaptiveDemuxTestCase *testData; testData = gst_adaptive_demux_test_case_new (); http_src_callbacks.src_start = gst_dashdemux_http_src_start; http_src_callbacks.src_create = gst_dashdemux_http_src_create; COPY_OUTPUT_TEST_DATA (outputTestData, testData); /* media segment starts at 4687 * Issue a seek request after media segment has started to be downloaded * on the first pad listed in GstAdaptiveDemuxTestOutputStreamData and the * first chunk of at least one byte has already arrived in AppSink */ testData->threshold_for_seek = 4687 + 1; /* FIXME hack to avoid having a 0 seqnum */ gst_util_seqnum_next (); /* seek to 5ms. * Because there is only one fragment, we expect the whole file to be * downloaded again */ testData->seek_event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags, start_type, seek_start, stop_type, seek_stop); gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData); gst_adaptive_demux_test_seek (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd", testData); gst_object_unref (testData); }
static void run_seek_position_test (gdouble rate, GstSeekType start_type, guint64 seek_start, GstSeekType stop_type, guint64 seek_stop, GstSeekFlags flags, guint64 segment_start, guint64 segment_stop, gint segments) { const gchar *mpd = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<SmoothStreamingMedia MajorVersion=\"2\" MinorVersion=\"0\" Duration=\"40000000\">" "<StreamIndex Type=\"audio\" Language=\"eng\" QualityLevels=\"1\" Chunks=\"1\" Url=\"QualityLevels({bitrate})/Fragments(audio_eng={start time})\">" "<QualityLevel Index=\"0\" Bitrate=\"200029\" FourCC=\"AACL\" SamplingRate=\"48000\" Channels=\"2\" BitsPerSample=\"16\" PacketSize=\"4\" AudioTag=\"255\" CodecPrivateData=\"1190\" />" "<c n=\"0\" d=\"10000000\" />" "<c n=\"1\" d=\"10000000\" />" "<c n=\"2\" d=\"10000000\" />" "<c n=\"3\" d=\"10000000\" />" "</StreamIndex>" "</SmoothStreamingMedia>"; GstMssDemuxTestInputData inputTestData[] = { {"http://unit.test/Manifest", (guint8 *) mpd, 0}, {"http://unit.test/QualityLevels(200029)/Fragments(audio_eng=0)", NULL, 10000}, {"http://unit.test/QualityLevels(200029)/Fragments(audio_eng=10000000)", NULL, 10000}, {"http://unit.test/QualityLevels(200029)/Fragments(audio_eng=20000000)", NULL, 10000}, {"http://unit.test/QualityLevels(200029)/Fragments(audio_eng=30000000)", NULL, 10000}, {NULL, NULL, 0}, }; GstTestHTTPSrcCallbacks http_src_callbacks = { 0 }; GstAdaptiveDemuxTestExpectedOutput outputTestData[] = { /* 1 from the init segment */ {"audio_00", segments * 10000, NULL}, }; GstAdaptiveDemuxTestCase *testData; testData = gst_adaptive_demux_test_case_new (); http_src_callbacks.src_start = gst_mssdemux_http_src_start; http_src_callbacks.src_create = gst_mssdemux_http_src_create; COPY_OUTPUT_TEST_DATA (outputTestData, testData); /* media segment starts at 4687 * Issue a seek request after media segment has started to be downloaded * on the first pad listed in GstAdaptiveDemuxTestOutputStreamData and the * first chunk of at least one byte has already arrived in AppSink */ testData->threshold_for_seek = 4687 + 1; /* FIXME hack to avoid having a 0 seqnum */ gst_util_seqnum_next (); /* seek to 5ms. * Because there is only one fragment, we expect the whole file to be * downloaded again */ testData->seek_event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags, start_type, seek_start, stop_type, seek_stop); gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData); gst_adaptive_demux_test_seek (DEMUX_ELEMENT_NAME, "http://unit.test/Manifest", testData); g_object_unref (testData); }