Commit graph

98 commits

Author SHA1 Message Date
Thiago Santos
731ab94cc3 adaptivedemux: handle snap seeks
Adaptive demuxers need to start downloading from specific positions
(fragments) for every stream, this means that all streams can snap-seek
to a different position when requested. Snap seeking in this case will
be done in 2 steps:

1) do the snap seeking on the pad that received the seek event and
   get the final position

2) use this position to do a regular seek on the other streams to
   make sure they all start from the same position

More arguments were added to the stream_seek function, allowing better control
of how seeking is done. Knowing the flags and the playback direction allows
subclasses to handle snap-seeking.
And also adds a new return parameter to inform of the final
selected seeking position that is used to align the other streams.

https://bugzilla.gnome.org/show_bug.cgi?id=759158
2016-02-04 14:05:08 -03:00
Thiago Santos
f16916f7e7 adaptivedemux: add utility function to get stream from pad
Simplifies the code a bit and avoid repeating this
common operation
2016-02-04 14:03:55 -03:00
Alex Ashley
cfb1b79516 adaptivedemux: fix leak of stream->internal_pad
The function gst_adaptive_demux_stream_update_source() function creates
a new GstPad called internal_pad. This pad is not freed when releasing
the stream.

The solution is to set GST_PAD_FLAG_NEED_PARENT so that the chain
functions do not get called when the pad has no parent and then
remove the parent in the gst_adaptive_demux_stream_free() function. This
causes the refcount of the pad to be set to zero.

https://bugzilla.gnome.org/show_bug.cgi?id=760982
2016-01-22 19:04:42 +02:00
Thiago Santos
b7a0be23c6 adaptivedemux: replace ghostpad with a standard pad
Handling the ghostpad and its internal pad was causing more issues
than helping because of their coupled activation/deactivation
actions.

As we have to install custom chain,event and query functions it is
better to use a floating sink pad internally in the demuxer and just
use those pad functions to push through a standard pad in the demuxer

https://bugzilla.gnome.org/show_bug.cgi?id=757951
2016-01-15 11:32:37 -03:00
Florin Apostol
d92f11b819 adaptivedemux: do not flush the input pad
gst_adaptive_demux_stream_clear_eos_and_flush_state() function will do
all the necessary cleaning.

https://bugzilla.gnome.org/show_bug.cgi?id=757951
2016-01-15 11:32:37 -03:00
Thiago Santos
16a2f7f5c0 adaptivedemux: fix seeking that just updates stop position
Fixed adaptivedemux seeking without flushing that just wants
to update stop position. This required protecting the segment
variables with a new mutex so that the seeking thread and the
download threads could safely manipulate the segment and
events related to it.

