Commit graph

474 commits

Author SHA1 Message Date
Sebastian Dröge
3971f8b86c mpegtsmux: Don't time out in live mode if no timestamped next buffer is available
The muxer can only advance the time if it has a timestamped buffer that can be
output, otherwise it will just busy-wait and use up a lot of CPU.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3912

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7870>
2024-11-15 13:07:06 +00:00
Edward Hervey
6ba70f5da8 mpegtsmux: Post error on the bus if no mapping is found
This is more useful/visible

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7707>
2024-11-13 08:29:25 +01:00
Edward Hervey
244b00ac08 mpegts: Add custom mapping for vp9
This is a custom mapping. There isn't much needed apart from that to store vp9
in mpeg-ts since the bitstream is self contained.

Since there are no official specification we don't want people to be mistaken in
believing that. Therefore that mapping is only used in the muxer if the (new)
property `enable-custom-mappings` is set to TRUE.

* The MPEG-TS Stream Type is Private Data (0x6) with the registration descriptor
  set to `VP09`.
* The Access Unit are VP9 frames stored in PES packets
* As there is no emulation prevention byte in VP9 elementary stream, the can be
  misdetection of PES start code. To avoid this, the start of a PES packet must
  be signalled using the Payload Unit Start Indicator in the transport packet
  header

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7707>
2024-11-13 08:28:36 +01:00
Théo Maillart
a1c92c0cb1 mpegvideoparse: do not set delta unit flag on unknown frame type
When encoding an image to mpeg2 video, with something like:
  gst-launch-1.0 encodebin name=e profile=mpegpsmux:video/mpeg,mpegversion=2,systemstream=false ! \
                 filesink location=sample.mpg filesrc num-buffers=1 blocksize=$(stat -c%s sample.png) \
                 location=sample/dts.png ! pngdec ! e.
The only frame's type is set to an invalid value 0
The consequence is that mpegvideoparse sets the delta unit flag on the buffer because
it is not an I frame, then decodebin3 drops this only frame because the delta
unit flag is set and the decoder receives eos before it was able to receive any
encoded data

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7832>
2024-11-12 09:13:10 +00:00
Olivier Crête
d934ea3f7a tensormeta: Add APIs to create and access GstTensorMeta contents
Also document those APIs better.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6000>
2024-11-08 14:58:49 +00:00
Olivier Crête
4295386804 tensors: Use full GstTensorDataType type name in type members
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6000>
2024-11-08 14:58:49 +00:00
Daniel Morin
8169863f01 analytics: Make GstTensor more suitable for inline allocation
GstTensor contained two fields (data, dims) that were dynamicallay allocated. For
data it's for a GstBuffer and we have pool for efficient memory management. For
dims it's a small array to store the dimension of the tensor. The dims field
can be allocated inplace by moving it at the end of the structure. This will
allow a better memory management when GstTensor is stored in an analytics meta
which will take advantage of the _clear interface for re-use.

- New api to allocate and free GstTensor
To continue to support use-cases where GstTensor is not stored in an
analytics-meta we provide gst_tensor_alloc, gst_tensor_alloc_n and
gst_tensor_free that will facilitate memory management.
- Make GstTensor a boxed type

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6000>
2024-11-08 14:58:49 +00:00
Olivier Crête
8fa4c8f2f0 tensordecoders: Move decoder out of the ONNX plugin
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6000>
2024-11-08 14:58:49 +00:00
Adrien De Coninck
abd9fc5635 tsdemux: validate frat before setting framerate in caps
From JPEG-XS part3 : "If the frame rate is unknown, the frat parameter is 0."

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7836>
2024-11-06 14:48:51 +00:00
Adrien De Coninck
b3e2ad498a tsdemux: use JXS_video_descriptor "frat" to set caps "framerate"
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7836>
2024-11-06 14:48:51 +00:00
Sebastian Dröge
d2d2a12aac timecodestamper: Don't fail the latency query in LTC mode if we have no framerate
Only in LTC mode we introduce additional latency that is depending on only on a
property and not on the framerate, so waiting for the framerate is not necessary.

