Commit graph

10424 commits

Author SHA1 Message Date
Havard Graff
8194ab13f7 rtptwcc: make enabling TWCC sticky
Meaning that if a caps comes along that does NOT have TWCC in it,
this does not turn of TWCC for the rest, as this is in fact
completely allowed. (To have some payload-types not containing TWCC
seqnums).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Havard Graff
b66c6714fa rtptwcc: move TWCC-logic over to the TWCC-manager
Prevent cluttering up the rtpsession, and keeping things localized.

Also write TWCC-seqnums for *all* streams in the session if configured by
caps.

A while back WebRTC was not doing TWCC for audio, basically breaking the
whole idea of a "transport-wide seqnuencenumber" applying for all bundled
streams. However, they have since fixed this, and now it no longers
makes sense to be able to single out certain payloadtypes for
use with TWCC, rather just including them all.

This also makes using RTX, RED, FEC etc much simpler, as it will apply
to them all as they enter the rtpsession.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Havard Graff
ee361bf958 rtptwcc: fix warning
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Tulio Beloqui
4ef0ce282e rtptwcc: fixes and optimizations around run-length chunks
Co-authored-by: Havard Graff <havard.graff@gmail.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Havard Graff
219749c40c rtptwcc: fix seqnum-wrap
Using the proper API to do this is obviously an improvement, and
adding a test for the case of a packet-loss when the seqnum wrap
is also a good idea.

Co-authored-by: Tulio Beloqui <tulio.beloqui@pexip.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Tulio Beloqui
3b14a24630 rtptwcc: fixed feedback packet count overflow that allowed late
packets to be processed

Co-authored-by: Havard Graff <havard.graff@gmail.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Tulio Beloqui
3484f21b95 rtptwcc: fixed parsing of old sequence number
Co-authored-by: Havard Graff <havard.graff@gmail.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Tulio Beloqui
abf4b57a1c rtptwcc: fixed guint8 overflow of feedback packet count
Co-authored-by: Havard Graff <havard.graff@gmail.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Havard Graff
be5fab15e0 rtptwcc: add feedback-interval
To allow RTCP TWCC reports to be scheduled on a timer instead of per
marker-bit.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Havard Graff
ddcde96efe rtptwcc: remove _set_send_packet_ts
Not in use.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/927>
2021-08-25 08:36:06 +00:00
Tim-Philipp Müller
43f2fd8081 qtdemux: add depth for ProRes 4:4:4:4 variants if available
Might be 24bpp in case an alpha channel is coded but
the image is always opaque.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1061>
2021-08-24 12:35:47 +00:00
Ruslan Khamidullin
f510d48ecf qtmux: for Apple ProRes, allow overriding pixel bit depth for 4:4:4:4 variants
e.g. when exporting an opaque image, yet with alpha channel.

Apple ProRes certification requires that, when a ProRes-writing
application *knows* that the entire frame is opaque, the application
writes only RGB without alpha even when the clip is RGBA. For that,
this tiny change allows the app to override pixel depth when writing ProRes.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1061>
2021-08-24 12:35:47 +00:00
Matthew Waters
6605174358 isomp4/mux: add a function for seeking to a specific output byte position
We do it enough times that this makes sense.  Also add a debug log line
for the seek position requested.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1060>
2021-08-23 04:17:36 +00:00
Matthew Waters
9dc5cb34ae isomp4/mux: don't overwrite with a bigger moov when fragmenting
When outputting fragmented mp4, with a seekable downstream, we rewrite
the moov to maybe add a duration to the mvex.  If we start by not
writing the initial moov->mvex->mhed duration and then overwrite with a
moov containing mhed atom, the moov's will have different sizes and
could overwrite subsequent data and result in an unplayable file.

e.g. The initial moov would be of size 842 and the final moov would have
a size of 862.

Fix by always pushing out the mhed duration in the moov when
fragmenting.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/898

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1060>
2021-08-23 04:17:36 +00:00
Matthew Waters
0d27e6f86e isomp4: actually make streamable fallback work
We weren't setting the fragment_mode field anymore now that the
implementation doesn't change based on the value of the streamable
property.  This lead to invalid files.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1060>
2021-08-23 04:17:36 +00:00
Matthew Waters
d806486503 isomp4: fix trun data offset handling
The trun offset was missing a calculation for one of the box type
headers.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/866

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1060>
2021-08-23 04:17:36 +00:00
Matthew Waters
467829358c isomp4/mux: fixes for fragmented mp4 output
Various buffer offset calculations were not quite correct in all cases.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/866

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1060>
2021-08-23 04:17:36 +00:00
Mathieu Duponchelle
9bd8d608d5 matroska-mux: support H264 avc3 / H265 hev1
The matroska codec specs is unfortunately vague on the subject,
stating for H264:

AVC/H.264 stored as described in [@!ISO.14496-15]

and for H265:

HEVC/H.265 stored as described in [@!ISO.14496-15]

This spec however specifies multiple stream formats, our
implementation has opted for interpreting this as avc1 / hvc1,
both of which disallow in-band SPS.

Most decoders however will support in-band SPS / PPS, and
this commit gives the option to explicitly mux in avc3 / hev1,
which allows changing stream parameters on the fly, that is
useful for smart encoding for example.

When either of these stream formats are picked as the input,
changes in codec_data / tier / level / profile do not cause
renegotiation failure, a warning is logged however as it isn't
clear how compliant such a stream is.

The stream-format field is correctly ordered in the template
caps to avoid selecting potentially non-compliant options on
automatic negotiation.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1047>
2021-08-20 00:16:43 +00:00
Mathieu Duponchelle
cb75eda13b isomp4/qtmux: allow renegotiating when tier / level / profile change
Those are carried either in codec_data or in-band SPS (for avc3),
and it is OK for those to change, though decoders obviously need
to support it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1047>
2021-08-20 00:16:43 +00:00
Mathieu Duponchelle
896c49cf49 isomp4/qtmux: accept video/x-h264, stream-format=avc3
The main difference between avc1 and avc3 is that avc3 is allowed
to contain in-band SPS / PPS. In practice decoders will always use
in-band parameter sets anyway, but it is cleaner to explicitly
advertise it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1047>
2021-08-20 00:16:43 +00:00
Mathieu Duponchelle
fa835d686f isomp4/qtmux: make sure to switch to next chunk on new caps
For example, with single video sink pad, and new codec_data is
received, current_chunk_offset must be reset to -1 for the
aggregate loop to open a new chunk.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1047>
2021-08-20 00:16:43 +00:00
Mathieu Duponchelle
e069824c7d isomp4/atoms: fix multiple stsd entries
stsd entries are serialized in reverse order (starting from
g_list_last()), and must be prepended to the entry list for their
index to be correct when referenced from stsc entries.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1047>
2021-08-20 00:16:43 +00:00
Arun Raghavan
2c6be7373f matroska-mux: Add a timestamp-offset property
Adds a user-controllable timestamp offset to clusters and blocks. This
should be useful if we want to have timestamps that have significance
outside of the current file (for example, we might set the offset to the
wallclock when the file is being created, or some other common base, if
we want to correlate streams across multiple files).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1051>
2021-08-18 10:51:15 -04:00
Stéphane Cerveau
508a565163 matroska: demux: update stream_start_time
The stream_start_time can be less than the first detected.
In case of B-Frame based media, the first frame PTS might be
greater than the next one.

Need to keep the segment.start if a seek has been performed.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1030>
2021-08-17 16:09:14 -04:00
Nicolas Dufresne
65deef0b0c mastrokademux: Remove redundant assignment
The segment.position is unconditionnaly set few lines below.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1030>
2021-08-17 16:08:33 -04:00
Víctor Manuel Jáquez Leal
d1cd310e42 videocrop: Fix icles tests.
Internally videcrop can call gst_video_crop_set_info() with NULL as in
caps. Then critical messages are raised when the in caps are
processed.

To fix this the in caps are checked, and if they are present, its
capsfeature is extracted, otherwise, the previous raw caps detection
remains as before.

Also the videocrop-test removes the format field in the structure
because now its always passed.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1056>
2021-08-17 17:19:16 +00:00
Jakub Adam
286208576f rtp: Color Space header extension
Implements WebRTC header extension defined in
http://www.webrtc.org/experiments/rtp-hdrext/color-space.

It uses RTP header to communicate color space information and optionally
also metadata that is needed in order to properly render a high dynamic
range (HDR) video stream.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/853>
2021-08-17 15:28:19 +00:00
Per Förlin
9a216d0ffa rtspsrc: Add support to ignore x-server HEADER reply
When connecting to an RTSP server in tunnled mode (HTTP) the server
usually replies with a x-server header. This contains the address
of the intended streaming server. However some servers return an
"invalid" address. Here follows two examples when it might happen.