This contention is only locked/unlocked when starting a new
download, when the first fragment of a segment is received and
when seeking so, hopefully, it won't damage performance.
2016-01-07 15:46:01 -03:00
Thiago Santos
eaace4922c adaptivedemux: fix segment update on seeks
Fixes typo on reverse rate check and also only update the
position when the start/stop was actually changed.
2016-01-07 15:45:56 -03:00
Thiago Santos
f57109ad2e adaptivedemux: stop reverse playback when we reach the limit
Avoids downloading and pushing a full segment just to get 1 nanosecond
of data. This happens frequently when seeking is done with flags
that adjust to boundaries or when the start is aligned with segment
starts. The later is common when segment durations is a multiple of
a second.
2016-01-06 10:23:13 -03:00
Thiago Santos
bf272edaf3 adaptivedemux: correctly track segment.position in reverse playback
For reverse, set position to segment.stop when starting and also
don't set the position to fragment end timestamp when it finishes,
just leave it at the fragment start.
2016-01-06 10:23:13 -03:00
Thiago Santos
2fdd5dca14 adaptivedemux: avoid pushing events with manifest lock
It can be an easy source of deadlocks. Reproducible with very
fast connections (local server).
2015-12-08 16:12:37 -03:00
Sebastian Dröge
280de75d89 adaptivedemux: Log PTS of buffers that are pushed downstream 2015-12-03 10:08:53 +02:00
Jan Schmidt
08544a459b adaptivedemux: Send the bitrate of the stream as a tag
If we know or can measure the nominal bitrate of a stream,
send that info as a tag downstream
2015-12-02 22:29:38 +11:00
Tim-Philipp Müller
64adb1998d hlsdemux: fix crash when decryption key can't be downloaded
Happened with
http://sslhls.m6tv.cdn.sfr.net/hls-live/livepkgr/_definst_/m6_hls_aes/m6_hls_aes_856.m3u8
if glib-networking was not installed (since key has https uri).
2015-12-01 18:01:36 +00:00
Tim-Philipp Müller
1491d02c4e adaptivedemux: remove now-defunct "num-lookback-fragments" property
This no longer does anything, and it was marked as CONSTRUCT_ONLY
which means someone would really have to go out of their way to
be able to set this, which would only be done in very custom
scenarios, if ever, and those will likely target a specific
version of GStreamer then, so probably not much point keeping
it deprecated for a while before removing it.
2015-11-14 20:28:34 +00:00
Florin Apostol
4994f068d5 adaptivedemux: fixed handling errors emitted by uri handler
https://bugzilla.gnome.org/show_bug.cgi?id=757947
2015-11-11 17:56:19 +01:00
Vineeth TM
d624ba0c61 adaptivedemux: Fix pad memory leak.
The static pads got from queue and uri_handler are not being freed
resulting in memory leaks.

https://bugzilla.gnome.org/show_bug.cgi?id=757859
2015-11-10 07:06:17 -03:00
Philippe Normand
ccff3be3ab adaptivedemux: improved bitrate estimations
Bitrate estimation is now handled through a queue2 element added after
the source element used to download fragments.

Original hlsdemux patch by Duncan Palmer <dpalmer@digisoft.tv>
https://bugzilla.gnome.org/show_bug.cgi?id=733959
2015-11-06 12:34:36 -03:00
Florin Apostol
a2ffe7e979 adaptivedemux: stop task on multiple download errors
On multiple download errors, we stop the download task and change the src
element state to NULL.

https://bugzilla.gnome.org/show_bug.cgi?id=756240
2015-10-30 12:50:10 +00:00
Vincent Penquerc'h
7d909966e5 adaptivedemux: fix a missing lock in write to stream->last_ret
https://bugzilla.gnome.org/show_bug.cgi?id=757359
2015-10-30 12:24:22 +00:00
Florin Apostol
ef466b46d3 adaptivedemux: return error if src element cannot start
https://bugzilla.gnome.org/show_bug.cgi?id=756209
2015-10-30 12:17:40 +00:00
Florin Apostol
519165e461 adaptivedemux: fixed waiting for fragment updates
https://bugzilla.gnome.org/show_bug.cgi?id=756237
2015-10-30 11:52:18 +00:00
Florin Apostol
a85b64bb6d adaptivedemux: fix header redownload in case of errors
https://bugzilla.gnome.org/show_bug.cgi?id=756239
2015-10-30 11:47:17 +00:00
Florin Apostol
e0ef335426 adaptivedemux: release manifest lock before sending flush stop event
https://bugzilla.gnome.org/show_bug.cgi?id=757337
2015-10-30 09:46:41 +00:00
Florin Apostol
e29514ea3d adaptivedemux: reset download_finished before starting the src element
https://bugzilla.gnome.org/show_bug.cgi?id=757336
2015-10-30 09:46:41 +00:00
Florin Apostol
ac58216f05 adaptivedemux: release manifest lock before changing element state
https://bugzilla.gnome.org/show_bug.cgi?id=757335
2015-10-30 09:46:41 +00:00
Florin Apostol
60f3eb15eb dahsdemux: task is signaled to stop without stop condition being set
The gst_adaptive_demux_stream_free function is trying to stop the stream's
download task. For this, it signals the task. But it fails to also set the
stream->download_finished = TRUE, so the task will go back to sleep and
only exit when the download is finished.

