Commit graph

260 commits

Author SHA1 Message Date
Jan Schmidt
436d33b288 splitmuxsink: add the ability to mux auxilliary video streams
The primary video stream is used to select fragment cut points
at keyframe boundaries. Auxilliary video streams may be
broken up at any packet - so fragments may not start with a keyframe
for those streams.
2019-07-15 11:46:36 +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
Thibault Saunier
ac55681bbf docs: Fix link to strings
We can't link to #gchar* this way.
2019-06-14 17:34:43 -04:00
Mathieu Duponchelle
ddbbe5d277 splitmuxsink: set the same seqnum on flush_start / flush_stop
It's currently not made mandatory by aggregator, but it might
eventually be, and is more consistent behaviour

See https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/977
2019-06-13 16:44:47 +02: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
Jan Schmidt
18a7c10d4e splitmuxsink: Improve debug output
Make the debug output less confusing by not mentioning a src
pad when doing calculations on the sink pad side.

Improve debug around why a GOP is considered overflowing a fragment
2019-06-06 10:55:42 +10:00
Jan Schmidt
5ae55a4633 splitmuxsink: Give internal queues useful names
Makes debug output more useful
2019-06-06 10:55:42 +10:00
Sebastian Dröge
32c465a537 splitmuxsink: Only set running time on finalizing sink element when in async-finalize mode
There is only a single sink element in async-finalize mode, and we would
keep the running time from previous fragments set in that case. As we
don't ever set the running time for the very last fragment on EOS, this
would mean that the closing time reported for the very last fragment is
the same as the closing time of the previous fragment.
2019-05-28 17:21:06 +03:00
Mathieu Duponchelle
d704790519 doc: fix element section documentations
Element sections were not rendered anymore after the hotdoc
port, fixing this revealed a few incorrect links.
2019-05-25 16:57:31 +02:00
Seungha Yang
d2cac61113 multifilesink: Fix documentation of max-file-duration property
The max-file-duration property works with max-duration mode
2019-05-22 11:03:34 +09:00
Thibault Saunier
af01988534 doc: Port documentation to hotdoc 2019-05-13 11:34:56 -04: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
Vivia Nikolaidou
af0e30d545 splitmuxsink: Do not hardcode frames_of_daily_jam
Apart from the obvious drawbacks of hardcoding, the drawback here was
that, if we subtracted 2 frames (instead of 2.6) from the target running
time, we'd request the next keyframe a bit too far into the future,
which would make our files split at the wrong position.

https://bugzilla.gnome.org/show_bug.cgi?id=797293
2018-10-16 16:06:47 +03:00
Vivia Nikolaidou
faee020994 splitmuxsink: Fix if condition in drop-frame timecode wrap-around
Was previously: if ( x | y && a == b). Changed it into if ((x & y) && (a
== b)).
2018-10-11 13:58:34 +03:00
Vivia Nikolaidou
1219712da0 splitmuxsink: Subtract daily jam offset when day wraps around
For drop-frame framerates, when the expected next max timecode wraps
around at the end of the day, we have to subtract the offset of the
daily jam, otherwise we end up with a duration that's a few frames too
long.

https://bugzilla.gnome.org/show_bug.cgi?id=797270
2018-10-11 13:51:08 +03:00
Peter Körner
4b570026aa splitmuxsink: accept pads named 'sink' on the muxer, handle static pads as well
https://bugzilla.gnome.org/show_bug.cgi?id=797241
2018-10-03 23:24:26 +03:00
John Nikolaides
6fe214e7a9 splitmuxsink: Added a split-at-running-time action signal
The video file can now be split at an arbitrary time, given by the user
as an argument to the action signal.

https://bugzilla.gnome.org/show_bug.cgi?id=787922
2018-09-28 16:53:29 +03:00
Mathieu Duponchelle
9605028a71 splitmuxsink: Implement split-after
The behaviour of split-now is to output the current GOP after
starting a new file.

The newly-added split-after signal will output the current GOP
to the old file if possible once a new GOP is opened.

https://bugzilla.gnome.org/show_bug.cgi?id=796982
2018-09-21 16:31:34 +02:00
Mathieu Duponchelle
bfcddb7125 mp4 robust muxing: improve documentation and logging 2018-08-16 19:43:50 +02:00
Jan Schmidt
5da08a21c6 splitmuxsink: Don't leak old muxer/sink in async mode
Make sure to clear the reference taken earlier in the function
when switching muxer/sink asynchronously so they don't leak
2018-08-15 02:28:20 +10:00
Jan Schmidt
f8076e208b splitmuxsink: Fix reference counting loop
The stream context was holding a reference to the
internal queue and pads, with pad probes that were
in turn holding references to the stream context.

This lead to a leak if the request pads weren't explicitly
released.

https://bugzilla.gnome.org/show_bug.cgi?id=796893
2018-08-15 02:12:53 +10:00
Jan Schmidt
f672116c72 splitmux: Improve handling of repeated timestamps
When handling input with timestamps that repeat, sometimes
splitmuxsink would get confused and ignore a keyframe.

The logic in question is a holdover from before the cmd queue
moved the file cutting to the multiqueue output side and made
it deterministic, so it's no longer needed on the input
here.

