Commit graph

41 commits

Author SHA1 Message Date
Jan Schmidt
5ac4fdeb7a splitmuxsrc: Mark running=false on shutdown.
Make sure that any late gst_element_call_async() callbacks
know that the elements is shutting down and bail out instead
of operating on the element we're trying to stop.

Fixes a spurious test failure in elements_splitmuxsrc

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/798>
2020-10-31 02:50:51 +00:00
Olivier Crête
c79a520946 splitmuxsrc: Implement segment query
Fixes #239

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/713>
2020-09-18 10:54:23 -04:00
Edward Hervey
cfb9a5d53a slitmuxsrc: Properly stop the loop if not part reader is present
Previously this would end up in a refcounting loop of hell.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/578>
2020-05-05 15:32:58 +02:00
Jan Schmidt
00a08c69ac splitmuxsrc: Fix some deadlock conditions and a crash
When switching the splitmuxsrc state back to NULL quickly, it
can encounter deadlocks shutting down the part readers that
are still starting up, or encounter a crash if the splitmuxsrc
cleaned up the parts before the async callback could run.

Taking the state lock to post async-start / async-done messages can
deadlock if the state change function is trying to shut down the
element, so use some finer grained locks for that.
2020-03-26 14:44:54 -04:00
Jan Schmidt
f490c38416 splitmux: Avoid negative DTS
In order to concatenate fragments, splitmuxsrc offsets
the start of each fragment PTS to 0 to align it with the
previous file. This means that DTS can go negative for
the first fragment, with really bad results.

Add a fixed offset to outgoing timestamp ranges to
avoid that.
2020-03-04 05:42:21 +00:00
Aaron Boxer
46989dca96 documentation: fix a number of typos 2019-10-05 22:38:11 +00:00
Jan Schmidt
b5d8484b0b splitmuxsrc: Add video_%d pad template.
splitmuxsrc actually supports multiple video pads. Make that clear,
especially since it was already creating pads named "video_0" etc.
2019-07-15 11:46:36 +00:00
Jan Schmidt
f6b91fe303 splitmuxsrc: Protect initial pad configuration with the object lock
gst_splitmux_src_activate_part() configures the pad information
before starting the pad task, but occasionally the changes it makes
to the pad are not seen in the pad task because they're not
protected by the right locking. Use the pad's object lock to
protect those variables.
2019-06-12 02:46:48 +10:00
Jan Schmidt
715c6896a2 splitmuxsrc: Restart pad task on a reconfigure
On a reconfigure event, restart streaming on the pad so
that switching tracks in playbin works cleanly
2019-06-12 02:46:48 +10:00
Jan Schmidt
86c131b668 splitmuxsrc: Use an RW lock instead of a mutex to protect the pad list
Fix a deadlock around the pads list by using an RW lock to
allow simultaneous readers. The pad list doesn't really changes
except at startup and shutdown.
2019-06-12 02:46:48 +10:00
Jan Schmidt
26d6532702 splitmuxsrc: Ignore duplicate seeks
Use the seqnum to ignore duplicated seek events.
2019-06-12 02:46:41 +10:00
Thibault Saunier
0a6a62aa76 docs: Port all docstring to gtk-doc markdown 2019-05-13 10:24:40 -04:00
Sebastian Dröge
3537c4d217 splitmuxsrc: Refactor part preparation code and remove "prepared" signal from reader helper object
We don't need a special signal anymore but can directly work with
async-done
2019-01-09 13:35:58 +02:00
Sebastian Dröge
99bb6f44ba splitmuxsrc: Implement state change asynchronously instead of blocking
Blocking in change_state() is a recipe for disaster, even more so if
we wait for another thread that also calls into various element API and
could then lead to deadlocks on e.g. the state lock.
2019-01-09 13:35:58 +02:00
Jan Schmidt
f667ab05d2 Revert "splitmuxsrc: Make sure events are writable"
This reverts commit 3ac5430311.

There's no need to make a freshly created event writable,
and the other half of this patch was already fixed
and pushed in f2f15a1
2018-07-17 01:33:55 +10:00
Jan Schmidt
3ac5430311 splitmuxsrc: Make sure events are writable
Before setting the seqnum on events sent downstream,
make sure they are writable.
2018-07-17 00:17:18 +10:00
Sebastian Dröge
f2f15a119f splitmuxsrc: Make sure events are writable before setting their seqnum 2018-06-18 12:13:48 +03:00
Jan Schmidt
d61066e6b5 splitmuxsrc: Improve not-linked handling.
Don't report not-linked unless all pads have
returned not-linked.
2018-02-16 17:02:31 +11:00
Tim-Philipp Müller
ddd4fe680f splitmuxsrc: properly set total duration on outgoing segment
We would accidentally pass through the duration value from the
demuxer from a single fragment, which causes problems when
feeding the stream from splitmuxsrc to rtsp-server. Streaming
would stop after one fragment due to that.