https://bugzilla.gnome.org/show_bug.cgi?id=755121
2015-10-29 11:17:48 +00:00
Florin Apostol
eab158a669 adaptivedemux: fixed multithread support
https://bugzilla.gnome.org/show_bug.cgi?id=755169
2015-10-29 10:20:45 +00:00
Sebastian Dröge
e523bd2a33 adaptivedemux: HTTP ranges are inclusive, GStreamer segment.stop is exclusive
Translate the values accordingly.

https://bugzilla.gnome.org/show_bug.cgi?id=748316
2015-10-14 16:57:56 +03:00
John Chang
40a63d27d8 adaptivedemux: remove unused variable
https://bugzilla.gnome.org/show_bug.cgi?id=755656
2015-09-29 14:43:07 +01:00
Tim-Philipp Müller
d331f01e03 adaptivedemux: remove unprefix STATISTICS_MESSAGE_NAME after all
It was only added during 1.5.x so we might just as well remove it
immediately.

https://bugzilla.gnome.org/show_bug.cgi?id=754686
2015-09-17 17:54:36 +01:00
Philippe Normand
261d8daca0 adaptivedemux: prefix the statistics message name macro
Keep old define around for now.

https://bugzilla.gnome.org/show_bug.cgi?id=754686
2015-09-17 17:39:27 +01:00
Sebastian Dröge
5674dd75d9 adaptivedemux: Fix playback of live streams
dashdemux seeks each live stream to its current fragment in the beginning, but
the base class does not know about this. Update the demuxer segment with this
seek so we generate the correct SEGMENT event and can actually play the
stream.

This needs some refactoring at some point.

https://bugzilla.gnome.org/show_bug.cgi?id=755047
2015-09-15 22:05:19 +02:00
Thiago Santos
0ed501ab03 adaptivedemux: Only overwrite last return if it was OK
Prevents overwriting other conditions that would be more important,
such as EOS.

https://bugzilla.gnome.org/show_bug.cgi?id=755042
2015-09-15 12:46:31 -03:00
Sebastian Dröge
d1c5669a38 adaptivedemux: Properly implement timestamping of multi-period streams
Each period will start again with pts 0 + period presentation offset, which is
also going to be the presentation time inside the container stream if any.
However all periods together should form a continuous timeline, with regard to
stream time and running time.

For making this possible we keep track of the "user requested segment", i.e.
the seek events, inside the demuxer without adjusting anything and taking this
demuxer segment only as orientation for modified segments per stream.

This per stream segments will have their segment.start at pts that would be
produced for this stream in this period, and the segment.base/time adjusted so
that this pts maps to the running and stream time this period should have in
the context of all other periods.

https://bugzilla.gnome.org/show_bug.cgi?id=754222
2015-09-14 19:53:03 +02:00
Edward Hervey
e276d02d28 adaptivedemux: Demote debugging level 2015-08-15 19:04:43 +02:00
Edward Hervey
69867f95e2 adaptivedemux: Actually wait for playlist update when requested
There are several cases where a HLS server could temporarily have wrong
fragments, or reconfigure the playlist. In those cases, when we get
fragment download failures, we *really* want to wait a bit (for the next
playlist update) before retrying to get fragments.

Previously this method was first checking to see if there was next fragments
(according to the previous manifest update) before waiting for the next update.
The problem was that if that if there is a temporary failure on the server,
that's uncorrelated to whether the manifest contains next fragments or not.
2015-08-15 19:04:42 +02:00
Tim-Philipp Müller
b4fe1b516b adaptivedemux: minor clean-up
No need for a foreach callback function that's just a few
lines of code and is only used once, just do the event
pushing inline.

https://bugzilla.gnome.org/show_bug.cgi?id=705991
2015-07-20 16:04:26 +01:00
Alex Ashley
71a1e3669a dashdemux: add support for generating Protection events from ContentProtection elements
If a ContentProtection element is present in an AdaptationSet element,
send Protection events on the source pad, so that qtdemux can use this
information to correctly generate its source caps for DASH CENC
encrypted streams.

This allows qtdemux to support CENC encrypted DASH streams where the
content protection specific information is carried in the MPD file
rather than in pssh boxes in the initialisation segments.

