Commit graph

104 commits

Author SHA1 Message Date
Thiago Santos ac2734f5cb mssdemux: implement snap seeking
Implement snap seek flags handling in stream_seek to allow the
parent class to handle it for us

https://bugzilla.gnome.org/show_bug.cgi?id=759158
2016-02-04 14:20:16 -03:00
Thiago Santos c01d266238 mssdemux: use correct seek position on reverse seeks
Otherwise it was always using the 'start' value, leading to wrong
behavior
2016-02-04 14:20:16 -03:00
Thiago Santos 1b12d7f8a3 mssdemux: only update download position if the seek requests to
Some seeks are only updating the stop position, there is no need
to change the current downloading position.
2016-02-04 14:20:16 -03:00
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 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
Philippe Normand bf1246cb13 mssdemux: activate streams before configuring bitrate
Doing the contrary has no effect and the consequence is that playback
will start with the lowest bitrate even if we can already handle
higher bitrate.

https://bugzilla.gnome.org/show_bug.cgi?id=755108
2015-09-30 16:54:20 +01:00
Philippe Normand ae7d938842 mssdemux: PlayReady WRM parsing support
If the manifest has a ProtectionHeader node then parse it and emit
protection events according to the specified protection SystemID.

https://bugzilla.gnome.org/show_bug.cgi?id=753613
2015-09-30 16:49:11 +01:00
Sebastian Dröge 0cd3938345 adaptivedemux: Allow subclasses to override how a new manifest would be downloaded 2015-04-23 17:47:18 +02:00
Thiago Santos 2526c7b286 mssdemux: use correct function to clear fragment info
Just freeing the url won't reset the byte ranges and can lead to wrong
ranges being used.
2015-02-17 11:41:27 -03:00
Thiago Santos f7a1649c77 adaptivedemux: add bitrate-limit property
Move the property from subclasses to adaptivedemux, it allows
selecing the percentage of the measured bitrate to be used when
selecting stream bitrates
2015-02-17 11:12:42 -03:00
Thiago Santos e9ab79dc36 adaptivedemux: add connection-speed property
Allows to set a bitrate directly instead of measuring it internally
based on the received chunks. The connection-speed was removed from
mssdemux and hlsdemux as it is now in the base class
2015-02-17 11:12:41 -03:00
Thiago Santos 8c49c79d7e mssdemux: add live support
Implement the functions of adaptivedemux to have live support
enabled. This allows mssdemux to refresh the Manifest periodically
2014-12-04 19:52:33 -03:00
Thiago Santos b418c88b26 mssdemux: port to adaptivedemux base class 2014-12-04 14:24:42 -03:00
Thiago Santos 613b110b25 mssdemux: seeks in the manifest never fail
Set void as the return and remove error handling as it could
never fail
2014-11-07 19:30:18 -03:00
Tim-Philipp Müller f216b7bb11 Sprinkle some G_PARAM_DEPRECATED and #ifndef GST_REMOVE_DEPRECATED 2014-11-02 17:19:34 +00:00
Thiago Santos e644b5e6ae mssdemux: do not unlock not locked mutex 2014-10-31 17:33:55 -03:00
George Kiagiadakis e289ab07c1 mssdemux: synchronize with the download loop thread to signal it to continue
If EOS or ERROR happens before the download loop thread has reached its
g_cond_wait() call, then the g_cond_signal doesn't have any effect and
the download loop thread stucks later.

https://bugzilla.gnome.org/show_bug.cgi?id=735663
2014-09-18 13:38:29 -03:00
Thiago Santos 01ccac24fa mssdemux: fix clearing of eos state in pads
The internal pad still keeps its EOS flag and event as it can be assigned
after the flush-start/stop pair is sent. The EOS is assigned from the streaming
thread so this is racy.

To be sure to clear it, it has to be done after setting the source to READY to
be sure that its streaming thread isn't running.

