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); }