https://bugzilla.gnome.org/show_bug.cgi?id=792861
2018-01-29 11:29:24 +00:00
Tim-Philipp Müller
07ae64118d splitmuxsrc: don't respond to duration query with CLOCK_TIME_NONE
total_duration is initialised to CLOCK_TIME_NONE, not 0, so check
for that as well in order not to return an invalid duration to
a duration query. Doesn't fix anything particular observed in
practice, just seemed inconsistent.
2018-01-29 11:29:24 +00:00
Jan Schmidt
7c0a9cb585 splitmuxsrc: Fix reverse playback
Fix the check for whether the start time of the segment has
been reached when playing in reverse. Otherwise, playback
stops after reaching the start of any file part, instead of
continuing until all parts within the segment have played
2017-03-04 00:35:32 +11:00
Jan Schmidt
389dd4e3d0 splitmuxsrc: Pass seek flags when activating.
Pass all seek flags when activating a part
based on a seek, so that SNAP flags are preserved.
2017-01-03 01:34:02 +11:00
Jan Schmidt
afc440e906 splitmuxsrc: Store seek seqnum and send it on EOS / segment events.
GES relies on the EOS event having the seqnum of the seek that
caused it.
2016-11-02 11:02:12 +11:00
Jan Schmidt
f609986c34 splitmuxsrc: Forward a not-linked error on the bus
Handle not-linked as for other fatal errors and post it
onto the bus so the app knows
2016-11-02 11:02:12 +11:00
Jan Schmidt
00d20b044c splitmuxsrc: Handle stop point from segment
If the seek stop point (or start, during reverse play)
was within the segment we just finished, go EOS immediately
instead of proceeding through all other parts and sending
0 length seeks to them.

https://bugzilla.gnome.org/show_bug.cgi?id=772138
2016-10-01 00:12:41 +10:00
Jan Schmidt
1a17ce9705 splitmuxsrc: Drop lock shutting down pads
Avoid a sporadic deadlock on shutdown by dropping
the splitmux lock around pad shutdown

https://bugzilla.gnome.org/show_bug.cgi?id=772138
2016-10-01 00:12:41 +10:00
Jan Schmidt
f8d7a2a0af splitmuxsrc: Avoid stall when parts get out of sync
When one part moves ahead of the others - due to excessive
downstream queueing, or really small input files - then
we can end up activating parts more than once. That can lead to
effects like shutting down pad tasks prematurely.

https://bugzilla.gnome.org/show_bug.cgi?id=772138
2016-10-01 00:12:41 +10:00
Thibault Saunier
150edef830 Use the new API to post flow ERROR messages on the bus
https://bugzilla.gnome.org/show_bug.cgi?id=770158
2016-08-26 19:23:26 -03:00
Jan Schmidt
69df65fabe splitmuxsrc: Don't stop and error on EOS flow return
Don't immediately halt on EOS flow return from downstream
due to out of segment. Let the demuxer handle it and send
EOS.
2016-08-06 01:41:06 +10:00
George Kiagiadakis
bd2a1487cc splitmuxsrc: add a format-location signal that allows bypassing the location property
This signal allows a user to directly return a sorted list of
files to be joined, so that they don't have to follow the
filename pattern that the "location" property expects.

https://bugzilla.gnome.org/show_bug.cgi?id=753625
2016-05-05 10:49:07 +01:00
Vineeth TM
1071309870 good: use new gst_element_class_add_static_pad_template()
https://bugzilla.gnome.org/show_bug.cgi?id=763076
2016-03-24 14:32:20 +02:00
Thiago Santos
121fcbf7da splitmuxsrc: sticky events are sent automatically from the pad
No need to send them explicitly from the element

https://bugzilla.gnome.org/show_bug.cgi?id=751240
2015-06-25 17:13:43 -03:00
Thiago Santos
af6a09ae4c splitmuxsrc: make sure to push sticky events before adding pad
It allows the caps to be set on the pad before being added for
dynamic autoplugging to work.

https://bugzilla.gnome.org/show_bug.cgi?id=751240
2015-06-25 17:13:43 -03:00
Jan Schmidt
600bab0056 splitmuxsrc: Fix startup and shutdown races.
Fix 2 startup races when things happen too quickly, and 1
at shutdown by holding a ref to the pads in use until the
loop functions exit.

Handle errors activating file parts and publish them on
the bus.

https://bugzilla.gnome.org/show_bug.cgi?id=750747
2015-06-23 12:03:14 +10:00
Jan Schmidt
94e113c6c6 splitmuxsrc: Protect total_duration state variable with the object lock.
Prevent deadlocks from downstream querying duration from the streaming thread.
2015-06-08 14:16:36 +10:00
Tim-Philipp Müller
3755409409 splitmuxsrc: minor error message clean-up
Don't put filename in error message shown to user.
2015-05-10 10:53:13 +01:00
Jan Schmidt
d441140cd6 splitmux: Shut down element before downward state change
Make sure the state change won't hang trying to shut down pads
by making sure the streaming has stopped before chaining up.
2015-03-10 15:49:33 +11:00
Tim-Philipp Müller
f5b511b42b multifile: attempt to fix docs build issue on build bot 2015-02-26 19:48:33 +00:00
Luis de Bethencourt
102ae8511a splitmux: fix typo 2015-02-10 14:57:55 +00:00
Jan Schmidt
aa4c29c5d6 splitmux: Fix memory leaks until the test valgrinds clean 2015-02-07 00:19:36 +11:00
Jan Schmidt
5e2214d309 splitmux: Implement new elements for splitting files at mux level.
Implement 2 new elements - splitmuxsink and splitmuxsrc.

splitmuxsink is a bin which wraps a muxer and takes 1 video stream,
plus audio/subtitle streams, and starts a new file
whenever necessary to avoid overrunning a threshold of either bytes
or time. New files are started at a keyframe, and corresponding audio
and subtitle streams are split at packet boundaries to match
video GOP timestamps.

splitmuxsrc is a corresponding source element which handles
the splitmux:// URL and plays back all component files,
reconstructing the original elementary streams as it goes.
2015-02-06 04:26:59 +11:00