https://bugzilla.gnome.org/show_bug.cgi?id=736012
2014-09-18 12:14:30 -03:00
Matthieu Bouron bce21e7398 mssdemux: improve position detection when a download restart
Query other src pads before falling back to the position of the last
known pushed segment (which can be far ahead in time).

https://bugzilla.gnome.org/show_bug.cgi?id=736421
2014-09-11 18:25:19 -03:00
Sebastian Dröge bda4eae1cc mssdemux: Don't send flush events to deactivated pads
https://bugzilla.gnome.org/show_bug.cgi?id=736012
2014-09-04 18:21:38 +03:00
Sebastian Dröge 546feaef5c mssdemux: Always use the redirect target to resolve relative URIs
But redownload the playlists from the original URI if it's not
a permanent redirect.
2014-05-28 12:56:24 +02:00
Thiago Santos ce7319c62d mssdemux: avoid deadlocking when erroring
It might get stuck when posting the message while
a reconfigure event is being pushed upstream
2014-05-12 18:28:45 -03:00
Thiago Santos a1f87d0b4f mssdemux: fix caps leak 2014-05-12 18:08:12 -03:00
Thiago Santos 6b8448c245 mssdemux: handle error messages from internal source
set up a bin message handler to get notified of error messages from
the internal source element
2014-05-12 18:08:12 -03:00
Thiago Santos b627d7df83 mssdemux: Always accept the latency configure event
Upstream or internal elements are irrelevant and we should
always succeed.
2014-05-12 16:27:37 -03:00
Thiago Santos b54367e211 mssdemux: reenable segment tracking for streams
Store the latest pushed timestamp so that mssdemux streams know
where they are in time
2014-05-12 16:27:37 -03:00
Thiago Santos 45d5859131 mssdemux: deprecate unused max-queue-size-buffers
There is no internal storage of buffers anymore
2014-05-12 16:27:37 -03:00
Thiago Santos 99a2e425de mssdemux: measure bitrate similarly to hlsdemux
new bitrate = (old bitrate + (last fragment bitrate * 3)) / 4
2014-05-12 16:27:37 -03:00
Thiago Santos 90577c3ae7 mssdemux: remove uridownloader in favor of internal source
Refactor mssdemux to remove uridownloader to use an internal
source element which reduces startup latency and provides smaller
buffers for better buffering management downstream
2014-05-12 16:27:37 -03:00
Sebastian Dröge 3c2fe80ab6 mssdemux: Update for uri downloader API changes 2014-05-05 09:41:51 +02:00
Sebastian Dröge 5d34b071d9 mssdemux: Update for URI downloader API changes
And include the manifest file as referer in requests, and make sure
to set refresh=TRUE when updating the manifest.
2014-05-02 10:43:06 +02:00
Vincent Penquerc'h 14f8172d2b smoothstreaming: avoid using an uninitialized manifest
If we did not set the manifest yet, early out in the seeking query.

Coverity 1139737
2014-04-10 09:51:07 +01:00
Vincent Penquerc'h 88879654df smoothstreaming: remove unnecessary check
The function is static, the only call site passes a non NULL
pointer, and the pointer is dereferenced before anyway.

Coverity 1139839
2014-04-09 17:10:06 +01:00
Sebastian Dröge b47a4faf5f ext: Use Codec/Demuxer/Adaptive for the adaptive streaming demuxers 2014-02-23 00:11:04 +01:00
Sebastian Dröge a11c6640bf mssdemux: Download the manifest with compression, the fragments without 2014-02-12 13:11:38 +01:00
Sebastian Dröge 3a5abc233d ext: Update for GstUriDownloader API changes 2014-02-11 14:18:32 +01:00
Thiago Santos 6348113777 mssdemux: updating docs explaining how it works
mssdemux changed a lot and the docs were not correct anymore.