In all other modes no latency is introduced at all and the latency query can
simply be proxied.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7831>
2024-11-06 12:52:22 +00:00
Mart Raudsepp
790b12cf13 mpegtsmux: Add support for SMPTE 302M (audio/x-smpte-302m)
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6530>
2024-11-06 11:16:14 +00:00
Jan Alexander Steffens (heftig)
6ddd51c239 h264parse: Fix pic_timing SEI replacement
The calculated position was off. I'm not sure of the exact cause;
possibly because we're in AU-aligned byte-stream mode, which means
`transform` is true.

Replacing the math that calculates the NALU positions with code more
similar to what is already in use for `idr_pos` seems to have fixed it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7318>
2024-10-31 20:29:37 +00:00
Jan Alexander Steffens (heftig)
04238d3b3c h264parse, h265parse: Support drop frame codes with counting_type 6
Tested with an Ateme Kyrion CM5000, which uses 6 when it drops 4 frames
from the code for 1080p@59.94.

Apply the same change to h265parse, with reference to the spec.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7316>
2024-10-31 19:34:53 +00:00
Edward Hervey
0942dc57dd mpegts: Fix bit-depth storage for jpeg-xs
As per ISO/IEC 21122-3 2019:

> Sample_Bitdepth code shall specify directly the bitdepth of the components
minus 1

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3945

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7775>
2024-10-31 10:02:01 +00:00
Sebastian Dröge
8f5dca9611 rtmp2sink: Initialize base_ts / last_ts with the actual first observed timestamp
Initializing it with zero can falsely trigger the overflow / underflow detection
code if the first observed timestamp is a big integer.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7745>
2024-10-29 17:27:42 +00:00
Xavier Claessens
9b946098df unixfd: Fix racy unit test by adding wait-for-connection property
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6765>
2024-10-29 12:12:26 +00:00
Diego Nieto
43c9c3a020 debugutils: videocodectestsink: support GRAY8 and GRAY10_LE{16,32}
Add support for:
    * GST_VIDEO_FORMAT_GRAY8
    * GST_VIDEO_FORMAT_GRAY10_LE16
    * GST_VIDEO_FORMAT_GRAY10_LE32

These formats are used by Fraunhofer VVC encoder and decoder.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7706>
2024-10-25 05:53:22 +00:00
Peter Stensson
06d4629521 codectimestamper: Fix gint wraparound in pts_compare_func
The diff between compared timestamps might be outside the gint range
resulting in wrong sorting results. This patch corrects that by
comparing the timestamps and then returning -1, 0 or 1 depending on the
result.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7726>
2024-10-25 01:49:10 +00:00
Jordan Yelloz
bcaf72ba62 mpegtsmux: Schedule PMT update on stream removal
Following the behavior of tsmux_program_add_stream(), this ensures that a PMT
update will also be caused by removal of a stream from a program.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7719>
2024-10-24 16:08:12 +00:00
Sebastian Dröge
493f8e440a mpegtsdemux: Handle PTS/DTS wraparound with ignore-pcr=true
The wraparound handling code assumes that the PCR gets updated regularly for
being able to detect wraparounds. With ignore-pcr=true that was not the case and
it stayed initialized at 1h forever.

To avoid this problem, update the fake PCR whenever the PTS advanced by more
than 5s, and also detect wraparounds in these fake PCRs.

Problem can be reproduced with

  $ gst-launch-1.0 videotestsrc pattern=black ! video/x-raw,framerate=1/5 ! \
    x264enc speed-preset=ultrafast tune=zerolatency ! mpegtsmux ! \
    tsdemux ignore-pcr=true ! fakesink

