Commit graph

18855 commits

Author SHA1 Message Date
Seungha Yang
d06970c561 tests: splitmux: Add test for timecode based split 2020-03-25 13:22:31 +00:00
Seungha Yang
a40eacabb4 splitmuxsink: Split fragment only if queued time is larger than threshold
The queued time includes the duration of the last queued frame
(i.e., new keyframe) so the condition check should not be inclusive.
Note that the new fragment will be cut excluding the last frame
and therefore if the condition is inclusive way,
the fragment might have one frame shorter duration for all keyframe
stream such as jpeg or all-inter video streams.
2020-03-25 13:22:31 +00:00
Seungha Yang
6256fc67e4 splitmuxsink: Don't need to trace next timecode for split decision
Since the commit 94bb76b6b9, splitmuxsink
will split fragments based on queued time and the threshold of that.
So don't need to store the next timecode for split decision.
2020-03-25 13:22:31 +00:00
Guillaume Desmottes
d1501f0952 v4l2: add alternate interlace mode
When using this mode each frame is split in two fields, each one being
transferred using its own buffer.
This is implemented with the V4L2_FIELD_ALTERNATE field format in v4l2.

This mode is enabled using a caps filter such as
"v4l2src ! video/x-raw\(format:Interlaced\)"

Here are the main changes related to this feature:

- use the INTERLACED caps feature with this mode.

- in this mode both fields of a given frame have the same sequence/offset
so adjust the algorithm checking for lost field/frame accordingly.

- double pool's min number of buffers as each frame requires 2 buffers.

Fix #504
Co-authored-by: Zeeshan Ali <zeenix@collabora.co.uk>
2020-03-25 12:42:12 +01:00
Guillaume Desmottes
0834ef15ce v4l2: display field when setting or trying format
Ease debugging interlacing pipelines.
2020-03-25 12:14:41 +01:00
Guillaume Desmottes
8a69e26f16 v4l2: pass v4l2object to GST_V4L2_MIN_BUFFERS()
Will be used to double the number of buffers in alternate interlace
mode.
2020-03-25 12:14:41 +01:00
Guillaume Desmottes
00893baef9 v4l2: use GST_VIDEO_INFO_FIELD_HEIGHT()
Use GST_VIDEO_INFO_FIELD_HEIGHT() instead of GST_VIDEO_INFO_HEIGHT()
when we actually want the field height rather than the frame height.
So far both are equals but that won't longer be the case when
implementing alternate interlace mode.
2020-03-25 12:14:41 +01:00
Seungha Yang
0acd5d9f8b splitmuxsink: Mark some split decision related properties as MUTABLE_READY
The change of various criteria for split decision while muxing is on progress
wouldn't work well as expected.
2020-03-24 22:09:48 +09:00
Seungha Yang
94bb76b6b9 splitmuxsink: Take account queued time and max-size-timecode for split decision
Not only the requested keyframe time, the queued size should be
a criterion for the split decision of timecode based mode
(same as max-size-time based split case).
2020-03-24 22:04:21 +09:00
Matthew Waters
8be5c780bb qmlgloverlay: fix usage without an qmlglsink in the pipeline
Without a qmlglsink, we need to retrieve the window system display
ourselves rather than relying solely on qmlglsink to have priority on
the choice of display.
2020-03-24 10:24:36 +00:00
Xavier Claessens
6e1758d509 Fix usage of C99
It's 2020, way too early for that, let's stick to C89 for now.
2020-03-23 21:32:04 -04:00
Seungha Yang
b0f4831481 v4l2bufferpool: Use unique name for v4l2bufferpool object
Assign unique sequence number to an object name for better debugging
2020-03-23 17:48:19 +00:00
Matthew Waters
6397d2f910 qmlgloverlay: don't leak resources freed on a different GL thread
deleting a QOpenGLFrameBufferObject needs to occur on the same thread it
was created on in order to actually free the relevant resources
immediately.  Otherwise, they will be queued for deletion and not freed
until the associated QOpenGLContext is destroyed.
2020-03-23 14:05:18 +11:00
Matthew Waters
818dde2e02 qt: reorganize include defines 2020-03-20 21:23:03 +00:00
Havard Graff
a710bda1ab rtptimerqueue: remove ->num from the timer
This concept was only used by the "multi"-lost timer, and since that
one is not around any longer, the "num" concept is superfluous.
2020-03-20 13:17:20 +00:00
Havard Graff
f1ff80ced0 rtpjitterbuffer: remove the concept of "already-lost"
This is a concept that only applies when a buffer arrives in the chain
function, and it has already been scheduled as part of a "multi"-lost
timer.

However, "multi"-lost timers are now a thing of the past, making this
whole concept superflous, and this buffer is now simply counted as "late",
having already been pushed out (albeit as a lost-event).
2020-03-20 13:17:20 +00:00
Havard Graff
5dacf366c0 rtpjitterbuffer: immediately insert a lost-event on multiple lost packets
There is a problem with the code today, where a single timer will
be scheduled for a series of lost packets, and then if the first packet
in that series arrives, it will cause a rescheduling of that timer, going
from a "multi"-timer to a single-timer, causing a lot of the packets
in that timer to be unaccounted for, and creating a situation in where
the jitterbuffer will never again push out another packet.

This patch solves the problem by instead of scheduling those lost packets
as another timer, it instead asks to have that lost-event pushed straight
out.