Also adds the 'Adaptive' category to its details
2013-12-20 00:40:42 -03:00
Thiago Santos ff1e88ce93 mssdemux: do not push event holding object lock
Can lead to deadlocks as the push might block downstream in
serialized event cases.
2013-12-20 00:40:42 -03:00
Thiago Santos aa61251371 mssdemux: lock around 'cancelled' flag
Prevents race conditions when pipeline is seeking near eos
2013-12-20 00:40:42 -03:00
Thiago Santos 26acbbcca9 mssdemux: make sure streams stop properly on cancelled
specially when the gst_task_join is waiting for the task
to go stop and the task itself sets its back to paused, causing
a deadlock on exit.
2013-12-18 18:52:19 -03:00
Thiago Santos 99c8fb7330 mssdemux: track segments per stream
As streams now flow independently, the GstSegment needs to be put
on each stream so they can track the position of each one correctly
instead of being mixed in a single segment
2013-12-18 18:52:19 -03:00
Guillaume Desmottes f44c6ed526 mssdemux: push language code tag
https://bugzilla.gnome.org/show_bug.cgi?id=712358
2013-12-18 18:52:19 -03:00
Thiago Santos 67f3190301 mssdemux: remove the stream loop task
Download and push from the same task, makes code a lot simpler
to maintain. Also pushing from separate threads avoids deadlocking
when gst_pad_push blocks due to downstream queues being full
2013-12-18 18:52:19 -03:00
Thiago Santos 4e6e1315da mssdemux: Improve logging
Show the stream's pad on log messages to make easier to debug
issues in the multiple threads
2013-12-18 18:52:18 -03:00
Thiago Santos 056420940e mssdemux: improve flow return handling
Handle different flow returns both from the streaming and the
downloading loops
2013-12-18 18:52:18 -03:00
Thiago Santos e847bea1e1 mssdemux: remove stream locks
Simplify the locking by using a single lock instead of having one
lock per stream. This still works and is simpler to maintain.
2013-12-18 18:52:18 -03:00
Thiago Santos 2ce4f6a8e4 mssdemux: avoid downloading not-linked streams
When a stream gets a not-linked return, it will be marked as so and
won't download any more new fragments until a reconfigure event
is received. This will make mssdemux expose all pads, but only download
fragments for the streams that are actually being used.

Relying on the pads being linked/unlinked isn't enough in this scenario
as there might be an input-selector downstream that is actually discarding
buffers for a given linked pad.

When streams are switching, the old active stream can be blocked because
input-selector will block not-linked streams. In case the mssdemux's
stream loop is blocked pushing a buffer to a full queue downstream it will
never unblock as the queue will not drain (input-selector is blocking).

In this scenario, stream switching will deadlock as input-selector is
waiting for the newly active stream data and the stream_loop that would
push this data is blocked waiting for input-selector.

To solve this issue, whenever an stream is reactivated on a reconfigure
it will enter into the 'catch up mode', in this mode it can push buffers
from its download thread until it reaches the currrent GstSegment's position.
This works because this timestamp will always be behind or equal to the maximum
timestamp pushed for all streams, after pushing data for this timestamp,
the stream will go back to default and be pushed sequentially from the main
streaming thread. By this time, the input-selector should have already
released the thread.

https://bugzilla.gnome.org/show_bug.cgi?id=711849
2013-12-18 18:52:18 -03:00
Thiago Santos 27b0086e4a mssdemux: do not try to deinit the downloadrate while it is used
This can cause an assertion or deadlocks.
2013-11-15 12:01:55 -03:00
Thiago Santos fe77ee47c9 mssdemux: also consider /manifest
The spec says /Manifest, but /manifest is easily found on some
services, so handle that, too.

https://bugzilla.gnome.org/show_bug.cgi?id=710223
2013-11-15 12:01:54 -03:00
Thiago Santos 1b1332cb6d mssdemux: use gst_data_queue_push_force for adding events to queue
This prevents locking on startup when a stream only has a single buffer
for one of the streams and mssdemux decides to push an EOS event right
after it.
2013-08-13 12:44:41 -03:00