which restarts timestamps at 0 after around 26h30m.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7588>
2024-10-24 15:09:15 +00:00
Stéphane Cerveau
5e7f187d93 scenechange: fix memory leak
A reference to the last buffer(oldbuf) was kept
leading to a memory leak on stop.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7662>
2024-10-15 04:20:01 +00:00
Vivia Nikolaidou
384cb299ec mxftypes: Add support for a few additional fields
According to SMPTE ST 377-1:2019

Currently still unused.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7626>
2024-10-09 21:34:06 +00:00
Vivia Nikolaidou
1b81c9ca87 mxftypes: Check for the existence of all required fields
According to SMPTE ST 377-1:2019

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7626>
2024-10-09 21:34:06 +00:00
Vivia Nikolaidou
7cc16b64b7 mxfdemux: Keep tracking the offsets even when an index table was found
Some files may contain a partial index table, leading into a crash when
you try seeking in them

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7626>
2024-10-09 21:34:06 +00:00
Julian Bouzas
9accf21e53 h264parse: Wait for SEI before exposing src caps
This makes sure 'lcevc=false' src caps are not set before parsing SEI. It is
needed for decodebin2 to work properly with the LCEVC decoder.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7330>
2024-10-02 20:33:13 +00:00
Olivier Crête
8055b0386f h264parse: Don't fake IDR without at least an i-slice
There was an override to fake an IDR as soon as a SPS/PPS
is encountered, but that's not valid, at least an i-slice is needed.

Amend the visl result, as the output is slightly more correct, not
duplicating frame_num.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7330>
2024-10-02 20:33:13 +00:00
Julian Bouzas
2c514ac2f1 h264parse: attach LCEVC meta to buffers if it is present in SEI
This improves the h264parse element to attach LCEVC enhancement data to buffers
using the new GstLcevcMeta API. This metadata will eventually be used downstream
by LCEVC decoders to enhance the RAW video frame.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7330>
2024-10-02 20:33:13 +00:00
Sebastian Dröge
b7b24573ce common: Use more efficient versions of GstCapsFeatures API where possible
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7432>
2024-09-26 19:26:18 +03:00
Sebastian Dröge
6233eb0ff3 common: Stop using GQuark-based GstStructure field name API
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7432>
2024-09-26 19:21:29 +03:00
Sebastian Dröge
0c1611d31d common: Stop using GQuark-based GstStructure name API
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7432>
2024-09-26 19:21:29 +03:00
Sebastian Dröge
cff7e3986e mxfmux: Use gst_aggregator_update_segment() instead of randomly pushing a segment event
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7542>
2024-09-19 17:08:45 +03:00
Sebastian Dröge
1bd6aabf96 mpegtsmux: Use gst_aggregator_push_src_event() for pushing downstream events
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7542>
2024-09-19 17:08:45 +03:00
Sebastian Dröge
9f7148025f mpegtsmux: Fix refcounting issue when selecting the best pad
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7538>
2024-09-17 23:49:35 +00:00
Edward Hervey
15e7928c8a mpegts: Add support for SMPTE ST-2038 ANC
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7461>
2024-09-17 19:58:48 +01:00
Edward Hervey
2e8afcf51a mpegts: Add support for JPEG-XS
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7172>
2024-09-16 18:31:01 +01:00
Edward Hervey
838ad5c7e4 tsmux: Split off j2k descriptor code in separate function
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7172>
2024-09-16 18:31:01 +01:00
Sebastian Dröge
cd5d03811d mpegtsmux: Wait for data on all pads before deciding on a best pad unless timing out
This makes sure that if upstream has different latencies that we're still
outputting buffers with increasining timestamps across the different streams
unless buffers are arriving after the latency deadline.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7500>
2024-09-13 18:15:05 +00:00
Edward Hervey
2024287a39 mpegtsmux: Cleanup TsMuxStream fields
Instead of using plenty of case-specific booleans:
* Store type as GstStreamType
* Store unique stream type

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7476>
2024-09-09 14:51:13 +00:00
Daniel Pendse
e4fbf9d180 rtmp2: Add llnw auth support to rtmp client
Add support for Limelight CDN (llnw) authentication. Inspired
by the ffmpeg implementation of llnw auth.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7410>
2024-08-26 15:02:01 +00:00
Jan Alexander Steffens (heftig)
5ca52ea026 h264parse, h265parse: Fix time code calculation
We need to multiply for the nuit_field_based_flag before scaling, or
we'll lose precision and end up only adding even timecodes.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7241>
2024-08-26 14:04:13 +00:00
Seungha Yang
8f9a53fa85 timecodestamper: Add running-time source mode
Add a new source mode "running-time". This mode will convert buffer
running time into timecode

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7322>
2024-08-23 18:37:16 +00:00
Qian Hu (胡骞)
2447cf1077 jpegparse: fix incorrect reading of transform in app14 marker
"adobe" in app14 marker seem not a null-terminted string. so, when
we use gst_byte_reader_get_string_utf8, more bytes will be read until
null. and "gst_byte_reader_get_uint8 (&reader, &transform)" will almost fail
to read transform

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7356>
2024-08-15 13:33:47 +00:00
Jordan Petridis
b6c577c70c rtmp2: reimplement librtmp's connection parameters for the connect packet
librtmp allows for attaching arbitrary AMF objects to the end of the
connect packet, and this is commonly used for authenticating with
servers.