This commit adds a new function to the adaptivedemux base class to allow
a GstEvent to be queued for a stream. The queue of events are sent the
next time a buffer is pushed for that stream.

https://bugzilla.gnome.org/show_bug.cgi?id=705991
2015-07-20 16:04:22 +01:00
Sebastian Dröge
153bb7b273 adaptivedemux: Explicitly check for CUSTOM_ERROR when converting errors to EOS
We use things like CUSTOM_SUCCESS* in other places, and those are not errors
but should just be handled like OK.
2015-07-07 19:51:39 +03:00
Sebastian Dröge
a78c1bdad5 adaptivedemux: If downloading the last fragment fails, consider this as EOS and not ERROR
Sometimes the last fragment does not exist because of rounding errors with the
durations. Just finish the stream gracefully instead of erroring out instead.
2015-07-07 19:51:39 +03:00
Sebastian Dröge
f413129172 adaptivedemux: Move unref() into the right scope 2015-06-25 23:49:41 +02:00
Sebastian Dröge
548ed60e86 adaptivedemux: Properly handle presentationTimeOffset for seeking and multi-period streams
Segment start/time/position/base should only be modified if this is the first
time we send a segment, otherwise we will override values from the seek
segment if new streams have to be exposed as part of the seek.

Segment base should be calculated from the segment start based on the stream's
own segment, not the demuxer's segment. Both might differ slightly because of
the presentationTimeOffset.

Always add the presentationTimeOffset (relative to the period start, not
timestamp 0) to the segment start after resetting the stream's segment based
on the demuxer's segment (i.e. after seeks or stream restart). Also make sure
to keep the stream's segment up to date and not just send a new segment event
without storing the segment in the stream.

https://bugzilla.gnome.org/show_bug.cgi?id=745455
2015-06-25 23:36:25 +02:00
Sebastian Dröge
8c6b39215e adaptivedemux: Also update segment.base and segment.time when switching periods
And include the presentation offset in the last known position for each
stream, and just because we can also keep track of the latest known position
inside the demuxer segment.
2015-06-23 18:19:35 +02:00
Sebastian Dröge
281a13efa1 adaptivedemux: Remember the last return value of gst_adaptive_demux_stream_update_fragment_info()
It's going to return EOS if the period ended or otherwise there is just no
next fragment left. If we don't store the last return value, it will always
stay OK and gst_adaptive_demux_combine_flows() will always return OK instead
of EOS once all streams are done.

This partially switches period changes in DASH by at least trying to switch
instead of just stopping. What is still left is that after a period change
with DASH the times all start at 0 again instead of continuing.
2015-06-23 13:15:55 +02:00
Sebastian Dröge
4dd355cea2 adaptivedemux: Error out if downloading a segment failed too often in live mode
It's true that we shouldn't consider errors fatal immediately, but if we
always ignore them we will loop infinitely on live streams with segments
that can't be downloaded at all.
2015-06-05 11:26:11 +02:00
Sebastian Dröge
fc67e1db8b adaptivedemux: Release the manifest mutex before waiting for a download
Otherwise we will hurt parallel downloads in the best case, and often cause
deadlocks.
2015-06-04 12:36:41 +02:00
Luis de Bethencourt
6857048079 adaptivedemux: 'for' loop initial declaration
'for' loop initial declarations are only allowed in C89, moving the declaration
to before the 'for' loop.
2015-05-26 15:24:55 +01:00
Thiago Santos
61cad123d7 adaptivedemux: drop debug message that was wrong
EOS doesn't necessarily mean that no fragment was downloaded
2015-05-13 13:35:14 -03:00
Thiago Santos
8331b083ee adaptivedemux: run gst-indent
To allow commiting on this file cleanly
2015-05-13 13:35:14 -03:00
Jimmy Ohn
868472affb adaptivedemux: only update stream position if query success
We don't need to check about the query fail case.
because it is update to segment position even though query fail.

https://bugzilla.gnome.org/show_bug.cgi?id=748529
2015-05-05 14:33:41 -03:00