1. A server use Apache combined with a separate RTSP process to handle
   Https request on port 443. In this case Apache handle TLS and
   connects to the local RTSP server, which results in a local
   address 127.0.0.1 or ::1 in the x-server reply. This address is
   returned to the actual RTSP client in the x-server header.
   The client will receive this address and try to  connect to it
   and fail.

2. The client use a ipv6 link local address with a specified scope id
   fe80::aaaa:bbbb:cccc:dddd%eth0 and connects via Http on port 80.
   The RTSP server receives the connection and returns the address
   in the x-server header. The client will receive this address and
   try to connect to it "as is" without the scope id and fail.

In the case of streaming data from RTSP servers like 1. and 2. it's
useful to have the option to simply ignore the x-server header reply
and continue using the original address.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1007>
2021-08-17 10:15:27 +00:00
Tulio Beloqui
9af6ce974a rtpjitterbuffer: fixed stall on gap when using rtx
Co-authored-by: Håvard Graff <havard@pexip.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1055>
2021-08-16 09:51:05 +00:00
Nirbheek Chauhan
620e9323c5 flv: use g_memdup2() as g_memdup() is deprecated
g_memdup() is deprecated since GLib 2.68 and we want to avoid
deprecation warnings with recent versions of GLib.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1052>
2021-08-16 08:00:53 +00:00
Víctor Manuel Jáquez Leal
862aa25e53 videocrop: Resurrect logging category.
Fix for a regression from commit 8f1384c9. That commit moved the debug
category definition, as static, into a gstvideocropelement.c, but that
category was used as default, in gstvideocrop.c, so it was never used
at logging, so the debug selector never showed the logs for
videocrop.

This patch move back the category definition into gstvideocrop.c and
leaving the function videocrop_element_init() as a noop.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1049>
2021-08-11 16:09:06 +02:00
Víctor Manuel Jáquez Leal
9e1919c040 videocrop: Resurrect any caps feature negotiation.
Commit e31cbce4 brought a regression to negotiate featured caps. But
only by removing the entry in the caps template. This commit brings it
back.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1039>
2021-07-28 08:47:21 +00:00
Jan Schmidt
9499976fbb splitmuxsink: Fix some reference leaks in error cases.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1023>
2021-07-26 17:56:42 +10:00
Jan Schmidt
b50d3b9c9f splitmuxsink: Prevent hang going back to NULL after failures
Prevent a condition where splitmuxsink won't go back to NULL state
after a child element fails to change state by making sure that
a READY->READY state change doesn't fail, and by returning
GST_FLOW_ERROR or GST_FLOW_FLUSHING upstream to shut down streaming
as quickly as possible.

This can happen after (for example) setting an invalid filename
on the sink element. In that case, the READY->PAUSED transition
fails, but with internal elements still in the NULL state. Trying
to set splitmuxsink back to NULL then ends up trying to bring
those NULL elements up to READY with a READY->READY transition,
(which fails, prevent splitmuxsink from getting to NULL)

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1023>
2021-07-26 16:22:23 +10:00
Mathieu Duponchelle
2c85fd1be9 deinterlace: reduce noise when gst_pad_set_caps fails
It may be that downstream is simply flushing, in which case logging
an error is misleading.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1029>
2021-07-13 06:52:26 +00:00
Mathieu Duponchelle
a6d6e99f59 splitmuxsink: always use factory property when set
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1024>
2021-07-08 02:23:02 +02:00
Yacine Bandou
ce0be27caf qtdemux: No need for new "application/x-cbcs" caps
Instead of using the new "application/x-cbcs" caps, we are just adding
a new structure field "ciphe-mode", to indicate which encryption scheme
is used: "cenc", "cbcs", "cbc1" or "cens".

Similarly for the protection metadata, we add the "cipher-mode" field
to specify the encryption mode with which the buffers are encrypted.

"cenc": AES-CTR (no pattern)
"cbc1": AES-CBC (no pattern)
"cens": AES-CTR (pattern specified)
"cbcs": AES-CBC (pattern specified, using a constant IV)