Add a new property, extra-connect-args, that mimics librtmp's behavior.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7054>
2024-08-13 21:50:17 +00:00
Shengqi Yu
07b1841b54 baseautoconvert: correct mistake in printing log
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7323>
2024-08-08 15:19:50 +00:00
Jordan Yelloz
317c70651f h265parse: Reject FD received before SPS
A previous fix, a275e1e029, is correct but was too
permissive since it treats all un-matched NAL units the same as AU delimiters
even though some other NAL unit types can be encountered in the processing loop.

The problem this can cause is that some hardware decoders experience bad
performance when handling FD units that precede the SPS.

This change restores the original behavior for FDs so that they're ignored until
the SPS is received and it preserves the codec conformance test gains that the
fix has achieved.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7166>
2024-08-02 13:51:43 +00:00
Jordan Yelloz
f11735c97b tsmux: Adjust byte counter when adjusting bitrate
When configured in constant bitrate mode, the muxer computes timing information
using the configured bitrate and the byte counter (now = bytes sent / byterate).

When an application changes the bitrate in CBR mode during playback, the
relationship between bytes sent and bitrate is no longer valid so new timing
values will be off by the ratio of the old bitrate to the new bitrate.
Furthermore, it will upset the way that padding is generated.

pad_stream() works by trying to fit the byte counter to now * byterate.
The result is that when decreasing bitrate, the muxer stalls, waiting until the
byte counter is in agreement with now * byterate. Also, when increasing
bitrate, the padding will spike in volume until the byte counter fits with
now * byterate.

If the byte counter is scaled by the ratio of new bitrate / old bitrate when
adjusting bitrate, then padding is generated in a way that applications would
more likely expect.

One detail this change doesn't yet address is whether the next PCR will match up
optimally with the previous PCR right after the byte counter is scaled. In that
case, some correction may be necessary. Also, perhaps the user should be
prevented from changing from bitrate=0 to bitrate=nonzero during playback since
it's not straightforward how to scale the byte counter in that case.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7158>
2024-07-25 15:02:11 +00:00
jadarve
728c83f74d mpegtsmux: mux meta/x-id3
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6793>
2024-07-03 08:40:21 +00:00
Guillaume Desmottes
037d36f28d rtmp2: guard against calling gst_amf_node_get_type() with NULL
gst_amf_node_get_type() raises a CRITICAL if called with a NULL node.
All callers were checking for this except those.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7103>
2024-06-28 07:18:29 +00:00
Edward Hervey
a4a21feb87 tsdemux: Fix maximum PCR/DTS values
* PTS/DTS are stored as 33 bit
* PCR is 33bit multiplied by 300

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7050>
2024-06-18 15:56:09 +00:00