https://bugzilla.gnome.org/show_bug.cgi?id=796773
2018-07-17 10:57:42 +10: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
Vivia Nikolaidou
d11339d616 splitmuxsink: Added new async-finalize mode
This mode is useful for muxers that can take a long time to finalize a
file. Instead of blocking the whole upstream pipeline while the muxer is
doing its stuff, we can unlink it and spawn a new muxer+sink combination
to continue running normally.

This requires us to receive the muxer and sink (if needed) as factories,
optionally accompanied by their respective properties structures. Also
added the muxer-added and sink-added signals, in case custom code has to
be called for them.

https://bugzilla.gnome.org/show_bug.cgi?id=783754
2018-05-24 12:47:24 +03:00
Vivia Nikolaidou
498ebc5503 splitmuxsink: Added caption_%u pad template
For closed-caption-enabled muxers (e.g. qtmux)
2018-05-11 16:39:46 +03:00
Xavier Claessens
edd9c8f6b8 Meson: Generate pc file for all plugins in good
https://bugzilla.gnome.org/show_bug.cgi?id=794568
2018-04-25 11:07:06 +01:00
Vivia Nikolaidou
7d7c90bf5c splitmuxsink: Don't send fragment-opened-closed message if the reference ctx is NULL
It can happen during teardown that the reference context becomes NULL.
In that case, trying to send the fragment-opened-closed message would
lead to a crash.
2018-04-11 17:59:21 +03:00
Sebastian Dröge
6d7242925b splitmuxsink: Run gst_iterator_foreach() as long as it returns GST_ITERATOR_RESYNC
CID 1434160
2018-04-11 09:21:19 +02:00
Sebastian Dröge
0f1770f2bd splitmuxsink: Add new reset-muxer property
With this the muxer is not set to NULL after each segment but instead
only flush events are sent to it to reset the EOS state.

As a result, the muxer will keep stream state and e.g. mpegtsmux will
keep the packet continuity counter continuous between segments as needed
by hlssink2.

https://bugzilla.gnome.org/show_bug.cgi?id=794816
2018-04-03 14:37:44 +03:00
Sebastian Dröge
42f5f3d1be splitmuxsink: Allow splitting at exactly the time/bytes threshold
76e458a119 changed the conditions from
"queued > threshold" to "queued >= threshold", which broke hlssink2 and
resulting in too small fragments being created although keyframes would
be at *exactly* the configured threshold.

https://bugzilla.gnome.org/show_bug.cgi?id=794440
2018-03-19 12:23:47 +02: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
Justin Kim
ad8a6cb639 qtmux: send stream warning when refusing video caps
If codec_data is changed, the stream is no longer valid.
Rather than keeping running when refusing new caps,
this patch send a warning  to the bus.

Also fix up splitmuxsink to ignore this warning while changing caps.

https://bugzilla.gnome.org/show_bug.cgi?id=790000
2018-02-01 10:12:46 +00: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
Tim-Philipp Müller
a5b5451d93 multifilesrc: fix up uri handler a little
Fix path escaping when creating URI from location in get_uri().

Return FALSE with an error when URI can't be parsed in set_uri().

https://bugzilla.gnome.org/show_bug.cgi?id=783581
2018-01-23 18:38:26 +00:00
Dimitrios Katsaros
dccfaf2e91 multifilesrc: implement uri handler
With this patch we can now provide a set of files
created by multifilesink as a source for uri elements.

e.g. gst-launch-1.0 playbin uri=multifile://img%25d.ppm

Note that for the %d pattern you need to replace % with %25.
This is to be compliant with URL naming standards.

https://bugzilla.gnome.org/show_bug.cgi?id=783581
2018-01-23 18:05:49 +00:00
Tim-Philipp Müller
dfb27b44bc multifilesink: document unit of "max-file-duration" property 2018-01-16 13:19:29 +00:00
John Nikolaides
91dfc20a04 splitmuxsink: added a "split now" action signal
Now, the video file can be split at an arbitrary time chosen by the user.

https://bugzilla.gnome.org/show_bug.cgi?id=787922
2017-12-08 21:16:15 +02:00
Jan Schmidt
76e458a119 splitmuxsink: Use muxer reserved space properties if present.
If the use-robust-muxing property is set, check if the
assigned muxer has reserved-max-duration and
reserved-duration-remaining properties, and if so set
the configured maximum duration to the reserved-max-duration
property, and monitor the remaining space to start
a new file if the reserved header space is about to run out -
even though it never ought to.
2017-11-25 00:56:11 +11:00
Jan Schmidt
3a813a0dcc splitmux: Fix file switch-on-caps-change.
Switching to a new fragment because the input caps have
changed didn't properly end the previous file. Use the normal
EOS sequence to ensure that happens. Add a test that it works.
2017-11-24 16:56:03 +11:00
Jan Schmidt
97e8fd8272 splitmuxsrc: Don't return FALSE from event handling.
Returning FALSE because we drop an event means that
internal sources like qtdemux might throw an error
and break the whole pipeline. The only time it can
happen is either flushing or shutdown, and those
will be handled anyway.
2017-11-18 02:33:00 +11:00
Reynaldo H. Verdejo Pinochet
0ddb65dec7 Use proper GtkDoc notation for NULL/FALSE/TRUE 2017-10-03 16:30:10 -07:00
Tim-Philipp Müller
07dd3dba6f multifilesink: use new gst_buffer_list_calculate_size() 2017-09-17 12:50:30 +01:00