This very much goes with the intent of the code here: These packets are
so desperately late that no cure exists, and we might as well get the
lost-event out of the way and get on with it.

This change has some interesting knock-on effect being presented in
later commits. It completely removes the concept of "already-lost", so
that is why that test has been disabled in this commit, to be
removed later.
2020-03-20 13:17:20 +00:00
Havard Graff
d045b40db9 rtpjitterbuffer: rework large-gap tests
Make sure to set the time the buffer is supposed to arrive at, so
as not to trigger an artificial situation.
2020-03-20 13:17:20 +00:00
Havard Graff
2fa7e6a6d4 rtpjitterbuffer: refactor lost_timeout code
Split it up in code related to the timer, (do_lost_timeout) and code
to insert a lost-item/event and update private jitterbuffer-variables.
2020-03-20 13:17:20 +00:00
Havard Graff
9eaf084d7a test/check: split out rtptimerqueue-tests in a separate file 2020-03-20 13:17:20 +00:00
Dmitriy Purgin
40a82104ea gstqmlgl: Link to opengl32.lib on MinGW 2020-03-20 06:25:28 +00:00
Seungha Yang
4f443c81cf qtmux: Fix build warning
gstqtmux.c(644): warning C4133: '=':
  incompatible types - from 'gboolean (__cdecl *)(GstAggregator *,GstAggregatorPad *,GstEvent *)'
  to 'GstFlowReturn (__cdecl *)(GstAggregator *,GstAggregatorPad *,GstEvent *)'
2020-03-19 19:20:05 +00:00
Jan Schmidt
c5181c23a4 splitmuxsink: Reset cleanly for reuse
Reset the splitmuxsink completely when changing states so that
it can be reused.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/issues/1241
2020-03-19 15:37:14 +00:00
Zebediah Figura
71bb53a648 mpegaudioparse: Use a constant bit rate to convert between time and bytes if possible.
This should result in no worse accuracy than the base parse element, and may
result in better accuracy. In particular, the number of bytes processed at any
given point, as accumulated by baseparse, can be only accurate to
(1 / # of frames) bytes per second, and if we try to seek immediately after
pausing the pipeline to a large offset, this small inaccuracy can propagate to
something noticeable.

The use case that prompted this patch is a 45-minute MPEG-1 layer 3 file, which
has a constant bit rate but no seek tables. Trying to seek the pipeline
immediately after pauisng it, without the ACCURATE flag, to a location 41
minutes in, yields a location that is, even with <https://gitlab.freedesktop.org/gstreamer/gstreamer/merge_requests/374>,
still audibly incorrect. This patch yields a much closer position, no longer
audibly incorrect, and likely within a frame of the most correct position.
2020-03-19 14:02:44 +00:00
Mathieu Duponchelle
56e5243f03 qtmux: fix renegotiation check
By the time sink_event is called, the pad's current caps have
already been updated. To address this, implement sink_event_pre_queue,
and check if the pad can be renegotiated there.

Fixes #707
2020-03-19 23:34:52 +11:00
Seungha Yang
18e09de0a2 splitmuxsink: Decouple keyframe request and the decision for fragmentation
Split the decision for keyframe request and fragmentation in order to
ensure periodic keyframe request.
2020-03-19 10:17:21 +00:00
Matthew Waters
7a25fb5b08 qt: add a qml overlay filter element [part 2]
It takes a qml scene description and renders it using a possible input
stream.

Currently supported on GLX and WGL.

Follow up to (as that MR had an old version of the commit):
- https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/475
- 4778d7166a: qt: add a qml overlay filter element
2020-03-19 17:26:54 +11:00
Matthew Waters
4778d7166a qt: add a qml overlay filter element
It takes a qml scene description and renders it using a possible input
stream.

Currently supported on GLX and WGL.
2020-03-18 11:22:39 +00:00
Matthew Waters
21acf312f0 qt: don't always activate/deactivate our GstGLContext
Techincally it is enough to activate at the beginning and then forget.
2020-03-18 11:22:39 +00:00
Matthew Waters
73cd4477af test/qml: add an dynamically adding qmlglsink element
The example shows how to add qmlglsink to an already running pipeline
with pre-existing OpenGL elements.
2020-03-18 11:22:39 +00:00
Matthew Waters
a1f53b4f46 qmlglsink: propagate the context up the the application
Allows the application to be notified of the OpenGL context creation.
2020-03-18 11:22:39 +00:00
Matthew Waters
5e9f80c79a qtitem: fix leak of caps 2020-03-18 11:22:39 +00:00
Niels De Graef
4f4997a935 wavpack: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
34a934d8d4 vpx: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
5406208f0d twolame: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
58d74f0ec5 taglib: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
e5c9538d2a speex: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
e6c3a524ce soup: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
5ccd5659c4 shout2: Use G_DECLARE_FINAL_TYPE 2020-03-16 12:35:42 +01:00
Niels De Graef
59ac993a91 raw1394: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
91c55bd920 qt: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
a9ff9fe94e pulse: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
0da5b42bcc mpg123: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
45d7dfedb8 libpng: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
2cf28f3021 libcaca: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
0811b8d719 lame: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
f4841754ec jack: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
9f494290d5 gtk: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
e45a13ca2b gdk_pixbuf: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00
Niels De Graef
9fa9ea2162 flax: Use G_DECLARE_FINAL_TYPE 2020-03-16 09:20:07 +01:00