Currently only "cenc" and "cbcs" are supported.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1013>
2021-07-06 12:12:24 +00:00
Jan Schmidt
d270fa498c matroskamux: Always write a tags element into seekhead
If there are only stream tags, we still want to write the
tags entry into the seekhead, so that tags can be found
quickly in the player.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/905

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1020>
2021-07-02 07:45:07 +00:00
Seungha Yang
adae01e4c3 qtmux: Don't need to update track per GstCaps if it's not changed
Skip GstQTMuxPad::set_caps() call for duplicated caps.
All the processing done in set_caps() method for duplicated caps
are redundant.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1019>
2021-07-02 06:22:41 +00:00
Sebastian Dröge
6e2924ff9c rtpssrcdemux: Remove pads and reset the element also in READY->NULL
Mostly for completeness.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1018>
2021-07-01 13:19:53 +03:00
Sebastian Dröge
c94469339a rtpptdemux: Remove pads also in PAUSED->READY
They're based on per-stream information and that should be reset
whenever going to READY state.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1018>
2021-07-01 13:19:53 +03:00
Seungha Yang
e76218c1cb multiudpsink: Fix broken SO_SNDBUF get/set on Windows
SO_SNDBUF has been undefined on Windows because of missing WinSock2.h
include. And don't use native socket functions (e.g., setsockopt())
if code is expected to be built on Windows. We don't link ws2_32.lib
for this plugin.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1016>
2021-06-28 15:32:51 +00:00
Olivier Crête
38e906de5d rtpmanager: Access GstRTPHdrExt fields through accessor
This way, the implementation can be private.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1017>
2021-06-24 14:57:14 -04:00
Jan Schmidt
34a6acede1 qtdemux: Refuse seeks in BYTES format
If downstream tries to seek in BYTES format, don't pass that through
to upstream. The byte positions downstream requests won't make any
sense in the muxed stream. There might be other formats we want to
pass through to upstream, but BYTES is not one of them. If we get a
seeking query about BYTES format, refuse that too.

This fixes a situation where we're playing a fragmented mp4 over http
and qtdemux refuses the initial seek (in TIME format), but then
h264parse/baseparse send a seek in BYTES format and everything falls
apart.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1014>
2021-06-22 18:05:56 +10:00
Nirbheek Chauhan
95f6c31c21 rtph265depay: update codec_data in caps regardless of format
Updating of codec_data in the caps is important to propagate changes
in sps/pps/vps via NALs. Without this, downstream does not renegotiate
when upstream changes resolution.

The comment referring to rtph264pay is from 2015 and is out of date.
rtph264pay stopped doing that in 2017 with commit
dabeed52a9

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1011>
2021-06-16 16:35:07 +05:30
Tim-Philipp Müller
21c90afd92 qtdemux: use g_memdup2() as g_memdup() is deprecated
- atom nodes/bytereader sizes are already checked
- palettes: are fixed/known size

g_memdup() is deprecated since GLib 2.68 and we want to avoid
deprecation warnings with recent versions of GLib.

Also use gst_buffer_new_memdup() instead of _wrapped(g_memdup(),..).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/993>
2021-06-02 17:34:38 +01:00
Tim-Philipp Müller
05854f74c5 matroskademux: use g_memdup2() as g_memdup() is deprecated
- ebml-read: add some sanity checks when going from 64-bit
  to 32-bit length
- matroska-ids: codec_data_size has been checked via
  gst_ebml_read_binary(), is existing allocation.
- matroska-demux: alloc size is from existing allocations

g_memdup() is deprecated since GLib 2.68 and we want to avoid
deprecation warnings with recent versions of GLib.

Also use gst_buffer_new_memdup() instead of _wrapped(g_memdup(),..).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/993>
2021-06-02 17:34:38 +01:00
Tim-Philipp Müller
aa4448cdd6 rtpjpegpay: fix image corruption when compiled with MSVC on Windows
On Windows with MSVC, jpeg_header_size would end up 2 bytes larger
than it should be. This then leads to the first 2 bytes of the
actual jpeg image data to be dropped, because we think those
belong to the header, which results in an undecodable image when
reconstructed in the depayloader.

What happens is that when the compiler evaluates

  jpeg_header_size = mem.offset + read_u16_and_inc_offset_by_2(&mem);

it actually uses the mem.offset value after it has been increased
by the function call on the right hand size of the equation.

From section 6.5 of the C99 spec:

  3. The grouping of operators and operands is indicated by the syntax [74].
     Except as specified later (for the function-call (), &&, ||, ?:, and
     comma operators), the order of evaluation of subexpressions and the
     order in which side effects take place are both unspecified.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/889

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/999>
2021-05-29 14:31:34 +01:00
Seungha Yang
80567ca939 deinterlace: Drop "field-order" field while transforming caps
Like other basetransform subclasses are doing, drop field
which can be converted by deinterlace.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/997>
2021-05-27 12:58:30 +00:00
Seungha Yang
9a8aea4a6a deinterlace: Drop field-order field if outputting progressive
Progressive with field-order doesn't make sense

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/997>
2021-05-27 12:58:30 +00:00