Thiago Santos
b01a3729c0
dash: mpdparser: allow periods without start time for live streams
...
Live streams can have undefined start times for the periods and
mpdparser can let that pass instead of erroring out
2013-05-08 18:14:41 -03:00
Thiago Santos
cff4498f7c
dash: mpdparser: use guint64 for timestamps
...
The timestamps can be pretty big, so use guint64 for them
2013-05-08 18:14:41 -03:00
Thiago Santos
a53fd87508
dashdemux: mpd parsing: fix query parameter parsing
...
Try harder to detect URL parameters and split them to accomodate
the fragment url in the concat:
base-url + fragment-url + url-parameters
2013-05-08 18:14:41 -03:00
Thiago Santos
4ca530f2fe
dashdemux: plug some leaks
...
Add some missing free/unrefs spotted by valgrind
2013-05-08 18:14:41 -03:00
Thiago Santos
c82606a600
dashdemux: remove unused mutexes
2013-05-08 18:14:41 -03:00
Thiago Santos
737d328bb5
dashdemux: properly reset stream status after a flush
...
The stream eos/end of period status must also be reset after a flushing
seek. This makes seeking after EOS work.
2013-05-08 18:14:41 -03:00
Andre Moreira Magalhaes (andrunko)
fbbf713e45
dashdemux: keep a list of streams periods
...
Keep a list of streams per period so that the download loop can keep
downloading while the stream loop is still pushing old period's data.
2013-05-08 18:14:41 -03:00
Andre Moreira Magalhaes (andrunko)
b9272dc0e6
dashdemux: Properly parse base uri from mpd.
2013-05-08 18:14:40 -03:00
Andre Moreira Magalhaes (andrunko)
6ecb58c4f8
dashdemux: Remove unused members.
2013-05-08 18:14:40 -03:00
Andre Moreira Magalhaes (andrunko)
497500dbfe
dashdemux: Only send newsegment on seek.
2013-05-08 18:14:40 -03:00
Thiago Santos
3bc62ccc51
dashdemux: send segments that overwrite previous ones
...
This is only done for seeks, so it is fine
2013-05-08 18:14:40 -03:00
Andre Moreira Magalhaes (andrunko)
2b83b4410c
dashdemux: switch bitrates without switching pads
2013-05-08 18:14:40 -03:00
Andre Moreira Magalhaes (andrunko)
11697b9968
dashdemux: Remove unusued method.
2013-05-08 18:14:40 -03:00
Andre Moreira Magalhaes (andrunko)
daea47d3f4
dashdemux: Set stream need_header after seek and has_data_queued to FALSE when flushing stream.
2013-05-08 18:14:40 -03:00
Thiago Santos
4a9d7f0a9f
dashdemux: do not pause/start the stream loop on playing/paused changes
...
The demuxer shouldn't care about paused/playing, it should act the
same in both states
2013-05-08 18:14:39 -03:00
Thiago Santos
2fe509d50a
dashdemux: remove property that isn't used anymore
...
Remove some pieces of code that are from an old property
that isn't used anymore
2013-05-08 18:14:39 -03:00
Thiago Santos
460542daaf
dashdemux: add a downloadrate utility
...
A small struct that keeps a short history of fragment download bitrates
to have an average measure of N last fragments instead of using only
the last downloaded bitrate
2013-05-08 18:14:39 -03:00
Thiago Santos
28449ce7d1
dashdemux: sprinkling some more log
2013-05-08 18:14:39 -03:00
Thiago Santos
94dcb60127
dashdemux: change bitrates based on the stream bitrate
...
Do not use a global bitrate as the sizes of the fragments matter
when calculating the download rate as the connection setup time is
also being taken into the download duration, a smaller fragment
will have a lower bitrate than a larger one.
This avoids switching the bitrates for streams frequently because
of bitrate mismatches
2013-05-08 18:14:39 -03:00
Thiago Santos
770df6277a
dashdemux: refactor to use the uridownloader lib instead of internal copy
2013-05-08 18:14:39 -03:00
Andre Moreira Magalhaes (andrunko)
5efedbff0a
dashdemux: Make sure switch_pads won't leak any pad.
2013-05-08 18:14:39 -03:00
Andre Moreira Magalhaes (andrunko)
e92531c8f6
dashdemux: Properly stop download and stream tasks where appropriate.
2013-05-08 18:14:39 -03:00
Thiago Santos
288903a203
dashdemux: avoid an assertion when stopping the pipeline
...
Avoids asserting when dataqueues are setting to flushing due
to a pipeline stop during a pad switch.
2013-05-08 18:14:39 -03:00
Thiago Santos
83c0e1e25d
dashdemux: download the next fragment with smaller timestamp
...
Instead of downloading 1 fragment per stream per download loop,
select the stream with the earlier timestamp and get a fragment
only for that one.
The old algorithm would lead to problems when the fragment durations
were too different for streams.
2013-05-08 18:14:39 -03:00
Thiago Santos
dbd6bde9d1
dashdemux: track segments in the demuxer
...
Use a GstSegment to track the current segment information in the
demuxer.
2013-05-08 18:14:38 -03:00
Thiago Santos
39924c60a1
dashdemux: remove buffering message emission from dashdemux
...
dashdemux shouldn't emit the buffering message as that can pause
the pipeline. It has no proper knowledge of the downstream buffering
status so it can pause the pipeline when it isn't necessary. It should
have an internal buffer for downloading the streams ahead of playback,
but that shouldn't make it able to stop the pipeline for buffering.
A particular case in which this is bad is when a pad switch happens
(changing bitrates for example), the new pads dashdemux creates
will get linked to demuxers and new queues will be created,
these queues are initially empty and dashdemux will quickly
drain its buffers by pushing them to those queues. So it
would have no more buffers internally and would emit a
buffering message with a low ratio, causing the pipeline
to pause when it wouldn't be necessary.
2013-05-08 18:14:35 -03:00
Thiago Santos
10b5d4d1cc
dashdemux: removing unused code
...
Cleaning up by removing unused code and variables
2013-05-08 18:14:35 -03:00
Thiago Santos
0d9b5923af
dashdemux: re-enable and fix adaptive switching
...
It is still unstable, but at least it works when the switches aren't
happening after every fragment
2013-05-08 18:14:34 -03:00
Thiago Santos
2d85107299
dashdemux: correctly signal EOS on manifest end
...
Put EOS on the streams queues after the last fragment from the
last period for each stream. This way we keep it serialized
with the buffers and it will work when streams have different
ending times
2013-05-08 18:14:34 -03:00
Thiago Santos
a19c689dfa
dashdemux: detect end-of-period correctly
...
Detect end of period when there are no more buffers on any of the
streams
2013-05-08 18:14:34 -03:00
Thiago Santos
3a055ac2d1
dashdemux: Use the smallest queue value to define buffering state
...
The smallest queue should be used to prevent blocking the download
thread when a stream has too much data buffered, leaving the other
streams starving from fragments
2013-05-08 18:14:34 -03:00
Thiago Santos
9777fc5cb5
dash: fix parsing of streams to get correct fragment durations
...
Use the current stream base time instead of the 0th stream base time
to get default duration for fragments.
2013-05-08 18:14:34 -03:00
Thiago Santos
54542a6000
dashdemux: block waiting for buffers instead of busy wait
...
Make the streaming loop block waiting for buffers on the queues instead
of busy waiting eating cpu continuously on a queue length check
2013-05-08 18:14:34 -03:00
Thiago Santos
80c6973319
dashdemux: fix seeking on multiple streams
...
Each stream has its own durations and timestamps, the fragment number
is different for each stream when seeking, so the seek has to be done
for all streams, rather than on a single stream and propagated to
others
2013-05-08 18:14:34 -03:00
Thiago Santos
7330225ac8
dashdemux: Replace GQueue by GstDataQueue
...
GstDataQueue has proper locking and provides functions to limit the
size of the queue. Also has blocking calls that are useful to
our multithread scenario in Dash.
2013-05-08 18:14:34 -03:00
Thiago Santos
27b1abbda3
dashdemux: move the buffers queues to the streams
...
Store the buffers separately for each stream, this is clearer than
having a queue with a list of buffers. It also allows easier selection
of buffers to push in later refactors
2013-05-08 18:14:34 -03:00
Thiago Santos
1556d8cb03
dashdemux: refactor streams data to its own struct
...
Keeps code more organized and similar to what other demuxers
usually do
2013-05-08 18:14:33 -03:00
Thiago Santos
f46ba44e99
dash: do not try to print a pointer as a string
2013-05-08 18:14:33 -03:00
Thiago Santos
f27bb684f7
dashdemux: Remove timing code that delays pushing of fragments
...
Fragments should be pushed ASAP as downstream should be responsible for
doing the syncrhonization and proper buffering.
This has the great side effect of fixing most of the seeking A/V sync issues.
2013-05-08 18:14:33 -03:00
Thiago Santos
a1447a8ede
dash: fixing build warnings
...
Also running through gst-indent
2013-05-08 18:14:33 -03:00
Louis-Francis Ratté-Boulianne
6acf2fba8f
gstdashdemux: add need_header member to know whether the initialization fragment should be pushed
2013-05-08 18:14:33 -03:00
Louis-Francis Ratté-Boulianne
0bed9a6646
dashdemux: don't wait for the whole duration of a fragment when seeking
2013-05-08 18:14:33 -03:00
Louis-Francis Ratté-Boulianne
489d7a174c
dashdemux: switch pads and send header file when a newsegment event is sent
2013-05-08 18:14:33 -03:00
Louis-Francis Ratté-Boulianne
04004cdf65
dashdemux: various fixes
2013-05-08 18:14:33 -03:00
David Corvoysier
c901f610c2
Applied gst-indent
2013-05-08 18:14:33 -03:00
David Corvoysier
582aa51fd6
Replaced URL pointing to obsolete Klagenfurt MPD by a new one
2013-05-08 18:14:33 -03:00
Gianluca Gennari
c988ee3a4b
mpdparser: fix escape sequence in URL template resolving
2013-05-08 18:14:33 -03:00
Gianluca Gennari
470c860ffa
mpdparser: do not switch pads when bitstreamSwitching = true
2013-05-08 18:14:32 -03:00
Gianluca Gennari
e0c55050e1
dashdemux: complete support for manifest file updates
2013-05-08 18:14:32 -03:00
Gianluca Gennari
7092a9c1ac
dashdemux: add support for manifest file updates
...
- the MPD file is updated in the download loop (only if we have a "dynamic" MPD and minimumUpdatePeriod is valid);
- properly LOCK/UNLOCK the GstMpdClient;
2013-05-08 18:14:32 -03:00
Gianluca Gennari
7371b7997b
dashdemux: new API to set/get segment index and period index
...
TODO: rework segment selection to support Representations or Adaptation Sets with segments not aligned
2013-05-08 18:14:32 -03:00
Gianluca Gennari
e7fad847bb
dashdemux: new API to load the stream Period with a given index
...
this avoids to fiddle with stream internals in the code
2013-05-08 18:14:32 -03:00
Gianluca Gennari
9d43e33319
dashdemux: implement seeking across Periods
2013-05-08 18:14:32 -03:00
David Corvoysier
f7c6403432
Applied gst-indent
2013-05-08 18:14:32 -03:00
David Corvoysier
e323c099a0
By default, do not forward pad queries upstream, because it may have unforessen side-effects (forwarding the new 1.0 GST_CAPS query would prevent pad linking for instance)
2013-05-08 18:14:32 -03:00
Olivier Blin
d058a7f2b2
plugin: register as dashdemux instead of fragmented
...
This fixes conflicts with the HLS plugin, which is also named
fragmented.
When building its registry, gstreamer was picking one or the other
between hls and dashdemux.
2013-05-08 18:14:31 -03:00
Gianluca Gennari
895e804a86
dashdemux: check if we have received the MPD file in the proper way
2013-05-08 18:14:31 -03:00
Gianluca Gennari
8f13f246e0
mpdparser: silence warning
2013-05-08 18:14:31 -03:00
Olivier Blin
0b5eb519e7
dashdemux: fix printing buffering time and download rate/size
...
This was broken on armv7.
2013-05-08 18:14:31 -03:00
Olivier Blin
bd2784ffbb
dashdemux: fix unused-but-set variable
2013-05-08 18:14:30 -03:00
Olivier Blin
cbebb01f23
dashdemux: use new gst_mpd_client_get_next_fragment_duration API
...
This fixes build that has been broken by commit
fb9aeac6552021b176a4c4bd07265e02a0b70e0f.
gst_mpd_client_get_target_duration has been removed, and
gst_mpd_client_get_next_fragment_duration should be used instead.
2013-05-08 18:14:29 -03:00
Gianluca Gennari
f728e424b2
dashdemux: remove FIXME comment
...
pad switching across multiple periods works perfectly fine now
and it is done only when there is a change in the CAPS
2013-05-08 18:14:29 -03:00
Gianluca Gennari
e96cc18ab9
dashdemux: send new-segment events to all pads
2013-05-08 18:14:27 -03:00
Gianluca Gennari
9387365fc9
dashdemux: reworked the API to retrieve fragment timestamp, fragment duration and media presentation duration
...
This was necessary to support variable-duration Fragments.
in the new API:
- gst_mpd_client_get_current_position returns the timestamp of the NEXT fragment to download;
- gst_mpd_client_get_next_fragment_duration returns the duration of the next fragment to download;
- gst_mpd_client_get_media_presentation_duration returns the mediaPresentationDuration from the MPD file;
also there is a new internal parser function:
- gst_mpd_client_get_segment_duration extracts the constant segment duration from the MPD file
(only used when there is no SegmentTimeline syntax element in the current representation)
In gst_mpd_client_get_next_fragment, we set the timestamp/duration of the fragment just downloaded
copying the values from the corresponding GstMediaSegment.
TODO: rework SEEKING to support seeking across different Periods.
2013-05-08 18:14:25 -03:00
Gianluca Gennari
dc5d7d258e
dashdemux: use effective segment duration to reschedule the streaming task
...
do not assume segment duration is constant
Conflicts:
ext/dash/gstdashdemux.c
2013-05-08 18:14:22 -03:00
Gianluca Gennari
cfcd9ffac6
dashdemux: reworked gst_dash_demux_get_buffering_time() to return the effective buffering time
...
do not assume the Fragment duration is constant
2013-05-08 18:14:16 -03:00
Gianluca Gennari
0abd777257
dashdemux: complete support for Media Presentations with several Periods
...
- Periods are played in sequence, from PeriodStart to PeriodEnd
- seamless switching from one Period to the next one works fine;
- the 'new-segment' generation is broken, so if we need to switch pads for a new Period there is a crash;
2013-05-08 18:14:10 -03:00
Gianluca Gennari
9d09e99ebe
mpdparser: initial support for Media Presentations made of several Periods
...
- build a list of the available Periods with their start and duration time
- add the list of GstStreamPeriod in the GstMpdClient data struct
- remove cur_period from GstMpdClient and introduce an API to get the current GstStreamPeriod
- several API clean-ups
2013-05-08 18:14:10 -03:00
Olivier Blin
ba3bd1c69a
mpdparser: support BaseURL for SegmentURL using mediaRange
...
This is used in big_buck_bunny_CappedVBR_Multirate_4s_0_AudioVideo_MainProfile.mpd
2013-05-08 18:14:10 -03:00
Olivier Blin
767a5ebed0
mpdparser: factorize adding range parameter to URL
2013-05-08 18:14:08 -03:00
Gianluca Gennari
53f383eff0
dashdemux: reworked caps detection
...
also reworked the API to extract audio/video parameters from the manifest file
(mimeType, width, height, rate, num channels)
2013-05-08 18:14:06 -03:00
Gianluca Gennari
fe05060044
dashdemux: do not send bogus duration messages when mediaPresentationDuration is unknown
2013-05-08 18:14:03 -03:00
Gianluca Gennari
fba69179e4
mpdparser: support SegmentTimeline syntax also for list-based media segment generation
2013-05-08 18:14:03 -03:00
Gianluca Gennari
362b5e9446
mpdparser: add support for SegmentTimeline syntax elements
...
build the list of segments to be played using the SegmentTimeline syntax, if present
bugfixes:
- for dynamic MPD files, when mediaPresentationDuration is not present use minimumUpdatePeriod instead
- do not add a spurious '$' when building an URL from a template like "$Bandwidth$/init.mp4v"
- introduce gst_mpd_client_add_media_segment() to avoid code duplication
2013-05-08 18:14:03 -03:00
David Corvoysier
41733d8296
Fixed wrong index in fragments
2013-05-08 18:14:03 -03:00
Gianluca Gennari
8e9ba056d7
mpdparser: fix memory leak in gst_mpd_client_get_next_fragment_set()
...
we have to free next_fragment_uri
2013-05-08 18:14:03 -03:00
David Corvoysier
cf0ab8e1f3
Removed unused function
2013-05-08 18:14:03 -03:00
David Corvoysier
84c8de8ab6
Seek event handling cleanup
2013-05-08 18:14:02 -03:00
Gianluca Gennari
b580ee8cd7
dashdemux: fix playing of single-segment media streams
...
other fixes:
- fixed a buffering bug: now we stop buffering when we reach the end of manifest
- now gst_mpd_client_get_target_duration() always returns a valid duration
(in case of single-segment streams, we return either Period duration or mediaPresentation duration)
TODO: support SegmentTimeline
2013-05-08 18:14:02 -03:00
Gianluca Gennari
5ade664680
uridownloader: deleted useless declaration of gst_uri_downloader_free()
2013-05-08 18:14:00 -03:00
Gianluca Gennari
122f10669f
uridownloader: when possible, reuse existing element to download a new URI
...
previously a new element was allocated for each media segment, and it was never freed
2013-05-08 18:14:00 -03:00
Gianluca Gennari
5b830c3c91
dashdemux: unref caps in function need_add_header()
2013-05-08 18:13:58 -03:00
Gianluca Gennari
3726ff73ad
dashdemux: fix extraction of SegmentTemplate->initialization in gst_mpd_client_get_next_header()
...
now the following MPD files are properly supported:
http://dash.edgesuite.net/adobe/hdworld_dash/HDWorld-1600.mpd
http://dash.edgesuite.net/adobe/hdworld_dash/HDWorld.mpd
2013-05-08 18:13:58 -03:00
Gianluca Gennari
cd84aaa9aa
dashdemux: fix memory leak in gst_dash_demux_get_next_header()
2013-05-08 18:13:58 -03:00
David Corvoysier
95ee452625
We now only accept actual manifest files, and not any XML file
2013-05-08 18:13:58 -03:00
David Corvoysier
763f4c3fc3
Added a typefind helper for DASH: this commit should be reverted as soon as a proper patch has been submitted to gst-plugins-base
2013-05-08 18:13:57 -03:00
David Corvoysier
29c62f4780
Fixed state machine (again)
2013-05-08 18:13:57 -03:00
David Corvoysier
a7ad12e208
Code refactoring
2013-05-08 18:13:57 -03:00
David Corvoysier
f4756f7cb0
Fixed state machine
2013-05-08 18:13:57 -03:00
David Corvoysier
7f2207732b
Improve consistency of the tasks shutdown code
2013-05-08 18:13:57 -03:00
David Corvoysier
28aaff747c
Added missing g_list_free
2013-05-08 18:13:57 -03:00
David Corvoysier
30fece810f
Do not answer to URI queries
2013-05-08 18:13:56 -03:00
David Corvoysier
0e2c3ffc0b
Try queries upstream if we cannot process them
2013-05-08 18:13:56 -03:00
David Corvoysier
089daeba1b
Renamed demux->next_stream in demux->next_push
2013-05-08 18:13:56 -03:00
David Corvoysier
943f4fa152
Inlined one-line utility funciton that was called only once
2013-05-08 18:13:56 -03:00
David Corvoysier
3cb7b12cbe
Fixed regression after the introduction of the multi-screen support, preventing the pipeline from stopping properly
2013-05-08 18:13:56 -03:00
David Corvoysier
6f5d6f91ff
Modified log level of shutdown message
2013-05-08 18:13:56 -03:00
David Corvoysier
90be873ee1
Comments: We don't select a single representation, but a representation for each stream Code: cleanup of gst_get_next_fragment (also renamed in gst_get_next_fragment_set)
2013-05-08 18:13:56 -03:00
David Corvoysier
d3c4c48923
Removed debug trace
2013-05-08 18:13:56 -03:00
David Corvoysier
6be9a30ad8
Added introduction and general design notes
2013-05-08 18:13:56 -03:00
David Corvoysier
35c04708ba
Fixed wrong comment
2013-05-08 18:13:56 -03:00
David Corvoysier
6255b2762f
Documented gst_dash_demux_download_loop
2013-05-08 18:13:55 -03:00
David Corvoysier
5b6bede189
Commented gst_dash_demux_stream_loop
2013-05-08 18:13:55 -03:00
David Corvoysier
b9d6796cb5
Commented needs_pad_switch
2013-05-08 18:13:55 -03:00
David Corvoysier
54fcbf89f1
Documented the representation switch mechanism
2013-05-08 18:13:55 -03:00
David Corvoysier
7764efb761
Replaced references to playlist (HLS) by references to manifest (DASH)
2013-05-08 18:13:55 -03:00
David Corvoysier
ad22e0da6d
Renamed gst_dash_demux_switch_playlist to gst_dash_demux_select_representation and added comments
2013-05-08 18:13:55 -03:00
David Corvoysier
204ea9fc67
Removed obsolete comment
2013-05-08 18:13:55 -03:00
David Corvoysier
ae32818105
Applied gst-indent
2013-05-08 18:13:55 -03:00
David Corvoysier
28215b9e12
Updated README
2013-05-08 18:13:55 -03:00
Gianluca Gennari
b4057976be
mpdparser: support MPD files with SegmentBase elements encoded inside a SegmentList element
...
also properly support MPD files without any Initialization segment
2013-05-08 18:13:55 -03:00
Gianluca Gennari
375634f669
mpdparser/dashdemux: fixed get_width, get_height, get_audio_rate, get_num_audio_channels API functions
...
the actual values now can be extracted also from the AdaptationSet element;
checking NULL structs for better robustness;
2013-05-08 18:13:55 -03:00
Gianluca Gennari
98a41f2c9e
mpdparser: added support for single-segment streams with the URL encoded in the baseURL syntax element
2013-05-08 18:13:54 -03:00
Gianluca Gennari
779bf29879
mpdparser: added lang attribute to ProgramInformation node
2013-05-08 18:13:52 -03:00
Gianluca Gennari
94644fa82e
mpdparser: added support for Accessibility, Role, Rating, Viewpoint elements to AdaptationSet node
...
those are DescriptorType elements, so they are just parsed and dumped for now;
2013-05-08 18:13:50 -03:00
Gianluca Gennari
416ea67979
mpdparser: support multiple ProgramInformation nodes
...
now we keep a list of ProgramInformation nodes for each Period node
2013-05-08 18:13:48 -03:00
Gianluca Gennari
dd198bc86d
mpdparser: fixed parsing of SegmentList syntax element, and eliminated Represention node list from Period node
...
SegmentList nodes are allowed into Period, AdaptationSet or Representation nodes
and there is at most 1 element, so no need to keep a list;
Period nodes cannot have any Represention elements, as AdaptationSet nodes are mandatory;
this breaks compatibility with some legacy DASH test sequences.
2013-05-08 18:13:48 -03:00
Gianluca Gennari
8e3092661a
mpdparser: fixed return with no value
...
gstmpdparser.c: In function ‘gst_mpdparser_get_list_and_nb_of_audio_language’:
gstmpdparser.c:2891: warning: ‘return’ with no value, in function returning non-void
2013-05-08 18:13:48 -03:00
Gianluca Gennari
7330bbfa7a
mpdparser.c/.h: changed license from dual MIT/LGPL 2.0 to LGPL 2.1
...
uniformed licencinsing to the other libraries in the dashdemux project
2013-05-08 18:13:48 -03:00
hzakari
ec44485510
Optimize the two functions that return the number and the list of languages in a single function
2013-05-08 18:13:48 -03:00
Hamid ZAKARI
fab388c9fd
Add the headers to the adaptationsets segments if any one of these changed representation
2013-05-08 18:13:46 -03:00
Hamid ZAKARI
713d02b81a
Support Multi languages (need a decodebin2 patch)
2013-05-08 18:13:45 -03:00
Hamid ZAKARI
a4ac4a3117
Remove the "TODO" comment
2013-05-08 18:13:45 -03:00
David Corvoysier
3c937636ee
Renamed LICENSE into COPYING
2013-05-08 18:13:44 -03:00
David Corvoysier
79dc12cc05
Updated authors
2013-05-08 18:13:44 -03:00
David Corvoysier
6fc0db0e0b
Initial import of gstdashdemux sources
2013-05-08 18:13:43 -03:00