Compare commits

...

159 commits
main ... 1.24.2

Author SHA1 Message Date
Tim-Philipp Müller 2d82731515 Release 1.24.2 2024-04-09 21:48:55 +01:00
Seungha Yang 380511f14d ccconverter: Fix caps leak and remove unnecessary code
The removed code does the exactly same thing as the below code
except for leaking caps

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6587>
2024-04-09 20:24:42 +01:00
Seungha Yang 10ffbdbb1f qsvdecoder: Release too old frames
Release too old frames manually.

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3163
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6586>
2024-04-09 18:56:08 +01:00
Philippe Normand 7ce569359f vpxenc: Include vpx error details in errors and warnings
The vpx_codec_t err_detail string usually provides additional context about the
error, so include it in GStreamer warnings and errors, when it's not NULL.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6584>
2024-04-09 17:34:44 +01:00
Jochen Henneberg 2aff9380c7 qt6: Fixes for dummy texture
* RED_OR_ALPHA8 will map value to alpha for OpenGL, use R8 to avoid
  2nd shader
* Determine texel size for proper texture memory preparation
* QByteArray::fromRawData() does shallow copy and thus leads to use of
  corrupted memory
* Make sure RGBA dummy texture is fully opaque
* QRhiTexture::create() must be called to allocate texture resources

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6581>
2024-04-09 13:51:27 +01:00
Jochen Henneberg a0e870263e qt: Fixup for dummy textures
* Initialize dummy texture Ids
* Ensure YUV->RGB matrix set for dummy textures

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6581>
2024-04-09 13:51:27 +01:00
Sebastian Dröge 17db91c7c1 rtpbin: Don't re-use a variable for a completely different purpose temporarily
During RTP-Info synchronization, clock_base was temporarily switched
from the actual clock-base to the base RTP time and then back some lines
later.

Instead directly work with the base RTP time. The comment about using a
signed variable for convenience doesn't make any sense because all
calculations done with the value are unsigned.

Similarly, rtp_clock_base was overridden with the rtp_delta when
calculating it, which was fine because it is not used anymore
afterwards. Instead, introduce a new variable `rtp_delta` to make this
calculation clearer.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6575>
2024-04-08 13:22:24 +00:00
Sebastian Dröge 72c6cac8db rtpbin: Convert clock-base to extended RTP timestamp correctly
It's not in the same period as the current RTP base time but always in
the very first period. This avoids using it again at a much later time.

The code in question is only triggered with rtcp-sync=rtp-info.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6575>
2024-04-08 13:22:24 +00:00
Sebastian Dröge bba6f097b1 rtpjitterbuffer: Use an extended RTP timestamp for the clock-base
It is compared to other extended RTP timestamps all over rtpjitterbuffer
and since 4df3da3bab the initial extended RTP timestamp is not equal
anymore to the plain RTP time.

Continue passing a non-extended RTP timestamp via the `sync` signal for
backwards compatibility. It will always be a timestamp inside the first
extended timestamp period anyway.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6575>
2024-04-08 13:22:24 +00:00
Sebastian Dröge 38ec8f1299 rtphdrext-ntp: Fix typo of the RFC number in the element metadata
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3417

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6537>
2024-04-08 12:21:35 +00:00
Seungha Yang f5500906ce dwrite: Fix crash on device update
Selected blend mode should not be cleared on device update

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6521>
2024-04-08 11:38:43 +00:00
Robert Guziolowski 50bd2f2109 qml6glsink: fix destruction of underlying texture
One should not directly delete the QRhiTexture instance.
Instead it should be marked as to be deleted once QRhi::endFrame()
is called (see: https://doc.qt.io/qt-6/qrhiresource.html#deleteLater )

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3443
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6506>
2024-04-08 10:45:26 +00:00
Daniel Morin b96072b810 ci/fluster: Revert results for visl
- Make test pass without h264parse AU boundary detection changes

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin 9289fb5ce4 h264parser: maintain API changes
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin 59230efdd9 Revert "h264parse: test - AU align with SEI between frame slices"
This reverts commit 533f814fd9.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin 83038c3daf Revert "h264parse: Improved AU boundary detection"
This reverts commit 49f200cb54.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin 115b4792b5 Revert "h264parse: Remove dead code"
This reverts commit 141cd38715.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin 9bbf246cc4 Revert "h264parse: Fix AU collection"
This reverts commit 495390f63a.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin 5453976f03 Revert "h264parse: Remove un-needed check on SPS state"
This reverts commit 73dedf9a51.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin ee7026925f Revert "h264parse: use AUD to detect first VCL NAL"
This reverts commit 90a3b63eed.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Daniel Morin c259674ed5 Revert "h264parse: correct NAL mode backlog processing"
This reverts commit b2098849dc.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6562>
2024-04-07 17:40:51 +00:00
Jan Schmidt b3d6a14737 rtpjitterbuffer: Don't use estimated_dts to do default skew adjustment
When the buffer DTS is estimated based on arrival time at the
jitterbuffer (rather than provided on the incoming buffer itself),
it shouldn't be used for skew adjustment. The typical case is
packets being deinterleaved from a tunnelled TCP/HTTP RTSP stream,
and the arrival times at the jitter buffer are not well enough
correlated to usefully do skew adjustments.

This restores the original intended behaviour for the 'estimated dts'
path, that was broken years ago during other jitterbuffer refactoring.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6561>
2024-04-07 16:24:22 +01:00
Sebastian Dröge 4b6cbca300 flac: Add wrap file and add fallback for it to the flac plugin
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6560>
2024-04-07 13:57:40 +00:00
Tim Blechmann 88dd91cb30 v4l2: enforce a pixel aspect ratio of 1/1 if no data are available
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6559>
2024-04-07 14:17:19 +01:00
Philipp Zabel 993d8b89bc v4l2: allocator: Fix unref log/trace on memory release
Use gst_object_unref() instead of g_object_unref() in
gst_v4l2_allocator_release(), so refcounting log and
tracer get to know about this unref.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6556>
2024-04-06 23:41:52 +00:00
Edward Hervey 4ea7d5ae64 videoparsers: Demote CC warning message
Another warning message which isn't fatal and therefore should just be a DEBUG
line.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6555>
2024-04-06 19:08:33 +00:00
Elliot Chen 7aa75e590a v4l2: fix error in calculating padding bottom for tile format
This is a regression while porting to arbitrary tile dimensions
introduced in !3424.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6554>
2024-04-06 19:10:25 +01:00
Elizabeth Figura e1b82701df atdec: Handle channel counts greater than 2
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6546>
2024-04-05 10:14:59 +00:00
Elizabeth Figura b7a4b9e1ab atdec: Use gst_audio_decoder_set_output_caps() directly
The code currently sets the same caps in two different ways, and neither of them correctly handle the channel mask.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6546>
2024-04-05 10:14:59 +00:00
Seungha Yang ce4f0d5746 avviddec: Fix AVPacket leak
av_packet_unref() does not release allocated memory.
av_packet_free() is the correct free function.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6545>
2024-04-05 10:28:22 +01:00
Sebastian Dröge 984b1f413a wavpackparse: Use an unsigned integer for the block size calculations
It's never negative.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6541>
2024-04-04 17:33:48 +01:00
Sebastian Dröge 078ef786d2 wavpackparse: Fix potential integer overflow on ID_ODD_SIZE blocks
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6541>
2024-04-04 17:33:48 +01:00
Sebastian Dröge 99bdbd78ca wavpackparse: Explicitly handle ID_WVX_NEW_BITSTREAM
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6541>
2024-04-04 17:33:48 +01:00
Sebastian Dröge ef72daea70 typefind: Handle WavPack block sizes > 131072
These are valid nowadays.

Also handle ID_ODD_SIZE and ID_WVX_NEW_BITSTREAM. The parser already
handles the former but not the latter.

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

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6541>
2024-04-04 17:33:48 +01:00
Robert Mader 81a800ab9e jpegparse: turn some bus warnings into object ones
For some cameras `gst_jpeg_parse_app0()` fails on a invalid segment.
While this is likely a driver or firmware bug that should be addressed
accordingly, it's not fatal and likely does not deserve a bus message on
every frame, flooding journals.

Turn down the volume of the warnings by turning them into object
warnings. If we conclude that in some cases we'd still want bus
warnings, they can be done more fine-grained in the
`gst_jpeg_parse_appX()` functions.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6539>
2024-04-04 15:14:06 +01:00
Sebastian Dröge 22315a435d pbutils: descriptions: Don't warn on MPEG-1 audio caps without layer field
While this is not ideal and won't give too accurate codec descriptions,
it is what tsdemux produces.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6538>
2024-04-04 12:45:54 +01:00
Chris Spencer f85d1efafb vkbufferpool: correct usage flags type
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6528>
2024-04-03 19:20:23 +00:00
Víctor Manuel Jáquez Leal d2aa3829b8 vkh265dec: add missing VPS parameter
and fix coded size

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6534>
2024-04-03 18:26:05 +00:00
Víctor Manuel Jáquez Leal 56ac5e9041 vkh26xdec: implement close() vmethod
Since a validation layer error is signaled at EOS because it's required to wait
for the last frame to be processed.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6534>
2024-04-03 18:26:05 +00:00
Víctor Manuel Jáquez Leal 9301f64d72 vkh26xdec: remove unused variables
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6534>
2024-04-03 18:26:05 +00:00
Víctor Manuel Jáquez Leal 85a78f56dc vkh265dec: fix resource info structure when layered DPB
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6534>
2024-04-03 18:26:05 +00:00
Víctor Manuel Jáquez Leal 6f7d62eb73 msdk: sink context reference
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6527>
2024-04-03 16:34:26 +00:00
Víctor Manuel Jáquez Leal db387f1b13 gtk: sink reference of internal wayland pool
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6527>
2024-04-03 16:34:26 +00:00
Víctor Manuel Jáquez Leal 124ceabafe wayland: sink reference to internal pool
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6527>
2024-04-03 16:34:26 +00:00
Víctor Manuel Jáquez Leal e1fa26e16f dash: sink references of all MDP objects
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6527>
2024-04-03 16:34:26 +00:00
Víctor Manuel Jáquez Leal 1d7b7b04d1 va: sink reference at instantiation
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6527>
2024-04-03 16:34:26 +00:00
Víctor Manuel Jáquez Leal 4a51579cb2 vulkan: sink references at instantiation
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6527>
2024-04-03 16:34:26 +00:00
Xavier Claessens 4836312360 clocksync: Proxy allocation queries
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6525>
2024-04-03 15:06:40 +00:00
eri 648a1cb03a play: Update video_snapshot to support playbin3
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6526>
2024-04-03 13:48:13 +00:00
Guillaume Desmottes 5fcc15514f examples: set perfect-timestamp=true on opusenc
Fix audio streaming on Chrome, see https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1524

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6523>
2024-04-03 11:35:08 +00:00
Matthew Waters d556c02aa8 glcaopengllayer: NULL some fields when freed
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
2024-04-03 10:28:08 +01:00
Matthew Waters 6f0ad951c3 glwindow/cocoa: keep a window reference across an async callback
Esnures that the window is alive when the callback is fired.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
2024-04-03 10:28:08 +01:00
Matthew Waters 651ccd0175 glimagesink: avoid a possible critical on shutdown
It is possible that the close callback can be called after glimagesink
is changing state to NULL.  Protect against that by taking the glimagesink
lock and some NULL checking.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
2024-04-03 10:28:08 +01:00
Matthew Waters 0bf962dbdf glimagesink: unref the potential last ref outside of the glimagesink lock
Avoids a deadlock between the state change removing the last ref and
the destructer calling the window's on_close handler and trying to
take the glimagesink lock.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
2024-04-03 10:28:08 +01:00
Matthew Waters e5b4f09172 glbufferpool: protect release_buffer from multiple concurrent access
If two different threads attempt to release buffers at the same time, then the
keep-alive-slightly-longer GQueue may become corrupted.  Guard against that with
some locking.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
2024-04-03 10:28:08 +01:00
Matthew Waters 9cedabae5a gl/context/cocoa: ensure pixel format lives as long as the context
Under some circumstances, the CGLPixelFormatObj was being destroyed too
early which could lead to potential use-after-frees.

Fix by returning a reference when asked for the pixel format.

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3154
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6524>
2024-04-03 10:28:08 +01:00
Xavier Claessens e47f9e8f87 videorate: Reset last_ts when a new segment is received
This fix all buffers being droped when a new segment is received and
average-period property is set.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6522>
2024-04-03 00:33:15 +01:00
He Junyan 3fe9a6dc8c va: av1enc: Avoid reopen encoder or renegotiate
If parameters remain similar enough to avoid either encoder reopening
or downstream renegotiation, avoid it.

This is going to be useful for dynamic parameters setting.

To check if the stream parameters changed, so the internal encoder has
to be closed and opened again, are required two steps:

1. If input caps, format, profile, chroma or rate control mode have changed.
2. If any of the calculated variables and element properties have changed.

Later on, only if the output caps also changed, the pipeline
is renegotiated.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6519>
2024-04-02 21:45:33 +00:00
L. E. Segovia a1c30bc6a6 gst: clock: Block futex_time64 usage on Android API level < 30
This syscall is seccomp blocked on all lower API levels:

ee7bc3002d

While at it, also fix all direct tests on __NR_futex_time64 and
__NR_futex so that they refer to the results available in
config.h.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6518>
2024-04-02 20:15:57 +00:00
Chao Guo 25dc99f81f glcolorconvert: Ensure glcolorconvert does not miss supported RGB formats
Add RGB16 and other RGB formats to rgb_formats to ensure glcolorconvert
does not miss the RGB formats it supports

Signed-off-by: Chao Guo <chao.guo@nxp.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6517>
2024-04-02 19:30:00 +01:00
Seungha Yang 11eb88178b meson: d3d11: Add support for MinGW DirectXMath package
Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3428
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6503>
2024-04-02 12:55:24 +00:00
Seungha Yang 092c0eec66 subprojects: directxmath: Update to 3.1.9
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6503>
2024-04-02 12:55:24 +00:00
He Junyan ac23e04236 va: av1enc: Improve the LAST reference assignment
The last frame which has the smallest diff should be consider as
the first choice rather than the golden frame. Especially when only
one reference available, this way can improve the BD rate about 5
percentage.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6507>
2024-04-02 09:57:51 +01:00
He Junyan c4bb6d301e va: av1enc: Fix the reference number setting bug
The current way will let the total reference number surplus the
reference number set by the "ref-frames" property.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6507>
2024-04-02 09:57:51 +01:00
Alexander Slobodeniuk f1d28fdcf7 d3d11videosink: disconnect signals before releasing the window
It might happen that the key event arrives when the d3d11videosink
is stopping. In case of GstD3D11WindowWin32 it can raise a
navigation event even when the sink is already freed, because the
window object's refcount may reach 0 in the window thread. In
other words sometimes the GstD3D11WindowWin32 lives few ms more
then the GstD3D11VideoSink, because it's freed asynchronously.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6492>
2024-03-30 19:06:31 +00:00
Ruben Gonzalez ca97570da5 wpe: avoid crash with G_DEBUG=fatal_criticals and static build
No plugin filenames if static build.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6488>
2024-03-30 11:15:17 +00:00
Hou Qi 1dc3fe831c encodebin: Add the parser before timestamper to tosync list
Also need to sync the state of the parser before timestamper with
parent.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6486>
2024-03-29 19:45:23 +00:00
Ruben Gonzalez e6e3ed5679 ristsrc: Clean caps instead of unref
Fix issue unrefering null caps. Better solution than

```
  if (src->caps)
      gst_caps_unref (src->caps);
```

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6485>
2024-03-29 19:04:52 +00:00
Tim-Philipp Müller d2aeaeb73f tests: rtpred: fix out-of-bound writes
Don't write more data to the buffer than we allocated
space for.

Fixes #3312

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6478>
2024-03-29 00:22:16 +00:00
Haihua Hu bb43b96d2c v4l2src: need maintain the caps order in caps compare when fixate
if the calculated "distance" of caps A and B from the preference are
equal, need to keep the original order instead of swap them

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6473>
2024-03-28 20:05:27 +00:00
Seungha Yang 98ed7a8201 meson: d3d11: Disable library build if DirectXMath header was not found
DirectXMath header library is a hard dependency

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6472>
2024-03-28 19:06:57 +00:00
Nicolas Dufresne fa44d14d2b v4l2codecs: alphadecoder: Explicitly pass 64 bit integers as such through varargs
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6469>
2024-03-28 11:16:28 +00:00
Sebastian Dröge c42d3fc6e3 alphadecodebin: Explicitly pass 64 bit integers as such through varargs
Maybe fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3422

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6469>
2024-03-28 11:16:28 +00:00
Taruntej Kanakamalla 5f499b7932 net/gstptpclock: fix double free of domain data during deinit
The attempt to free the domain data is happeing twice during the ptp deinit.
Once while iterating through the list domain_data and second while iterating
through the list domain_clocks, so this is crashing the application
trying to gst_ptp_deinit

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6457>
2024-03-28 00:06:45 +00:00
Sebastian Dröge 91ded3fa77 basesrc: Clear submitted buffer lists consistently with buffers
And handle the case of a NULL buffer being returned cleanly, which is
valid as long as a buffer list is returned instead. Previously this
would cause an assertion because of calling gst_buffer_unref() with
NULL.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6463>
2024-03-27 20:32:34 +00:00
Jan Schmidt 2980981618 rtpmp4adepay: Set duration on outgoing buffers
If we can calculate timestamps for buffers, then set the duration
on outgoing buffers based on the number of samples depayloaded.

This can fix the muxing to mp4, where otherwise the last packet
in a muxed file will have 0 duration in the mp4 file.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6456>
2024-03-27 19:48:43 +00:00
Arnaud Vrac 0d04d702bd inputselector: fix possible clock leak on shutdown
Avoid leaking a GstClock object on shutdown, bail out before taking the ref when
not playing.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6455>
2024-03-27 17:31:15 +00:00
Piotr Brzeziński 4020144a65 vtdec: Fix caps criticals during negotiation
Calling gst_pad_peer_query_caps() without a filter can give us EMPTY caps, whereas all the code below
assumes that's not the case. Replacing query+intersect with a filtered query ensures we always get a subset
of the template caps back.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6454>
2024-03-27 16:24:07 +00:00
Víctor Manuel Jáquez Leal 6eab0524ca jpegparse: avi1 tag can be progressive
AVI1 tag in APP0 is trivalue: 0 not interleaved, 1 odd, 2 even.

So if avi1 is zero then the frame is progressive.

Also, this patch adds a couple log messages.

Fixes: #3414
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6453>
2024-03-27 14:59:38 +00:00
Tim-Philipp Müller d2f20d546d tests: add check to make sure -bad lib headers are C++ compiler clean
Only non-internal libs without external deps for now.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6448>
2024-03-26 16:15:12 +00:00
Tim-Philipp Müller fe8b80704a ges: add check to make sure headers are C++ compiler clean
See https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3421

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6448>
2024-03-26 16:15:12 +00:00
Thibault Saunier 256d990aea ges: frame-composition-meta: Stop using keyword 'operator' for field in C++
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3421

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6448>
2024-03-26 16:15:12 +00:00
Wojciech Kapsa 7a8663d051 libnice: bump subproject wrap to v0.1.22
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6431>
2024-03-22 21:37:41 +00:00
Hou Qi c0d35575a8 v4l2: Also set max_width/max_height if enum framesize fail
Some driver doesn't implement enum_framesize. The maximum supported
size can be got by trying format with a very large size. Also need
to set max_width/max_height for this case, otherwise default encoded
buffer size 256kB is too small.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6430>
2024-03-22 17:27:58 +00:00
Tim-Philipp Müller 175d116f94 Back to development 2024-03-22 01:38:06 +01:00
Tim-Philipp Müller 0d0a1d9d16 Release 1.24.1 2024-03-21 21:47:53 +01:00
Thomas Goodwin 5a80a146f0 gst-inspect: fix --atleast-version to be implicitly applied to --exists
The --atleast-version implies --exists, but the implementation in
earlier commits had the version check applied any time the --exists was
checked, and the default value of the major and minor versions were set
to the GStreamer major and minor versions.  The resulting behavior would
have gst-inspect return '1' if the plugin's version didn't match
gstreamer's even when --atleast-version was not specified in the command
line args.  The change in this patch removes that behavior and adds
tests to verify that if --exists is specified WITHOUT --atleast-version
the version check will NOT be applied.  If both arguments are specified
and the version does not match the arg-supplied version number, a new
return code of '2' is used to uniquely identify the failure.

Fixes #3246

Signed-off-by: Thomas Goodwin <thomas.goodwin@laerdal.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6414>
2024-03-21 00:13:59 +01:00
Piotr Brzeziński 11c6432cca vtdec: Ignore output loop errors in drain() if we're flushing
In an early non-linked scenario, this was causing a ton of criticals about the queue array,
because the output callback would still fire for leftover frames that were still being processed by VT
at the time the output loop stopped. This makes sure they're flushed correctly as well.

Also renames gst_vtdec_loop to gst_vtdec_output_loop for consistency with related functions.

wip

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6411>
2024-03-20 14:21:24 +01:00
Piotr Brzeziński bf88fb152d vtdec: Fix a deadlock during ProRes playback
Sometimes a call to negotiate (and thus drain) can happen from the output loop
(via finish_frame()), which will tell VT to output all internal frames, but that won't succeed
if we happen to decide to wait for the queue to empty (because the loop is waiting for draining to finish and
will not make space in the queue!). This commit adds an override for the queue size limit if we're draining/flushing.

This bug could happen for any formats, but was especially obvious for ProRes, which has dpb_size of 0.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6411>
2024-03-20 14:21:24 +01:00
Edward Hervey db6803bd55 adaptivedemux2: Don't use g_str_equal on potentially NULL strings
It is only meant to be used as a callback. The fallback macro uses strcmp which
doesn't handle NULL strings gracefully. Instead use g_strcmp0

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6410>
2024-03-20 10:49:02 +01:00
Edward Hervey 77fa0ae0e7 hlsdemux2: Avoid NULL pointer usage
The pending/current variant are both NULL when the demuxer is resetted.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6410>
2024-03-20 10:49:02 +01:00
Edward Hervey 9ce063f5f6 adaptivedemux2: Handle context going away
This issue can happen when the scheduler loop was stopped (and context went
away). We no longer want to push/pop main context threads.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6410>
2024-03-20 10:49:02 +01:00
Edward Hervey 257de579b3 hlsdemux2: Improve detection of playlist updates
In the case we are not updating an existing playlist, we only want to reset the
download error count if the URI we are downloading was not the previous one we
were trying to load

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6410>
2024-03-20 10:49:02 +01:00
Edward Hervey f8d8c6795d uridecodebin3: Don't hold lock when posting messages or signals
There's a very good chance that the receiver might react on those synchronously
and call back into uridecodebin3 (ex: for setting the next URI).

Make sure we release the lock if we need to do that.

Fixes #3400

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6403>
2024-03-19 12:02:27 +01:00
Ruijing Dong b547c8eebb va: enc : checking surface alignment attribute
Apply surface alignment attribute when availalbe,
also fix frame cropping issue for va h265 encoder.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6399>
2024-03-18 20:55:38 +01:00
Edward Hervey c8f42ab3af uridecodebin3: Handle potential double redirection errors
Some elements (like qtdemux) might post a redirection error message twice. We
only want to handle it once.

Fixes #3390

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6394>
2024-03-18 15:52:08 +01:00
Mark Nauwelaerts f8ae970db2 dvdspu: avoid null dereference
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6391>
2024-03-18 11:43:39 +01:00
Philippe Normand 559278420b play: Fix a critical warning in error callback
`on_error()` can be called with a NULL details structure, so in that situation
the `gst_structure_copy()` would raise a critical warning. Create an empty
structure instead of attempting to copy a NULL one.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6387>
2024-03-17 21:43:44 +01:00
Tim-Philipp Müller 93255efece Revert "audiobasesink: Don't wait on gap events"
This reverts commit 8e923a8e2d.

This caused regressions, see #3303.

Without this commit, osxaudiosrc ! osxaudiosink won't work
right, but since that hasn't really been a huge problem
for years it's probably best to revert this until a proper
solution can be figured out.



(cherry picked from commit f04f86f3ee)

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6384>
2024-03-17 03:18:54 +00:00
Seungha Yang 9061e464a8 d3d12: Fix SDK debug layer activation
Debug layer must be enabled before creating device. Otherwise
already opened devices before the activation will be removed

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6383>
2024-03-16 15:58:13 +01:00
Edward Hervey 80cd85d03d decodebin3: Post error messages if there are no streams to output
This could happen because:
* No streams were selected
* Or we end up with no stream selected

Also post a warning message if we are missing plugins but there are other
streams to output

Fixes #3360

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6377>
2024-03-15 00:12:28 +00:00
Edward Hervey 2d875b5ed2 decodebin3: Remove failing stream from active selection also
It gets added in get_output_slot()

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6377>
2024-03-15 00:12:28 +00:00
Robert Mader aef872944e v4l2codecs: decoders: Add DMA_DRM caps support
In order to simplify caps negotiations for clients and, notably, be more
compatible with va* decoders.
Crucially this allows clients to know ahead of time whether buffers will
actually be DMABufs.

Similar to GstVaBaseDec we only announce system memory caps if the peer
has ANY caps. Further more, and again like va decoders, we fail in
`decide_allocation()` if DMA_DRM caps are used without VideoMeta.
Apart from buggy peers this can happen e.g. when a peer with ANY caps
is used in combination with caps filters.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6376>
2024-03-14 23:32:00 +00:00
Robert Mader 383545d856 v4l2codecs: decoders: Introduce and use set_output_state helper class
Allowing us to avoid some code duplication. This will become more
important with upcoming changes to caps generation.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6376>
2024-03-14 23:32:00 +00:00
Robert Mader 84d015cabb v4l2codecs: decoder: Clean up select_src_format()
Most importantly rely on video info helpers instead of manual parsing
of caps, which will allow us to use additional helpers in the future.

While on it, tighen the check for supported formats - failing that
indicates a bug in caps negotiation - and make some style changes.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6376>
2024-03-14 23:32:00 +00:00
Robert Mader b5fe2319f3 v4l2codecs: decoder: Generalize size enumeration caps
By reducing the generated caps to the minimal number of fields and
using intersections instead of merges. This will allow us to reuse the
result in the future.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6376>
2024-03-14 23:32:00 +00:00
Robert Mader 7b6d6fe080 v4l2codecs: decoders: Use src template for negotiation filter
This ensures we don't create filter caps that are not supported by the
individual codec implementations, as well as that the resulting caps
have the required fields so they can be turned into a GstVideoFormat.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6376>
2024-03-14 23:32:00 +00:00
Piotr Brzeziński 4295e1dd30 avaudenc: Avoid double-freeing frame's extended data
This occured when attempting to encode 16 channel audio, would crash on the first buffer.
We only need to store ext_data, old ext_data_array (frame->extended_data) is already freed by `av_frame_unref`.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6375>
2024-03-14 23:39:35 +01:00
Piotr Brzeziński 9048bea3d3 avcodecmap: Increase max AAC channels to 16
This is the maximum amount supported by aacenc. 8-channel output fully works.
16-channel also encodes fine, but codec-utils isn't able to parse its channel config,
so output level will not be shown in caps. For that to work, GASpecificConfig parsing
needs to be implemented. It's not a critical issue and can be worked on at a later date.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6375>
2024-03-14 23:39:35 +01:00
Seungha Yang 615b7ca7ca asio: Fix {input,output}-channels property handling
Fixing regression introduced by the commit 06dc931b52

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6372>
2024-03-14 13:46:28 +00:00
Sebastian Dröge 0fe3ffe0c0 ptp: Initialize expected DELAY_REQ seqnum to an invalid value
This allows distinguishing pending syncs that didn't have a DELAY_REQ
sent from ones that did but used a seqnum of 0, like the very first one.

Specifically, if the first one or more syncs are still pending and we
send the first DELAY_REQ for a later pending sync, then the DELAY_RESP
would've been wrongly associated to the very first pending sync because
of the seqnum.

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

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6365>
2024-03-14 01:36:28 +00:00
Seungha Yang 470bcd4ec9 d3d11device: Fix adapter LUID comparison in wrapped device mode
Fix integer type mismatching

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3382
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6364>
2024-03-14 00:35:19 +00:00
Alexander Slobodeniuk 6e57362f35 rtspsrc: remove 'deprecated' flag from the 'push-backchannel-sample' signal
It seems that it was added by accident when copying from push-backchannel-buffer

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6363>
2024-03-13 21:14:27 +00:00
Thomas Klausner 8ca53a1a67 shmallocator: fix build on Illumos
Closes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3370

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6362>
2024-03-13 20:09:44 +00:00
Sebastian Dröge 5a2f99a255 mpg123audiodec: Correctly handle the case of clipping all decoded samples
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3365

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6357>
2024-03-13 14:23:56 +00:00
Piotr Brzeziński 07e1f13e2c audiovisualizer: Don't wrap temporary memory in buffers
Avoids potentially ending up with the buffermemory pointing to already-freed or reused addresses.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6339>
2024-03-13 12:36:28 +00:00
Piotr Brzeziński 6b369d8470 qtdemux: Fix wrapping temporary memory in buffers
That memory can disappear at any moment, doesn't cost much to just copy those few bytes.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6339>
2024-03-13 12:36:28 +00:00
Piotr Brzeziński eff6167d2d audioencoder: Avoid wrapping temporarily mapped memory with a GstBuffer and passing that to subclass
Memory from gst_adapter_map() could live shorter than the GstMemory that the GstBuffer wraps around it, which in lucky
cases 'just' caused a re-use of the same memory for multiple (potentially still in use!) input buffers, but could easily
end up pointing to an already-freed memory.

Manifested when an AudioToolbox encoder kept getting silence inserted in seemingly random circumstances, turned out
to be the memory being re-used by GStreamer at the same time that the AT API was processing it...

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6339>
2024-03-13 12:36:28 +00:00
Seungha Yang 1a7d34a0e4 d3d12device: Fix IDXGIFactory2 leak
factory passed to gst_d3d12_device_find_adapter() method is valid
handle already

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6353>
2024-03-13 11:32:01 +00:00
Antonio Larrosa a7b128bb27 gitlint: Allow curly brackets in commit prefix
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6344>
2024-03-13 09:58:25 +00:00
Antonio Larrosa c04cdddd37 va{h264,h265,av1}enc: fix potential crash on devices without rate control
This fixes a crash in `gst_va_h264_enc_class_init` and `gst_va_h265_enc_class_init`
(and probably also in gst_va_av1_enc_class_init) when calling
`g_object_class_install_properties (object_class, n_props, properties);`

When rate_control_type is 0, the following code is executed in :

```
  } else {
    n_props--;
    properties[PROP_RATE_CONTROL] = NULL;
  }
```

n_props has initially a value of N_PROPERTIES but PROP_RATE_CONTROL
is not the last element in the array, so it's making
g_object_class_install_properties fail to iterate over the
properties array.

This applies the same fix to gstvah264enc.c, gstvah265enc.c and
gstvaav1enc.c.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6344>
2024-03-13 09:58:24 +00:00
Sebastian Dröge cee1a14bb2 videoparsers: Don't verbosely warn about CEA_708_PROCESS_EM_DATA_FLAG not being set
And the same for CEA_708_PROCESS_CC_DATA_FLAG. This is not really a
problem and was polluting logs with warnings for every single frame.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6352>
2024-03-13 08:06:06 +00:00
Nicolas Dufresne 8c850dba9e glupload: Do not propose allocators with sysmem
None of the GL allocators actually offer a generic alloc() implementation. As a
side effect, they cannot be offered as they don't work with generic video
buffer pool.

Our specialized buffer pool can be dropped by tee or alphacombine as sharing the
same buffer pool over two branch is not supported by the pool API.

Fixes #3372

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6350>
2024-03-13 03:10:20 +00:00
Seungha Yang 44d4eb096d cuda,d3d11,d3d12bufferpool: Disable preallocation
Do not chain up to parent's GstBufferPool::start() which will do
preallocation. We don't want it to be preallocated
since there are various cases where negotiated downstream buffer pool is
not used at all (e.g., zero-copy decoding, IPC elements).

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6345>
2024-03-13 02:29:42 +00:00
Antonio Larrosa 89041ad29d registry, ptp: Canonicalize the library path returned by dladdr
On systems using UsrMerge (like openSUSE or Fedora), /lib64 is
a symlink to /usr/lib64. So dladdr is returning the path to
the gstreamer library in /lib64 in priv_gst_get_relocated_libgstreamer.
Later gst_plugin_loader_spawn tries to build the path to the
gst-plugin-scanner helper from /lib64 and ends up trying to use
/lib64/../libexec/gstreamer-1.0/gst-plugin-scanner which doesn't exist.

By canonicalizing the path with a call to realpath, gst-plugin-scanner
is found correctly under
/usr/lib64/../libexec/gstreamer-1.0/gst-plugin-scanner

Similar change applied to gstreamer/libs/gst/net/gstptpclock.c

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6343>
2024-03-12 23:54:59 +00:00
Nirbheek Chauhan 45ce449854 gsturi: Sort by feature name to break a feature rank tie
This matches autoplug in other places such as decodebin, otherwise we
will pick "randomly" based on the order in which plugins are
registered, which is mostly dependent on the order in which readdir()
returns items.

So let's make it predictable.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6342>
2024-03-12 19:02:40 +00:00
Edward Hervey 48e0c6218d playbin3: Remove un-needed URI NULL check
This will mimic the playbin2 behaviour, which sets the "next" entry to be
NULL.

The biggest impact this has is that when going back to READY the current play
entry will be discarded (instead of being kept around for when you go back to
PAUSED/PLAYING).

Fixes #3371

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6338>
2024-03-12 14:16:34 +00:00
He Junyan c6a5ea3825 va: av1enc: Init the output_frame_num when resetting gf group
Fixes: #3359
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6333>
2024-03-12 00:48:44 +00:00
Mikhail Rudenko 92c0f7ddb5 rtsp-stream: clear sockets when leaving bin
Since commit 4d86f994, when setting an RTSP media both shared and
reusable, streaming cannot be restarted after the first time all the
clients disconnect. That happens because the sockets (unlike
addresses) of GstRTSPStream are not cleared in
gst_rtsp_stream_leave_bin, and on restart sockets and addresses are
not allocated in gst_rtsp_stream_allocate_udp_sockets, and then the
check in create_sender_part fails. Fix this by clearing sockets in
gst_rtsp_stream_leave_bin.

Fixes gstreamer/gst-rtsp-server#113

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6334>
2024-03-11 22:06:31 +00:00
Edward Hervey d89da0f5c4 decodebin3: Handle race switching on pending streams
find_slot_for_stream_id() will return a slot which has the request stream-id as
active_stream *or* pending_stream (i.e. the slot on which that stream is
currently being outputted or will be outputted).

When figuring out which slot to use (if any) we want to consider stream-id
which *will* appear on a given slot which isn't outputting anything yet the same
way as if we didn't find a slot yet.

Fixes races when doing intensive state changes

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6332>
2024-03-11 20:20:19 +00:00
Edward Hervey 31feb293c7 decodebin3: Clear select streams seqnum when resetting
At this point there's definitely no pending select streams

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6332>
2024-03-11 20:20:19 +00:00
Edward Hervey 381d38eb82 decodebin3: Only post collection message on actual updates
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6332>
2024-03-11 20:20:19 +00:00
Edward Hervey 1c80cde250 decodebin3: Clear the global collection when resetting
This avoids having stray collections when re-using decodebin3

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6332>
2024-03-11 20:20:19 +00:00
Edward Hervey 3f9665eed2 avviddec: Fix how we get back the codec frame
With the new copy_opaque system, the corresponding frame is stored in the
picture opaque ref.

This also handles the case where the "regular" opaque might be empty in the
case of "DECODE_ONLY" frames, since it that field is set in `get_buffer2()`
which might not be called for those frames

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6331>
2024-03-11 19:29:22 +00:00
Edward Hervey 5132c679a7 avviddec: Improve debug statements
Add SFN to better track what is going on

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6331>
2024-03-11 19:29:22 +00:00
Nirbheek Chauhan bcb016d6d2 rtspsrc: Don't invoke close when stopping if we've started cleanup
When we're doing a state change from PLAYING to NULL, first we invoke
gst_rtspsrc_loop_send_cmd_and_wait (..., CMD_CLOSE, ...) during
PAUSED_TO_READY which will schedule a TEARDOWN to happen async on the
task thread.

The task thread will call gst_rtspsrc_close(), which will send the
TEARDOWN and once it's complete, it will call gst_rtspsrc_cleanup()
without taking any locks, which frees src->streams.

At the same time however, the state change in the app thread will
progress further and in READY_TO_NULL it will call gst_rtspsrc_stop()
which calls gst_rtspsrc_close() a second time, which accesses
src->streams (without a lock again), which leads to simultaneous
access of src->streams, and a segfault.

So the state change and the cleanup are racing, but they almost always
complete sequentially. Either the cleanup sets src->streams to NULL or
_stop() completes first. Very rarely, _stop() can start while
src->streams is being freed in a for loop. That causes the segfault.

This is unlocked access is unfixable with more locking, it just leads
to deadlocks. This pattern has been observed in rtspsrc a lot: state
changes and cleanup in the element are unfixably racy, and that
foundational issue is being addressed separately via a rewrite.

The bandage fix here is to prevent gst_rtspsrc_stop() from accessing
src->streams after it has already been freed by setting src->state to
INVALID.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6330>
2024-03-11 18:32:12 +00:00
Edward Hervey 18399d9fac decodebin3: Provide clear error message if no decoders present
If we don't do this we will end up with a more cryptic error message (not-linked
error from some upstream component).

Fixes #3198

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6329>
2024-03-11 17:29:49 +00:00
Seungha Yang b5686f4eb8 ges: Fix critical warning
GStreamer-CRITICAL **: 20:44:38.256: gst_debug_log_full_valist:
assertion 'category != NULL' failed

Make sure debug category initialized.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6315>
2024-03-10 14:01:54 +00:00
Jan Schmidt 5f8f174a76 identity: Don't refuse seeks unless single-segment=true
identity only needs to configure the internal seek segment if it's
aggregating upstream segments into 1. If it's not, don't break
other seek behaviour by refusing (for example) instant-rate change
seeks.

Fixes: #3363
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6314>
2024-03-10 13:08:25 +00:00
Michael Tretter 555bb8ece2 meson: Fix description in qt options
The qt-x11 description contains a copy/paste error from the qt-wayland option.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6313>
2024-03-10 12:24:21 +00:00
Seungha Yang 3a727fde2c avviddec: Fix interlaced mode detection
Fixing regression introduced by the commit b46559102b

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6297>
2024-03-08 10:02:29 +00:00
Mathieu Duponchelle 0d1a0cec5e onvif: tests: check for T flag on all packets
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6298>
2024-03-08 03:47:38 +00:00
Mathieu Duponchelle 172221a2cf rtpgstpay: flush on EOS
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6298>
2024-03-08 03:47:38 +00:00
Mathieu Duponchelle a620e4e0d8 rtponviftimestamp: make sure to set E and T bits on last buffer of lists
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6298>
2024-03-08 03:47:38 +00:00
Sebastian Dröge d804e133e0 rtpgstpay: Delay pushing of event packets until the next buffer
And also re-timestamp them with the current buffer's PTS.

Not doing so keeps the timestamps of event packets as
GST_CLOCK_TIME_NONE or the timestamp of the previous buffer, both of
which are bogus.

Making sure that (especially) the first packet has a valid timestamp
allows putting e.g. the NTP timestamp RTP header extension on it.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6298>
2024-03-08 03:47:38 +00:00
Elizabeth Figura a4d3d80e95 qtdemux: Do not set channel-mask to zero
Leave it uninitialized, so that the downstream decoder will initialize it appropriately. Setting it to zero is wrong.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6296>
2024-03-08 02:18:53 +00:00
Jan Schmidt 538cafbd9c rtspsrc: Parse Speed/Scale before Range in responses
Parse the speed and scale in the server's response
*before* the range, so that the range start/stop
are swapped (or not swapped) correctly based
on the server's actual chosen values. Otherwise,
the old rate from the segment is used - what the
last seek asked for, but not necessarily what
the server chooses.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6295>
2024-03-08 00:51:50 +00:00
Jan Schmidt 464cd9f9a3 rtspsrc: Handle queries and events with no manager
When doing direct output with no session manager, we still
want to respond to queries and events from downstream, so
install the handlers

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6295>
2024-03-08 00:51:50 +00:00
Jan Schmidt fc3be23863 rtspsrc: return NO_PREROLL on PLAYING->PAUSED too
When transitioning back to PAUSED and rtspsrc is live, return
NO_PREROLL so the pipeline knows to skip preroll here too.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6295>
2024-03-08 00:51:50 +00:00
Jan Schmidt d3f57a9748 rtponviftimestamp: Use gst_segment_to_stream_time_full()
In the situation where playback starts from a keyframe before
the target playback segment, then the first buffers will be
outside the configured segment and gst_segment_to_stream_time()
will return GST_CLOCK_TIME_NONE unconditionally.

If drop-out-of-segment is false, the RTP buffers will not be
dropped, but will be sent witout ONVIF extension timestamps
and given GST_CLOCK_TIME_NONE timestamps on the receiver.

Instead, use gst_segment_to_stream_time_full() to extrapolate
stream time outside the segment so that such buffers still
get assigned their correct timestamps on the receiver.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6295>
2024-03-08 00:51:50 +00:00
Jan Schmidt 03cfc78059 dvbsubenc: Fix bottom field size calculation
Don't accidentally include the stuffing byte (if present)
into the bottom field size. It should only be included in the
total segment length.

Fixes problems with FFmpeg not rendering the subtitles
with a stuffing byte, giving a "Invalid object location!" error.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6277>
2024-03-06 19:52:28 +00:00
Piotr Brzeziński 6566f33274 macos: Fix glimagesink not respecting preferred size
Cocoa version of glwindow only checks the preferred size upon window creation. glimagesink sets the size right before
calling gst_gl_window_show(), which might be way after the window is created in some cases. If the size was set too
late, glimagesink on macOS would remain 320x240 unless manually resized.

This change makes sure to resize the existing window when _show() is called.

Curiously, this has always been an issue, but went from manifesting every once in a while to being almost completely
broken once old event loop workarounds were removed and gst_macos_main() was introduced.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6276>
2024-03-06 18:55:35 +00:00
Jan Schmidt 5e44b3b8e0 gstsegment: Don't use g_return_val_if_fail()
Don't use g_return_val_if_fail() to catch the
open-ended segment or empty segment cases in
gst_segment_to_running_time_full()

g_return_val_if_fail() is for programmer errors,
and can be compiled out with a flag.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6275>
2024-03-06 17:45:16 +00:00
Xi Ruoyao c0fe3de2d7 gst-plugins-base: meson: Fix the condition to skip theoradec test
Due to operator priority "not a and b" is interpreted "(not a) and b".

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6269>
2024-03-06 03:35:59 +00:00
Sebastian Dröge 5d0e8e4dbd ptp: Don't install test executable
And handle it like all our other test executables.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6268>
2024-03-06 02:42:58 +00:00
Tim-Philipp Müller 0f3099ef5c rtspsrc: Consider 503 Service Not Available when handling broken control urls
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6267>
2024-03-06 01:35:01 +00:00
Tim-Philipp Müller 202e255724 orc: bump wrap to 0.4.38
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6266>
2024-03-05 20:18:56 +00:00
Tim-Philipp Müller dd80bf8cde ci: update for 1.24 branch
Don't have validate do --check-bugs in the 1.24 branch, as
any issues fixed may only have been fixed in the main branch.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6264>
2024-03-05 14:00:10 +00:00
Tim-Philipp Müller 2c7bb61580 Back to development
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6264>
2024-03-05 14:00:10 +00:00
227 changed files with 6807 additions and 2491 deletions

View file

@ -24,7 +24,7 @@ variables:
GIT_DEPTH: 1
# Branch to track for modules that have no ref specified in the manifest
GST_UPSTREAM_BRANCH: 'main'
GST_UPSTREAM_BRANCH: '1.24'
FDO_UPSTREAM_REPO: 'gstreamer/gstreamer'

View file

@ -5,10 +5,10 @@ variables:
# If you are hacking on them or need a them to rebuild, its enough
# to change any part of the string of the image you want.
###
FEDORA_TAG: '2024-02-13.0'
FEDORA_TAG: '2024-03-05.0'
INDENT_TAG: '2023-08-24.3'
INDENT_TAG: '2024-03-05.0'
LINT_TAG: '2024-02-20.0'
LINT_TAG: '2024-03-05.0'
WINDOWS_TAG: '2024-02-08.0'
WINDOWS_TAG: '2024-03-05.0'

View file

@ -13,7 +13,7 @@ min-length=10
# Ensure every title starts with a prefix
[title-match-regex]
regex=^[\w]+[\w, -\\/]*[\w]+: .*
regex=^[\w]+[\w, -\\/{}]*[\w]+: .*
# Ignore GDB backtraces
[ignore-body-lines]

View file

@ -753,7 +753,7 @@
"source_checksum": "43da4cb7e244219d4ca423419d27cde8",
"input_file": "FM1_BT_B.h264",
"output_format": "yuv420p",
"result": "b76dc7f54eef4279c1769ac4ae5cb877"
"result": "f21ad956409cfa237099f7ac28390614"
},
{
"name": "FM1_FT_E",
@ -761,7 +761,7 @@
"source_checksum": "3644489dab877ffbf5497594098f63e2",
"input_file": "FM1_FT_E.264",
"output_format": "yuv420p",
"result": "b3997865c7ecbda4acfaff6b46b712bf"
"result": "46b584c89e359c39619bc144f9f29162"
},
{
"name": "FM2_SVA_C",

View file

@ -11,7 +11,6 @@ echo "-> Running ${TEST_SUITE}"
./gst-env.py \
gst-validate-launcher ${TEST_SUITE} \
--check-bugs \
--dump-on-failure \
--mute \
--shuffle \

View file

@ -15458,7 +15458,7 @@ contains one frame)</doc>
<source-position filename="../subprojects/gst-editing-services/ges/ges-version.h"/>
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MICRO" value="0" c:type="GES_VERSION_MICRO">
<constant name="VERSION_MICRO" value="2" c:type="GES_VERSION_MICRO">
<source-position filename="../subprojects/gst-editing-services/ges/ges-version.h"/>
<type name="gint" c:type="gint"/>
</constant>

View file

@ -49386,7 +49386,7 @@ determine a order for the two provided values.</doc>
<source-position filename="../subprojects/gstreamer/gst/gstversion.h"/>
<type name="gint" c:type="gint"/>
</constant>
<constant name="VERSION_MICRO" value="0" c:type="GST_VERSION_MICRO">
<constant name="VERSION_MICRO" value="2" c:type="GST_VERSION_MICRO">
<doc xml:space="preserve" filename="../subprojects/gstreamer/gst/gstversion.h">The micro version of GStreamer at compile time:</doc>
<source-position filename="../subprojects/gstreamer/gst/gstversion.h"/>
<type name="gint" c:type="gint"/>

View file

@ -2899,7 +2899,7 @@ in debugging.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstpluginsbaseversion.h"/>
<type name="gint" c:type="gint"/>
</constant>
<constant name="PLUGINS_BASE_VERSION_MICRO" value="0" c:type="GST_PLUGINS_BASE_VERSION_MICRO">
<constant name="PLUGINS_BASE_VERSION_MICRO" value="2" c:type="GST_PLUGINS_BASE_VERSION_MICRO">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstpluginsbaseversion.h">The micro version of GStreamer's gst-plugins-base libraries at compile time.</doc>
<source-position filename="../subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstpluginsbaseversion.h"/>
<type name="gint" c:type="gint"/>

View file

@ -1115,7 +1115,7 @@ multiple times. This must be called before any other #GstVulkanBufferMemory ope
</parameter>
<parameter name="usage" transfer-ownership="none">
<doc xml:space="preserve" filename="../subprojects/gst-plugins-bad/gst-libs/gst/vulkan/gstvkbufferpool.c">The Vulkan buffer usage flags.</doc>
<type name="Vulkan.ImageUsageFlags" c:type="VkImageUsageFlags"/>
<type name="Vulkan.BufferUsageFlags" c:type="VkBufferUsageFlags"/>
</parameter>
<parameter name="mem_properties" transfer-ownership="none">
<type name="Vulkan.MemoryPropertyFlags" c:type="VkMemoryPropertyFlags"/>

View file

@ -1,5 +1,5 @@
project('gstreamer-full', 'c',
version : '1.24.0',
version : '1.24.2',
meson_version : '>= 1.1',
default_options : ['buildtype=debugoptimized',
# Needed due to https://github.com/mesonbuild/meson/issues/1889,

View file

@ -1,14 +1,13 @@
[wrap-file]
directory = DirectXMath-dec2022
source_url = https://github.com/microsoft/DirectXMath/archive/refs/tags/dec2022.tar.gz
source_filename = dec2022.tar.gz
source_hash = 70a18f35343ff07084d31afa7a7978b3b59160f0533424365451c72475ff480f
patch_filename = directxmath_3.1.8-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/directxmath_3.1.8-1/get_patch
patch_hash = 854f9c065319885f3de5b381cc77454913377a84c8ae6756795fe3eaa99b81f7
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/directxmath_3.1.8-1/dec2022.tar.gz
wrapdb_version = 3.1.8-1
diff_files = DirectXMath-dec2022/0001-Inc-Use-two-argument-cpuid-when-using-recent-MinGW.patch
directory = DirectXMath-feb2024
source_url = https://github.com/microsoft/DirectXMath/archive/refs/tags/feb2024.tar.gz
source_filename = feb2024.tar.gz
source_hash = f78bb400dcbedd987f2876b2fb6fe12199d795cd6a912f965ef3a2141c78303d
patch_filename = directxmath_3.1.9-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/directxmath_3.1.9-1/get_patch
patch_hash = d2475b7de8deb6c801139b96ad91904b9062c9ea6432d62c1cb490a3d449ad12
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/directxmath_3.1.9-1/feb2024.tar.gz
wrapdb_version = 3.1.9-1
[provide]
directxmath = directxmath_dep

13
subprojects/flac.wrap Normal file
View file

@ -0,0 +1,13 @@
[wrap-file]
directory = flac-1.4.3
source_url = https://github.com/xiph/flac/releases/download/1.4.3/flac-1.4.3.tar.xz
source_filename = flac-1.4.3.tar.xz
source_hash = 6c58e69cd22348f441b861092b825e591d0b822e106de6eb0ee4d05d27205b70
patch_filename = flac_1.4.3-2_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/flac_1.4.3-2/get_patch
patch_hash = 3eace1bd0769d3e0d4ff099960160766a5185d391c8f583293b087a1f96c2a9c
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/flac_1.4.3-2/flac-1.4.3.tar.xz
wrapdb_version = 1.4.3-2
[provide]
flac = flac_dep

View file

@ -2,18 +2,20 @@ GStreamer 1.24 Release Notes
GStreamer 1.24.0 was originally released on 4 March 2024.
The latest bug-fix release in the stable 1.24 series is 1.24.2 and was released on 9 April 2024.
See https://gstreamer.freedesktop.org/releases/1.24/ for the latest version of this document.
Last updated: Monday 4 March 2024, 23:00 UTC (log)
Last updated: Tuesday 9 April 2024, 12:30 UTC (log)
Introduction
## Introduction
The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite
cross-platform multimedia framework!
As always, this release is again packed with many new features, bug fixes and other improvements.
Highlights
## Highlights
- New Discourse forum and Matrix chat space
- New Analytics and Machine Learning abstractions and elements
@ -48,11 +50,12 @@ Highlights
- AVX/AVX2 support and NEON support on macOS on Apple ARM64 CPUs via new liborc
- GStreamer C# bindings have been updated
- Rust bindings improvements and many new and improved Rust plugins
- Rust plugins now shipped in packages for all major platforms including Android and iOS
- Lots of new plugins, features, performance improvements and bug fixes
Major new features and changes
## Major new features and changes
Discourse forum and Matrix chat space
### Discourse forum and Matrix chat space
- The new Discourse forum and Matrix chat space are now our preferred communication channels for support and developer chat.
@ -61,7 +64,7 @@ Discourse forum and Matrix chat space
- For release announcements please subscribe to the News + Announcements category on Discourse, although we will continue to
also send announcements to the mailing list for the time being.
Playbin3, decodebin3 now stable and default
### Playbin3, decodebin3 now stable and default
- After a year of stability, testing and more improvements, playbin3, and its various components (uridecodebin3, decodebin3
and urisourcebin), are now the recommended playback components.
@ -84,7 +87,7 @@ Improvements in this cycle:
partly due to a historical confusion between subtitle “decoders” (which decode the format to text and “parsers” (which only
do timing detection and optional seeking).
GstMeta serialization/deserialization and other GstMeta improvements
### GstMeta serialization/deserialization and other GstMeta improvements
- GstMeta serialization/deserialization allows metas to be transmitted or stored. This is used by the unixfd and cudaipc
plugins for inter-process communication (IPC). Implemented so far for GstCustomMeta, GstVideoMeta, GstAudioMeta and
@ -98,7 +101,7 @@ GstMeta serialization/deserialization and other GstMeta improvements
- Add gst_meta_info_new() and gst_meta_info_register() to register a GstMeta in two steps for easier extensibility.
New unixfd plugin for efficient 1:N inter-process communication on Linux
### New unixfd plugin for efficient 1:N inter-process communication on Linux
- unixfdsink and unixfdsrc are elements that, inspired by shmsink andn shmsrc, send UNIX file descriptors (e.g. memfd, dmabuf)
from one sink to multiple source elements in other processes on Linux.
@ -106,7 +109,7 @@ New unixfd plugin for efficient 1:N inter-process communication on Linux
- The unixfdsink proposes a memfd/shm allocator to upstream elements which allows for example videotestsrc to write directly
into memory that can be transfered to other processes without copying.
New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
### New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Previously only various specific GstMeta for ancillary data were provided, such as GstVideoCaptionMeta and GstVideoAFDMeta.
The new GstAncillaryMeta allows passing arbitrary ancillary data between elements, including custom and non-standard
@ -117,7 +120,7 @@ New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Supported by the newly added AJA sink and source elements
DSD audio support
### DSD audio support
- DSD audio is a non-PCM raw audio format representation and the GstAudio library gained support for this in form of new
GstDsdInfo and GstDsdFormat API.
@ -125,7 +128,7 @@ DSD audio support
- Support for DSD audio has been implemented in alsasink as well as the GstAudioSink and GstAudioRingBuffer base classes, and
the gst-libav plugin to enable FFmpeg-based DSD elements and functionality.
Analytics and Machine Learning
### Analytics and Machine Learning
- A new library, GstAnalytics, has been added. It defines a GstAnalyticsRelationMeta that can efficiently hold a large number
of observations from a data analysis process, for example from machine learning. It also contains a matrix of the
@ -146,7 +149,7 @@ Analytics and Machine Learning
- In the next release, tensor decoders such as ssdobjectdetector will live outside of the ONNX plugin so they can be used with
other machine learning acceleration frameworks.
Qt5 + Qt6 QML integration improvements
### Qt5 + Qt6 QML integration improvements
- The Qt5 qmlglsink, qmlgloverlay, qmlglmixer received support for directly consuming BGRA and YV12 video frames without a
prior glcolorconvert.
@ -156,7 +159,7 @@ Qt5 + Qt6 QML integration improvements
- qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink.
DRM Modifier Support for dmabufs on Linux
### DRM Modifier Support for dmabufs on Linux
The Linux dmabuf subsystem provides buffer sharing across different hardware device drivers and subsystems, and is used
extensively by the DRM subsystem to exchange buffers between processes, contexts, and library APIs within the same process, and
@ -189,7 +192,7 @@ New API has been added for easy handling of these new caps:
- GST_VIDEO_FORMAT_DMA_DRM
OpenGL integration enhancements
### OpenGL integration enhancements
- When using EGL, if both OpenGL ES and OpenGL are available, OpenGL ES is preferred over OpenGL. OpenGL ES supports some
necessary features required for dmabuf support. This does not apply if an external library/application chooses an OpenGL API
@ -233,7 +236,7 @@ OpenGL integration enhancements
- GstGLBufferPool now has a configuration option for allowing a number of buffers to be always outstanding allowing for
reducing the potential synchronisation delay when reusing OpenGL memory backed buffers.
Vulkan integration enhancements
### Vulkan integration enhancements
- Add support for the Vulkan H.264 and H.265 decoders.
@ -246,7 +249,7 @@ Vulkan integration enhancements
- Vulkan/Wayland: add support for xdg_wm_base protocol for creating a visible debug window. Required as the previous wl_shell
interface is being removed from compositors.
CUDA / NVCODEC integration and feature additions
### CUDA / NVCODEC integration and feature additions
- New cudaipcsrc and cudaipcsink elements for zero-copy CUDA memory sharing between processes
@ -265,7 +268,7 @@ CUDA / NVCODEC integration and feature additions
flag, cuStreamSynchronize() or gst_cuda_memory_sync() call is required unless application-side CUDA operation is executed
with the GstCudaMemorys associated CUDA stream.
RTP stack improvements
### RTP stack improvements
- New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element.
This is useful for relaying an RTP stream as-is through gst-rtsp-server, which expects an RTP payloader with certain
@ -310,7 +313,7 @@ RTP stack improvements
rtpsbcdepay, rtpvorbisdepay, rtpmp4vdepay, rtptheoradepay, rtpsv3vdepay, rtpmp4adepay, rtpklvdepay, rtpjpegdepay,
rtpj2kdepay, rtph263pdepay, rtph263depay, rtph261depay. rtpgstdepay.
WebRTC improvements
### WebRTC improvements
- Add support for ICE consent freshness (RFC 7675). This requires libnice >= 0.1.22.
@ -321,7 +324,7 @@ WebRTC improvements
- Various improvements and feature additions in the Rust webrtc plugin, which provides webrtcsrc and webrtcsink elements as
well as specific elements for different WebRTC signalling protocols. See the Rust plugins section below for more details.
Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
### Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- hlsdemux2 now supports Low-Latency HLS (LL-HLS)
@ -345,7 +348,7 @@ Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- No development took place on the legacy demuxers (dashdemux, hlsdemux, mssdemux). Application developers are reminded to use
the new demuxers instead. They are automatically picked up when using urisourcebin, uridecodebin3 or playbin3.
W3C Media Source Extensions library
### W3C Media Source Extensions library
- A new GStreamer library (mse) implementing the W3C Media Source Extensions specification was added.
@ -353,7 +356,7 @@ W3C Media Source Extensions library
without relying on a web browser engine. Typically an application consuming this library will wrap the C API with JavaScript
bindings that match the Media Source API so their existing code can integrate with this library.
Closed Caption handling improvements
### Closed Caption handling improvements
- ccconverter supports converting between the two CEA-608 fields.
@ -362,7 +365,7 @@ Closed Caption handling improvements
- Various improvements and feature additions in the Rust-based closed caption elements. Check out the Rust plugins section
below for more details.
Precision Time Protocol (PTP) clock improvements
### Precision Time Protocol (PTP) clock improvements
- Many fixes and compatibility/interoperability improvements.
@ -376,14 +379,14 @@ Precision Time Protocol (PTP) clock improvements
Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD, Solaris and Illumos. Newly supported compared to the C version is
Windows. Compared to the C version various error paths are handled more correctly and a couple of memory leaks are fixed.
Otherwise it should work identically. The minimum required Rust version for compiling this is 1.48, i.e. the version
currently in Debian stable. On Windows, Rust 1.54 is needed at least.
currently in Debian oldstable. On Windows, Rust 1.54 is needed at least.
- New ptp-helper Meson build option so PTP support can be disabled or required.
- gst_ptp_init_full() allows for a more fine-grained and extensible configuration and initialization of the GStreamer PTP
subsystem, including TTL configuration.
Bayer 10/12/14/16-bit depth support
### Bayer 10/12/14/16-bit depth support
- bayer2rgb and rgb2bayer now support bayer with 10/12/14/16 bit depths
@ -391,7 +394,7 @@ Bayer 10/12/14/16-bit depth support
- imagefreeze gained bayer support as well
MPEG-TS improvements
### MPEG-TS improvements
- mpegtsdemux gained support for
- segment seeking for seamless non-flushing looping, and
@ -403,7 +406,7 @@ MPEG-TS improvements
- allows writing arbitrary Opus channel mapping families and up to 255 channels
- separate handling of DVB and ATSC AC3 descriptors
New elements and plugins
## New elements and plugins
- analyticsoverlay visualises object-detection metas on a video stream.
@ -436,7 +439,7 @@ New elements and plugins
- New uvcsink element for exporting streams as UVC camera
New element features and additions
## New element features and additions
- alphacombine supports I420_10LE now for 10-bit WebM/alpha support.
@ -594,11 +597,11 @@ New element features and additions
- y4mdec now parses extended headers to support high bit depth video.
Plugin and library moves
## Plugin and library moves
- The AMR-NB and AMR-WB plugins have been moved from -bad to -good.
- The AMR-NB and AMR-WB plugins have been moved from -ugly to -good.
Plugin and element removals
## Plugin and element removals
- The entire gst-omx package and plugin has been retired. See the OMX section below for more details.
@ -606,7 +609,7 @@ Plugin and element removals
- The kate subtitle plugin has been removed.
Miscellaneous API additions
## Miscellaneous API additions
GStreamer Core
@ -700,7 +703,7 @@ New Video Formats
- Tiled 10-bit NV12 format NV12_10LE40_4L4 (Verisilicon Hantro)
Miscellaneous performance, latency and memory optimisations
## Miscellaneous performance, latency and memory optimisations
- liborc 0.4.35 (latest: 0.4.38) adds support for AVX/AVX2 and contains improvements for the SSE backend.
@ -712,7 +715,7 @@ Miscellaneous performance, latency and memory optimisations
- As always there have been plenty of performance, latency and memory optimisations all over the place.
Tracing framework and debugging improvements
## Tracing framework and debugging improvements
- The gst-stats tool can now be passed a custom regular expression
@ -734,7 +737,7 @@ Fake video decoder
- It draws a snake moving from left to right in the middle of the frame, which is reasonably light weight and still provides
an idea about how smooth the rendering is.
Tools
## Tools
- gst-launch-1.0 gained a new --prog-name command line option to set the program name, which will be used by GTK and GStreamer
to set the class or app-id.
@ -742,7 +745,7 @@ Tools
- gst-play-1.0 now defaults to using playbin3, but can still be made to use the old playbin by passing the --use-playbin2
command line argument.
GStreamer FFmpeg wrapper
## GStreamer FFmpeg wrapper
- New avvideocompare element to compare two incoming video buffers using a specified comparison method (e.g. SSIM or PSNR).
@ -759,7 +762,7 @@ GStreamer FFmpeg wrapper
- Note: see Known Issues section below for known issues with FFmpeg 6.0
GStreamer RTSP server
## GStreamer RTSP server
- New “ensure-keyunit-on-start” property: While the suspend modes NONE and PAUSED provided a low startup latency for
connecting clients, it did not ensure that streams started on fresh data. With this new property it is possible to maintain
@ -769,7 +772,7 @@ GStreamer RTSP server
- rtspclientsink: apply “port-range” property for RTCP port selection as well
GStreamer VA-API support
## GStreamer VA-API support
GstVA
@ -802,7 +805,7 @@ GStreamer-VAAPI
equivalent. Users who rely on gstreamer-vaapi are encouraged to migrate and test the va elements at the earliest
opportunity.
GStreamer Video4Linux2 support
## GStreamer Video4Linux2 support
- New uvcsink element, based on v4l2sink allow streaming your pipeline as a UVC camera using Linux UVC Gadget driver.
@ -814,7 +817,7 @@ GStreamer Video4Linux2 support
- Stateless decoders now tested using Virtual driver (visl), making it possible to run the tests in the cloud based CI
GStreamer OMX
## GStreamer OMX
- The gst-omx module has been removed. The OpenMAX standard is long dead and even the Raspberry Pi OS no longer supports it.
There has not been any development since 1.22 was released. Users of these elements should switch to the Video4Linux-based
@ -823,7 +826,7 @@ GStreamer OMX
- Hardware vendors which still use OpenMAX are known to have non-standard forks and it is recommended that they maintain it
while planning their move to the Video4Linux API.
GStreamer Editing Services and NLE
## GStreamer Editing Services and NLE
- Implement a gesvideoscale effect which gives user the ability to chooses where a clip has to be scaled in the chain of
effects. By default scaling is done in the compositor.
@ -861,7 +864,7 @@ ges-launch
- Move +effect stack effects from source to last effect added, so it feels more natural to user as adding them at the
beginning of the chain while the syntax is +effect felt wrong
GStreamer validate
## GStreamer validate
- In action types, add a way to avoid checking property value after setting it, in case elements do it async for example.
@ -888,7 +891,7 @@ GStreamer validate
- Fixed compatibility with Python 3.12.
GStreamer Python Bindings
## GStreamer Python Bindings
gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject,
and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more
@ -905,7 +908,7 @@ e.g. GStreamers fundamental GLib types such as Gst.Fraction, Gst.IntRange etc
- Fix libpython dlopen on macOS
GStreamer C# Bindings
## GStreamer C# Bindings
- The GStreamer C# bindings have been updated to a more recent version of GtkSharp and the bindings have been regenerated with
that version.
@ -914,7 +917,7 @@ GStreamer C# Bindings
- GstRtspServer bindings have been added, plus an RTSP server example
GStreamer Rust Bindings and Rust Plugins
## GStreamer Rust Bindings and Rust Plugins
The GStreamer Rust bindings and plugins are released separately with a different release cadence thats tied to the twice-a-year
GNOME release cycle.
@ -928,7 +931,7 @@ backported as needed to the 0.12 brach for future 1.24.x bugfix releases.
Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++.
WebRTC
### WebRTC
- New element webrtcsrc that can act as a recvonly WebRTC client. Just like the opposite direction, webrtcsink, this can
support various different WebRTC signalling protocols. Some are included with the plugin and provide their own element
@ -969,7 +972,7 @@ WebRTC
… and various other smaller improvements!
RTSP
### RTSP
- New rtspsrc2 element. Only a subset of RTSP features are implemented so far:
- RTSP 1.0 support
@ -980,7 +983,7 @@ RTSP
- The existing rtspsrc has a hard-coded order list for lower transports
- Many advanced features are not implemented yet, such as non-live support. See the README for the current status.
GTK4
### GTK4
- Support for rendering GL textures on X11/EGL, X11/GLX, Wayland, macOS, and WGL/EGL on Windows.
@ -996,7 +999,7 @@ GTK4
- Various bugfixes, including support for the new GTK 4.14 GL renderer. The plugin needs to be built with at least the
gtk_v4_10 feature to work with the new GTK 4.14 GL renderer, and will work best if built with the gtk_v4_14 feature.
Closed Caption
### Closed Caption
- Add cea608tocea708 element for upconverting CEA-608 captions to their CEA-708 representation.
@ -1007,7 +1010,7 @@ Closed Caption
- awstranscriber is using the new HTTP/2-based API now instead of the WebSocket-based one.
Other new elements
### Other new elements
- New awss3putobjectsink that works similar to awss3sink but with a different upload strategy.
@ -1021,7 +1024,7 @@ Other new elements
- New isomp4mux non-fragmented MP4 muxer element.
Other improvements
### Other improvements
- audiornnoise
- Attach audio level meta to output buffers.
@ -1041,12 +1044,12 @@ Other improvements
For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.9 (shipped with GStreamer
1.22) and 0.12 (shipped with GStreamer 1.24).
Cerbero Rust support
## Cerbero Rust support
- As of GStreamer 1.24, the GStreamer Rust plugins are shipped as part of our binary packages on all major platforms. This
includes Android and iOS now in addition to macOS and Windows/MSVC.
Build and Dependencies
## Build and Dependencies
- Meson >= 1.1 is now required for all modules
@ -1067,9 +1070,9 @@ Build and Dependencies
- zxing: added support for the zxing-c++ 2.0 API
- The ptp-helper for Precision Time Protocol (PTP) support in GStreamer core has been rewritten in Rust, and the minimum
required Rust version for building this is 1.48, i.e. the version currently in Debian stable. On Windows, at least Rust 1.54
is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP support is
available (if set to ptp-helper=enabled). cargo is not required for building.
required Rust version for building this is 1.48, i.e. the version currently in Debian oldstable. On Windows, at least Rust
1.54 is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP
support is available (if set to ptp-helper=enabled). cargo is not required for building.
- gst-plugins-rs requires Rust 1.70 or newer.
@ -1104,7 +1107,7 @@ Development environment
- gst-env.py: Output a setting for the prompt with --only-environment
Cerbero
### Cerbero
Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily
available, such as Windows, Android, iOS, and macOS.
@ -1181,16 +1184,16 @@ Android
- tremor and ivorbisdec plugins are no longer shipped on Android
- openh264 plugin no longer enables ASM optimizations on Android x86 due to relocation errors
Platform-specific changes and improvements
## Platform-specific changes and improvements
Android
### Android
- Add NDK implementation of Android MediaCodec. This reduces the amount of Java <-> native calls, which should reduce
overhead.
- Add support for AV1 to the androidmedia video encoder and decoder.
Apple macOS and iOS
### Apple macOS and iOS
- osxaudio: audio clock improvements (interpolate based on system time)
@ -1199,7 +1202,7 @@ Apple macOS and iOS
them. Without that, windows would disappear if you clicked outside them and there would be no way to bring them to front
again. This change also allows osxvideosink to receive navigation events correctly.
Windows
### Windows
- New DirectWrite text rendering plugin with dwriteclockoverlay, dwritetimeoverlay, dwritetextoverlay, dwritesubtitlemux, and
dwritesubtitleoverlay elements, including closed caption overlay support in dwritetextoverlay.
@ -1243,12 +1246,12 @@ Windows
- All d3d12 elements are zero ranked for now. Users will need to adjust rank of each d3d12 element via GST_PLUGIN_RANK
environment or appropriate plugin feature APIs if they want these elements autoplugged.
Documentation improvements
## Documentation improvements
- hotdoc has been updated to the latest version, and the theme has also been updated, which should fix various usability
issues.
Possibly Breaking Changes
## Possibly Breaking Changes
- gst_plugin_feature_check_version() has been updated to fix unexpected version check behaviour for git versions. It would
return TRUE if the plugin version is for a git development version (e.g. 1.24.0.1) and the check is for the “next” micro
@ -1268,12 +1271,12 @@ Possibly Breaking Changes
- The NVIDIA desktop GPU decoders nvh264sldec, nvh265sldec, nvvp8sldec and nvvp9sldec were renamed to nvh264dec, nvh265dec,
nvvp8dec and nvvp9dec, respectively.
Known Issues
## Known Issues
- There are known issues with FFmpeg version 6.0.0 due to opaque passing being broken in that version. This affects at least
avdec_h264, but may affect other decoders as well. Versions before 6.0.0, and 6.0.1 or higher are not affected.
Statistics
## Statistics
- 4643 commits
@ -1293,7 +1296,7 @@ Statistics
- 259791 lines added (net)
Contributors
## Contributors
Aaron Boxer, Aaron Huang, Acky Xu, adixonn, Adrian Fiergolski, Adrien De Coninck, Akihiro Sagawa, Albert Sjölund, Alessandro
Bono, Alexande B, Alexander Slobodeniuk, Alicia Boya García, amindfv, Amir Naghdinezhad, anaghdin, Anders Hellerup Madsen,
@ -1341,6 +1344,334 @@ bug-fix releases will be made from the git 1.24 branch, which will be a stable b
GStreamer 1.24.0 was released on 4 March 2024.
1.24.1
The first 1.24 bug-fix release (1.24.1) was released on 21 March 2024.
This release only contains bugfixes and it should be safe to update from 1.24.0.
Highlighted bugfixes in 1.24.1
- Fix instant-EOS regression in audio sinks in some cases when volume is 0
- rtspsrc: server compatibility improvements and ONVIF trick mode fixes
- rtsp-server: fix issues if RTSP media was set to be both shared and reusable
- (uri)decodebin3 and playbin3 fixes
- adaptivdemux2/hlsdemux2: Fix issues with failure updating playlists
- mpeg123 audio decoder fixes
- v4l2codecs: DMA_DRM caps support for decoders
- va: various AV1 / H.264 / H.265 video encoder fixes
- vtdec: fix potential deadlock regression with ProRes playback
- gst-libav: fixes for video decoder frame handling, interlaced mode detection
- avenc_aac: support for 7.1 and 16 channel modes
- glimagesink: Fix the sink not always respecting preferred size on macOS
- gtk4paintablesink: Fix scaling of texture position
- webrtc: Allow resolution and framerate changes, and many other improvements
- webrtc: Add new LiveKit source element
- Fix usability of binary packages on arm64 iOS
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- registry, ptp: Canonicalize the library path returned by dladdr
- segment: Dont use g_return_val_if_fail() in gst_segment_to_running_time_full()
- uri: Sort uri protocol sources/sinks by feature name to break a feature rank tie
- ptp: Initialize expected DELAY_REQ seqnum to an invalid value
- ptp: Dont install test executable
- gst-inspect: fix exists for plugins with versions other than GStreamers version, like the Rust plugins
- identity: Dont refuse seeks unless single-segment=true
gst-plugins-base
- audiobasesink: Dont wait on gap events
- audioencoder: Avoid using temporarily mapped memory as base for input buffers
- decodebin3: Be more specific when sending missing plugin messages
- decodebin3: Fix re-usability issues
- decodebin3: Provide clear error message if no decoders present
- playbin3: Remove un-needed URI NULL check
- uridecodebin3: Dont hold lock when posting messages or signals
- uridecodebin3: Handle potential double redirection errors
- glimagesink: Fix the sink not always respecting preferred size on macOS
- glupload: Do not propose allocators with sysmem, fixes warning when playing VP9 with alpha
- shmallocator: fix build on Illumos
- meson: Fix the condition to skip theoradec test
gst-plugins-good
- adaptivdemux/hlsdemux2: Fix issues with failure updating playlists
- mpg123audiodec: Correctly handle the case of clipping all decoded samples
- mpg123audiodec: gst_audio_decoder_allocate_output_buffer: assertion size > 0 failed
- qt: Fix description in meson build options
- qtdemux: Do not set channel-mask to zero
- rtspsrc: remove deprecated flag from the push-backchannel-sample signal
- rtspsrc: Consider 503 Service Not Available when handling broken control urls
- rtspsrc, rtponviftimestamp: ONVIF mode fixes
- rtspsrc: Dont invoke close when stopping if weve started cleanup, fixing potential crash on shutdown
- rtpgstpay: Delay pushing of event packets until the next buffer
gst-plugins-bad
- asio: Fix {input,output}-channels property handling
- cuda,d3d11,d3d12bufferpool: Disable preallocation
- d3d11device: Fix adapter LUID comparison in wrapped device mode
- d3d12device: Fix IDXGIFactory2 leak
- d3d12: Fix SDK debug layer activation
- dvbsubenc: Fix bottom field size calculation
- dvdspu: avoid null dereference
- GstPlay: Fix a critical warning in error callback
- v4l2codecs: decoders: Add DMA_DRM caps support
- vaav1enc: Init the output_frame_num when resetting gf group
- vah264enc, vah265enc, vaav1enc: fix potential crash on devices without rate control
- vah265enc: checking surface alignment
- videoparsers: Dont verbosely warn about CEA_708_PROCESS_EM_DATA_FLAG not being set
- vtdec: Fix a deadlock during ProRes playback, handle non-linked gracefully
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- gtk4paintablesink: Fix scaling of texture position
- janusvrwebrtcsink: Handle 64 bit numerical room ids
- janusvrwebrtcsink: Dont include deprecated audio/video fields in publish messages
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
- livekitwebrtc: Fix shutdown behaviour
- rtpgccbwe: Dont forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
- sccparse: Ignore invalid timecodes during seeking
- webrtcsink: Dont try parsing audio caps as video caps
- webrtc: Allow resolution and framerate changes
- webrtcsrc: Make producer-peer-id optional
- livekitwebrtcsrc: Add new LiveKit source element
- regex: Add support for configuring regex behaviour
- spotifyaudiosrc: Document how to use with non-Facebook accounts
- webrtcsrc: Add do-retransmission property
gst-libav
- avcodecmap: Increase max AAC channels to 16
- avviddec: Fix how we get back the codec frame
- avviddec: Fix interlaced mode detection
- avviddec: Double check if AV_CODEC_FLAG_COPY_OPAQUE port is safe for our scenario
gst-rtsp-server
- media: gst_rtsp_media_set_reusable() and gst_rtsp_media_set_shared() have become incompatible
- rtsp-stream: clear sockets when leaving bin
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: Fix critical warning
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- No changes
Development build environment
- No changes
Cerbero build tool and packaging changes in 1.24.1
- gstreamer: Enable ptp helper explicitly
- gst-plugins-bad: Package new insertbin plugin
- gst-plugins-rs: Adjust parallel architecture build blocks
- libnice: update to 0.1.22
- pixman: Bump to 0.43.4
- orc: disable JIT code generation on arm64 on iOS again, fixing crashes
Contributors to 1.24.1
Alexander Slobodeniuk, Antonio Larrosa, Edward Hervey, Elizabeth Figura, François Laignel, Guillaume Desmottes, He Junyan, Jan
Schmidt, Jordan Yelloz, L. E. Segovia, Mark Nauwelaerts, Mathieu Duponchelle, Michael Tretter, Mikhail Rudenko, Nicolas
Dufresne, Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Robert Mader, Ruijing Dong, Sebastian Dröge, Seungha Yang,
Thomas Goodwin, Thomas Klausner, Tim-Philipp Müller, Xi Ruoyao,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.1
- List of Merge Requests applied in 1.24.1
- List of Issues fixed in 1.24.1
1.24.2
The second 1.24 bug-fix release (1.24.2) was released on 9 April 2024.
This release only contains bugfixes and it should be safe to update from 1.24.x.
Highlighted bugfixes in 1.24.2
- H.264 parsing regression fixes
- WavPack typefinding improvements
- Video4linux fixes and improvements
- Android build and runtime fixes
- macOS OpenGL memory leak and robustness fixes
- Qt/QML video sink fixes
- Package new analytics and mse libraries in binary packages
- Windows MSVC binary packages: fix libvpx avx/avx2/avx512 instruction set detection
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- clock: Block futex_time64 usage on Android API level < 30
- basesrc: Clear submitted buffer lists consistently with buffers
- ptpclock: fix double free of domain data during deinit
- clocksync: Proxy allocation queries
- inputselector: fix possible clock leak on shutdown
- typefind: Handle WavPack block sizes > 131072
gst-plugins-base
- glcolorconvert: Ensure glcolorconvert does not miss supported RGB formats
- gl/macos: a couple of race/reference count fixes
- pbutils: descriptions: Dont warn on MPEG-1 audio caps without layer field
- encodebin: Add the parser before timestamper to tosync list
- videorate: Reset last_ts when a new segment is received
gst-plugins-good
- qml6glsink: fix destruction of underlying texture
- qt/qt6: Fixup for dummy textures
- rtpjitterbuffer: Dont use estimated_dts to do default skew adjustment
- rtpjitterbuffer: Use an extended RTP timestamp for the clock-base
- rtpmp4adepay: Set duration on outgoing buffers
- tests: rtpred: fix out-of-bound writes
- v4l2: allocator: Fix unref log/trace on memory release
- v4l2: Also set max_width/max_width if enum framesize fail
- v4l2: enforce a pixel aspect ratio of 1/1 if no data are available
- v4l2: fix error in calculating padding bottom for tile format
- v4l2src: need maintain the caps order in caps compare when fixate
- vpxenc: Include vpx error details in errors and warnings
gst-plugins-bad
- h264parse: element hangs with some video streams (regression)
- h264parse: Revert “AU boundary detection changes”
- alphadecodebin: Explicitly pass 64 bit integers as such through varargs
- atdec: Set a channel mask for channel counts greater than 2
- ccconverter: Fix caps leak and remove unnecessary code
- d3d11videosink: disconnect signals before releasing the window
- d3d11: meson: Add support for MinGW DirectXMath package and update directxmath wrap to 3.1.9
- d3d11: meson: Disable library build if DirectXMath header was not found
- dwrite: Fix crash on device update
- GstPlay: Update video_snapshot to support playbin3
- jpegparse: avi1 tag can be progressive
- jpegparse: turn some bus warnings into object ones
- qsvdecoder: Release too old frames
- ristsrc: Only free caps if needed
- va: av1enc: Correct the reference number and improve the reference setting
- va: {vp9, av1}enc: Avoid reopen encoder or renegotiate
- videoparsers: Demote CC warning message
- vkbufferpool: correct usage flags type
- vkh26xdec: a couple decoding fixes
- vtdec: Fix caps criticals during negotiation
- wpe: avoid crash with G_DEBUG=fatal_criticals and static build
- Sink missing floating references
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- aws: use fixed BehaviorVersion
- aws: improve error message logs
- fmp4: Update to dash-mpd 0.16
- fmp4mux: Require gstreamer-pbutils 1.20 for the examples
- onvifmetadataparse: Reset state in PAUSED->READY after pad deactivation, fixing occasional deadlock on shutdown
- reqwest: Update to reqwest 0.12
- webrtcsink: set perfect-timestamp=true on audio encoders
- webrtcsink: improve panic message on unexpected caps during discovery
- webrtchttp: Update to reqwest 0.12
- webrtc: fix inconsistencies in documentation of object names
- Fix clippy warnings after upgrade to Rust 1.77
gst-libav
- avviddec: Fix AVPacket leak
gst-rtsp-server
- No changes
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: frame-composition-meta: Stop using keyword operator for field in C++
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- webrtc examples: set perfect-timestamp=true on opusenc for better Chrome interoperability
Development build environment
- flac: Add subproject wrap and allow falling back to it in the flac plugin
- libnice: bump subproject wrap to v0.1.22 (needed for ICE consent freshness support in gstwebrtc)
Cerbero build tool and packaging changes in 1.24.2
- glib: Block futex_time64 usage on Android API level < 30
- libvpx: Fix build with Python 3.8
- libvpx: Fix errors with avx* instruction set detection for x86* builds and MSVC
- openjpeg: Update to 2.5.2
- directxmath: Update to 3.1.9
- gst-plugins-rs: Fix superstripping for ELF breaking all plugins
- Rust-based plugin initialization hangs on Android with GStreamer 1.24.0
Contributors to 1.24.2
Alexander Slobodeniuk, Arnaud Vrac, Chao Guo, Chris Spencer, Daniel Morin, Edward Hervey, Elizabeth Figura, Elliot Chen, eri,
François Laignel, Guillaume Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Schmidt, Jochen Henneberg, L. E. Segovia, Martin
Nordholts, Matthew Waters, Nicolas Dufresne, Philippe Normand, Philipp Zabel, Piotr Brzeziński, Robert Guziolowski, Robert
Mader, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, Taruntej Kanakamalla, Thibault Saunier, Tim Blechmann, Tim-Philipp Müller,
Víctor Manuel Jáquez Leal, Wojciech Kapsa, Xavier Claessens,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.2
- List of Merge Requests applied in 1.24.2
- List of Issues fixed in 1.24.2
Schedule for 1.26
Our next major feature release will be 1.26, and 1.25 will be the unstable development version leading up to the stable 1.26

View file

@ -1,4 +1,4 @@
This is GStreamer gst-devtools 1.24.0.
This is GStreamer gst-devtools 1.24.2.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!

View file

@ -53,6 +53,26 @@
</GitRepository>
</repository>
<release>
<Version>
<revision>1.24.2</revision>
<branch>1.24</branch>
<name></name>
<created>2024-04-09</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-devtools/gst-devtools-1.24.2.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.1</revision>
<branch>1.24</branch>
<name></name>
<created>2024-03-21</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-devtools/gst-devtools-1.24.1.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.0</revision>

View file

@ -1,5 +1,5 @@
project('gst-devtools', 'c',
version : '1.24.0',
version : '1.24.2',
meson_version : '>= 1.1',
default_options : [ 'warning_level=1',
'c_std=gnu99',

View file

@ -1,5 +1,5 @@
project('GStreamer manuals and tutorials', 'c',
version: '1.24.0',
version: '1.24.2',
meson_version : '>= 1.1')
hotdoc_p = find_program('hotdoc')

View file

@ -2,18 +2,20 @@ GStreamer 1.24 Release Notes
GStreamer 1.24.0 was originally released on 4 March 2024.
The latest bug-fix release in the stable 1.24 series is 1.24.2 and was released on 9 April 2024.
See https://gstreamer.freedesktop.org/releases/1.24/ for the latest version of this document.
Last updated: Monday 4 March 2024, 23:00 UTC (log)
Last updated: Tuesday 9 April 2024, 12:30 UTC (log)
Introduction
## Introduction
The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite
cross-platform multimedia framework!
As always, this release is again packed with many new features, bug fixes and other improvements.
Highlights
## Highlights
- New Discourse forum and Matrix chat space
- New Analytics and Machine Learning abstractions and elements
@ -48,11 +50,12 @@ Highlights
- AVX/AVX2 support and NEON support on macOS on Apple ARM64 CPUs via new liborc
- GStreamer C# bindings have been updated
- Rust bindings improvements and many new and improved Rust plugins
- Rust plugins now shipped in packages for all major platforms including Android and iOS
- Lots of new plugins, features, performance improvements and bug fixes
Major new features and changes
## Major new features and changes
Discourse forum and Matrix chat space
### Discourse forum and Matrix chat space
- The new Discourse forum and Matrix chat space are now our preferred communication channels for support and developer chat.
@ -61,7 +64,7 @@ Discourse forum and Matrix chat space
- For release announcements please subscribe to the News + Announcements category on Discourse, although we will continue to
also send announcements to the mailing list for the time being.
Playbin3, decodebin3 now stable and default
### Playbin3, decodebin3 now stable and default
- After a year of stability, testing and more improvements, playbin3, and its various components (uridecodebin3, decodebin3
and urisourcebin), are now the recommended playback components.
@ -84,7 +87,7 @@ Improvements in this cycle:
partly due to a historical confusion between subtitle “decoders” (which decode the format to text and “parsers” (which only
do timing detection and optional seeking).
GstMeta serialization/deserialization and other GstMeta improvements
### GstMeta serialization/deserialization and other GstMeta improvements
- GstMeta serialization/deserialization allows metas to be transmitted or stored. This is used by the unixfd and cudaipc
plugins for inter-process communication (IPC). Implemented so far for GstCustomMeta, GstVideoMeta, GstAudioMeta and
@ -98,7 +101,7 @@ GstMeta serialization/deserialization and other GstMeta improvements
- Add gst_meta_info_new() and gst_meta_info_register() to register a GstMeta in two steps for easier extensibility.
New unixfd plugin for efficient 1:N inter-process communication on Linux
### New unixfd plugin for efficient 1:N inter-process communication on Linux
- unixfdsink and unixfdsrc are elements that, inspired by shmsink andn shmsrc, send UNIX file descriptors (e.g. memfd, dmabuf)
from one sink to multiple source elements in other processes on Linux.
@ -106,7 +109,7 @@ New unixfd plugin for efficient 1:N inter-process communication on Linux
- The unixfdsink proposes a memfd/shm allocator to upstream elements which allows for example videotestsrc to write directly
into memory that can be transfered to other processes without copying.
New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
### New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Previously only various specific GstMeta for ancillary data were provided, such as GstVideoCaptionMeta and GstVideoAFDMeta.
The new GstAncillaryMeta allows passing arbitrary ancillary data between elements, including custom and non-standard
@ -117,7 +120,7 @@ New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Supported by the newly added AJA sink and source elements
DSD audio support
### DSD audio support
- DSD audio is a non-PCM raw audio format representation and the GstAudio library gained support for this in form of new
GstDsdInfo and GstDsdFormat API.
@ -125,7 +128,7 @@ DSD audio support
- Support for DSD audio has been implemented in alsasink as well as the GstAudioSink and GstAudioRingBuffer base classes, and
the gst-libav plugin to enable FFmpeg-based DSD elements and functionality.
Analytics and Machine Learning
### Analytics and Machine Learning
- A new library, GstAnalytics, has been added. It defines a GstAnalyticsRelationMeta that can efficiently hold a large number
of observations from a data analysis process, for example from machine learning. It also contains a matrix of the
@ -146,7 +149,7 @@ Analytics and Machine Learning
- In the next release, tensor decoders such as ssdobjectdetector will live outside of the ONNX plugin so they can be used with
other machine learning acceleration frameworks.
Qt5 + Qt6 QML integration improvements
### Qt5 + Qt6 QML integration improvements
- The Qt5 qmlglsink, qmlgloverlay, qmlglmixer received support for directly consuming BGRA and YV12 video frames without a
prior glcolorconvert.
@ -156,7 +159,7 @@ Qt5 + Qt6 QML integration improvements
- qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink.
DRM Modifier Support for dmabufs on Linux
### DRM Modifier Support for dmabufs on Linux
The Linux dmabuf subsystem provides buffer sharing across different hardware device drivers and subsystems, and is used
extensively by the DRM subsystem to exchange buffers between processes, contexts, and library APIs within the same process, and
@ -189,7 +192,7 @@ New API has been added for easy handling of these new caps:
- GST_VIDEO_FORMAT_DMA_DRM
OpenGL integration enhancements
### OpenGL integration enhancements
- When using EGL, if both OpenGL ES and OpenGL are available, OpenGL ES is preferred over OpenGL. OpenGL ES supports some
necessary features required for dmabuf support. This does not apply if an external library/application chooses an OpenGL API
@ -233,7 +236,7 @@ OpenGL integration enhancements
- GstGLBufferPool now has a configuration option for allowing a number of buffers to be always outstanding allowing for
reducing the potential synchronisation delay when reusing OpenGL memory backed buffers.
Vulkan integration enhancements
### Vulkan integration enhancements
- Add support for the Vulkan H.264 and H.265 decoders.
@ -246,7 +249,7 @@ Vulkan integration enhancements
- Vulkan/Wayland: add support for xdg_wm_base protocol for creating a visible debug window. Required as the previous wl_shell
interface is being removed from compositors.
CUDA / NVCODEC integration and feature additions
### CUDA / NVCODEC integration and feature additions
- New cudaipcsrc and cudaipcsink elements for zero-copy CUDA memory sharing between processes
@ -265,7 +268,7 @@ CUDA / NVCODEC integration and feature additions
flag, cuStreamSynchronize() or gst_cuda_memory_sync() call is required unless application-side CUDA operation is executed
with the GstCudaMemorys associated CUDA stream.
RTP stack improvements
### RTP stack improvements
- New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element.
This is useful for relaying an RTP stream as-is through gst-rtsp-server, which expects an RTP payloader with certain
@ -310,7 +313,7 @@ RTP stack improvements
rtpsbcdepay, rtpvorbisdepay, rtpmp4vdepay, rtptheoradepay, rtpsv3vdepay, rtpmp4adepay, rtpklvdepay, rtpjpegdepay,
rtpj2kdepay, rtph263pdepay, rtph263depay, rtph261depay. rtpgstdepay.
WebRTC improvements
### WebRTC improvements
- Add support for ICE consent freshness (RFC 7675). This requires libnice >= 0.1.22.
@ -321,7 +324,7 @@ WebRTC improvements
- Various improvements and feature additions in the Rust webrtc plugin, which provides webrtcsrc and webrtcsink elements as
well as specific elements for different WebRTC signalling protocols. See the Rust plugins section below for more details.
Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
### Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- hlsdemux2 now supports Low-Latency HLS (LL-HLS)
@ -345,7 +348,7 @@ Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- No development took place on the legacy demuxers (dashdemux, hlsdemux, mssdemux). Application developers are reminded to use
the new demuxers instead. They are automatically picked up when using urisourcebin, uridecodebin3 or playbin3.
W3C Media Source Extensions library
### W3C Media Source Extensions library
- A new GStreamer library (mse) implementing the W3C Media Source Extensions specification was added.
@ -353,7 +356,7 @@ W3C Media Source Extensions library
without relying on a web browser engine. Typically an application consuming this library will wrap the C API with JavaScript
bindings that match the Media Source API so their existing code can integrate with this library.
Closed Caption handling improvements
### Closed Caption handling improvements
- ccconverter supports converting between the two CEA-608 fields.
@ -362,7 +365,7 @@ Closed Caption handling improvements
- Various improvements and feature additions in the Rust-based closed caption elements. Check out the Rust plugins section
below for more details.
Precision Time Protocol (PTP) clock improvements
### Precision Time Protocol (PTP) clock improvements
- Many fixes and compatibility/interoperability improvements.
@ -376,14 +379,14 @@ Precision Time Protocol (PTP) clock improvements
Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD, Solaris and Illumos. Newly supported compared to the C version is
Windows. Compared to the C version various error paths are handled more correctly and a couple of memory leaks are fixed.
Otherwise it should work identically. The minimum required Rust version for compiling this is 1.48, i.e. the version
currently in Debian stable. On Windows, Rust 1.54 is needed at least.
currently in Debian oldstable. On Windows, Rust 1.54 is needed at least.
- New ptp-helper Meson build option so PTP support can be disabled or required.
- gst_ptp_init_full() allows for a more fine-grained and extensible configuration and initialization of the GStreamer PTP
subsystem, including TTL configuration.
Bayer 10/12/14/16-bit depth support
### Bayer 10/12/14/16-bit depth support
- bayer2rgb and rgb2bayer now support bayer with 10/12/14/16 bit depths
@ -391,7 +394,7 @@ Bayer 10/12/14/16-bit depth support
- imagefreeze gained bayer support as well
MPEG-TS improvements
### MPEG-TS improvements
- mpegtsdemux gained support for
- segment seeking for seamless non-flushing looping, and
@ -403,7 +406,7 @@ MPEG-TS improvements
- allows writing arbitrary Opus channel mapping families and up to 255 channels
- separate handling of DVB and ATSC AC3 descriptors
New elements and plugins
## New elements and plugins
- analyticsoverlay visualises object-detection metas on a video stream.
@ -436,7 +439,7 @@ New elements and plugins
- New uvcsink element for exporting streams as UVC camera
New element features and additions
## New element features and additions
- alphacombine supports I420_10LE now for 10-bit WebM/alpha support.
@ -594,11 +597,11 @@ New element features and additions
- y4mdec now parses extended headers to support high bit depth video.
Plugin and library moves
## Plugin and library moves
- The AMR-NB and AMR-WB plugins have been moved from -bad to -good.
- The AMR-NB and AMR-WB plugins have been moved from -ugly to -good.
Plugin and element removals
## Plugin and element removals
- The entire gst-omx package and plugin has been retired. See the OMX section below for more details.
@ -606,7 +609,7 @@ Plugin and element removals
- The kate subtitle plugin has been removed.
Miscellaneous API additions
## Miscellaneous API additions
GStreamer Core
@ -700,7 +703,7 @@ New Video Formats
- Tiled 10-bit NV12 format NV12_10LE40_4L4 (Verisilicon Hantro)
Miscellaneous performance, latency and memory optimisations
## Miscellaneous performance, latency and memory optimisations
- liborc 0.4.35 (latest: 0.4.38) adds support for AVX/AVX2 and contains improvements for the SSE backend.
@ -712,7 +715,7 @@ Miscellaneous performance, latency and memory optimisations
- As always there have been plenty of performance, latency and memory optimisations all over the place.
Tracing framework and debugging improvements
## Tracing framework and debugging improvements
- The gst-stats tool can now be passed a custom regular expression
@ -734,7 +737,7 @@ Fake video decoder
- It draws a snake moving from left to right in the middle of the frame, which is reasonably light weight and still provides
an idea about how smooth the rendering is.
Tools
## Tools
- gst-launch-1.0 gained a new --prog-name command line option to set the program name, which will be used by GTK and GStreamer
to set the class or app-id.
@ -742,7 +745,7 @@ Tools
- gst-play-1.0 now defaults to using playbin3, but can still be made to use the old playbin by passing the --use-playbin2
command line argument.
GStreamer FFmpeg wrapper
## GStreamer FFmpeg wrapper
- New avvideocompare element to compare two incoming video buffers using a specified comparison method (e.g. SSIM or PSNR).
@ -759,7 +762,7 @@ GStreamer FFmpeg wrapper
- Note: see Known Issues section below for known issues with FFmpeg 6.0
GStreamer RTSP server
## GStreamer RTSP server
- New “ensure-keyunit-on-start” property: While the suspend modes NONE and PAUSED provided a low startup latency for
connecting clients, it did not ensure that streams started on fresh data. With this new property it is possible to maintain
@ -769,7 +772,7 @@ GStreamer RTSP server
- rtspclientsink: apply “port-range” property for RTCP port selection as well
GStreamer VA-API support
## GStreamer VA-API support
GstVA
@ -802,7 +805,7 @@ GStreamer-VAAPI
equivalent. Users who rely on gstreamer-vaapi are encouraged to migrate and test the va elements at the earliest
opportunity.
GStreamer Video4Linux2 support
## GStreamer Video4Linux2 support
- New uvcsink element, based on v4l2sink allow streaming your pipeline as a UVC camera using Linux UVC Gadget driver.
@ -814,7 +817,7 @@ GStreamer Video4Linux2 support
- Stateless decoders now tested using Virtual driver (visl), making it possible to run the tests in the cloud based CI
GStreamer OMX
## GStreamer OMX
- The gst-omx module has been removed. The OpenMAX standard is long dead and even the Raspberry Pi OS no longer supports it.
There has not been any development since 1.22 was released. Users of these elements should switch to the Video4Linux-based
@ -823,7 +826,7 @@ GStreamer OMX
- Hardware vendors which still use OpenMAX are known to have non-standard forks and it is recommended that they maintain it
while planning their move to the Video4Linux API.
GStreamer Editing Services and NLE
## GStreamer Editing Services and NLE
- Implement a gesvideoscale effect which gives user the ability to chooses where a clip has to be scaled in the chain of
effects. By default scaling is done in the compositor.
@ -861,7 +864,7 @@ ges-launch
- Move +effect stack effects from source to last effect added, so it feels more natural to user as adding them at the
beginning of the chain while the syntax is +effect felt wrong
GStreamer validate
## GStreamer validate
- In action types, add a way to avoid checking property value after setting it, in case elements do it async for example.
@ -888,7 +891,7 @@ GStreamer validate
- Fixed compatibility with Python 3.12.
GStreamer Python Bindings
## GStreamer Python Bindings
gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject,
and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more
@ -905,7 +908,7 @@ e.g. GStreamers fundamental GLib types such as Gst.Fraction, Gst.IntRange etc
- Fix libpython dlopen on macOS
GStreamer C# Bindings
## GStreamer C# Bindings
- The GStreamer C# bindings have been updated to a more recent version of GtkSharp and the bindings have been regenerated with
that version.
@ -914,7 +917,7 @@ GStreamer C# Bindings
- GstRtspServer bindings have been added, plus an RTSP server example
GStreamer Rust Bindings and Rust Plugins
## GStreamer Rust Bindings and Rust Plugins
The GStreamer Rust bindings and plugins are released separately with a different release cadence thats tied to the twice-a-year
GNOME release cycle.
@ -928,7 +931,7 @@ backported as needed to the 0.12 brach for future 1.24.x bugfix releases.
Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++.
WebRTC
### WebRTC
- New element webrtcsrc that can act as a recvonly WebRTC client. Just like the opposite direction, webrtcsink, this can
support various different WebRTC signalling protocols. Some are included with the plugin and provide their own element
@ -969,7 +972,7 @@ WebRTC
… and various other smaller improvements!
RTSP
### RTSP
- New rtspsrc2 element. Only a subset of RTSP features are implemented so far:
- RTSP 1.0 support
@ -980,7 +983,7 @@ RTSP
- The existing rtspsrc has a hard-coded order list for lower transports
- Many advanced features are not implemented yet, such as non-live support. See the README for the current status.
GTK4
### GTK4
- Support for rendering GL textures on X11/EGL, X11/GLX, Wayland, macOS, and WGL/EGL on Windows.
@ -996,7 +999,7 @@ GTK4
- Various bugfixes, including support for the new GTK 4.14 GL renderer. The plugin needs to be built with at least the
gtk_v4_10 feature to work with the new GTK 4.14 GL renderer, and will work best if built with the gtk_v4_14 feature.
Closed Caption
### Closed Caption
- Add cea608tocea708 element for upconverting CEA-608 captions to their CEA-708 representation.
@ -1007,7 +1010,7 @@ Closed Caption
- awstranscriber is using the new HTTP/2-based API now instead of the WebSocket-based one.
Other new elements
### Other new elements
- New awss3putobjectsink that works similar to awss3sink but with a different upload strategy.
@ -1021,7 +1024,7 @@ Other new elements
- New isomp4mux non-fragmented MP4 muxer element.
Other improvements
### Other improvements
- audiornnoise
- Attach audio level meta to output buffers.
@ -1041,12 +1044,12 @@ Other improvements
For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.9 (shipped with GStreamer
1.22) and 0.12 (shipped with GStreamer 1.24).
Cerbero Rust support
## Cerbero Rust support
- As of GStreamer 1.24, the GStreamer Rust plugins are shipped as part of our binary packages on all major platforms. This
includes Android and iOS now in addition to macOS and Windows/MSVC.
Build and Dependencies
## Build and Dependencies
- Meson >= 1.1 is now required for all modules
@ -1067,9 +1070,9 @@ Build and Dependencies
- zxing: added support for the zxing-c++ 2.0 API
- The ptp-helper for Precision Time Protocol (PTP) support in GStreamer core has been rewritten in Rust, and the minimum
required Rust version for building this is 1.48, i.e. the version currently in Debian stable. On Windows, at least Rust 1.54
is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP support is
available (if set to ptp-helper=enabled). cargo is not required for building.
required Rust version for building this is 1.48, i.e. the version currently in Debian oldstable. On Windows, at least Rust
1.54 is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP
support is available (if set to ptp-helper=enabled). cargo is not required for building.
- gst-plugins-rs requires Rust 1.70 or newer.
@ -1104,7 +1107,7 @@ Development environment
- gst-env.py: Output a setting for the prompt with --only-environment
Cerbero
### Cerbero
Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily
available, such as Windows, Android, iOS, and macOS.
@ -1181,16 +1184,16 @@ Android
- tremor and ivorbisdec plugins are no longer shipped on Android
- openh264 plugin no longer enables ASM optimizations on Android x86 due to relocation errors
Platform-specific changes and improvements
## Platform-specific changes and improvements
Android
### Android
- Add NDK implementation of Android MediaCodec. This reduces the amount of Java <-> native calls, which should reduce
overhead.
- Add support for AV1 to the androidmedia video encoder and decoder.
Apple macOS and iOS
### Apple macOS and iOS
- osxaudio: audio clock improvements (interpolate based on system time)
@ -1199,7 +1202,7 @@ Apple macOS and iOS
them. Without that, windows would disappear if you clicked outside them and there would be no way to bring them to front
again. This change also allows osxvideosink to receive navigation events correctly.
Windows
### Windows
- New DirectWrite text rendering plugin with dwriteclockoverlay, dwritetimeoverlay, dwritetextoverlay, dwritesubtitlemux, and
dwritesubtitleoverlay elements, including closed caption overlay support in dwritetextoverlay.
@ -1243,12 +1246,12 @@ Windows
- All d3d12 elements are zero ranked for now. Users will need to adjust rank of each d3d12 element via GST_PLUGIN_RANK
environment or appropriate plugin feature APIs if they want these elements autoplugged.
Documentation improvements
## Documentation improvements
- hotdoc has been updated to the latest version, and the theme has also been updated, which should fix various usability
issues.
Possibly Breaking Changes
## Possibly Breaking Changes
- gst_plugin_feature_check_version() has been updated to fix unexpected version check behaviour for git versions. It would
return TRUE if the plugin version is for a git development version (e.g. 1.24.0.1) and the check is for the “next” micro
@ -1268,12 +1271,12 @@ Possibly Breaking Changes
- The NVIDIA desktop GPU decoders nvh264sldec, nvh265sldec, nvvp8sldec and nvvp9sldec were renamed to nvh264dec, nvh265dec,
nvvp8dec and nvvp9dec, respectively.
Known Issues
## Known Issues
- There are known issues with FFmpeg version 6.0.0 due to opaque passing being broken in that version. This affects at least
avdec_h264, but may affect other decoders as well. Versions before 6.0.0, and 6.0.1 or higher are not affected.
Statistics
## Statistics
- 4643 commits
@ -1293,7 +1296,7 @@ Statistics
- 259791 lines added (net)
Contributors
## Contributors
Aaron Boxer, Aaron Huang, Acky Xu, adixonn, Adrian Fiergolski, Adrien De Coninck, Akihiro Sagawa, Albert Sjölund, Alessandro
Bono, Alexande B, Alexander Slobodeniuk, Alicia Boya García, amindfv, Amir Naghdinezhad, anaghdin, Anders Hellerup Madsen,
@ -1341,6 +1344,334 @@ bug-fix releases will be made from the git 1.24 branch, which will be a stable b
GStreamer 1.24.0 was released on 4 March 2024.
1.24.1
The first 1.24 bug-fix release (1.24.1) was released on 21 March 2024.
This release only contains bugfixes and it should be safe to update from 1.24.0.
Highlighted bugfixes in 1.24.1
- Fix instant-EOS regression in audio sinks in some cases when volume is 0
- rtspsrc: server compatibility improvements and ONVIF trick mode fixes
- rtsp-server: fix issues if RTSP media was set to be both shared and reusable
- (uri)decodebin3 and playbin3 fixes
- adaptivdemux2/hlsdemux2: Fix issues with failure updating playlists
- mpeg123 audio decoder fixes
- v4l2codecs: DMA_DRM caps support for decoders
- va: various AV1 / H.264 / H.265 video encoder fixes
- vtdec: fix potential deadlock regression with ProRes playback
- gst-libav: fixes for video decoder frame handling, interlaced mode detection
- avenc_aac: support for 7.1 and 16 channel modes
- glimagesink: Fix the sink not always respecting preferred size on macOS
- gtk4paintablesink: Fix scaling of texture position
- webrtc: Allow resolution and framerate changes, and many other improvements
- webrtc: Add new LiveKit source element
- Fix usability of binary packages on arm64 iOS
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- registry, ptp: Canonicalize the library path returned by dladdr
- segment: Dont use g_return_val_if_fail() in gst_segment_to_running_time_full()
- uri: Sort uri protocol sources/sinks by feature name to break a feature rank tie
- ptp: Initialize expected DELAY_REQ seqnum to an invalid value
- ptp: Dont install test executable
- gst-inspect: fix exists for plugins with versions other than GStreamers version, like the Rust plugins
- identity: Dont refuse seeks unless single-segment=true
gst-plugins-base
- audiobasesink: Dont wait on gap events
- audioencoder: Avoid using temporarily mapped memory as base for input buffers
- decodebin3: Be more specific when sending missing plugin messages
- decodebin3: Fix re-usability issues
- decodebin3: Provide clear error message if no decoders present
- playbin3: Remove un-needed URI NULL check
- uridecodebin3: Dont hold lock when posting messages or signals
- uridecodebin3: Handle potential double redirection errors
- glimagesink: Fix the sink not always respecting preferred size on macOS
- glupload: Do not propose allocators with sysmem, fixes warning when playing VP9 with alpha
- shmallocator: fix build on Illumos
- meson: Fix the condition to skip theoradec test
gst-plugins-good
- adaptivdemux/hlsdemux2: Fix issues with failure updating playlists
- mpg123audiodec: Correctly handle the case of clipping all decoded samples
- mpg123audiodec: gst_audio_decoder_allocate_output_buffer: assertion size > 0 failed
- qt: Fix description in meson build options
- qtdemux: Do not set channel-mask to zero
- rtspsrc: remove deprecated flag from the push-backchannel-sample signal
- rtspsrc: Consider 503 Service Not Available when handling broken control urls
- rtspsrc, rtponviftimestamp: ONVIF mode fixes
- rtspsrc: Dont invoke close when stopping if weve started cleanup, fixing potential crash on shutdown
- rtpgstpay: Delay pushing of event packets until the next buffer
gst-plugins-bad
- asio: Fix {input,output}-channels property handling
- cuda,d3d11,d3d12bufferpool: Disable preallocation
- d3d11device: Fix adapter LUID comparison in wrapped device mode
- d3d12device: Fix IDXGIFactory2 leak
- d3d12: Fix SDK debug layer activation
- dvbsubenc: Fix bottom field size calculation
- dvdspu: avoid null dereference
- GstPlay: Fix a critical warning in error callback
- v4l2codecs: decoders: Add DMA_DRM caps support
- vaav1enc: Init the output_frame_num when resetting gf group
- vah264enc, vah265enc, vaav1enc: fix potential crash on devices without rate control
- vah265enc: checking surface alignment
- videoparsers: Dont verbosely warn about CEA_708_PROCESS_EM_DATA_FLAG not being set
- vtdec: Fix a deadlock during ProRes playback, handle non-linked gracefully
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- gtk4paintablesink: Fix scaling of texture position
- janusvrwebrtcsink: Handle 64 bit numerical room ids
- janusvrwebrtcsink: Dont include deprecated audio/video fields in publish messages
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
- livekitwebrtc: Fix shutdown behaviour
- rtpgccbwe: Dont forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
- sccparse: Ignore invalid timecodes during seeking
- webrtcsink: Dont try parsing audio caps as video caps
- webrtc: Allow resolution and framerate changes
- webrtcsrc: Make producer-peer-id optional
- livekitwebrtcsrc: Add new LiveKit source element
- regex: Add support for configuring regex behaviour
- spotifyaudiosrc: Document how to use with non-Facebook accounts
- webrtcsrc: Add do-retransmission property
gst-libav
- avcodecmap: Increase max AAC channels to 16
- avviddec: Fix how we get back the codec frame
- avviddec: Fix interlaced mode detection
- avviddec: Double check if AV_CODEC_FLAG_COPY_OPAQUE port is safe for our scenario
gst-rtsp-server
- media: gst_rtsp_media_set_reusable() and gst_rtsp_media_set_shared() have become incompatible
- rtsp-stream: clear sockets when leaving bin
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: Fix critical warning
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- No changes
Development build environment
- No changes
Cerbero build tool and packaging changes in 1.24.1
- gstreamer: Enable ptp helper explicitly
- gst-plugins-bad: Package new insertbin plugin
- gst-plugins-rs: Adjust parallel architecture build blocks
- libnice: update to 0.1.22
- pixman: Bump to 0.43.4
- orc: disable JIT code generation on arm64 on iOS again, fixing crashes
Contributors to 1.24.1
Alexander Slobodeniuk, Antonio Larrosa, Edward Hervey, Elizabeth Figura, François Laignel, Guillaume Desmottes, He Junyan, Jan
Schmidt, Jordan Yelloz, L. E. Segovia, Mark Nauwelaerts, Mathieu Duponchelle, Michael Tretter, Mikhail Rudenko, Nicolas
Dufresne, Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Robert Mader, Ruijing Dong, Sebastian Dröge, Seungha Yang,
Thomas Goodwin, Thomas Klausner, Tim-Philipp Müller, Xi Ruoyao,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.1
- List of Merge Requests applied in 1.24.1
- List of Issues fixed in 1.24.1
1.24.2
The second 1.24 bug-fix release (1.24.2) was released on 9 April 2024.
This release only contains bugfixes and it should be safe to update from 1.24.x.
Highlighted bugfixes in 1.24.2
- H.264 parsing regression fixes
- WavPack typefinding improvements
- Video4linux fixes and improvements
- Android build and runtime fixes
- macOS OpenGL memory leak and robustness fixes
- Qt/QML video sink fixes
- Package new analytics and mse libraries in binary packages
- Windows MSVC binary packages: fix libvpx avx/avx2/avx512 instruction set detection
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- clock: Block futex_time64 usage on Android API level < 30
- basesrc: Clear submitted buffer lists consistently with buffers
- ptpclock: fix double free of domain data during deinit
- clocksync: Proxy allocation queries
- inputselector: fix possible clock leak on shutdown
- typefind: Handle WavPack block sizes > 131072
gst-plugins-base
- glcolorconvert: Ensure glcolorconvert does not miss supported RGB formats
- gl/macos: a couple of race/reference count fixes
- pbutils: descriptions: Dont warn on MPEG-1 audio caps without layer field
- encodebin: Add the parser before timestamper to tosync list
- videorate: Reset last_ts when a new segment is received
gst-plugins-good
- qml6glsink: fix destruction of underlying texture
- qt/qt6: Fixup for dummy textures
- rtpjitterbuffer: Dont use estimated_dts to do default skew adjustment
- rtpjitterbuffer: Use an extended RTP timestamp for the clock-base
- rtpmp4adepay: Set duration on outgoing buffers
- tests: rtpred: fix out-of-bound writes
- v4l2: allocator: Fix unref log/trace on memory release
- v4l2: Also set max_width/max_width if enum framesize fail
- v4l2: enforce a pixel aspect ratio of 1/1 if no data are available
- v4l2: fix error in calculating padding bottom for tile format
- v4l2src: need maintain the caps order in caps compare when fixate
- vpxenc: Include vpx error details in errors and warnings
gst-plugins-bad
- h264parse: element hangs with some video streams (regression)
- h264parse: Revert “AU boundary detection changes”
- alphadecodebin: Explicitly pass 64 bit integers as such through varargs
- atdec: Set a channel mask for channel counts greater than 2
- ccconverter: Fix caps leak and remove unnecessary code
- d3d11videosink: disconnect signals before releasing the window
- d3d11: meson: Add support for MinGW DirectXMath package and update directxmath wrap to 3.1.9
- d3d11: meson: Disable library build if DirectXMath header was not found
- dwrite: Fix crash on device update
- GstPlay: Update video_snapshot to support playbin3
- jpegparse: avi1 tag can be progressive
- jpegparse: turn some bus warnings into object ones
- qsvdecoder: Release too old frames
- ristsrc: Only free caps if needed
- va: av1enc: Correct the reference number and improve the reference setting
- va: {vp9, av1}enc: Avoid reopen encoder or renegotiate
- videoparsers: Demote CC warning message
- vkbufferpool: correct usage flags type
- vkh26xdec: a couple decoding fixes
- vtdec: Fix caps criticals during negotiation
- wpe: avoid crash with G_DEBUG=fatal_criticals and static build
- Sink missing floating references
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- aws: use fixed BehaviorVersion
- aws: improve error message logs
- fmp4: Update to dash-mpd 0.16
- fmp4mux: Require gstreamer-pbutils 1.20 for the examples
- onvifmetadataparse: Reset state in PAUSED->READY after pad deactivation, fixing occasional deadlock on shutdown
- reqwest: Update to reqwest 0.12
- webrtcsink: set perfect-timestamp=true on audio encoders
- webrtcsink: improve panic message on unexpected caps during discovery
- webrtchttp: Update to reqwest 0.12
- webrtc: fix inconsistencies in documentation of object names
- Fix clippy warnings after upgrade to Rust 1.77
gst-libav
- avviddec: Fix AVPacket leak
gst-rtsp-server
- No changes
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: frame-composition-meta: Stop using keyword operator for field in C++
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- webrtc examples: set perfect-timestamp=true on opusenc for better Chrome interoperability
Development build environment
- flac: Add subproject wrap and allow falling back to it in the flac plugin
- libnice: bump subproject wrap to v0.1.22 (needed for ICE consent freshness support in gstwebrtc)
Cerbero build tool and packaging changes in 1.24.2
- glib: Block futex_time64 usage on Android API level < 30
- libvpx: Fix build with Python 3.8
- libvpx: Fix errors with avx* instruction set detection for x86* builds and MSVC
- openjpeg: Update to 2.5.2
- directxmath: Update to 3.1.9
- gst-plugins-rs: Fix superstripping for ELF breaking all plugins
- Rust-based plugin initialization hangs on Android with GStreamer 1.24.0
Contributors to 1.24.2
Alexander Slobodeniuk, Arnaud Vrac, Chao Guo, Chris Spencer, Daniel Morin, Edward Hervey, Elizabeth Figura, Elliot Chen, eri,
François Laignel, Guillaume Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Schmidt, Jochen Henneberg, L. E. Segovia, Martin
Nordholts, Matthew Waters, Nicolas Dufresne, Philippe Normand, Philipp Zabel, Piotr Brzeziński, Robert Guziolowski, Robert
Mader, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, Taruntej Kanakamalla, Thibault Saunier, Tim Blechmann, Tim-Philipp Müller,
Víctor Manuel Jáquez Leal, Wojciech Kapsa, Xavier Claessens,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.2
- List of Merge Requests applied in 1.24.2
- List of Issues fixed in 1.24.2
Schedule for 1.26
Our next major feature release will be 1.26, and 1.25 will be the unstable development version leading up to the stable 1.26

View file

@ -1,4 +1,4 @@
This is GStreamer gst-editing-services 1.24.0.
This is GStreamer gst-editing-services 1.24.2.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!

View file

@ -129,9 +129,24 @@
#include <gst/gst.h>
GST_DEBUG_CATEGORY_STATIC (ges_asset_debug);
#undef GST_CAT_DEFAULT
#define GST_CAT_DEFAULT ges_asset_debug
#ifndef GST_DISABLE_GST_DEBUG
#define GST_CAT_DEFAULT ensure_debug_category()
static GstDebugCategory *
ensure_debug_category (void)
{
static gsize cat_gonce = 0;
if (g_once_init_enter (&cat_gonce)) {
gsize cat_done = (gsize) _gst_debug_category_new ("ges-asset",
GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GES Asset");
g_once_init_leave (&cat_gonce, cat_done);
}
return (GstDebugCategory *) cat_gonce;
}
#endif /* GST_DISABLE_GST_DEBUG */
enum
{
@ -538,9 +553,6 @@ ges_asset_class_init (GESAssetClass * klass)
klass->extract = ges_asset_extract_default;
klass->request_id_update = ges_asset_request_id_update_default;
klass->inform_proxy = NULL;
GST_DEBUG_CATEGORY_INIT (ges_asset_debug, "ges-asset",
GST_DEBUG_FG_BLUE | GST_DEBUG_BOLD, "GES Asset");
}
void

View file

@ -66,7 +66,11 @@ struct _GESFrameCompositionMeta {
gdouble height;
gdouble width;
guint zorder;
#ifdef __cplusplus
gint _operator;
#else
gint operator;
#endif
};
GES_API

View file

@ -30,6 +30,26 @@ GStreamer library for creating audio and video editors
</GitRepository>
</repository>
<release>
<Version>
<revision>1.24.2</revision>
<branch>1.24</branch>
<name></name>
<created>2024-04-09</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-editing-services/gst-editing-services-1.24.2.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.1</revision>
<branch>1.24</branch>
<name></name>
<created>2024-03-21</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-editing-services/gst-editing-services-1.24.1.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.0</revision>

View file

@ -1,5 +1,5 @@
project('gst-editing-services', 'c',
version : '1.24.0',
version : '1.24.2',
meson_version : '>= 1.1',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])

View file

@ -0,0 +1,49 @@
/* GStreamer
* Copyright (C) 2024 Tim-Philipp Müller <tim centricular net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <gst/check/check.h>
#include <ges/ges.h>
/* we mostly just want to make sure that our library headers don't
* contain anything a C++ compiler might not like */
GST_START_TEST (test_nothing)
{
gst_init (NULL, NULL);
}
GST_END_TEST;
static Suite *
gescpp_suite (void)
{
Suite *s = suite_create ("GstGESCpp");
TCase *tc_chain = tcase_create ("C++ GES headers tests");
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_nothing);
return s;
}
GST_CHECK_MAIN (gescpp);

View file

@ -25,6 +25,13 @@ ges_tests = [
['nle/tempochange']
]
# Make sure our headers are C++ clean
if add_languages('cpp', native: false, required: false)
ges_tests += [
[ 'gescpp.cc', false ],
]
endif
fsmod = import('fs')
test_defines = [
'-UG_DISABLE_ASSERT',
@ -50,7 +57,11 @@ endif
gst_plugin_scanner_path = join_paths(gst_plugin_scanner_dir, 'gst-plugin-scanner')
foreach t : ges_tests
fname = '@0@.c'.format(t.get(0))
if t.get(0).endswith('.cc')
fname = t.get(0)
else
fname = '@0@.c'.format(t.get(0))
endif
test_name = t.get(0).underscorify()
if t.length() == 2
skip_test = t.get(1)

View file

@ -1,4 +1,4 @@
project('gst-examples', 'c', version : '1.24.0', license : 'LGPL')
project('gst-examples', 'c', version : '1.24.2', license : 'LGPL')
static_build = get_option('default_library') == 'static'
cc = meson.get_compiler('c')

View file

@ -390,7 +390,7 @@ start_pipeline (WebRTC * webrtc)
"ahcsrc device-facing=front ! video/x-raw,width=[320,1280] ! queue max-size-buffers=1 ! videoconvert ! "
"vp8enc keyframe-max-dist=30 deadline=1 error-resilient=default ! rtpvp8pay picture-id-mode=15-bit mtu=1300 ! "
"queue max-size-time=300000000 ! " RTP_CAPS_VP8 " ! sendrecv.sink_0 "
"openslessrc ! queue ! audioconvert ! audioresample ! audiorate ! queue ! opusenc ! rtpopuspay ! "
"openslessrc ! queue ! audioconvert ! audioresample ! audiorate ! queue ! opusenc perfect-timestamp=true ! rtpopuspay ! "
"queue ! " RTP_CAPS_OPUS " ! sendrecv.sink_1 ", &error);
if (error) {

View file

@ -458,7 +458,7 @@ start_pipeline (void)
* inside the same pipeline. We start by connecting it to a fakesink so that
* we can preroll early. */
pipeline = gst_parse_launch ("tee name=audiotee ! queue ! fakesink "
"audiotestsrc is-live=true wave=red-noise ! queue ! opusenc ! rtpopuspay ! "
"audiotestsrc is-live=true wave=red-noise ! queue ! opusenc perfect-timestamp=true ! rtpopuspay ! "
"queue ! " RTP_CAPS_OPUS (96) " ! audiotee. ", &error);
if (error) {

View file

@ -329,7 +329,7 @@ create_receiver_entry (SoupWebsocketConnection * connection)
receiver_entry->pipeline =
gst_parse_launch ("webrtcbin name=webrtcbin stun-server=stun://"
STUN_SERVER " "
"audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! "
"audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay ! "
"queue ! " RTP_CAPS_OPUS "97 ! webrtcbin. ", &error);
if (error != NULL) {
g_error ("Could not create WebRTC pipeline: %s\n", error->message);

View file

@ -249,7 +249,7 @@ create_receiver_entry (SoupWebsocketConnection * connection)
"application/x-rtp,media=video,encoding-name=H264,payload="
RTP_PAYLOAD_TYPE " ! webrtcbin. "
"autoaudiosrc ! queue max-size-buffers=1 leaky=downstream"
" ! audioconvert ! audioresample ! opusenc ! rtpopuspay pt="
" ! audioconvert ! audioresample ! opusenc perfect-timestamp=true ! rtpopuspay pt="
RTP_AUDIO_PAYLOAD_TYPE " ! application/x-rtp, encoding-name=OPUS !"
" webrtcbin. ", &error);
if (error != NULL) {

View file

@ -30,7 +30,7 @@ public class WebrtcSendRecv {
private static final Logger logger = LoggerFactory.getLogger(WebrtcSendRecv.class);
private static final String REMOTE_SERVER_URL = "wss://webrtc.gstreamer.net:8443";
private static final String VIDEO_BIN_DESCRIPTION = "videotestsrc ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay ! queue ! capsfilter caps=application/x-rtp,media=video,encoding-name=VP8,payload=97";
private static final String AUDIO_BIN_DESCRIPTION = "audiotestsrc ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay ! queue ! capsfilter caps=application/x-rtp,media=audio,encoding-name=OPUS,payload=96";
private static final String AUDIO_BIN_DESCRIPTION = "audiotestsrc ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay ! queue ! capsfilter caps=application/x-rtp,media=audio,encoding-name=OPUS,payload=96";
private final String serverUrl;
private final String peerId;

View file

@ -19,7 +19,7 @@ namespace GstWebRTCDemo
const string PIPELINE_DESC = @"webrtcbin name=sendrecv bundle-policy=max-bundle
videotestsrc is-live=true pattern=ball ! videoconvert ! queue ! vp8enc deadline=1 ! rtpvp8pay !
queue ! application/x-rtp,media=video,encoding-name=VP8,payload=97 ! sendrecv.
audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay !
audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay !
queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload=96 ! sendrecv.";
readonly int _id;

View file

@ -490,7 +490,7 @@ start_pipeline (gboolean create_offer, guint opus_pt, guint vp8_pt)
audio_desc =
g_strdup_printf
("audiotestsrc is-live=true wave=red-noise ! audioconvert ! audioresample"
"! queue ! opusenc ! rtpopuspay name=audiopay pt=%u "
"! queue ! opusenc perfect-timestamp=true ! rtpopuspay name=audiopay pt=%u "
"! application/x-rtp, encoding-name=OPUS ! queue", opus_pt);
audio_bin = gst_parse_bin_from_description (audio_desc, TRUE, &audio_error);
g_free (audio_desc);

View file

@ -39,7 +39,7 @@ PIPELINE_DESC_VP8 = WEBRTCBIN + '''
{vsrc} ! videoconvert ! queue !
vp8enc deadline=1 keyframe-max-dist=2000 ! rtpvp8pay picture-id-mode=15-bit !
queue ! application/x-rtp,media=video,encoding-name=VP8,payload={video_pt} ! sendrecv.
{asrc} ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay !
{asrc} ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay !
queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload={audio_pt} ! sendrecv.
'''
PIPELINE_DESC_H264 = WEBRTCBIN + '''
@ -47,7 +47,7 @@ PIPELINE_DESC_H264 = WEBRTCBIN + '''
x264enc tune=zerolatency speed-preset=ultrafast key-int-max=30 intra-refresh=true !
rtph264pay aggregate-mode=zero-latency config-interval=-1 !
queue ! application/x-rtp,media=video,encoding-name=H264,payload={video_pt} ! sendrecv.
{asrc} ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay !
{asrc} ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay !
queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload={audio_pt} ! sendrecv.
'''
# Force I420 because dav1d bundled with Chrome doesn't support 10-bit choma/luma (I420_10LE)
@ -55,7 +55,7 @@ PIPELINE_DESC_AV1 = WEBRTCBIN + '''
{vsrc} ! videoconvert ! queue !
video/x-raw,format=I420 ! svtav1enc preset=13 ! av1parse ! rtpav1pay !
queue ! application/x-rtp,media=video,encoding-name=AV1,payload={video_pt} ! sendrecv.
{asrc} ! audioconvert ! audioresample ! queue ! opusenc ! rtpopuspay !
{asrc} ! audioconvert ! audioresample ! queue ! opusenc perfect-timestamp=true ! rtpopuspay !
queue ! application/x-rtp,media=audio,encoding-name=OPUS,payload={audio_pt} ! sendrecv.
'''
PIPELINE_DESC = {

View file

@ -1 +1 @@
project('gst-integration-testsuites', [], version: '1.24.0', meson_version : '>= 1.1', license: 'LGPL')
project('gst-integration-testsuites', [], version: '1.24.2', meson_version : '>= 1.1', license: 'LGPL')

View file

@ -2,18 +2,20 @@ GStreamer 1.24 Release Notes
GStreamer 1.24.0 was originally released on 4 March 2024.
The latest bug-fix release in the stable 1.24 series is 1.24.2 and was released on 9 April 2024.
See https://gstreamer.freedesktop.org/releases/1.24/ for the latest version of this document.
Last updated: Monday 4 March 2024, 23:00 UTC (log)
Last updated: Tuesday 9 April 2024, 12:30 UTC (log)
Introduction
## Introduction
The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite
cross-platform multimedia framework!
As always, this release is again packed with many new features, bug fixes and other improvements.
Highlights
## Highlights
- New Discourse forum and Matrix chat space
- New Analytics and Machine Learning abstractions and elements
@ -48,11 +50,12 @@ Highlights
- AVX/AVX2 support and NEON support on macOS on Apple ARM64 CPUs via new liborc
- GStreamer C# bindings have been updated
- Rust bindings improvements and many new and improved Rust plugins
- Rust plugins now shipped in packages for all major platforms including Android and iOS
- Lots of new plugins, features, performance improvements and bug fixes
Major new features and changes
## Major new features and changes
Discourse forum and Matrix chat space
### Discourse forum and Matrix chat space
- The new Discourse forum and Matrix chat space are now our preferred communication channels for support and developer chat.
@ -61,7 +64,7 @@ Discourse forum and Matrix chat space
- For release announcements please subscribe to the News + Announcements category on Discourse, although we will continue to
also send announcements to the mailing list for the time being.
Playbin3, decodebin3 now stable and default
### Playbin3, decodebin3 now stable and default
- After a year of stability, testing and more improvements, playbin3, and its various components (uridecodebin3, decodebin3
and urisourcebin), are now the recommended playback components.
@ -84,7 +87,7 @@ Improvements in this cycle:
partly due to a historical confusion between subtitle “decoders” (which decode the format to text and “parsers” (which only
do timing detection and optional seeking).
GstMeta serialization/deserialization and other GstMeta improvements
### GstMeta serialization/deserialization and other GstMeta improvements
- GstMeta serialization/deserialization allows metas to be transmitted or stored. This is used by the unixfd and cudaipc
plugins for inter-process communication (IPC). Implemented so far for GstCustomMeta, GstVideoMeta, GstAudioMeta and
@ -98,7 +101,7 @@ GstMeta serialization/deserialization and other GstMeta improvements
- Add gst_meta_info_new() and gst_meta_info_register() to register a GstMeta in two steps for easier extensibility.
New unixfd plugin for efficient 1:N inter-process communication on Linux
### New unixfd plugin for efficient 1:N inter-process communication on Linux
- unixfdsink and unixfdsrc are elements that, inspired by shmsink andn shmsrc, send UNIX file descriptors (e.g. memfd, dmabuf)
from one sink to multiple source elements in other processes on Linux.
@ -106,7 +109,7 @@ New unixfd plugin for efficient 1:N inter-process communication on Linux
- The unixfdsink proposes a memfd/shm allocator to upstream elements which allows for example videotestsrc to write directly
into memory that can be transfered to other processes without copying.
New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
### New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Previously only various specific GstMeta for ancillary data were provided, such as GstVideoCaptionMeta and GstVideoAFDMeta.
The new GstAncillaryMeta allows passing arbitrary ancillary data between elements, including custom and non-standard
@ -117,7 +120,7 @@ New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Supported by the newly added AJA sink and source elements
DSD audio support
### DSD audio support
- DSD audio is a non-PCM raw audio format representation and the GstAudio library gained support for this in form of new
GstDsdInfo and GstDsdFormat API.
@ -125,7 +128,7 @@ DSD audio support
- Support for DSD audio has been implemented in alsasink as well as the GstAudioSink and GstAudioRingBuffer base classes, and
the gst-libav plugin to enable FFmpeg-based DSD elements and functionality.
Analytics and Machine Learning
### Analytics and Machine Learning
- A new library, GstAnalytics, has been added. It defines a GstAnalyticsRelationMeta that can efficiently hold a large number
of observations from a data analysis process, for example from machine learning. It also contains a matrix of the
@ -146,7 +149,7 @@ Analytics and Machine Learning
- In the next release, tensor decoders such as ssdobjectdetector will live outside of the ONNX plugin so they can be used with
other machine learning acceleration frameworks.
Qt5 + Qt6 QML integration improvements
### Qt5 + Qt6 QML integration improvements
- The Qt5 qmlglsink, qmlgloverlay, qmlglmixer received support for directly consuming BGRA and YV12 video frames without a
prior glcolorconvert.
@ -156,7 +159,7 @@ Qt5 + Qt6 QML integration improvements
- qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink.
DRM Modifier Support for dmabufs on Linux
### DRM Modifier Support for dmabufs on Linux
The Linux dmabuf subsystem provides buffer sharing across different hardware device drivers and subsystems, and is used
extensively by the DRM subsystem to exchange buffers between processes, contexts, and library APIs within the same process, and
@ -189,7 +192,7 @@ New API has been added for easy handling of these new caps:
- GST_VIDEO_FORMAT_DMA_DRM
OpenGL integration enhancements
### OpenGL integration enhancements
- When using EGL, if both OpenGL ES and OpenGL are available, OpenGL ES is preferred over OpenGL. OpenGL ES supports some
necessary features required for dmabuf support. This does not apply if an external library/application chooses an OpenGL API
@ -233,7 +236,7 @@ OpenGL integration enhancements
- GstGLBufferPool now has a configuration option for allowing a number of buffers to be always outstanding allowing for
reducing the potential synchronisation delay when reusing OpenGL memory backed buffers.
Vulkan integration enhancements
### Vulkan integration enhancements
- Add support for the Vulkan H.264 and H.265 decoders.
@ -246,7 +249,7 @@ Vulkan integration enhancements
- Vulkan/Wayland: add support for xdg_wm_base protocol for creating a visible debug window. Required as the previous wl_shell
interface is being removed from compositors.
CUDA / NVCODEC integration and feature additions
### CUDA / NVCODEC integration and feature additions
- New cudaipcsrc and cudaipcsink elements for zero-copy CUDA memory sharing between processes
@ -265,7 +268,7 @@ CUDA / NVCODEC integration and feature additions
flag, cuStreamSynchronize() or gst_cuda_memory_sync() call is required unless application-side CUDA operation is executed
with the GstCudaMemorys associated CUDA stream.
RTP stack improvements
### RTP stack improvements
- New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element.
This is useful for relaying an RTP stream as-is through gst-rtsp-server, which expects an RTP payloader with certain
@ -310,7 +313,7 @@ RTP stack improvements
rtpsbcdepay, rtpvorbisdepay, rtpmp4vdepay, rtptheoradepay, rtpsv3vdepay, rtpmp4adepay, rtpklvdepay, rtpjpegdepay,
rtpj2kdepay, rtph263pdepay, rtph263depay, rtph261depay. rtpgstdepay.
WebRTC improvements
### WebRTC improvements
- Add support for ICE consent freshness (RFC 7675). This requires libnice >= 0.1.22.
@ -321,7 +324,7 @@ WebRTC improvements
- Various improvements and feature additions in the Rust webrtc plugin, which provides webrtcsrc and webrtcsink elements as
well as specific elements for different WebRTC signalling protocols. See the Rust plugins section below for more details.
Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
### Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- hlsdemux2 now supports Low-Latency HLS (LL-HLS)
@ -345,7 +348,7 @@ Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- No development took place on the legacy demuxers (dashdemux, hlsdemux, mssdemux). Application developers are reminded to use
the new demuxers instead. They are automatically picked up when using urisourcebin, uridecodebin3 or playbin3.
W3C Media Source Extensions library
### W3C Media Source Extensions library
- A new GStreamer library (mse) implementing the W3C Media Source Extensions specification was added.
@ -353,7 +356,7 @@ W3C Media Source Extensions library
without relying on a web browser engine. Typically an application consuming this library will wrap the C API with JavaScript
bindings that match the Media Source API so their existing code can integrate with this library.
Closed Caption handling improvements
### Closed Caption handling improvements
- ccconverter supports converting between the two CEA-608 fields.
@ -362,7 +365,7 @@ Closed Caption handling improvements
- Various improvements and feature additions in the Rust-based closed caption elements. Check out the Rust plugins section
below for more details.
Precision Time Protocol (PTP) clock improvements
### Precision Time Protocol (PTP) clock improvements
- Many fixes and compatibility/interoperability improvements.
@ -376,14 +379,14 @@ Precision Time Protocol (PTP) clock improvements
Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD, Solaris and Illumos. Newly supported compared to the C version is
Windows. Compared to the C version various error paths are handled more correctly and a couple of memory leaks are fixed.
Otherwise it should work identically. The minimum required Rust version for compiling this is 1.48, i.e. the version
currently in Debian stable. On Windows, Rust 1.54 is needed at least.
currently in Debian oldstable. On Windows, Rust 1.54 is needed at least.
- New ptp-helper Meson build option so PTP support can be disabled or required.
- gst_ptp_init_full() allows for a more fine-grained and extensible configuration and initialization of the GStreamer PTP
subsystem, including TTL configuration.
Bayer 10/12/14/16-bit depth support
### Bayer 10/12/14/16-bit depth support
- bayer2rgb and rgb2bayer now support bayer with 10/12/14/16 bit depths
@ -391,7 +394,7 @@ Bayer 10/12/14/16-bit depth support
- imagefreeze gained bayer support as well
MPEG-TS improvements
### MPEG-TS improvements
- mpegtsdemux gained support for
- segment seeking for seamless non-flushing looping, and
@ -403,7 +406,7 @@ MPEG-TS improvements
- allows writing arbitrary Opus channel mapping families and up to 255 channels
- separate handling of DVB and ATSC AC3 descriptors
New elements and plugins
## New elements and plugins
- analyticsoverlay visualises object-detection metas on a video stream.
@ -436,7 +439,7 @@ New elements and plugins
- New uvcsink element for exporting streams as UVC camera
New element features and additions
## New element features and additions
- alphacombine supports I420_10LE now for 10-bit WebM/alpha support.
@ -594,11 +597,11 @@ New element features and additions
- y4mdec now parses extended headers to support high bit depth video.
Plugin and library moves
## Plugin and library moves
- The AMR-NB and AMR-WB plugins have been moved from -bad to -good.
- The AMR-NB and AMR-WB plugins have been moved from -ugly to -good.
Plugin and element removals
## Plugin and element removals
- The entire gst-omx package and plugin has been retired. See the OMX section below for more details.
@ -606,7 +609,7 @@ Plugin and element removals
- The kate subtitle plugin has been removed.
Miscellaneous API additions
## Miscellaneous API additions
GStreamer Core
@ -700,7 +703,7 @@ New Video Formats
- Tiled 10-bit NV12 format NV12_10LE40_4L4 (Verisilicon Hantro)
Miscellaneous performance, latency and memory optimisations
## Miscellaneous performance, latency and memory optimisations
- liborc 0.4.35 (latest: 0.4.38) adds support for AVX/AVX2 and contains improvements for the SSE backend.
@ -712,7 +715,7 @@ Miscellaneous performance, latency and memory optimisations
- As always there have been plenty of performance, latency and memory optimisations all over the place.
Tracing framework and debugging improvements
## Tracing framework and debugging improvements
- The gst-stats tool can now be passed a custom regular expression
@ -734,7 +737,7 @@ Fake video decoder
- It draws a snake moving from left to right in the middle of the frame, which is reasonably light weight and still provides
an idea about how smooth the rendering is.
Tools
## Tools
- gst-launch-1.0 gained a new --prog-name command line option to set the program name, which will be used by GTK and GStreamer
to set the class or app-id.
@ -742,7 +745,7 @@ Tools
- gst-play-1.0 now defaults to using playbin3, but can still be made to use the old playbin by passing the --use-playbin2
command line argument.
GStreamer FFmpeg wrapper
## GStreamer FFmpeg wrapper
- New avvideocompare element to compare two incoming video buffers using a specified comparison method (e.g. SSIM or PSNR).
@ -759,7 +762,7 @@ GStreamer FFmpeg wrapper
- Note: see Known Issues section below for known issues with FFmpeg 6.0
GStreamer RTSP server
## GStreamer RTSP server
- New “ensure-keyunit-on-start” property: While the suspend modes NONE and PAUSED provided a low startup latency for
connecting clients, it did not ensure that streams started on fresh data. With this new property it is possible to maintain
@ -769,7 +772,7 @@ GStreamer RTSP server
- rtspclientsink: apply “port-range” property for RTCP port selection as well
GStreamer VA-API support
## GStreamer VA-API support
GstVA
@ -802,7 +805,7 @@ GStreamer-VAAPI
equivalent. Users who rely on gstreamer-vaapi are encouraged to migrate and test the va elements at the earliest
opportunity.
GStreamer Video4Linux2 support
## GStreamer Video4Linux2 support
- New uvcsink element, based on v4l2sink allow streaming your pipeline as a UVC camera using Linux UVC Gadget driver.
@ -814,7 +817,7 @@ GStreamer Video4Linux2 support
- Stateless decoders now tested using Virtual driver (visl), making it possible to run the tests in the cloud based CI
GStreamer OMX
## GStreamer OMX
- The gst-omx module has been removed. The OpenMAX standard is long dead and even the Raspberry Pi OS no longer supports it.
There has not been any development since 1.22 was released. Users of these elements should switch to the Video4Linux-based
@ -823,7 +826,7 @@ GStreamer OMX
- Hardware vendors which still use OpenMAX are known to have non-standard forks and it is recommended that they maintain it
while planning their move to the Video4Linux API.
GStreamer Editing Services and NLE
## GStreamer Editing Services and NLE
- Implement a gesvideoscale effect which gives user the ability to chooses where a clip has to be scaled in the chain of
effects. By default scaling is done in the compositor.
@ -861,7 +864,7 @@ ges-launch
- Move +effect stack effects from source to last effect added, so it feels more natural to user as adding them at the
beginning of the chain while the syntax is +effect felt wrong
GStreamer validate
## GStreamer validate
- In action types, add a way to avoid checking property value after setting it, in case elements do it async for example.
@ -888,7 +891,7 @@ GStreamer validate
- Fixed compatibility with Python 3.12.
GStreamer Python Bindings
## GStreamer Python Bindings
gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject,
and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more
@ -905,7 +908,7 @@ e.g. GStreamers fundamental GLib types such as Gst.Fraction, Gst.IntRange etc
- Fix libpython dlopen on macOS
GStreamer C# Bindings
## GStreamer C# Bindings
- The GStreamer C# bindings have been updated to a more recent version of GtkSharp and the bindings have been regenerated with
that version.
@ -914,7 +917,7 @@ GStreamer C# Bindings
- GstRtspServer bindings have been added, plus an RTSP server example
GStreamer Rust Bindings and Rust Plugins
## GStreamer Rust Bindings and Rust Plugins
The GStreamer Rust bindings and plugins are released separately with a different release cadence thats tied to the twice-a-year
GNOME release cycle.
@ -928,7 +931,7 @@ backported as needed to the 0.12 brach for future 1.24.x bugfix releases.
Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++.
WebRTC
### WebRTC
- New element webrtcsrc that can act as a recvonly WebRTC client. Just like the opposite direction, webrtcsink, this can
support various different WebRTC signalling protocols. Some are included with the plugin and provide their own element
@ -969,7 +972,7 @@ WebRTC
… and various other smaller improvements!
RTSP
### RTSP
- New rtspsrc2 element. Only a subset of RTSP features are implemented so far:
- RTSP 1.0 support
@ -980,7 +983,7 @@ RTSP
- The existing rtspsrc has a hard-coded order list for lower transports
- Many advanced features are not implemented yet, such as non-live support. See the README for the current status.
GTK4
### GTK4
- Support for rendering GL textures on X11/EGL, X11/GLX, Wayland, macOS, and WGL/EGL on Windows.
@ -996,7 +999,7 @@ GTK4
- Various bugfixes, including support for the new GTK 4.14 GL renderer. The plugin needs to be built with at least the
gtk_v4_10 feature to work with the new GTK 4.14 GL renderer, and will work best if built with the gtk_v4_14 feature.
Closed Caption
### Closed Caption
- Add cea608tocea708 element for upconverting CEA-608 captions to their CEA-708 representation.
@ -1007,7 +1010,7 @@ Closed Caption
- awstranscriber is using the new HTTP/2-based API now instead of the WebSocket-based one.
Other new elements
### Other new elements
- New awss3putobjectsink that works similar to awss3sink but with a different upload strategy.
@ -1021,7 +1024,7 @@ Other new elements
- New isomp4mux non-fragmented MP4 muxer element.
Other improvements
### Other improvements
- audiornnoise
- Attach audio level meta to output buffers.
@ -1041,12 +1044,12 @@ Other improvements
For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.9 (shipped with GStreamer
1.22) and 0.12 (shipped with GStreamer 1.24).
Cerbero Rust support
## Cerbero Rust support
- As of GStreamer 1.24, the GStreamer Rust plugins are shipped as part of our binary packages on all major platforms. This
includes Android and iOS now in addition to macOS and Windows/MSVC.
Build and Dependencies
## Build and Dependencies
- Meson >= 1.1 is now required for all modules
@ -1067,9 +1070,9 @@ Build and Dependencies
- zxing: added support for the zxing-c++ 2.0 API
- The ptp-helper for Precision Time Protocol (PTP) support in GStreamer core has been rewritten in Rust, and the minimum
required Rust version for building this is 1.48, i.e. the version currently in Debian stable. On Windows, at least Rust 1.54
is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP support is
available (if set to ptp-helper=enabled). cargo is not required for building.
required Rust version for building this is 1.48, i.e. the version currently in Debian oldstable. On Windows, at least Rust
1.54 is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP
support is available (if set to ptp-helper=enabled). cargo is not required for building.
- gst-plugins-rs requires Rust 1.70 or newer.
@ -1104,7 +1107,7 @@ Development environment
- gst-env.py: Output a setting for the prompt with --only-environment
Cerbero
### Cerbero
Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily
available, such as Windows, Android, iOS, and macOS.
@ -1181,16 +1184,16 @@ Android
- tremor and ivorbisdec plugins are no longer shipped on Android
- openh264 plugin no longer enables ASM optimizations on Android x86 due to relocation errors
Platform-specific changes and improvements
## Platform-specific changes and improvements
Android
### Android
- Add NDK implementation of Android MediaCodec. This reduces the amount of Java <-> native calls, which should reduce
overhead.
- Add support for AV1 to the androidmedia video encoder and decoder.
Apple macOS and iOS
### Apple macOS and iOS
- osxaudio: audio clock improvements (interpolate based on system time)
@ -1199,7 +1202,7 @@ Apple macOS and iOS
them. Without that, windows would disappear if you clicked outside them and there would be no way to bring them to front
again. This change also allows osxvideosink to receive navigation events correctly.
Windows
### Windows
- New DirectWrite text rendering plugin with dwriteclockoverlay, dwritetimeoverlay, dwritetextoverlay, dwritesubtitlemux, and
dwritesubtitleoverlay elements, including closed caption overlay support in dwritetextoverlay.
@ -1243,12 +1246,12 @@ Windows
- All d3d12 elements are zero ranked for now. Users will need to adjust rank of each d3d12 element via GST_PLUGIN_RANK
environment or appropriate plugin feature APIs if they want these elements autoplugged.
Documentation improvements
## Documentation improvements
- hotdoc has been updated to the latest version, and the theme has also been updated, which should fix various usability
issues.
Possibly Breaking Changes
## Possibly Breaking Changes
- gst_plugin_feature_check_version() has been updated to fix unexpected version check behaviour for git versions. It would
return TRUE if the plugin version is for a git development version (e.g. 1.24.0.1) and the check is for the “next” micro
@ -1268,12 +1271,12 @@ Possibly Breaking Changes
- The NVIDIA desktop GPU decoders nvh264sldec, nvh265sldec, nvvp8sldec and nvvp9sldec were renamed to nvh264dec, nvh265dec,
nvvp8dec and nvvp9dec, respectively.
Known Issues
## Known Issues
- There are known issues with FFmpeg version 6.0.0 due to opaque passing being broken in that version. This affects at least
avdec_h264, but may affect other decoders as well. Versions before 6.0.0, and 6.0.1 or higher are not affected.
Statistics
## Statistics
- 4643 commits
@ -1293,7 +1296,7 @@ Statistics
- 259791 lines added (net)
Contributors
## Contributors
Aaron Boxer, Aaron Huang, Acky Xu, adixonn, Adrian Fiergolski, Adrien De Coninck, Akihiro Sagawa, Albert Sjölund, Alessandro
Bono, Alexande B, Alexander Slobodeniuk, Alicia Boya García, amindfv, Amir Naghdinezhad, anaghdin, Anders Hellerup Madsen,
@ -1341,6 +1344,334 @@ bug-fix releases will be made from the git 1.24 branch, which will be a stable b
GStreamer 1.24.0 was released on 4 March 2024.
1.24.1
The first 1.24 bug-fix release (1.24.1) was released on 21 March 2024.
This release only contains bugfixes and it should be safe to update from 1.24.0.
Highlighted bugfixes in 1.24.1
- Fix instant-EOS regression in audio sinks in some cases when volume is 0
- rtspsrc: server compatibility improvements and ONVIF trick mode fixes
- rtsp-server: fix issues if RTSP media was set to be both shared and reusable
- (uri)decodebin3 and playbin3 fixes
- adaptivdemux2/hlsdemux2: Fix issues with failure updating playlists
- mpeg123 audio decoder fixes
- v4l2codecs: DMA_DRM caps support for decoders
- va: various AV1 / H.264 / H.265 video encoder fixes
- vtdec: fix potential deadlock regression with ProRes playback
- gst-libav: fixes for video decoder frame handling, interlaced mode detection
- avenc_aac: support for 7.1 and 16 channel modes
- glimagesink: Fix the sink not always respecting preferred size on macOS
- gtk4paintablesink: Fix scaling of texture position
- webrtc: Allow resolution and framerate changes, and many other improvements
- webrtc: Add new LiveKit source element
- Fix usability of binary packages on arm64 iOS
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- registry, ptp: Canonicalize the library path returned by dladdr
- segment: Dont use g_return_val_if_fail() in gst_segment_to_running_time_full()
- uri: Sort uri protocol sources/sinks by feature name to break a feature rank tie
- ptp: Initialize expected DELAY_REQ seqnum to an invalid value
- ptp: Dont install test executable
- gst-inspect: fix exists for plugins with versions other than GStreamers version, like the Rust plugins
- identity: Dont refuse seeks unless single-segment=true
gst-plugins-base
- audiobasesink: Dont wait on gap events
- audioencoder: Avoid using temporarily mapped memory as base for input buffers
- decodebin3: Be more specific when sending missing plugin messages
- decodebin3: Fix re-usability issues
- decodebin3: Provide clear error message if no decoders present
- playbin3: Remove un-needed URI NULL check
- uridecodebin3: Dont hold lock when posting messages or signals
- uridecodebin3: Handle potential double redirection errors
- glimagesink: Fix the sink not always respecting preferred size on macOS
- glupload: Do not propose allocators with sysmem, fixes warning when playing VP9 with alpha
- shmallocator: fix build on Illumos
- meson: Fix the condition to skip theoradec test
gst-plugins-good
- adaptivdemux/hlsdemux2: Fix issues with failure updating playlists
- mpg123audiodec: Correctly handle the case of clipping all decoded samples
- mpg123audiodec: gst_audio_decoder_allocate_output_buffer: assertion size > 0 failed
- qt: Fix description in meson build options
- qtdemux: Do not set channel-mask to zero
- rtspsrc: remove deprecated flag from the push-backchannel-sample signal
- rtspsrc: Consider 503 Service Not Available when handling broken control urls
- rtspsrc, rtponviftimestamp: ONVIF mode fixes
- rtspsrc: Dont invoke close when stopping if weve started cleanup, fixing potential crash on shutdown
- rtpgstpay: Delay pushing of event packets until the next buffer
gst-plugins-bad
- asio: Fix {input,output}-channels property handling
- cuda,d3d11,d3d12bufferpool: Disable preallocation
- d3d11device: Fix adapter LUID comparison in wrapped device mode
- d3d12device: Fix IDXGIFactory2 leak
- d3d12: Fix SDK debug layer activation
- dvbsubenc: Fix bottom field size calculation
- dvdspu: avoid null dereference
- GstPlay: Fix a critical warning in error callback
- v4l2codecs: decoders: Add DMA_DRM caps support
- vaav1enc: Init the output_frame_num when resetting gf group
- vah264enc, vah265enc, vaav1enc: fix potential crash on devices without rate control
- vah265enc: checking surface alignment
- videoparsers: Dont verbosely warn about CEA_708_PROCESS_EM_DATA_FLAG not being set
- vtdec: Fix a deadlock during ProRes playback, handle non-linked gracefully
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- gtk4paintablesink: Fix scaling of texture position
- janusvrwebrtcsink: Handle 64 bit numerical room ids
- janusvrwebrtcsink: Dont include deprecated audio/video fields in publish messages
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
- livekitwebrtc: Fix shutdown behaviour
- rtpgccbwe: Dont forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
- sccparse: Ignore invalid timecodes during seeking
- webrtcsink: Dont try parsing audio caps as video caps
- webrtc: Allow resolution and framerate changes
- webrtcsrc: Make producer-peer-id optional
- livekitwebrtcsrc: Add new LiveKit source element
- regex: Add support for configuring regex behaviour
- spotifyaudiosrc: Document how to use with non-Facebook accounts
- webrtcsrc: Add do-retransmission property
gst-libav
- avcodecmap: Increase max AAC channels to 16
- avviddec: Fix how we get back the codec frame
- avviddec: Fix interlaced mode detection
- avviddec: Double check if AV_CODEC_FLAG_COPY_OPAQUE port is safe for our scenario
gst-rtsp-server
- media: gst_rtsp_media_set_reusable() and gst_rtsp_media_set_shared() have become incompatible
- rtsp-stream: clear sockets when leaving bin
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: Fix critical warning
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- No changes
Development build environment
- No changes
Cerbero build tool and packaging changes in 1.24.1
- gstreamer: Enable ptp helper explicitly
- gst-plugins-bad: Package new insertbin plugin
- gst-plugins-rs: Adjust parallel architecture build blocks
- libnice: update to 0.1.22
- pixman: Bump to 0.43.4
- orc: disable JIT code generation on arm64 on iOS again, fixing crashes
Contributors to 1.24.1
Alexander Slobodeniuk, Antonio Larrosa, Edward Hervey, Elizabeth Figura, François Laignel, Guillaume Desmottes, He Junyan, Jan
Schmidt, Jordan Yelloz, L. E. Segovia, Mark Nauwelaerts, Mathieu Duponchelle, Michael Tretter, Mikhail Rudenko, Nicolas
Dufresne, Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Robert Mader, Ruijing Dong, Sebastian Dröge, Seungha Yang,
Thomas Goodwin, Thomas Klausner, Tim-Philipp Müller, Xi Ruoyao,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.1
- List of Merge Requests applied in 1.24.1
- List of Issues fixed in 1.24.1
1.24.2
The second 1.24 bug-fix release (1.24.2) was released on 9 April 2024.
This release only contains bugfixes and it should be safe to update from 1.24.x.
Highlighted bugfixes in 1.24.2
- H.264 parsing regression fixes
- WavPack typefinding improvements
- Video4linux fixes and improvements
- Android build and runtime fixes
- macOS OpenGL memory leak and robustness fixes
- Qt/QML video sink fixes
- Package new analytics and mse libraries in binary packages
- Windows MSVC binary packages: fix libvpx avx/avx2/avx512 instruction set detection
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- clock: Block futex_time64 usage on Android API level < 30
- basesrc: Clear submitted buffer lists consistently with buffers
- ptpclock: fix double free of domain data during deinit
- clocksync: Proxy allocation queries
- inputselector: fix possible clock leak on shutdown
- typefind: Handle WavPack block sizes > 131072
gst-plugins-base
- glcolorconvert: Ensure glcolorconvert does not miss supported RGB formats
- gl/macos: a couple of race/reference count fixes
- pbutils: descriptions: Dont warn on MPEG-1 audio caps without layer field
- encodebin: Add the parser before timestamper to tosync list
- videorate: Reset last_ts when a new segment is received
gst-plugins-good
- qml6glsink: fix destruction of underlying texture
- qt/qt6: Fixup for dummy textures
- rtpjitterbuffer: Dont use estimated_dts to do default skew adjustment
- rtpjitterbuffer: Use an extended RTP timestamp for the clock-base
- rtpmp4adepay: Set duration on outgoing buffers
- tests: rtpred: fix out-of-bound writes
- v4l2: allocator: Fix unref log/trace on memory release
- v4l2: Also set max_width/max_width if enum framesize fail
- v4l2: enforce a pixel aspect ratio of 1/1 if no data are available
- v4l2: fix error in calculating padding bottom for tile format
- v4l2src: need maintain the caps order in caps compare when fixate
- vpxenc: Include vpx error details in errors and warnings
gst-plugins-bad
- h264parse: element hangs with some video streams (regression)
- h264parse: Revert “AU boundary detection changes”
- alphadecodebin: Explicitly pass 64 bit integers as such through varargs
- atdec: Set a channel mask for channel counts greater than 2
- ccconverter: Fix caps leak and remove unnecessary code
- d3d11videosink: disconnect signals before releasing the window
- d3d11: meson: Add support for MinGW DirectXMath package and update directxmath wrap to 3.1.9
- d3d11: meson: Disable library build if DirectXMath header was not found
- dwrite: Fix crash on device update
- GstPlay: Update video_snapshot to support playbin3
- jpegparse: avi1 tag can be progressive
- jpegparse: turn some bus warnings into object ones
- qsvdecoder: Release too old frames
- ristsrc: Only free caps if needed
- va: av1enc: Correct the reference number and improve the reference setting
- va: {vp9, av1}enc: Avoid reopen encoder or renegotiate
- videoparsers: Demote CC warning message
- vkbufferpool: correct usage flags type
- vkh26xdec: a couple decoding fixes
- vtdec: Fix caps criticals during negotiation
- wpe: avoid crash with G_DEBUG=fatal_criticals and static build
- Sink missing floating references
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- aws: use fixed BehaviorVersion
- aws: improve error message logs
- fmp4: Update to dash-mpd 0.16
- fmp4mux: Require gstreamer-pbutils 1.20 for the examples
- onvifmetadataparse: Reset state in PAUSED->READY after pad deactivation, fixing occasional deadlock on shutdown
- reqwest: Update to reqwest 0.12
- webrtcsink: set perfect-timestamp=true on audio encoders
- webrtcsink: improve panic message on unexpected caps during discovery
- webrtchttp: Update to reqwest 0.12
- webrtc: fix inconsistencies in documentation of object names
- Fix clippy warnings after upgrade to Rust 1.77
gst-libav
- avviddec: Fix AVPacket leak
gst-rtsp-server
- No changes
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: frame-composition-meta: Stop using keyword operator for field in C++
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- webrtc examples: set perfect-timestamp=true on opusenc for better Chrome interoperability
Development build environment
- flac: Add subproject wrap and allow falling back to it in the flac plugin
- libnice: bump subproject wrap to v0.1.22 (needed for ICE consent freshness support in gstwebrtc)
Cerbero build tool and packaging changes in 1.24.2
- glib: Block futex_time64 usage on Android API level < 30
- libvpx: Fix build with Python 3.8
- libvpx: Fix errors with avx* instruction set detection for x86* builds and MSVC
- openjpeg: Update to 2.5.2
- directxmath: Update to 3.1.9
- gst-plugins-rs: Fix superstripping for ELF breaking all plugins
- Rust-based plugin initialization hangs on Android with GStreamer 1.24.0
Contributors to 1.24.2
Alexander Slobodeniuk, Arnaud Vrac, Chao Guo, Chris Spencer, Daniel Morin, Edward Hervey, Elizabeth Figura, Elliot Chen, eri,
François Laignel, Guillaume Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Schmidt, Jochen Henneberg, L. E. Segovia, Martin
Nordholts, Matthew Waters, Nicolas Dufresne, Philippe Normand, Philipp Zabel, Piotr Brzeziński, Robert Guziolowski, Robert
Mader, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, Taruntej Kanakamalla, Thibault Saunier, Tim Blechmann, Tim-Philipp Müller,
Víctor Manuel Jáquez Leal, Wojciech Kapsa, Xavier Claessens,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.2
- List of Merge Requests applied in 1.24.2
- List of Issues fixed in 1.24.2
Schedule for 1.26
Our next major feature release will be 1.26, and 1.25 will be the unstable development version leading up to the stable 1.26

View file

@ -1,4 +1,4 @@
This is GStreamer gst-libav 1.24.0.
This is GStreamer gst-libav 1.24.2.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!

View file

@ -30510,12 +30510,12 @@
"long-name": "libav AAC (Advanced Audio Coding) encoder",
"pad-templates": {
"sink": {
"caps": "audio/x-raw:\n channels: [ 1, 6 ]\n rate: { (int)96000, (int)88200, (int)64000, (int)48000, (int)44100, (int)32000, (int)24000, (int)22050, (int)16000, (int)12000, (int)11025, (int)8000, (int)7350 }\n format: F32LE\n layout: interleaved\n",
"caps": "audio/x-raw:\n channels: [ 1, 16 ]\n rate: { (int)96000, (int)88200, (int)64000, (int)48000, (int)44100, (int)32000, (int)24000, (int)22050, (int)16000, (int)12000, (int)11025, (int)8000, (int)7350 }\n format: F32LE\n layout: interleaved\n",
"direction": "sink",
"presence": "always"
},
"src": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "src",
"presence": "always"
}
@ -135463,7 +135463,7 @@
"long-name": "libav 3GP2 (3GPP2 file format) muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/AMR:\n channels: 1\n rate: { (int)8000 }\naudio/AMR-WB:\n channels: 1\n rate: { (int)16000 }\naudio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/AMR:\n channels: 1\n rate: { (int)8000 }\naudio/AMR-WB:\n channels: 1\n rate: { (int)16000 }\naudio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -135527,7 +135527,7 @@
"long-name": "libav 3GP (3GPP file format) muxer (not recommended, use gppmux instead)",
"pad-templates": {
"audio_%%u": {
"caps": "audio/AMR:\n channels: 1\n rate: { (int)8000 }\naudio/AMR-WB:\n channels: 1\n rate: { (int)16000 }\naudio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/AMR:\n channels: 1\n rate: { (int)8000 }\naudio/AMR-WB:\n channels: 1\n rate: { (int)16000 }\naudio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -135645,7 +135645,7 @@
"long-name": "libav ADTS AAC (Advanced Audio Coding) muxer (not recommended, use aacparse instead)",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -136766,7 +136766,7 @@
"long-name": "libav DASH Muxer muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -137012,7 +137012,7 @@
"long-name": "libav F4V Adobe Flash Video muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -137440,7 +137440,7 @@
"long-name": "libav HDS Muxer muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -137504,7 +137504,7 @@
"long-name": "libav Apple HTTP Live Streaming muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -137681,7 +137681,7 @@
"long-name": "libav iPod H.264 MP4 (MPEG-4 Part 14) muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -137804,7 +137804,7 @@
"long-name": "libav ISMV/ISMA (Smooth Streaming) muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -137981,7 +137981,7 @@
"long-name": "libav LOAS/LATM muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -138281,7 +138281,7 @@
"long-name": "libav QuickTime / MOV muxer (not recommended, use qtmux instead)",
"pad-templates": {
"audio_%%u": {
"caps": "audio/x-mulaw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\naudio/x-alaw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\naudio/x-adpcm:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n layout: quicktime\naudio/x-mace:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n maceversion: 3\naudio/x-mace:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n maceversion: 6\naudio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\naudio/AMR:\n channels: 1\n rate: { (int)8000 }\naudio/AMR-WB:\n channels: 1\n rate: { (int)16000 }\naudio/x-raw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n format: S16BE\n layout: interleaved\naudio/x-raw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n format: S16LE\n layout: interleaved\naudio/mpeg:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n mpegversion: 1\n layer: 3\n",
"caps": "audio/x-mulaw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\naudio/x-alaw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\naudio/x-adpcm:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n layout: quicktime\naudio/x-mace:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n maceversion: 3\naudio/x-mace:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n maceversion: 6\naudio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\naudio/AMR:\n channels: 1\n rate: { (int)8000 }\naudio/AMR-WB:\n channels: 1\n rate: { (int)16000 }\naudio/x-raw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n format: S16BE\n layout: interleaved\naudio/x-raw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n format: S16LE\n layout: interleaved\naudio/mpeg:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n mpegversion: 1\n layer: 3\n",
"direction": "sink",
"presence": "request"
},
@ -138468,7 +138468,7 @@
"long-name": "libav MP4 (MPEG-4 Part 14) muxer (not recommended, use mp4mux instead)",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\naudio/mpeg:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n mpegversion: 1\n layer: 3\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\naudio/mpeg:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n mpegversion: 1\n layer: 3\n",
"direction": "sink",
"presence": "request"
},
@ -138596,7 +138596,7 @@
"long-name": "libav MPEG-TS (MPEG-2 Transport Stream) muxer (not recommended, use mpegtsmux instead)",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 2 ]\n rate: { (int)48000, (int)44100, (int)32000, (int)24000, (int)22050, (int)16000 }\n mpegversion: 1\n layer: 2\naudio/mpeg:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n mpegversion: 1\n layer: 3\naudio/x-ac3:\n channels: [ 1, 6 ]\n rate: { (int)48000, (int)44100, (int)32000 }\naudio/x-dts:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\naudio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 2 ]\n rate: { (int)48000, (int)44100, (int)32000, (int)24000, (int)22050, (int)16000 }\n mpegversion: 1\n layer: 2\naudio/mpeg:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n mpegversion: 1\n layer: 3\naudio/x-ac3:\n channels: [ 1, 6 ]\n rate: { (int)48000, (int)44100, (int)32000 }\naudio/x-dts:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\naudio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -139255,7 +139255,7 @@
"long-name": "libav PSP MP4 (MPEG-4 Part 14) muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -139442,7 +139442,7 @@
"long-name": "libav RTSP output muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -139506,7 +139506,7 @@
"long-name": "libav SAP output muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},
@ -139693,7 +139693,7 @@
"long-name": "libav Smooth Streaming Muxer muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/mpeg:\n channels: [ 1, 6 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"caps": "audio/mpeg:\n channels: [ 1, 16 ]\n rate: [ 4000, 96000 ]\n mpegversion: 4\n base-profile: lc\n",
"direction": "sink",
"presence": "request"
},

View file

@ -403,7 +403,7 @@ typedef struct
GstBuffer *buffer;
GstMapInfo map;
guint8 **ext_data_array, *ext_data;
guint8 *ext_data;
} BufferInfo;
static void
@ -416,7 +416,6 @@ buffer_info_free (void *opaque, guint8 * data)
gst_buffer_unref (info->buffer);
} else {
av_freep (&info->ext_data);
av_freep (&info->ext_data_array);
}
g_free (info);
}
@ -473,7 +472,7 @@ gst_ffmpegaudenc_send_frame (GstFFMpegAudEnc * ffmpegaudenc, GstBuffer * buffer)
av_buffer_create (NULL, 0, buffer_info_free, buffer_info, 0);
if (info->channels > AV_NUM_DATA_POINTERS) {
buffer_info->ext_data_array = frame->extended_data =
frame->extended_data =
av_malloc_array (info->channels, sizeof (uint8_t *));
} else {
frame->extended_data = frame->data;

View file

@ -65,7 +65,9 @@ static const struct
AV_CH_TOP_BACK_CENTER, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_CENTER}, {
AV_CH_TOP_BACK_RIGHT, GST_AUDIO_CHANNEL_POSITION_TOP_REAR_RIGHT}, {
AV_CH_STEREO_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT}, {
AV_CH_STEREO_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}
AV_CH_STEREO_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT}, {
AV_CH_WIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_WIDE_LEFT}, {
AV_CH_WIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_WIDE_RIGHT},
};
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100)
@ -673,11 +675,13 @@ gst_ff_aud_caps_new (AVCodecContext * context, AVCodec * codec,
/* so we must be after restricted caps in this case */
switch (codec_id) {
case AV_CODEC_ID_AAC:
case AV_CODEC_ID_AAC_LATM:
case AV_CODEC_ID_DTS:
maxchannels = 6;
break;
case AV_CODEC_ID_AAC:
case AV_CODEC_ID_AAC_LATM:
maxchannels = 16;
break;
case AV_CODEC_ID_MP2:
{
const static gint l_rates[] =

View file

@ -748,7 +748,8 @@ gst_ffmpegviddec_video_frame_new (GstFFMpegVidDec * ffmpegdec,
dframe->ffmpegdec = ffmpegdec;
dframe->frame = frame;
GST_DEBUG_OBJECT (ffmpegdec, "new video frame %p", dframe);
GST_DEBUG_OBJECT (ffmpegdec, "new video frame %p for sfn # %d", dframe,
frame->system_frame_number);
return dframe;
}
@ -757,7 +758,8 @@ static void
gst_ffmpegviddec_video_frame_free (GstFFMpegVidDec * ffmpegdec,
GstFFMpegVidDecVideoFrame * frame)
{
GST_DEBUG_OBJECT (ffmpegdec, "free video frame %p", frame);
GST_DEBUG_OBJECT (ffmpegdec, "free video frame %p for sfn # %d", frame,
frame->frame->system_frame_number);
if (frame->mapped)
gst_video_frame_unmap (&frame->vframe);
@ -994,15 +996,15 @@ gst_ffmpegviddec_get_buffer2 (AVCodecContext * context, AVFrame * picture,
/* GstFFMpegVidDecVideoFrame receives the frame ref */
if (picture->opaque) {
GST_DEBUG_OBJECT (ffmpegdec, "Re-using opaque %p", picture->opaque);
dframe = picture->opaque;
dframe->frame = frame;
} else {
picture->opaque = dframe =
gst_ffmpegviddec_video_frame_new (ffmpegdec, frame);
GST_DEBUG_OBJECT (ffmpegdec, "storing opaque %p", dframe);
}
GST_DEBUG_OBJECT (ffmpegdec, "storing opaque %p", dframe);
if (!gst_ffmpegviddec_can_direct_render (ffmpegdec))
goto no_dr;
@ -1136,11 +1138,11 @@ picture_changed (GstFFMpegVidDec * ffmpegdec, AVFrame * picture,
if (picture->repeat_pict)
pic_field_order |= GST_VIDEO_BUFFER_FLAG_RFF;
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 31, 100)
} else if (picture->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) {
if (picture->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST)
#else
} else if (picture->top_field_first) {
if (picture->top_field_first)
#endif
pic_field_order |= GST_VIDEO_BUFFER_FLAG_TFF;
pic_field_order |= GST_VIDEO_BUFFER_FLAG_TFF;
}
return !(ffmpegdec->pic_width == picture->width
@ -1879,11 +1881,20 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec,
/* get the output picture timing info again */
out_dframe = ffmpegdec->picture->opaque;
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT (60, 31, 100)
out_frame =
gst_video_codec_frame_ref (av_buffer_get_opaque (ffmpegdec->
picture->opaque_ref));
#else
g_assert (out_dframe);
out_frame = gst_video_codec_frame_ref (out_dframe->frame);
#endif
/* also give back a buffer allocated by the frame, if any */
gst_buffer_replace (&out_frame->output_buffer, out_dframe->buffer);
gst_buffer_replace (&out_dframe->buffer, NULL);
if (out_dframe) {
gst_buffer_replace (&out_frame->output_buffer, out_dframe->buffer);
gst_buffer_replace (&out_dframe->buffer, NULL);
}
/* Extract auxilliary info not stored in the main AVframe */
{
@ -2239,8 +2250,9 @@ gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
packet->opaque_ref =
av_buffer_create (NULL, 0, gst_ffmpeg_opaque_free,
gst_video_codec_frame_ref (frame), 0);
GST_DEBUG_OBJECT (ffmpegdec, "Store incoming frame %u on AVPacket opaque",
frame->system_frame_number);
GST_DEBUG_OBJECT (ffmpegdec,
"Store incoming frame # %u (%p) on AVPacket opaque",
frame->system_frame_number, frame);
}
#else
ffmpegdec->context->reordered_opaque = (gint64) frame->system_frame_number;
@ -2265,10 +2277,10 @@ gst_ffmpegviddec_handle_frame (GstVideoDecoder * decoder,
GST_VIDEO_DECODER_STREAM_UNLOCK (ffmpegdec);
if (avcodec_send_packet (ffmpegdec->context, packet) < 0) {
GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
av_packet_unref (packet);
av_packet_free (&packet);
goto send_packet_failed;
}
av_packet_unref (packet);
av_packet_free (&packet);
GST_VIDEO_DECODER_STREAM_LOCK (ffmpegdec);
do {

View file

@ -32,6 +32,26 @@ colorspace conversion elements.
</GitRepository>
</repository>
<release>
<Version>
<revision>1.24.2</revision>
<branch>1.24</branch>
<name></name>
<created>2024-04-09</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-1.24.2.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.1</revision>
<branch>1.24</branch>
<name></name>
<created>2024-03-21</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-1.24.1.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.0</revision>

View file

@ -1,5 +1,5 @@
project('gst-libav', 'c',
version : '1.24.0',
version : '1.24.2',
meson_version : '>= 1.1',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])

View file

@ -2,18 +2,20 @@ GStreamer 1.24 Release Notes
GStreamer 1.24.0 was originally released on 4 March 2024.
The latest bug-fix release in the stable 1.24 series is 1.24.2 and was released on 9 April 2024.
See https://gstreamer.freedesktop.org/releases/1.24/ for the latest version of this document.
Last updated: Monday 4 March 2024, 23:00 UTC (log)
Last updated: Tuesday 9 April 2024, 12:30 UTC (log)
Introduction
## Introduction
The GStreamer team is proud to announce a new major feature release in the stable 1.x API series of your favourite
cross-platform multimedia framework!
As always, this release is again packed with many new features, bug fixes and other improvements.
Highlights
## Highlights
- New Discourse forum and Matrix chat space
- New Analytics and Machine Learning abstractions and elements
@ -48,11 +50,12 @@ Highlights
- AVX/AVX2 support and NEON support on macOS on Apple ARM64 CPUs via new liborc
- GStreamer C# bindings have been updated
- Rust bindings improvements and many new and improved Rust plugins
- Rust plugins now shipped in packages for all major platforms including Android and iOS
- Lots of new plugins, features, performance improvements and bug fixes
Major new features and changes
## Major new features and changes
Discourse forum and Matrix chat space
### Discourse forum and Matrix chat space
- The new Discourse forum and Matrix chat space are now our preferred communication channels for support and developer chat.
@ -61,7 +64,7 @@ Discourse forum and Matrix chat space
- For release announcements please subscribe to the News + Announcements category on Discourse, although we will continue to
also send announcements to the mailing list for the time being.
Playbin3, decodebin3 now stable and default
### Playbin3, decodebin3 now stable and default
- After a year of stability, testing and more improvements, playbin3, and its various components (uridecodebin3, decodebin3
and urisourcebin), are now the recommended playback components.
@ -84,7 +87,7 @@ Improvements in this cycle:
partly due to a historical confusion between subtitle “decoders” (which decode the format to text and “parsers” (which only
do timing detection and optional seeking).
GstMeta serialization/deserialization and other GstMeta improvements
### GstMeta serialization/deserialization and other GstMeta improvements
- GstMeta serialization/deserialization allows metas to be transmitted or stored. This is used by the unixfd and cudaipc
plugins for inter-process communication (IPC). Implemented so far for GstCustomMeta, GstVideoMeta, GstAudioMeta and
@ -98,7 +101,7 @@ GstMeta serialization/deserialization and other GstMeta improvements
- Add gst_meta_info_new() and gst_meta_info_register() to register a GstMeta in two steps for easier extensibility.
New unixfd plugin for efficient 1:N inter-process communication on Linux
### New unixfd plugin for efficient 1:N inter-process communication on Linux
- unixfdsink and unixfdsrc are elements that, inspired by shmsink andn shmsrc, send UNIX file descriptors (e.g. memfd, dmabuf)
from one sink to multiple source elements in other processes on Linux.
@ -106,7 +109,7 @@ New unixfd plugin for efficient 1:N inter-process communication on Linux
- The unixfdsink proposes a memfd/shm allocator to upstream elements which allows for example videotestsrc to write directly
into memory that can be transfered to other processes without copying.
New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
### New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Previously only various specific GstMeta for ancillary data were provided, such as GstVideoCaptionMeta and GstVideoAFDMeta.
The new GstAncillaryMeta allows passing arbitrary ancillary data between elements, including custom and non-standard
@ -117,7 +120,7 @@ New GstMeta for SMPTE ST-291M HANC/VANC Ancillary Data
- Supported by the newly added AJA sink and source elements
DSD audio support
### DSD audio support
- DSD audio is a non-PCM raw audio format representation and the GstAudio library gained support for this in form of new
GstDsdInfo and GstDsdFormat API.
@ -125,7 +128,7 @@ DSD audio support
- Support for DSD audio has been implemented in alsasink as well as the GstAudioSink and GstAudioRingBuffer base classes, and
the gst-libav plugin to enable FFmpeg-based DSD elements and functionality.
Analytics and Machine Learning
### Analytics and Machine Learning
- A new library, GstAnalytics, has been added. It defines a GstAnalyticsRelationMeta that can efficiently hold a large number
of observations from a data analysis process, for example from machine learning. It also contains a matrix of the
@ -146,7 +149,7 @@ Analytics and Machine Learning
- In the next release, tensor decoders such as ssdobjectdetector will live outside of the ONNX plugin so they can be used with
other machine learning acceleration frameworks.
Qt5 + Qt6 QML integration improvements
### Qt5 + Qt6 QML integration improvements
- The Qt5 qmlglsink, qmlgloverlay, qmlglmixer received support for directly consuming BGRA and YV12 video frames without a
prior glcolorconvert.
@ -156,7 +159,7 @@ Qt5 + Qt6 QML integration improvements
- qml6d3d11sink is a new Direct3D11 Qt6 QML sink for Windows as an alternative to the existing qml6glsink.
DRM Modifier Support for dmabufs on Linux
### DRM Modifier Support for dmabufs on Linux
The Linux dmabuf subsystem provides buffer sharing across different hardware device drivers and subsystems, and is used
extensively by the DRM subsystem to exchange buffers between processes, contexts, and library APIs within the same process, and
@ -189,7 +192,7 @@ New API has been added for easy handling of these new caps:
- GST_VIDEO_FORMAT_DMA_DRM
OpenGL integration enhancements
### OpenGL integration enhancements
- When using EGL, if both OpenGL ES and OpenGL are available, OpenGL ES is preferred over OpenGL. OpenGL ES supports some
necessary features required for dmabuf support. This does not apply if an external library/application chooses an OpenGL API
@ -233,7 +236,7 @@ OpenGL integration enhancements
- GstGLBufferPool now has a configuration option for allowing a number of buffers to be always outstanding allowing for
reducing the potential synchronisation delay when reusing OpenGL memory backed buffers.
Vulkan integration enhancements
### Vulkan integration enhancements
- Add support for the Vulkan H.264 and H.265 decoders.
@ -246,7 +249,7 @@ Vulkan integration enhancements
- Vulkan/Wayland: add support for xdg_wm_base protocol for creating a visible debug window. Required as the previous wl_shell
interface is being removed from compositors.
CUDA / NVCODEC integration and feature additions
### CUDA / NVCODEC integration and feature additions
- New cudaipcsrc and cudaipcsink elements for zero-copy CUDA memory sharing between processes
@ -265,7 +268,7 @@ CUDA / NVCODEC integration and feature additions
flag, cuStreamSynchronize() or gst_cuda_memory_sync() call is required unless application-side CUDA operation is executed
with the GstCudaMemorys associated CUDA stream.
RTP stack improvements
### RTP stack improvements
- New rtppassthroughpay element which just passes RTP packets through unchanged, but appears like an RTP payloader element.
This is useful for relaying an RTP stream as-is through gst-rtsp-server, which expects an RTP payloader with certain
@ -310,7 +313,7 @@ RTP stack improvements
rtpsbcdepay, rtpvorbisdepay, rtpmp4vdepay, rtptheoradepay, rtpsv3vdepay, rtpmp4adepay, rtpklvdepay, rtpjpegdepay,
rtpj2kdepay, rtph263pdepay, rtph263depay, rtph261depay. rtpgstdepay.
WebRTC improvements
### WebRTC improvements
- Add support for ICE consent freshness (RFC 7675). This requires libnice >= 0.1.22.
@ -321,7 +324,7 @@ WebRTC improvements
- Various improvements and feature additions in the Rust webrtc plugin, which provides webrtcsrc and webrtcsink elements as
well as specific elements for different WebRTC signalling protocols. See the Rust plugins section below for more details.
Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
### Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- hlsdemux2 now supports Low-Latency HLS (LL-HLS)
@ -345,7 +348,7 @@ Adaptive Streaming improvements and Low-Latency HLS (LL-HLS) support
- No development took place on the legacy demuxers (dashdemux, hlsdemux, mssdemux). Application developers are reminded to use
the new demuxers instead. They are automatically picked up when using urisourcebin, uridecodebin3 or playbin3.
W3C Media Source Extensions library
### W3C Media Source Extensions library
- A new GStreamer library (mse) implementing the W3C Media Source Extensions specification was added.
@ -353,7 +356,7 @@ W3C Media Source Extensions library
without relying on a web browser engine. Typically an application consuming this library will wrap the C API with JavaScript
bindings that match the Media Source API so their existing code can integrate with this library.
Closed Caption handling improvements
### Closed Caption handling improvements
- ccconverter supports converting between the two CEA-608 fields.
@ -362,7 +365,7 @@ Closed Caption handling improvements
- Various improvements and feature additions in the Rust-based closed caption elements. Check out the Rust plugins section
below for more details.
Precision Time Protocol (PTP) clock improvements
### Precision Time Protocol (PTP) clock improvements
- Many fixes and compatibility/interoperability improvements.
@ -376,14 +379,14 @@ Precision Time Protocol (PTP) clock improvements
Windows, macOS, FreeBSD, NetBSD, OpenBSD, DragonFlyBSD, Solaris and Illumos. Newly supported compared to the C version is
Windows. Compared to the C version various error paths are handled more correctly and a couple of memory leaks are fixed.
Otherwise it should work identically. The minimum required Rust version for compiling this is 1.48, i.e. the version
currently in Debian stable. On Windows, Rust 1.54 is needed at least.
currently in Debian oldstable. On Windows, Rust 1.54 is needed at least.
- New ptp-helper Meson build option so PTP support can be disabled or required.
- gst_ptp_init_full() allows for a more fine-grained and extensible configuration and initialization of the GStreamer PTP
subsystem, including TTL configuration.
Bayer 10/12/14/16-bit depth support
### Bayer 10/12/14/16-bit depth support
- bayer2rgb and rgb2bayer now support bayer with 10/12/14/16 bit depths
@ -391,7 +394,7 @@ Bayer 10/12/14/16-bit depth support
- imagefreeze gained bayer support as well
MPEG-TS improvements
### MPEG-TS improvements
- mpegtsdemux gained support for
- segment seeking for seamless non-flushing looping, and
@ -403,7 +406,7 @@ MPEG-TS improvements
- allows writing arbitrary Opus channel mapping families and up to 255 channels
- separate handling of DVB and ATSC AC3 descriptors
New elements and plugins
## New elements and plugins
- analyticsoverlay visualises object-detection metas on a video stream.
@ -436,7 +439,7 @@ New elements and plugins
- New uvcsink element for exporting streams as UVC camera
New element features and additions
## New element features and additions
- alphacombine supports I420_10LE now for 10-bit WebM/alpha support.
@ -594,11 +597,11 @@ New element features and additions
- y4mdec now parses extended headers to support high bit depth video.
Plugin and library moves
## Plugin and library moves
- The AMR-NB and AMR-WB plugins have been moved from -bad to -good.
- The AMR-NB and AMR-WB plugins have been moved from -ugly to -good.
Plugin and element removals
## Plugin and element removals
- The entire gst-omx package and plugin has been retired. See the OMX section below for more details.
@ -606,7 +609,7 @@ Plugin and element removals
- The kate subtitle plugin has been removed.
Miscellaneous API additions
## Miscellaneous API additions
GStreamer Core
@ -700,7 +703,7 @@ New Video Formats
- Tiled 10-bit NV12 format NV12_10LE40_4L4 (Verisilicon Hantro)
Miscellaneous performance, latency and memory optimisations
## Miscellaneous performance, latency and memory optimisations
- liborc 0.4.35 (latest: 0.4.38) adds support for AVX/AVX2 and contains improvements for the SSE backend.
@ -712,7 +715,7 @@ Miscellaneous performance, latency and memory optimisations
- As always there have been plenty of performance, latency and memory optimisations all over the place.
Tracing framework and debugging improvements
## Tracing framework and debugging improvements
- The gst-stats tool can now be passed a custom regular expression
@ -734,7 +737,7 @@ Fake video decoder
- It draws a snake moving from left to right in the middle of the frame, which is reasonably light weight and still provides
an idea about how smooth the rendering is.
Tools
## Tools
- gst-launch-1.0 gained a new --prog-name command line option to set the program name, which will be used by GTK and GStreamer
to set the class or app-id.
@ -742,7 +745,7 @@ Tools
- gst-play-1.0 now defaults to using playbin3, but can still be made to use the old playbin by passing the --use-playbin2
command line argument.
GStreamer FFmpeg wrapper
## GStreamer FFmpeg wrapper
- New avvideocompare element to compare two incoming video buffers using a specified comparison method (e.g. SSIM or PSNR).
@ -759,7 +762,7 @@ GStreamer FFmpeg wrapper
- Note: see Known Issues section below for known issues with FFmpeg 6.0
GStreamer RTSP server
## GStreamer RTSP server
- New “ensure-keyunit-on-start” property: While the suspend modes NONE and PAUSED provided a low startup latency for
connecting clients, it did not ensure that streams started on fresh data. With this new property it is possible to maintain
@ -769,7 +772,7 @@ GStreamer RTSP server
- rtspclientsink: apply “port-range” property for RTCP port selection as well
GStreamer VA-API support
## GStreamer VA-API support
GstVA
@ -802,7 +805,7 @@ GStreamer-VAAPI
equivalent. Users who rely on gstreamer-vaapi are encouraged to migrate and test the va elements at the earliest
opportunity.
GStreamer Video4Linux2 support
## GStreamer Video4Linux2 support
- New uvcsink element, based on v4l2sink allow streaming your pipeline as a UVC camera using Linux UVC Gadget driver.
@ -814,7 +817,7 @@ GStreamer Video4Linux2 support
- Stateless decoders now tested using Virtual driver (visl), making it possible to run the tests in the cloud based CI
GStreamer OMX
## GStreamer OMX
- The gst-omx module has been removed. The OpenMAX standard is long dead and even the Raspberry Pi OS no longer supports it.
There has not been any development since 1.22 was released. Users of these elements should switch to the Video4Linux-based
@ -823,7 +826,7 @@ GStreamer OMX
- Hardware vendors which still use OpenMAX are known to have non-standard forks and it is recommended that they maintain it
while planning their move to the Video4Linux API.
GStreamer Editing Services and NLE
## GStreamer Editing Services and NLE
- Implement a gesvideoscale effect which gives user the ability to chooses where a clip has to be scaled in the chain of
effects. By default scaling is done in the compositor.
@ -861,7 +864,7 @@ ges-launch
- Move +effect stack effects from source to last effect added, so it feels more natural to user as adding them at the
beginning of the chain while the syntax is +effect felt wrong
GStreamer validate
## GStreamer validate
- In action types, add a way to avoid checking property value after setting it, in case elements do it async for example.
@ -888,7 +891,7 @@ GStreamer validate
- Fixed compatibility with Python 3.12.
GStreamer Python Bindings
## GStreamer Python Bindings
gst-python is an extension of the regular GStreamer Python bindings based on gobject-introspection information and PyGObject,
and provides “syntactic sugar” in form of overrides for various GStreamer APIs that makes them easier to use in Python and more
@ -905,7 +908,7 @@ e.g. GStreamers fundamental GLib types such as Gst.Fraction, Gst.IntRange etc
- Fix libpython dlopen on macOS
GStreamer C# Bindings
## GStreamer C# Bindings
- The GStreamer C# bindings have been updated to a more recent version of GtkSharp and the bindings have been regenerated with
that version.
@ -914,7 +917,7 @@ GStreamer C# Bindings
- GstRtspServer bindings have been added, plus an RTSP server example
GStreamer Rust Bindings and Rust Plugins
## GStreamer Rust Bindings and Rust Plugins
The GStreamer Rust bindings and plugins are released separately with a different release cadence thats tied to the twice-a-year
GNOME release cycle.
@ -928,7 +931,7 @@ backported as needed to the 0.12 brach for future 1.24.x bugfix releases.
Rust plugins can be used from any programming language. To applications they look just like a plugin written in C or C++.
WebRTC
### WebRTC
- New element webrtcsrc that can act as a recvonly WebRTC client. Just like the opposite direction, webrtcsink, this can
support various different WebRTC signalling protocols. Some are included with the plugin and provide their own element
@ -969,7 +972,7 @@ WebRTC
… and various other smaller improvements!
RTSP
### RTSP
- New rtspsrc2 element. Only a subset of RTSP features are implemented so far:
- RTSP 1.0 support
@ -980,7 +983,7 @@ RTSP
- The existing rtspsrc has a hard-coded order list for lower transports
- Many advanced features are not implemented yet, such as non-live support. See the README for the current status.
GTK4
### GTK4
- Support for rendering GL textures on X11/EGL, X11/GLX, Wayland, macOS, and WGL/EGL on Windows.
@ -996,7 +999,7 @@ GTK4
- Various bugfixes, including support for the new GTK 4.14 GL renderer. The plugin needs to be built with at least the
gtk_v4_10 feature to work with the new GTK 4.14 GL renderer, and will work best if built with the gtk_v4_14 feature.
Closed Caption
### Closed Caption
- Add cea608tocea708 element for upconverting CEA-608 captions to their CEA-708 representation.
@ -1007,7 +1010,7 @@ Closed Caption
- awstranscriber is using the new HTTP/2-based API now instead of the WebSocket-based one.
Other new elements
### Other new elements
- New awss3putobjectsink that works similar to awss3sink but with a different upload strategy.
@ -1021,7 +1024,7 @@ Other new elements
- New isomp4mux non-fragmented MP4 muxer element.
Other improvements
### Other improvements
- audiornnoise
- Attach audio level meta to output buffers.
@ -1041,12 +1044,12 @@ Other improvements
For a full list of changes in the Rust plugins see the gst-plugins-rs ChangeLog between versions 0.9 (shipped with GStreamer
1.22) and 0.12 (shipped with GStreamer 1.24).
Cerbero Rust support
## Cerbero Rust support
- As of GStreamer 1.24, the GStreamer Rust plugins are shipped as part of our binary packages on all major platforms. This
includes Android and iOS now in addition to macOS and Windows/MSVC.
Build and Dependencies
## Build and Dependencies
- Meson >= 1.1 is now required for all modules
@ -1067,9 +1070,9 @@ Build and Dependencies
- zxing: added support for the zxing-c++ 2.0 API
- The ptp-helper for Precision Time Protocol (PTP) support in GStreamer core has been rewritten in Rust, and the minimum
required Rust version for building this is 1.48, i.e. the version currently in Debian stable. On Windows, at least Rust 1.54
is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP support is
available (if set to ptp-helper=enabled). cargo is not required for building.
required Rust version for building this is 1.48, i.e. the version currently in Debian oldstable. On Windows, at least Rust
1.54 is needed. There is a new ptp-helper Meson feature option that can be used to make sure everything needed for PTP
support is available (if set to ptp-helper=enabled). cargo is not required for building.
- gst-plugins-rs requires Rust 1.70 or newer.
@ -1104,7 +1107,7 @@ Development environment
- gst-env.py: Output a setting for the prompt with --only-environment
Cerbero
### Cerbero
Cerbero is a meta build system used to build GStreamer plus dependencies on platforms where dependencies are not readily
available, such as Windows, Android, iOS, and macOS.
@ -1181,16 +1184,16 @@ Android
- tremor and ivorbisdec plugins are no longer shipped on Android
- openh264 plugin no longer enables ASM optimizations on Android x86 due to relocation errors
Platform-specific changes and improvements
## Platform-specific changes and improvements
Android
### Android
- Add NDK implementation of Android MediaCodec. This reduces the amount of Java <-> native calls, which should reduce
overhead.
- Add support for AV1 to the androidmedia video encoder and decoder.
Apple macOS and iOS
### Apple macOS and iOS
- osxaudio: audio clock improvements (interpolate based on system time)
@ -1199,7 +1202,7 @@ Apple macOS and iOS
them. Without that, windows would disappear if you clicked outside them and there would be no way to bring them to front
again. This change also allows osxvideosink to receive navigation events correctly.
Windows
### Windows
- New DirectWrite text rendering plugin with dwriteclockoverlay, dwritetimeoverlay, dwritetextoverlay, dwritesubtitlemux, and
dwritesubtitleoverlay elements, including closed caption overlay support in dwritetextoverlay.
@ -1243,12 +1246,12 @@ Windows
- All d3d12 elements are zero ranked for now. Users will need to adjust rank of each d3d12 element via GST_PLUGIN_RANK
environment or appropriate plugin feature APIs if they want these elements autoplugged.
Documentation improvements
## Documentation improvements
- hotdoc has been updated to the latest version, and the theme has also been updated, which should fix various usability
issues.
Possibly Breaking Changes
## Possibly Breaking Changes
- gst_plugin_feature_check_version() has been updated to fix unexpected version check behaviour for git versions. It would
return TRUE if the plugin version is for a git development version (e.g. 1.24.0.1) and the check is for the “next” micro
@ -1268,12 +1271,12 @@ Possibly Breaking Changes
- The NVIDIA desktop GPU decoders nvh264sldec, nvh265sldec, nvvp8sldec and nvvp9sldec were renamed to nvh264dec, nvh265dec,
nvvp8dec and nvvp9dec, respectively.
Known Issues
## Known Issues
- There are known issues with FFmpeg version 6.0.0 due to opaque passing being broken in that version. This affects at least
avdec_h264, but may affect other decoders as well. Versions before 6.0.0, and 6.0.1 or higher are not affected.
Statistics
## Statistics
- 4643 commits
@ -1293,7 +1296,7 @@ Statistics
- 259791 lines added (net)
Contributors
## Contributors
Aaron Boxer, Aaron Huang, Acky Xu, adixonn, Adrian Fiergolski, Adrien De Coninck, Akihiro Sagawa, Albert Sjölund, Alessandro
Bono, Alexande B, Alexander Slobodeniuk, Alicia Boya García, amindfv, Amir Naghdinezhad, anaghdin, Anders Hellerup Madsen,
@ -1341,6 +1344,334 @@ bug-fix releases will be made from the git 1.24 branch, which will be a stable b
GStreamer 1.24.0 was released on 4 March 2024.
1.24.1
The first 1.24 bug-fix release (1.24.1) was released on 21 March 2024.
This release only contains bugfixes and it should be safe to update from 1.24.0.
Highlighted bugfixes in 1.24.1
- Fix instant-EOS regression in audio sinks in some cases when volume is 0
- rtspsrc: server compatibility improvements and ONVIF trick mode fixes
- rtsp-server: fix issues if RTSP media was set to be both shared and reusable
- (uri)decodebin3 and playbin3 fixes
- adaptivdemux2/hlsdemux2: Fix issues with failure updating playlists
- mpeg123 audio decoder fixes
- v4l2codecs: DMA_DRM caps support for decoders
- va: various AV1 / H.264 / H.265 video encoder fixes
- vtdec: fix potential deadlock regression with ProRes playback
- gst-libav: fixes for video decoder frame handling, interlaced mode detection
- avenc_aac: support for 7.1 and 16 channel modes
- glimagesink: Fix the sink not always respecting preferred size on macOS
- gtk4paintablesink: Fix scaling of texture position
- webrtc: Allow resolution and framerate changes, and many other improvements
- webrtc: Add new LiveKit source element
- Fix usability of binary packages on arm64 iOS
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- registry, ptp: Canonicalize the library path returned by dladdr
- segment: Dont use g_return_val_if_fail() in gst_segment_to_running_time_full()
- uri: Sort uri protocol sources/sinks by feature name to break a feature rank tie
- ptp: Initialize expected DELAY_REQ seqnum to an invalid value
- ptp: Dont install test executable
- gst-inspect: fix exists for plugins with versions other than GStreamers version, like the Rust plugins
- identity: Dont refuse seeks unless single-segment=true
gst-plugins-base
- audiobasesink: Dont wait on gap events
- audioencoder: Avoid using temporarily mapped memory as base for input buffers
- decodebin3: Be more specific when sending missing plugin messages
- decodebin3: Fix re-usability issues
- decodebin3: Provide clear error message if no decoders present
- playbin3: Remove un-needed URI NULL check
- uridecodebin3: Dont hold lock when posting messages or signals
- uridecodebin3: Handle potential double redirection errors
- glimagesink: Fix the sink not always respecting preferred size on macOS
- glupload: Do not propose allocators with sysmem, fixes warning when playing VP9 with alpha
- shmallocator: fix build on Illumos
- meson: Fix the condition to skip theoradec test
gst-plugins-good
- adaptivdemux/hlsdemux2: Fix issues with failure updating playlists
- mpg123audiodec: Correctly handle the case of clipping all decoded samples
- mpg123audiodec: gst_audio_decoder_allocate_output_buffer: assertion size > 0 failed
- qt: Fix description in meson build options
- qtdemux: Do not set channel-mask to zero
- rtspsrc: remove deprecated flag from the push-backchannel-sample signal
- rtspsrc: Consider 503 Service Not Available when handling broken control urls
- rtspsrc, rtponviftimestamp: ONVIF mode fixes
- rtspsrc: Dont invoke close when stopping if weve started cleanup, fixing potential crash on shutdown
- rtpgstpay: Delay pushing of event packets until the next buffer
gst-plugins-bad
- asio: Fix {input,output}-channels property handling
- cuda,d3d11,d3d12bufferpool: Disable preallocation
- d3d11device: Fix adapter LUID comparison in wrapped device mode
- d3d12device: Fix IDXGIFactory2 leak
- d3d12: Fix SDK debug layer activation
- dvbsubenc: Fix bottom field size calculation
- dvdspu: avoid null dereference
- GstPlay: Fix a critical warning in error callback
- v4l2codecs: decoders: Add DMA_DRM caps support
- vaav1enc: Init the output_frame_num when resetting gf group
- vah264enc, vah265enc, vaav1enc: fix potential crash on devices without rate control
- vah265enc: checking surface alignment
- videoparsers: Dont verbosely warn about CEA_708_PROCESS_EM_DATA_FLAG not being set
- vtdec: Fix a deadlock during ProRes playback, handle non-linked gracefully
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- gtk4paintablesink: Fix scaling of texture position
- janusvrwebrtcsink: Handle 64 bit numerical room ids
- janusvrwebrtcsink: Dont include deprecated audio/video fields in publish messages
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
- livekitwebrtc: Fix shutdown behaviour
- rtpgccbwe: Dont forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
- sccparse: Ignore invalid timecodes during seeking
- webrtcsink: Dont try parsing audio caps as video caps
- webrtc: Allow resolution and framerate changes
- webrtcsrc: Make producer-peer-id optional
- livekitwebrtcsrc: Add new LiveKit source element
- regex: Add support for configuring regex behaviour
- spotifyaudiosrc: Document how to use with non-Facebook accounts
- webrtcsrc: Add do-retransmission property
gst-libav
- avcodecmap: Increase max AAC channels to 16
- avviddec: Fix how we get back the codec frame
- avviddec: Fix interlaced mode detection
- avviddec: Double check if AV_CODEC_FLAG_COPY_OPAQUE port is safe for our scenario
gst-rtsp-server
- media: gst_rtsp_media_set_reusable() and gst_rtsp_media_set_shared() have become incompatible
- rtsp-stream: clear sockets when leaving bin
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: Fix critical warning
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- No changes
Development build environment
- No changes
Cerbero build tool and packaging changes in 1.24.1
- gstreamer: Enable ptp helper explicitly
- gst-plugins-bad: Package new insertbin plugin
- gst-plugins-rs: Adjust parallel architecture build blocks
- libnice: update to 0.1.22
- pixman: Bump to 0.43.4
- orc: disable JIT code generation on arm64 on iOS again, fixing crashes
Contributors to 1.24.1
Alexander Slobodeniuk, Antonio Larrosa, Edward Hervey, Elizabeth Figura, François Laignel, Guillaume Desmottes, He Junyan, Jan
Schmidt, Jordan Yelloz, L. E. Segovia, Mark Nauwelaerts, Mathieu Duponchelle, Michael Tretter, Mikhail Rudenko, Nicolas
Dufresne, Nirbheek Chauhan, Philippe Normand, Piotr Brzeziński, Robert Mader, Ruijing Dong, Sebastian Dröge, Seungha Yang,
Thomas Goodwin, Thomas Klausner, Tim-Philipp Müller, Xi Ruoyao,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.1
- List of Merge Requests applied in 1.24.1
- List of Issues fixed in 1.24.1
1.24.2
The second 1.24 bug-fix release (1.24.2) was released on 9 April 2024.
This release only contains bugfixes and it should be safe to update from 1.24.x.
Highlighted bugfixes in 1.24.2
- H.264 parsing regression fixes
- WavPack typefinding improvements
- Video4linux fixes and improvements
- Android build and runtime fixes
- macOS OpenGL memory leak and robustness fixes
- Qt/QML video sink fixes
- Package new analytics and mse libraries in binary packages
- Windows MSVC binary packages: fix libvpx avx/avx2/avx512 instruction set detection
- various bug fixes, memory leak fixes, and other stability and reliability improvements
gstreamer
- clock: Block futex_time64 usage on Android API level < 30
- basesrc: Clear submitted buffer lists consistently with buffers
- ptpclock: fix double free of domain data during deinit
- clocksync: Proxy allocation queries
- inputselector: fix possible clock leak on shutdown
- typefind: Handle WavPack block sizes > 131072
gst-plugins-base
- glcolorconvert: Ensure glcolorconvert does not miss supported RGB formats
- gl/macos: a couple of race/reference count fixes
- pbutils: descriptions: Dont warn on MPEG-1 audio caps without layer field
- encodebin: Add the parser before timestamper to tosync list
- videorate: Reset last_ts when a new segment is received
gst-plugins-good
- qml6glsink: fix destruction of underlying texture
- qt/qt6: Fixup for dummy textures
- rtpjitterbuffer: Dont use estimated_dts to do default skew adjustment
- rtpjitterbuffer: Use an extended RTP timestamp for the clock-base
- rtpmp4adepay: Set duration on outgoing buffers
- tests: rtpred: fix out-of-bound writes
- v4l2: allocator: Fix unref log/trace on memory release
- v4l2: Also set max_width/max_width if enum framesize fail
- v4l2: enforce a pixel aspect ratio of 1/1 if no data are available
- v4l2: fix error in calculating padding bottom for tile format
- v4l2src: need maintain the caps order in caps compare when fixate
- vpxenc: Include vpx error details in errors and warnings
gst-plugins-bad
- h264parse: element hangs with some video streams (regression)
- h264parse: Revert “AU boundary detection changes”
- alphadecodebin: Explicitly pass 64 bit integers as such through varargs
- atdec: Set a channel mask for channel counts greater than 2
- ccconverter: Fix caps leak and remove unnecessary code
- d3d11videosink: disconnect signals before releasing the window
- d3d11: meson: Add support for MinGW DirectXMath package and update directxmath wrap to 3.1.9
- d3d11: meson: Disable library build if DirectXMath header was not found
- dwrite: Fix crash on device update
- GstPlay: Update video_snapshot to support playbin3
- jpegparse: avi1 tag can be progressive
- jpegparse: turn some bus warnings into object ones
- qsvdecoder: Release too old frames
- ristsrc: Only free caps if needed
- va: av1enc: Correct the reference number and improve the reference setting
- va: {vp9, av1}enc: Avoid reopen encoder or renegotiate
- videoparsers: Demote CC warning message
- vkbufferpool: correct usage flags type
- vkh26xdec: a couple decoding fixes
- vtdec: Fix caps criticals during negotiation
- wpe: avoid crash with G_DEBUG=fatal_criticals and static build
- Sink missing floating references
gst-plugins-ugly
- No changes
GStreamer Rust plugins
- aws: use fixed BehaviorVersion
- aws: improve error message logs
- fmp4: Update to dash-mpd 0.16
- fmp4mux: Require gstreamer-pbutils 1.20 for the examples
- onvifmetadataparse: Reset state in PAUSED->READY after pad deactivation, fixing occasional deadlock on shutdown
- reqwest: Update to reqwest 0.12
- webrtcsink: set perfect-timestamp=true on audio encoders
- webrtcsink: improve panic message on unexpected caps during discovery
- webrtchttp: Update to reqwest 0.12
- webrtc: fix inconsistencies in documentation of object names
- Fix clippy warnings after upgrade to Rust 1.77
gst-libav
- avviddec: Fix AVPacket leak
gst-rtsp-server
- No changes
gstreamer-vaapi
- No changes
gstreamer-sharp
- No changes
gst-omx
- No changes
gst-python
- No changes
gst-editing-services
- ges: frame-composition-meta: Stop using keyword operator for field in C++
gst-validate + gst-integration-testsuites
- No changes
gst-examples
- webrtc examples: set perfect-timestamp=true on opusenc for better Chrome interoperability
Development build environment
- flac: Add subproject wrap and allow falling back to it in the flac plugin
- libnice: bump subproject wrap to v0.1.22 (needed for ICE consent freshness support in gstwebrtc)
Cerbero build tool and packaging changes in 1.24.2
- glib: Block futex_time64 usage on Android API level < 30
- libvpx: Fix build with Python 3.8
- libvpx: Fix errors with avx* instruction set detection for x86* builds and MSVC
- openjpeg: Update to 2.5.2
- directxmath: Update to 3.1.9
- gst-plugins-rs: Fix superstripping for ELF breaking all plugins
- Rust-based plugin initialization hangs on Android with GStreamer 1.24.0
Contributors to 1.24.2
Alexander Slobodeniuk, Arnaud Vrac, Chao Guo, Chris Spencer, Daniel Morin, Edward Hervey, Elizabeth Figura, Elliot Chen, eri,
François Laignel, Guillaume Desmottes, Haihua Hu, He Junyan, Hou Qi, Jan Schmidt, Jochen Henneberg, L. E. Segovia, Martin
Nordholts, Matthew Waters, Nicolas Dufresne, Philippe Normand, Philipp Zabel, Piotr Brzeziński, Robert Guziolowski, Robert
Mader, Ruben Gonzalez, Sebastian Dröge, Seungha Yang, Taruntej Kanakamalla, Thibault Saunier, Tim Blechmann, Tim-Philipp Müller,
Víctor Manuel Jáquez Leal, Wojciech Kapsa, Xavier Claessens,
… and many others who have contributed bug reports, translations, sent suggestions or helped testing. Thank you all!
List of merge requests and issues fixed in 1.24.2
- List of Merge Requests applied in 1.24.2
- List of Issues fixed in 1.24.2
Schedule for 1.26
Our next major feature release will be 1.26, and 1.25 will be the unstable development version leading up to the stable 1.26

View file

@ -1,4 +1,4 @@
This is GStreamer gst-plugins-bad 1.24.0.
This is GStreamer gst-plugins-bad 1.24.2.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!

View file

@ -247,26 +247,7 @@ gst_cc_converter_transform_caps (GstBaseTransform * base,
res = gst_caps_merge (res, gst_static_caps_get (&cdp_caps_framerate));
/* Or anything else with a CDP framerate */
if (framerate) {
GstCaps *tmp;
GstStructure *t;
const GValue *cdp_framerate;
/* Create caps that contain the intersection of all framerates with
* the CDP allowed framerates */
tmp =
gst_caps_make_writable (gst_static_caps_get
(&cdp_caps_framerate));
t = gst_caps_get_structure (tmp, 0);
/* There's an intersection between the framerates so we can convert
* into CDP with exactly those framerates from anything else */
cdp_framerate = gst_structure_get_value (t, "framerate");
tmp = gst_caps_make_writable (gst_static_caps_get (&non_cdp_caps));
tmp = gst_caps_merge (tmp, gst_static_caps_get (&raw_608_caps));
gst_caps_set_value (tmp, "framerate", cdp_framerate);
res = gst_caps_merge (res, tmp);
} else {
{
GstCaps *tmp, *cdp_caps;
const GValue *cdp_framerate;

View file

@ -262,7 +262,11 @@ gst_mpd_adaptation_set_node_init (GstMPDAdaptationSetNode * self)
GstMPDAdaptationSetNode *
gst_mpd_adaptation_set_node_new (void)
{
return g_object_new (GST_TYPE_MPD_ADAPTATION_SET_NODE, NULL);
GstMPDAdaptationSetNode *ret;
ret = g_object_new (GST_TYPE_MPD_ADAPTATION_SET_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -155,7 +155,11 @@ gst_mpd_baseurl_node_init (GstMPDBaseURLNode * self)
GstMPDBaseURLNode *
gst_mpd_baseurl_node_new (void)
{
return g_object_new (GST_TYPE_MPD_BASEURL_NODE, NULL);
GstMPDBaseURLNode *ret;
ret = g_object_new (GST_TYPE_MPD_BASEURL_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -459,9 +459,13 @@ gst_mpd_client_init (GstMPDClient * client)
GstMPDClient *
gst_mpd_client_new (void)
{
GstMPDClient *ret;
GST_DEBUG_CATEGORY_INIT (gst_dash_mpd_client_debug, "dashmpdclient", 0,
"DashmMpdClient");
return g_object_new (GST_TYPE_MPD_CLIENT, NULL);
ret = g_object_new (GST_TYPE_MPD_CLIENT, NULL);
gst_object_ref_sink (ret);
return ret;
}
GstMPDClient *

View file

@ -109,7 +109,11 @@ gst_mpd_content_component_node_init (GstMPDContentComponentNode * self)
GstMPDContentComponentNode *
gst_mpd_content_component_node_new (void)
{
return g_object_new (GST_TYPE_MPD_CONTENT_COMPONENT_NODE, NULL);
GstMPDContentComponentNode *ret;
ret = g_object_new (GST_TYPE_MPD_CONTENT_COMPONENT_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -88,6 +88,7 @@ gst_mpd_descriptor_type_node_new (const gchar * name)
GstMPDDescriptorTypeNode *self =
g_object_new (GST_TYPE_MPD_DESCRIPTOR_TYPE_NODE, NULL);
self->node_name = g_strdup (name);
gst_object_ref_sink (self);
return self;
}

View file

@ -73,7 +73,11 @@ gst_mpd_location_node_init (GstMPDLocationNode * self)
GstMPDLocationNode *
gst_mpd_location_node_new (void)
{
return g_object_new (GST_TYPE_MPD_LOCATION_NODE, NULL);
GstMPDLocationNode *ret;
ret = g_object_new (GST_TYPE_MPD_LOCATION_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -83,7 +83,10 @@ gst_mpd_metrics_node_init (GstMPDMetricsNode * self)
GstMPDMetricsNode *
gst_mpd_metrics_node_new (void)
{
return g_object_new (GST_TYPE_MPD_METRICS_NODE, NULL);
GstMPDMetricsNode *ret;
ret = g_object_new (GST_TYPE_MPD_METRICS_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -64,7 +64,11 @@ gst_mpd_metrics_range_node_init (GstMPDMetricsRangeNode * self)
GstMPDMetricsRangeNode *
gst_mpd_metrics_range_node_new (void)
{
return g_object_new (GST_TYPE_MPD_METRICS_RANGE_NODE, NULL);
GstMPDMetricsRangeNode *ret;
ret = g_object_new (GST_TYPE_MPD_METRICS_RANGE_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -203,7 +203,11 @@ gst_mpd_period_node_init (GstMPDPeriodNode * self)
GstMPDPeriodNode *
gst_mpd_period_node_new (void)
{
return g_object_new (GST_TYPE_MPD_PERIOD_NODE, NULL);
GstMPDPeriodNode *ret;
ret = g_object_new (GST_TYPE_MPD_PERIOD_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -114,7 +114,11 @@ gst_mpd_program_information_node_init (GstMPDProgramInformationNode * self)
GstMPDProgramInformationNode *
gst_mpd_program_information_node_new (void)
{
return g_object_new (GST_TYPE_MPD_PROGRAM_INFORMATION_NODE, NULL);
GstMPDProgramInformationNode *ret;
ret = g_object_new (GST_TYPE_MPD_PROGRAM_INFORMATION_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -53,7 +53,11 @@ gst_mpd_reporting_node_init (GstMPDReportingNode * self)
GstMPDReportingNode *
gst_mpd_reporting_node_new (void)
{
return g_object_new (GST_TYPE_MPD_REPORTING_NODE, NULL);
GstMPDReportingNode *ret;
ret = g_object_new (GST_TYPE_MPD_REPORTING_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -187,7 +187,11 @@ gst_mpd_representation_node_init (GstMPDRepresentationNode * self)
GstMPDRepresentationNode *
gst_mpd_representation_node_new (void)
{
return g_object_new (GST_TYPE_MPD_REPRESENTATION_NODE, NULL);
GstMPDRepresentationNode *ret;
ret = g_object_new (GST_TYPE_MPD_REPRESENTATION_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -405,7 +405,11 @@ gst_mpd_root_node_init (GstMPDRootNode * self)
GstMPDRootNode *
gst_mpd_root_node_new (void)
{
return g_object_new (GST_TYPE_MPD_ROOT_NODE, NULL);
GstMPDRootNode *ret;
ret = g_object_new (GST_TYPE_MPD_ROOT_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -101,7 +101,11 @@ gst_mpd_segment_base_node_init (GstMPDSegmentBaseNode * self)
GstMPDSegmentBaseNode *
gst_mpd_segment_base_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SEGMENT_BASE_NODE, NULL);
GstMPDSegmentBaseNode *ret;
ret = g_object_new (GST_TYPE_MPD_SEGMENT_BASE_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -84,7 +84,11 @@ gst_mpd_segment_list_node_init (GstMPDSegmentListNode * self)
GstMPDSegmentListNode *
gst_mpd_segment_list_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SEGMENT_LIST_NODE, NULL);
GstMPDSegmentListNode *ret;
ret = g_object_new (GST_TYPE_MPD_SEGMENT_LIST_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -175,7 +175,11 @@ gst_mpd_segment_template_node_init (GstMPDSegmentTemplateNode * self)
GstMPDSegmentTemplateNode *
gst_mpd_segment_template_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SEGMENT_TEMPLATE_NODE, NULL);
GstMPDSegmentTemplateNode *ret;
ret = g_object_new (GST_TYPE_MPD_SEGMENT_TEMPLATE_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -78,7 +78,11 @@ gst_mpd_segment_timeline_node_init (GstMPDSegmentTimelineNode * self)
GstMPDSegmentTimelineNode *
gst_mpd_segment_timeline_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SEGMENT_TIMELINE_NODE, NULL);
GstMPDSegmentTimelineNode *ret;
ret = g_object_new (GST_TYPE_MPD_SEGMENT_TIMELINE_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -139,7 +139,11 @@ gst_mpd_segment_url_node_init (GstMPDSegmentURLNode * self)
GstMPDSegmentURLNode *
gst_mpd_segment_url_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SEGMENT_URL_NODE, NULL);
GstMPDSegmentURLNode *ret;
ret = g_object_new (GST_TYPE_MPD_SEGMENT_URL_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -66,7 +66,11 @@ gst_mpd_s_node_init (GstMPDSNode * self)
GstMPDSNode *
gst_mpd_s_node_new (void)
{
return g_object_new (GST_TYPE_MPD_S_NODE, NULL);
GstMPDSNode *ret;
ret = g_object_new (GST_TYPE_MPD_S_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -98,7 +98,11 @@ gst_mpd_sub_representation_node_init (GstMPDSubRepresentationNode * self)
GstMPDSubRepresentationNode *
gst_mpd_sub_representation_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SUB_REPRESENTATION_NODE, NULL);
GstMPDSubRepresentationNode *ret;
ret = g_object_new (GST_TYPE_MPD_SUB_REPRESENTATION_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -77,7 +77,11 @@ gst_mpd_subset_node_init (GstMPDSubsetNode * self)
GstMPDSubsetNode *
gst_mpd_subset_node_new (void)
{
return g_object_new (GST_TYPE_MPD_SUBSET_NODE, NULL);
GstMPDSubsetNode *ret;
ret = g_object_new (GST_TYPE_MPD_SUBSET_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -82,6 +82,7 @@ gst_mpd_url_type_node_new (const gchar * name)
{
GstMPDURLTypeNode *self = g_object_new (GST_TYPE_MPD_URL_TYPE_NODE, NULL);
self->node_name = g_strdup (name);
gst_object_ref_sink (self);
return self;
}

View file

@ -106,7 +106,11 @@ gst_mpd_utctiming_node_init (GstMPDUTCTimingNode * self)
GstMPDUTCTimingNode *
gst_mpd_utctiming_node_new (void)
{
return g_object_new (GST_TYPE_MPD_UTCTIMING_NODE, NULL);
GstMPDUTCTimingNode *ret;
ret = g_object_new (GST_TYPE_MPD_UTCTIMING_NODE, NULL);
gst_object_ref_sink (ret);
return ret;
}
void

View file

@ -855,6 +855,7 @@ gst_gtk_wayland_update_pool (GstGtkWaylandSink * self, GstAllocator * allocator)
gst_object_unref (priv->pool);
}
priv->pool = gst_wl_video_buffer_pool_new ();
gst_object_ref_sink (priv->pool);
config = gst_buffer_pool_get_config (priv->pool);
gst_buffer_pool_config_set_params (config, priv->caps, size, 2, 0);

View file

@ -59,9 +59,6 @@ struct _GstVulkanH264Decoder
GstVulkanDecoder *decoder;
GstBuffer *inbuf;
GstMapInfo in_mapinfo;
gboolean need_negotiation;
gboolean need_params_update;
@ -75,9 +72,6 @@ struct _GstVulkanH264Decoder
VkChromaLocation xloc, yloc;
GstVideoCodecState *output_state;
GstBufferPool *dpb_pool;
GstBuffer *layered_dpb;
};
static GstStaticPadTemplate gst_vulkan_h264dec_sink_template =
@ -183,28 +177,25 @@ gst_vulkan_h264_decoder_close (GstVideoDecoder * decoder)
{
GstVulkanH264Decoder *self = GST_VULKAN_H264_DECODER (decoder);
if (self->decoder)
gst_vulkan_decoder_stop (self->decoder);
if (self->inbuf)
gst_buffer_unmap (self->inbuf, &self->in_mapinfo);
gst_clear_buffer (&self->inbuf);
if (self->output_state)
gst_video_codec_state_unref (self->output_state);
gst_clear_object (&self->decoder);
gst_clear_object (&self->decode_queue);
gst_clear_object (&self->graphic_queue);
gst_clear_object (&self->device);
gst_clear_object (&self->instance);
if (self->dpb_pool) {
gst_buffer_pool_set_active (self->dpb_pool, FALSE);
gst_clear_object (&self->dpb_pool);
}
return TRUE;
}
gst_clear_buffer (&self->layered_dpb);
static gboolean
gst_vulkan_h264_decoder_stop (GstVideoDecoder * decoder)
{
GstVulkanH264Decoder *self = GST_VULKAN_H264_DECODER (decoder);
if (self->decoder)
gst_vulkan_decoder_stop (self->decoder);
if (self->output_state)
gst_video_codec_state_unref (self->output_state);
return TRUE;
}
@ -1329,6 +1320,7 @@ gst_vulkan_h264_decoder_class_init (GstVulkanH264DecoderClass * klass)
decoder_class->open = GST_DEBUG_FUNCPTR (gst_vulkan_h264_decoder_open);
decoder_class->close = GST_DEBUG_FUNCPTR (gst_vulkan_h264_decoder_close);
decoder_class->stop = GST_DEBUG_FUNCPTR (gst_vulkan_h264_decoder_stop);
decoder_class->src_query =
GST_DEBUG_FUNCPTR (gst_vulkan_h264_decoder_src_query);
decoder_class->sink_query =

View file

@ -60,9 +60,6 @@ struct _GstVulkanH265Decoder
GstVulkanDecoder *decoder;
GstBuffer *inbuf;
GstMapInfo in_mapinfo;
gboolean need_negotiation;
gboolean need_params_update;
@ -75,9 +72,6 @@ struct _GstVulkanH265Decoder
VkChromaLocation xloc, yloc;
GstVideoCodecState *output_state;
GstBufferPool *dpb_pool;
GstBuffer *layered_dpb;
};
static GstStaticPadTemplate gst_vulkan_h265dec_sink_template =
@ -241,28 +235,25 @@ gst_vulkan_h265_decoder_close (GstVideoDecoder * decoder)
{
GstVulkanH265Decoder *self = GST_VULKAN_H265_DECODER (decoder);
if (self->decoder)
gst_vulkan_decoder_stop (self->decoder);
if (self->inbuf)
gst_buffer_unmap (self->inbuf, &self->in_mapinfo);
gst_clear_buffer (&self->inbuf);
if (self->output_state)
gst_video_codec_state_unref (self->output_state);
gst_clear_object (&self->decoder);
gst_clear_object (&self->decode_queue);
gst_clear_object (&self->graphic_queue);
gst_clear_object (&self->device);
gst_clear_object (&self->instance);
if (self->dpb_pool) {
gst_buffer_pool_set_active (self->dpb_pool, FALSE);
gst_clear_object (&self->dpb_pool);
}
return TRUE;
}
gst_clear_buffer (&self->layered_dpb);
static gboolean
gst_vulkan_h265_decoder_stop (GstVideoDecoder * decoder)
{
GstVulkanH265Decoder *self = GST_VULKAN_H265_DECODER (decoder);
if (self->decoder)
gst_vulkan_decoder_stop (self->decoder);
if (self->output_state)
gst_video_codec_state_unref (self->output_state);
return TRUE;
}
@ -1316,6 +1307,7 @@ _update_parameters (GstVulkanH265Decoder * self, const GstH265PPS * pps)
/* .pNext = */
.maxStdSPSCount = params.stdSPSCount,
.maxStdPPSCount = params.stdPPSCount,
.maxStdVPSCount = params.stdVPSCount,
.pParametersAddInfo = &params,
}
};
@ -1396,8 +1388,8 @@ _fill_ref_slot (GstVulkanH265Decoder * self, GstH265Picture * picture,
*res = (VkVideoPictureResourceInfoKHR) {
.sType = VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR,
.codedOffset = { self->x, self->y },
.codedExtent = { self->width, self->height },
.baseArrayLayer = self->layered_dpb ? pic->slot_idx : 0,
.codedExtent = { self->coded_width, self->coded_height },
.baseArrayLayer = self->decoder->layered_dpb ? pic->slot_idx : 0,
.imageViewBinding = pic->base.img_view_ref->view,
};
@ -1674,6 +1666,7 @@ gst_vulkan_h265_decoder_class_init (GstVulkanH265DecoderClass * klass)
GST_DEBUG_FUNCPTR (gst_vulkan_h265_decoder_sink_query);
decoder_class->open = GST_DEBUG_FUNCPTR (gst_vulkan_h265_decoder_open);
decoder_class->close = GST_DEBUG_FUNCPTR (gst_vulkan_h265_decoder_close);
decoder_class->stop = GST_DEBUG_FUNCPTR (gst_vulkan_h265_decoder_stop);
decoder_class->negotiate =
GST_DEBUG_FUNCPTR (gst_vulkan_h265_decoder_negotiate);
decoder_class->decide_allocation =

View file

@ -609,6 +609,7 @@ gst_wayland_update_pool (GstWaylandSink * self, GstAllocator * allocator)
gst_object_unref (self->pool);
}
self->pool = gst_wl_video_buffer_pool_new ();
gst_object_ref_sink (self->pool);
config = gst_buffer_pool_get_config (self->pool);
gst_buffer_pool_config_set_params (config, self->caps, size, 2, 0);

View file

@ -42,14 +42,18 @@ static gboolean
plugin_init (GstPlugin * plugin)
{
gboolean result;
gchar *dirname = g_path_get_dirname (gst_plugin_get_filename (plugin));
gchar *dirname;
const gchar *filename = gst_plugin_get_filename (plugin);
GST_DEBUG_CATEGORY_INIT (wpe_video_src_debug, "wpevideosrc", 0, "WPE Video Source");
GST_DEBUG_CATEGORY_INIT (wpe_view_debug, "wpeview", 0, "WPE Threaded View");
GST_DEBUG_CATEGORY_INIT (wpe_src_debug, "wpesrc", 0, "WPE Source");
extension_path = g_build_filename (dirname, "wpe-extension", NULL);
g_free (dirname);
if (filename != NULL) {
dirname = g_path_get_dirname (filename);
extension_path = g_build_filename (dirname, "wpe-extension", NULL);
g_free (dirname);
}
result = gst_element_register (plugin, "wpevideosrc", GST_RANK_NONE,
GST_TYPE_WPE_VIDEO_SRC);
result &= gst_element_register(plugin, "wpesrc", GST_RANK_NONE, GST_TYPE_WPE_SRC);

View file

@ -211,7 +211,7 @@ gst_cuda_buffer_pool_start (GstBufferPool * pool)
return FALSE;
}
return GST_BUFFER_POOL_CLASS (parent_class)->start (pool);
return TRUE;
}
static gboolean

View file

@ -362,7 +362,6 @@ gst_d3d11_buffer_pool_start (GstBufferPool * pool)
GstD3D11BufferPool *self = GST_D3D11_BUFFER_POOL (pool);
GstD3D11BufferPoolPrivate *priv = self->priv;
guint i;
gboolean ret;
GST_DEBUG_OBJECT (self, "Start");
@ -378,22 +377,6 @@ gst_d3d11_buffer_pool_start (GstBufferPool * pool)
}
}
ret = GST_BUFFER_POOL_CLASS (parent_class)->start (pool);
if (!ret) {
GST_ERROR_OBJECT (self, "Failed to start");
for (i = 0; i < G_N_ELEMENTS (priv->alloc); i++) {
GstD3D11Allocator *alloc = priv->alloc[i];
if (!alloc)
break;
gst_d3d11_allocator_set_active (alloc, FALSE);
}
return FALSE;
}
return TRUE;
}

View file

@ -834,7 +834,6 @@ _gst_d3d11_device_get_adapter (const GstD3D11DeviceConstructData * data,
ComPtr < IDXGIDevice > dxgi_device;
ComPtr < IDXGIAdapter > adapter;
ID3D11Device *device = data->data.device;
guint luid;
hr = device->QueryInterface (IID_PPV_ARGS (&dxgi_device));
if (FAILED (hr))
@ -852,7 +851,7 @@ _gst_d3d11_device_get_adapter (const GstD3D11DeviceConstructData * data,
if (FAILED (hr))
return hr;
luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid);
auto luid = gst_d3d11_luid_to_int64 (&desc.AdapterLuid);
for (guint i = 0;; i++) {
DXGI_ADAPTER_DESC tmp_desc;

View file

@ -196,9 +196,13 @@ have_dx_math = cxx.compiles('''
name: 'DirectXMath support in Windows SDK')
if not have_dx_math
directxmath_dep = dependency('directxmath',
directxmath_dep = dependency('DirectXMath', 'directxmath',
allow_fallback: true,
required: get_option('d3d11-math'))
version: '>= 3.1.9',
required: d3d11_opt)
if not directxmath_dep.found()
subdir_done()
endif
extra_deps += [directxmath_dep]
endif

View file

@ -981,7 +981,11 @@ on_error (GstPlay * self, GError * err, const GstStructure * details)
g_quark_to_string (err->domain), err->code);
#ifndef GST_DISABLE_GST_DEBUG
extra_details = gst_structure_copy (details);
if (details != NULL) {
extra_details = gst_structure_copy (details);
} else {
extra_details = gst_structure_new_empty ("error-details");
}
if (gst_play_config_get_pipeline_dump_in_error_details (self->config)) {
dot_data = gst_debug_bin_to_dot_data (GST_BIN_CAST (self->playbin),
GST_DEBUG_GRAPH_SHOW_ALL);
@ -4593,6 +4597,7 @@ gst_play_get_video_snapshot (GstPlay * self,
GstPlaySnapshotFormat format, const GstStructure * config)
{
gint video_tracks = 0;
GstPlayVideoInfo *video_info = NULL;
GstSample *sample = NULL;
GstCaps *caps = NULL;
gint width = -1;
@ -4601,10 +4606,20 @@ gst_play_get_video_snapshot (GstPlay * self,
gint par_d = 1;
g_return_val_if_fail (GST_IS_PLAY (self), NULL);
g_object_get (self->playbin, "n-video", &video_tracks, NULL);
if (video_tracks == 0) {
GST_DEBUG_OBJECT (self, "total video track num is 0");
return NULL;
if (self->use_playbin3) {
video_info = gst_play_get_current_video_track (self);
if (video_info == NULL) {
GST_DEBUG_OBJECT (self, "no current video track");
return NULL;
} else {
g_object_unref (video_info);
}
} else {
g_object_get (self->playbin, "n-video", &video_tracks, NULL);
if (video_tracks == 0) {
GST_DEBUG_OBJECT (self, "total video track num is 0");
return NULL;
}
}
switch (format) {

View file

@ -44,7 +44,7 @@ struct _GstVulkanBufferPoolPrivate
GstCaps *caps;
GstVideoInfo v_info;
gboolean add_videometa;
VkImageUsageFlags usage;
VkBufferUsageFlags usage;
VkMemoryPropertyFlags mem_props;
gsize alloc_sizes[GST_VIDEO_MAX_PLANES];
};
@ -74,7 +74,7 @@ gst_vulkan_buffer_pool_get_options (GstBufferPool * pool)
static inline gboolean
gst_vulkan_buffer_pool_config_get_allocation_params (GstStructure *
config, VkImageUsageFlags * usage, VkMemoryPropertyFlags * mem_props)
config, VkBufferUsageFlags * usage, VkMemoryPropertyFlags * mem_props)
{
if (!gst_structure_get_uint (config, "usage", usage)) {
*usage =
@ -98,7 +98,7 @@ gst_vulkan_buffer_pool_config_get_allocation_params (GstStructure *
*/
void
gst_vulkan_buffer_pool_config_set_allocation_params (GstStructure *
config, VkImageUsageFlags usage, VkMemoryPropertyFlags mem_properties)
config, VkBufferUsageFlags usage, VkMemoryPropertyFlags mem_properties)
{
/* assumption: G_TYPE_UINT is compatible with uint32_t (VkFlags) */
gst_structure_set (config, "usage", G_TYPE_UINT, usage, "memory-properties",

View file

@ -84,7 +84,7 @@ GstBufferPool *gst_vulkan_buffer_pool_new (GstVulkanDevice * devic
GST_VULKAN_API
void gst_vulkan_buffer_pool_config_set_allocation_params
(GstStructure * config,
VkImageUsageFlags usage,
VkBufferUsageFlags usage,
VkMemoryPropertyFlags mem_properties);
G_END_DECLS

View file

@ -1437,8 +1437,14 @@ gst_vulkan_operation_pipeline_barrier2 (GstVulkanOperation * self,
GstVulkanOperation *
gst_vulkan_operation_new (GstVulkanCommandPool * cmd_pool)
{
GstVulkanOperation *self;
g_return_val_if_fail (GST_IS_VULKAN_COMMAND_POOL (cmd_pool), NULL);
return g_object_new (GST_TYPE_VULKAN_OPERATION, "command-pool", cmd_pool,
self = g_object_new (GST_TYPE_VULKAN_OPERATION, "command-pool", cmd_pool,
NULL);
gst_object_ref_sink (self);
return self;
}

View file

@ -532,7 +532,12 @@ gst_vulkan_trash_fence_list_init (GstVulkanTrashFenceList * trash_list)
GstVulkanTrashList *
gst_vulkan_trash_fence_list_new (void)
{
return g_object_new (gst_vulkan_trash_fence_list_get_type (), NULL);
GstVulkanTrashList *ret;
ret = g_object_new (gst_vulkan_trash_fence_list_get_type (), NULL);
gst_object_ref_sink (ret);
return ret;
}
GST_DEFINE_MINI_OBJECT_TYPE (GstVulkanTrash, gst_vulkan_trash);

View file

@ -33,6 +33,26 @@ real live maintainer, or some actual wide use.
</GitRepository>
</repository>
<release>
<Version>
<revision>1.24.2</revision>
<branch>1.24</branch>
<name></name>
<created>2024-04-09</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.24.2.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.1</revision>
<branch>1.24</branch>
<name></name>
<created>2024-03-21</created>
<file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.24.1.tar.xz" />
</Version>
</release>
<release>
<Version>
<revision>1.24.0</revision>

View file

@ -169,10 +169,10 @@ gst_alpha_decode_bin_constructed (GObject * obj)
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
gst_object_unref (src_pad);
g_object_set (queue, "max-size-bytes", 0, "max-size-time", 0,
"max-size-buffers", 1, NULL);
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time", 0,
"max-size-buffers", 1, NULL);
g_object_set (queue, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
/* signal success, we will handle this in NULL->READY transition */
priv->constructed = TRUE;

View file

@ -551,7 +551,7 @@ static gboolean
dvbenc_write_object_data (GstByteWriter * b, int object_version, int page_id,
int object_id, SubpictureRect * s)
{
guint seg_size_pos, end_pos;
guint seg_size_pos, end_pos, bottom_end_pos;
guint pixel_fields_size_pos, top_start_pos, bottom_start_pos;
EncodeRLEFunc encode_rle_func;
const gint stride = GST_VIDEO_INFO_PLANE_STRIDE (&s->frame->info, 0);
@ -588,13 +588,15 @@ dvbenc_write_object_data (GstByteWriter * b, int object_version, int page_id,
if (h > 1)
encode_rle_func (b, pixels + stride, stride * 2, w, h >> 1);
end_pos = gst_byte_writer_get_pos (b);
bottom_end_pos = gst_byte_writer_get_pos (b);
/* If the encoded size of the top+bottom field data blocks is even,
* add a stuffing byte */
if (((end_pos - top_start_pos) & 1) == 0) {
if (((bottom_end_pos - top_start_pos) & 1) == 0) {
gst_byte_writer_put_uint8 (b, 0);
end_pos = gst_byte_writer_get_pos (b);
} else {
end_pos = bottom_end_pos;
}
/* Re-write the size fields */
@ -605,12 +607,12 @@ dvbenc_write_object_data (GstByteWriter * b, int object_version, int page_id,
if (bottom_start_pos - top_start_pos > G_MAXUINT16)
return FALSE; /* Data too big */
if (end_pos - bottom_start_pos > G_MAXUINT16)
if (bottom_end_pos - bottom_start_pos > G_MAXUINT16)
return FALSE; /* Data too big */
gst_byte_writer_set_pos (b, pixel_fields_size_pos);
gst_byte_writer_put_uint16_be (b, bottom_start_pos - top_start_pos);
gst_byte_writer_put_uint16_be (b, end_pos - bottom_start_pos);
gst_byte_writer_put_uint16_be (b, bottom_end_pos - bottom_start_pos);
gst_byte_writer_set_pos (b, end_pos);
GST_LOG ("Object seg size %u top_size %u bottom_size %u",

View file

@ -625,6 +625,11 @@ parse_set_object_data (GstDVDSpu * dvdspu, guint8 type, guint8 * payload,
PGS_DUMP ("Object ID %d ver %u flags 0x%02x\n", obj_id, obj_ver, flags);
if (!obj) {
GST_ERROR ("unknown Object ID %d", obj_id);
return 0;
}
if (flags & PGS_OBJECT_UPDATE_FLAG_START_RLE) {
obj->rle_data_ver = obj_ver;

View file

@ -405,6 +405,7 @@ gst_jpeg_parse_sof (GstJpegParse * parse, GstJpegSegment * seg)
&& parse->height < ((parse->orig_height * 3) / 4)) {
parse->interlace_mode = GST_VIDEO_INTERLACE_MODE_INTERLEAVED;
} else if (parse->avid) {
/* if no container info, let's suppose it doubles its height */
if (parse->orig_height == 0)
parse->orig_height = 2 * hdr.height;
parse->interlace_mode = GST_VIDEO_INTERLACE_MODE_INTERLEAVED;
@ -531,11 +532,11 @@ gst_jpeg_parse_app0 (GstJpegParse * parse, GstJpegSegment * seg)
if (!gst_byte_reader_get_uint8 (&reader, &unit))
return FALSE;
parse->avid = TRUE;
parse->field = unit == 1 ? 0 : 1;
parse->avid = (unit > 0); /* otherwise is not interleaved */
/* TODO: update caps for interlaced MJPEG */
GST_DEBUG_OBJECT (parse, "MJPEG interleaved field: %d", unit);
GST_DEBUG_OBJECT (parse, "MJPEG interleaved field: %s", unit == 0 ?
"not interleaved" : unit % 2 ? "Odd" : "Even");
return TRUE;
}
@ -820,6 +821,7 @@ gst_jpeg_parse_finish_frame (GstJpegParse * parse, GstBaseParseFrame * frame,
GST_WARNING_OBJECT (parse, "Potentially invalid picture");
}
GST_TRACE_OBJECT (parse, "Finish frame %" GST_PTR_FORMAT, frame->buffer);
ret = gst_base_parse_finish_frame (bparse, frame, size);
gst_jpeg_parse_reset (parse);
@ -935,22 +937,16 @@ gst_jpeg_parse_handle_frame (GstBaseParse * bparse, GstBaseParseFrame * frame,
GST_WARNING_OBJECT (parse, "Failed to parse com segment");
break;
case GST_JPEG_MARKER_APP0:
if (!gst_jpeg_parse_app0 (parse, &seg)) {
GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
("Invalid data"), ("Failed to parse app0 segment"));
}
if (!gst_jpeg_parse_app0 (parse, &seg))
GST_WARNING_OBJECT (parse, "Failed to parse app0 segment");
break;
case GST_JPEG_MARKER_APP1:
if (!gst_jpeg_parse_app1 (parse, &seg)) {
GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
("Invalid data"), ("Failed to parse app1 segment"));
}
if (!gst_jpeg_parse_app1 (parse, &seg))
GST_WARNING_OBJECT (parse, "Failed to parse app1 segment");
break;
case GST_JPEG_MARKER_APP14:
if (!gst_jpeg_parse_app14 (parse, &seg)) {
GST_ELEMENT_WARNING (parse, STREAM, FORMAT,
("Invalid data"), ("Failed to parse app14 segment"));
}
if (!gst_jpeg_parse_app14 (parse, &seg))
GST_WARNING_OBJECT (parse, "Failed to parse app14 segment");
break;
case GST_JPEG_MARKER_DHT:
case GST_JPEG_MARKER_DAC:

View file

@ -538,11 +538,15 @@ get_utc_from_offset (GstRtpOnvifTimestamp * self, GstBuffer * buf)
guint64 time = GST_CLOCK_TIME_NONE;
if (GST_BUFFER_PTS_IS_VALID (buf)) {
time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME,
GST_BUFFER_PTS (buf));
if (gst_segment_to_stream_time_full (&self->segment, GST_FORMAT_TIME,
GST_BUFFER_PTS (buf), &time) < 0) {
time = GST_CLOCK_TIME_NONE;
}
} else if (GST_BUFFER_DTS_IS_VALID (buf)) {
time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME,
GST_BUFFER_DTS (buf));
if (gst_segment_to_stream_time_full (&self->segment, GST_FORMAT_TIME,
GST_BUFFER_DTS (buf), &time) < 0) {
time = GST_CLOCK_TIME_NONE;
}
} else {
g_assert_not_reached ();
}
@ -556,7 +560,7 @@ get_utc_from_offset (GstRtpOnvifTimestamp * self, GstBuffer * buf)
}
static gboolean
handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf, gboolean last)
{
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
guint8 *data;
@ -665,7 +669,7 @@ handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
}
/* Set E if this the last buffer of a contiguous section of recording */
if (self->set_e_bit) {
if (last && self->set_e_bit) {
GST_DEBUG_OBJECT (self, "set E flag");
field |= (1 << 6);
self->set_e_bit = FALSE;
@ -679,7 +683,7 @@ handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
}
/* Set T if we have received EOS */
if (self->set_t_bit) {
if (last && self->set_t_bit) {
GST_DEBUG_OBJECT (self, "set T flag");
field |= (1 << 4);
self->set_t_bit = FALSE;
@ -701,7 +705,7 @@ done:
static GstFlowReturn
handle_and_push_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
{
if (!handle_buffer (self, buf)) {
if (!handle_buffer (self, buf, TRUE)) {
gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
@ -732,13 +736,15 @@ gst_rtp_onvif_timestamp_chain (GstPad * pad, GstObject * parent,
static gboolean
do_handle_buffer (GstBuffer ** buffer, guint idx, GstRtpOnvifTimestamp * self)
{
return handle_buffer (self, *buffer);
return handle_buffer (self, *buffer, idx + 1 == self->current_list_size);
}
/* @buf: (transfer full) */
static GstFlowReturn
handle_and_push_buffer_list (GstRtpOnvifTimestamp * self, GstBufferList * list)
{
self->current_list_size = gst_buffer_list_length (list);
if (!gst_buffer_list_foreach (list, (GstBufferListFunc) do_handle_buffer,
self)) {
gst_buffer_list_unref (list);

View file

@ -73,6 +73,7 @@ struct _GstRtpOnvifTimestamp {
GQueue *event_queue;
GstBuffer *buffer;
GstBufferList *list;
guint current_list_size;
};
struct _GstRtpOnvifTimestampClass {

View file

@ -1334,7 +1334,7 @@ gst_rist_src_finalize (GObject * object)
g_clear_object (&src->jitterbuffer);
g_clear_object (&src->rtxbin);
gst_caps_unref (src->caps);
gst_clear_caps (&src->caps);
g_free (src->encoding_name);
g_mutex_unlock (&src->bonds_lock);

View file

@ -40,9 +40,6 @@ GST_DEBUG_CATEGORY (h264_parse_debug);
#define DEFAULT_CONFIG_INTERVAL (0)
#define DEFAULT_UPDATE_TIMECODE FALSE
#define HIST_IDX_CURR 0
#define HIST_IDX_PREV 1
enum
{
PROP_0,
@ -85,14 +82,6 @@ enum
GST_H264_PARSE_SEI_PARSED = 2,
};
typedef enum
{
GST_H264_PARSE_BACKLOG_STATUS_AU_INCOMPLETE = 0,
GST_H264_PARSE_BACKLOG_STATUS_AU_COMPLETE,
GST_H264_PARSE_BACKLOG_STATUS_UPD_FAILED,
GST_H264_PARSE_BACKLOG_STATUS_NOT_SUPPORTED
} GstH264ParseBacklogStatus;
#define GST_H264_PARSE_STATE_VALID(parse, expected_state) \
(((parse)->state & (expected_state)) == (expected_state))
@ -139,9 +128,6 @@ static gboolean gst_h264_parse_src_event (GstBaseParse * parse,
static void gst_h264_parse_update_src_caps (GstH264Parse * h264parse,
GstCaps * caps);
static GstH264ParseBacklogStatus gst_h264_parse_update_backlog (GstH264Parse *
h264parse, GstH264NalUnit * nalu);
static void
gst_h264_parse_class_init (GstH264ParseClass * klass)
{
@ -219,15 +205,6 @@ gst_h264_parse_init (GstH264Parse * h264parse)
h264parse->aud_needed = TRUE;
h264parse->aud_insert = TRUE;
h264parse->update_timecode = DEFAULT_UPDATE_TIMECODE;
h264parse->nal_backlog = g_array_new (FALSE, FALSE, sizeof (GstH264NalUnit));
h264parse->bl_curr_au_last_vcl = -1;
h264parse->bl_next_au_first_vcl = 1;
h264parse->bl_next_au_first_nal = 1;
h264parse->bl_next_nal = 0;
h264parse->bl_last_aud_nal = -1;
h264parse->history_slice[HIST_IDX_CURR].valid = FALSE;
h264parse->history_slice[HIST_IDX_PREV].valid = FALSE;
}
static void
@ -239,7 +216,6 @@ gst_h264_parse_finalize (GObject * object)
TRUE);
g_object_unref (h264parse->frame_out);
g_array_unref (h264parse->nal_backlog);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -249,6 +225,9 @@ gst_h264_parse_reset_frame (GstH264Parse * h264parse)
{
GST_DEBUG_OBJECT (h264parse, "reset frame");
/* done parsing; reset state */
h264parse->current_off = -1;
h264parse->update_caps = FALSE;
h264parse->idr_pos = -1;
h264parse->sei_pos = -1;
@ -336,7 +315,6 @@ gst_h264_parse_reset (GstH264Parse * h264parse)
h264parse->discard_bidirectional = FALSE;
h264parse->marker = FALSE;
g_array_set_size (h264parse->nal_backlog, 0);
gst_h264_parse_reset_stream_info (h264parse);
}
@ -358,7 +336,6 @@ gst_h264_parse_start (GstBaseParse * parse)
h264parse->field_pic_flag = 0;
h264parse->aud_needed = TRUE;
h264parse->aud_insert = FALSE;
h264parse->current_off = -1;
gst_base_parse_set_min_frame_size (parse, 4);
@ -975,66 +952,6 @@ gst_h264_parse_process_sei (GstH264Parse * h264parse, GstH264NalUnit * nalu)
g_array_free (messages, TRUE);
}
static void
gst_h264_parse_update_vcl_nal_history_sps (GstH264Parse * h264parse,
GstH264SPS * sps)
{
h264parse->history_sps[HIST_IDX_PREV] = h264parse->history_sps[HIST_IDX_CURR];
h264parse->history_sps[HIST_IDX_CURR].pic_order_cnt_type =
sps->pic_order_cnt_type;
h264parse->history_sps[HIST_IDX_CURR].profile_idc = sps->profile_idc;
}
static void
gst_h264_parse_update_vcl_nal_history_pps (GstH264Parse * h264parse,
GstH264PPS * pps)
{
gst_h264_parse_update_vcl_nal_history_sps (h264parse, pps->sequence);
h264parse->history_pps[HIST_IDX_PREV] = h264parse->history_pps[HIST_IDX_CURR];
h264parse->history_pps[HIST_IDX_CURR].id = pps->id;
}
static void
gst_h264_parse_update_vcl_nal_history_nalu (GstH264Parse * h264parse,
GstH264NalUnit * nalu)
{
h264parse->history_nalu[HIST_IDX_PREV]
= h264parse->history_nalu[HIST_IDX_CURR];
h264parse->history_nalu[HIST_IDX_CURR].ref_idc = nalu->ref_idc;
h264parse->history_nalu[HIST_IDX_CURR].idr_pic_flag = nalu->idr_pic_flag;
if (GST_H264_IS_MVC_NALU (nalu))
h264parse->history_nalu[HIST_IDX_CURR].view_id =
nalu->extension.mvc.view_id;
}
static void
gst_h264_parse_update_vcl_nal_history (GstH264Parse * h264parse,
GstH264NalUnit * nalu, GstH264SliceHdr * slice)
{
gst_h264_parse_update_vcl_nal_history_nalu (h264parse, nalu);
gst_h264_parse_update_vcl_nal_history_pps (h264parse, slice->pps);
h264parse->history_slice[HIST_IDX_PREV]
= h264parse->history_slice[HIST_IDX_CURR];
h264parse->history_slice[HIST_IDX_CURR].valid = TRUE;
h264parse->history_slice[HIST_IDX_CURR].frame_num = slice->frame_num;
h264parse->history_slice[HIST_IDX_CURR].field_pic_flag
= slice->field_pic_flag;
h264parse->history_slice[HIST_IDX_CURR].bottom_field_flag
= slice->bottom_field_flag;
h264parse->history_slice[HIST_IDX_CURR].idr_pic_id = slice->idr_pic_id;
h264parse->history_slice[HIST_IDX_CURR].delta_pic_order_cnt[0]
= slice->delta_pic_order_cnt[0];
h264parse->history_slice[HIST_IDX_CURR].delta_pic_order_cnt[1]
= slice->delta_pic_order_cnt[1];
h264parse->history_slice[HIST_IDX_CURR].pic_order_cnt_lsb
= slice->pic_order_cnt_lsb;
h264parse->history_slice[HIST_IDX_CURR].delta_pic_order_cnt_bottom
= slice->delta_pic_order_cnt_bottom;
h264parse->history_slice[HIST_IDX_CURR].first_mb_in_slice
= slice->first_mb_in_slice;
}
/* caller guarantees 2 bytes of nal payload */
static gboolean
gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
@ -1133,6 +1050,10 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
h264parse->header = TRUE;
break;
case GST_H264_NAL_SEI:
/* expected state: got-sps */
if (!GST_H264_PARSE_STATE_VALID (h264parse, GST_H264_PARSE_STATE_GOT_SPS))
return FALSE;
h264parse->header = TRUE;
gst_h264_parse_process_sei (h264parse, nalu);
/* mark SEI pos */
@ -1262,6 +1183,44 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
return TRUE;
}
/* caller guarantees at least 2 bytes of nal payload for each nal
* returns TRUE if next_nal indicates that nal terminates an AU */
static inline gboolean
gst_h264_parse_collect_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
{
GstH264NalUnitType nal_type = nalu->type;
gboolean complete;
/* determine if AU complete */
GST_LOG_OBJECT (h264parse, "next nal type: %d %s (picture started %i)",
nal_type, _nal_name (nal_type), h264parse->picture_start);
/* consider a coded slices (IDR or not) to start a picture,
* (so ending the previous one) if first_mb_in_slice == 0
* (non-0 is part of previous one) */
/* NOTE this is not entirely according to Access Unit specs in 7.4.1.2.4,
* but in practice it works in sane cases, needs not much parsing,
* and also works with broken frame_num in NAL
* (where spec-wise would fail) */
complete = h264parse->picture_start && ((nal_type >= GST_H264_NAL_SEI &&
nal_type <= GST_H264_NAL_AU_DELIMITER) ||
(nal_type >= 14 && nal_type <= 18));
/* first_mb_in_slice == 0 considered start of frame */
if (nalu->size > nalu->header_bytes)
complete |= h264parse->picture_start && (nal_type == GST_H264_NAL_SLICE
|| nal_type == GST_H264_NAL_SLICE_DPA
|| nal_type == GST_H264_NAL_SLICE_IDR) &&
(nalu->data[nalu->offset + nalu->header_bytes] & 0x80);
GST_LOG_OBJECT (h264parse, "au complete: %d", complete);
if (complete)
h264parse->picture_start = FALSE;
return complete;
}
static guint8 au_delim[6] = {
0x00, 0x00, 0x00, 0x01, /* nal prefix */
0x09, /* nal unit type = access unit delimiter */
@ -1378,451 +1337,6 @@ gst_h264_parse_handle_frame_packetized (GstBaseParse * parse,
return ret;
}
static gboolean
gst_h264_parse_received_first_vcl_nal_base (GstH264Parse * h264parse,
GstH264ParseHistorySlice * slice_hdr_prev)
{
/* Ref. ITU-T H.264, 7.4.1.2.4 */
GstH264ParseHistorySlice *slice_hdr_curr
= &h264parse->history_slice[HIST_IDX_CURR];
GstH264ParseHistoryPPS *pps_hist_curr
= &h264parse->history_pps[HIST_IDX_CURR];
GstH264ParseHistoryPPS *pps_hist_prev
= &h264parse->history_pps[HIST_IDX_PREV];
GstH264ParseHistorySPS *sps_hist_curr
= &h264parse->history_sps[HIST_IDX_CURR];
GstH264ParseHistorySPS *sps_hist_prev
= &h264parse->history_sps[HIST_IDX_PREV];
GstH264ParseHistoryNalUnit *nalu_hist_curr
= &h264parse->history_nalu[HIST_IDX_CURR];
GstH264ParseHistoryNalUnit *nalu_hist_prev
= &h264parse->history_nalu[HIST_IDX_PREV];
if (slice_hdr_curr->frame_num != slice_hdr_prev->frame_num) {
return TRUE;
} else if (pps_hist_curr->id != pps_hist_prev->id) {
return TRUE;
} else if (slice_hdr_curr->field_pic_flag != slice_hdr_prev->field_pic_flag) {
return TRUE;
} else if (slice_hdr_curr->field_pic_flag
&& (slice_hdr_curr->bottom_field_flag
!= slice_hdr_prev->bottom_field_flag)) {
return TRUE;
} else if ((nalu_hist_curr->ref_idc == 0 || nalu_hist_prev->ref_idc == 0)
&& nalu_hist_curr->ref_idc != nalu_hist_prev->ref_idc) {
return TRUE;
} else if (sps_hist_curr->pic_order_cnt_type == 0
&& sps_hist_prev->pic_order_cnt_type == 0
&& (slice_hdr_curr->pic_order_cnt_lsb
!= slice_hdr_prev->pic_order_cnt_lsb
|| slice_hdr_curr->delta_pic_order_cnt_bottom
!= slice_hdr_prev->delta_pic_order_cnt_bottom)) {
return TRUE;
} else if (sps_hist_curr->pic_order_cnt_type == 1
&& sps_hist_prev->pic_order_cnt_type == 1
&& (slice_hdr_curr->delta_pic_order_cnt[0]
!= slice_hdr_prev->delta_pic_order_cnt[0]
|| slice_hdr_curr->delta_pic_order_cnt[1]
!= slice_hdr_prev->delta_pic_order_cnt[1])) {
return TRUE;
} else if (nalu_hist_curr->idr_pic_flag != nalu_hist_prev->idr_pic_flag) {
return TRUE;
} else if (nalu_hist_curr->idr_pic_flag == 1
&& nalu_hist_prev->idr_pic_flag == 1
&& (slice_hdr_curr->idr_pic_id != slice_hdr_prev->idr_pic_id)) {
return TRUE;
} else if (slice_hdr_curr->first_mb_in_slice
<= slice_hdr_prev->first_mb_in_slice) {
return TRUE;
}
return FALSE;
}
static gboolean
gst_h264_parse_received_first_vcl_nal_mvc (GstH264Parse * h264parse,
GstH264ParseHistorySlice * slice_hdr_prev)
{
/* Ref. ITU-T H.264, H.7.4.1.2.4 */
GstH264ParseHistoryNalUnit *nalu_hist_curr
= &h264parse->history_nalu[HIST_IDX_CURR];
GstH264ParseHistoryNalUnit *nalu_hist_prev
= &h264parse->history_nalu[HIST_IDX_PREV];
if (nalu_hist_curr->view_id != nalu_hist_prev->view_id)
return TRUE;
return gst_h264_parse_received_first_vcl_nal_base (h264parse, slice_hdr_prev);
}
static gboolean
gst_h264_parse_received_first_vcl_nal (GstH264Parse * h264parse)
{
GstH264ParseHistorySlice *slice_hdr_prev
= &h264parse->history_slice[HIST_IDX_PREV];
GstH264ParseHistorySPS *sps_hist_prev
= &h264parse->history_sps[HIST_IDX_PREV];
if (slice_hdr_prev->valid) {
switch (sps_hist_prev->profile_idc) {
case GST_H264_PROFILE_BASELINE:
case GST_H264_PROFILE_MAIN:
case GST_H264_PROFILE_EXTENDED:
case GST_H264_PROFILE_HIGH:
case GST_H264_PROFILE_HIGH10:
case GST_H264_PROFILE_HIGH_422:
case GST_H264_PROFILE_HIGH_444:
return gst_h264_parse_received_first_vcl_nal_base (h264parse,
slice_hdr_prev);
case GST_H264_PROFILE_MULTIVIEW_HIGH:
case GST_H264_PROFILE_STEREO_HIGH:
return gst_h264_parse_received_first_vcl_nal_mvc (h264parse,
slice_hdr_prev);
case GST_H264_PROFILE_SCALABLE_BASELINE:
case GST_H264_PROFILE_SCALABLE_HIGH:
/* SVC not supported, should not be reached */
g_return_val_if_reached (FALSE);
default:
return FALSE;
}
}
return FALSE;
}
static gboolean
is_potential_nonvcl_au_limit (GstH264NalUnit * nalu)
{
gboolean ret = FALSE;
switch (nalu->type) {
case GST_H264_NAL_AU_DELIMITER:
case GST_H264_NAL_SPS:
case GST_H264_NAL_PPS:
case GST_H264_NAL_SEI:
case GST_H264_NAL_PREFIX_UNIT:
case GST_H264_NAL_SUBSET_SPS:
case GST_H264_NAL_DEPTH_SPS:
case GST_H264_NAL_RSV_1:
case GST_H264_NAL_RSV_2:
ret = TRUE;
break;
default:
break;
}
return ret;
}
static GstH264ParseBacklogStatus
gst_h264_parse_update_backlog (GstH264Parse * h264parse, GstH264NalUnit * nalu)
{
gboolean is_first_vcl_nal = FALSE;
GstH264ParserResult pres;
GstH264SliceHdr slice_hdr;
gboolean nvcl_before_cau_vcl = FALSE;
g_array_append_val (h264parse->nal_backlog, *nalu);
#define LAST_IDX (h264parse->nal_backlog->len -1)
/* Update nal_backlog_potential_au_first_idx following
* ref. ITU-T H.264 7.4.1.2.3 */
switch (nalu->type) {
case GST_H264_NAL_SLICE:
case GST_H264_NAL_SLICE_DPA:
case GST_H264_NAL_SLICE_DPB:
case GST_H264_NAL_SLICE_DPC:
case GST_H264_NAL_SLICE_IDR:
case GST_H264_NAL_SLICE_EXT:
GST_DEBUG_OBJECT (h264parse, "vcl nal (%u) added to backlog", nalu->type);
pres = gst_h264_parser_parse_slice_hdr (h264parse->nalparser, nalu,
&slice_hdr, FALSE, FALSE);
if (pres == GST_H264_PARSER_OK) {
gst_h264_parse_update_vcl_nal_history (h264parse, nalu, &slice_hdr);
is_first_vcl_nal = gst_h264_parse_received_first_vcl_nal (h264parse);
} else {
/* Reset vcl nal history */
h264parse->history_slice[HIST_IDX_PREV].valid = FALSE;
/* Reset backlog */
h264parse->bl_curr_au_last_vcl = -1;
h264parse->bl_next_au_first_vcl = 1;
h264parse->bl_next_au_first_nal = 1;
h264parse->bl_next_nal = 0;
h264parse->bl_last_aud_nal = -1;
g_array_set_size (h264parse->nal_backlog, 0);
GST_DEBUG_OBJECT (h264parse, "Failed to parse slice header");
return GST_H264_PARSE_BACKLOG_STATUS_UPD_FAILED;
}
if (h264parse->bl_curr_au_last_vcl == -1) {
/* initialization, first vcl nal reception */
h264parse->bl_curr_au_last_vcl = LAST_IDX;
/* set index above backlog, meaning not received */
h264parse->bl_next_au_first_vcl = h264parse->nal_backlog->len;
h264parse->bl_next_au_first_nal = h264parse->bl_next_au_first_vcl;
} else {
if (!is_first_vcl_nal) {
is_first_vcl_nal =
h264parse->bl_last_aud_nal > h264parse->bl_curr_au_last_vcl;
}
h264parse->bl_last_aud_nal = -1;
if (is_first_vcl_nal) {
h264parse->bl_next_au_first_vcl = LAST_IDX;
/* First AUD, SPS, PPS, SEI, PREFIX_UNIT, SUBSET_SPS, DEPTH_SPS,
* RSV1, RSV2 between last vcl nal of current AU and first vcl nal
* of next AU define the first nal of the next AU, otherwise
* first vcl nal of next AU is the first nal on next AU.*/
if (h264parse->bl_next_au_first_nal <= h264parse->bl_curr_au_last_vcl)
h264parse->bl_next_au_first_nal = h264parse->bl_next_au_first_vcl;
else
g_assert (h264parse->bl_next_au_first_nal <=
h264parse->bl_next_au_first_vcl);
} else {
h264parse->bl_next_au_first_vcl = h264parse->nal_backlog->len;
/*if previous vcl nal was not the last, non vcl nal can't be last,
* therefore we move index of last nal to the last received vcl
* nal.*/
h264parse->bl_next_au_first_nal = h264parse->bl_next_au_first_vcl;
}
}
break;
case GST_H264_NAL_AU_DELIMITER:
h264parse->bl_last_aud_nal = LAST_IDX;
default:
if (h264parse->bl_curr_au_last_vcl == -1) {
/* if we didn't receive any vcl, any nal from next au hasn't been
* received yet. In this state all nal from backlog belong to
* current AU. */
h264parse->bl_next_au_first_nal = h264parse->nal_backlog->len;
h264parse->bl_next_au_first_vcl = h264parse->nal_backlog->len;
}
nvcl_before_cau_vcl =
h264parse->bl_next_au_first_nal <= h264parse->bl_curr_au_last_vcl;
if (is_potential_nonvcl_au_limit (nalu)) {
/* these nal define the the first nal of a new AU if they are between
* the last vcl nal (of current AU) and first vcl (of next AU).*/
if (nvcl_before_cau_vcl)
h264parse->bl_next_au_first_nal = LAST_IDX;
/* Not the most efficient way has this will done again in _process_nal
* but sps and pps must be parsed before parsing s slice hdr. */
if (nalu->type == GST_H264_NAL_SPS) {
GstH264SPS sps;
gst_h264_parser_parse_sps (h264parse->nalparser, nalu, &sps);
g_return_val_if_fail (sps.profile_idc !=
GST_H264_PROFILE_SCALABLE_BASELINE
&& sps.profile_idc != GST_H264_PROFILE_SCALABLE_HIGH,
GST_H264_PARSE_BACKLOG_STATUS_NOT_SUPPORTED);
} else if (nalu->type == GST_H264_NAL_PPS) {
GstH264PPS pps;
gst_h264_parser_parse_pps (h264parse->nalparser, nalu, &pps);
} else if (nalu->type == GST_H264_NAL_SUBSET_SPS) {
GstH264SPS sps;
gst_h264_parser_parse_subset_sps (h264parse->nalparser, nalu, &sps);
g_return_val_if_fail (sps.profile_idc !=
GST_H264_PROFILE_SCALABLE_BASELINE
&& sps.profile_idc != GST_H264_PROFILE_SCALABLE_HIGH,
GST_H264_PARSE_BACKLOG_STATUS_NOT_SUPPORTED);
}
}
GST_DEBUG_OBJECT (h264parse, "Non-vcl nal (%u) added to backlog",
nalu->type);
break;
}
return is_first_vcl_nal ? GST_H264_PARSE_BACKLOG_STATUS_AU_COMPLETE :
GST_H264_PARSE_BACKLOG_STATUS_AU_INCOMPLETE;
}
static void
gst_h264_parse_trim_backlog (GstH264Parse * h264parse)
{
g_array_remove_range (h264parse->nal_backlog, 0,
h264parse->bl_next_au_first_nal);
h264parse->bl_next_nal = 0;
h264parse->bl_curr_au_last_vcl =
h264parse->bl_next_au_first_vcl - h264parse->bl_next_au_first_nal;
h264parse->bl_last_aud_nal -= h264parse->bl_curr_au_last_vcl;
h264parse->bl_next_au_first_nal = h264parse->bl_curr_au_last_vcl + 1;
h264parse->bl_next_au_first_vcl = h264parse->bl_next_au_first_nal;
}
static void
gst_h264_parse_clear_backlog (GstH264Parse * h264parse)
{
h264parse->bl_next_nal = 0;
g_array_remove_range (h264parse->nal_backlog, 0, h264parse->nal_backlog->len);
h264parse->bl_curr_au_last_vcl = -1;
h264parse->bl_next_au_first_nal = 1;
h264parse->bl_next_au_first_vcl = 1;
h264parse->bl_last_aud_nal = -1;
}
static gboolean
gst_h264_parse_process_backlog_loop (GstH264Parse * h264parse,
gint curr_next_thresh, gboolean adjust_offset_for_next,
gboolean * aud_insert, guint8 * data, gint * framesize)
{
GstH264NalUnit *bnalu;
gint i, size = 0;
for (i = h264parse->bl_next_nal; i < h264parse->nal_backlog->len; i++) {
bnalu = &g_array_index (h264parse->nal_backlog, GstH264NalUnit, i);
if (i < curr_next_thresh) {
if (aud_insert != NULL && i == 0 &&
bnalu->type != GST_H264_NAL_AU_DELIMITER)
*aud_insert = TRUE;
bnalu->data = (guint8 *) data;
if (gst_h264_parse_process_nal (h264parse, bnalu) == FALSE)
return FALSE;
size = bnalu->offset + bnalu->size;
h264parse->bl_next_nal = i + 1;
} else if (adjust_offset_for_next) {
/* section of backlog that belong to next AU */
bnalu->offset -= size;
bnalu->sc_offset -= size;
}
}
*framesize += size;
return TRUE;
}
static gboolean
gst_h264_parse_process_backlog_nal (GstH264Parse * h264parse, gint * proc_size,
gboolean * aud_insert, guint8 * data, gboolean drain, gboolean au_completed)
{
GstH264NalUnit *bnalu;
gint framesize = 0;
gboolean next_is_aud = FALSE;
g_assert (h264parse->nal_backlog != NULL);
g_assert (h264parse->nal_backlog->len > 0);
bnalu = &g_array_index (h264parse->nal_backlog, GstH264NalUnit,
h264parse->nal_backlog->len - 1);
h264parse->current_off = bnalu->offset + bnalu->size;
/* If the index of the first NAL from next AU is after the current AU vcl
* and the AU is not completed, we can't send the this nal downstream since
* we might need to insert a AUD before and we will only know this when we've
* received a new vcl nal. In this scenario even if we are in NAL alignment
* mode we have to keep non vcl NAL, that can start a AU, and only send them
* down stream when we know if the belong to current AU, in which case we
* just send them or belong if it belong to next AU where we might need to
* insert a AUD. If the first nal from next AU is a AUD we don't need to wait
* the completion the first vcl from next AU, AUD is the start of next AU.
*/
if (!gst_h264_parse_process_backlog_loop (h264parse,
h264parse->bl_next_au_first_nal, FALSE, aud_insert, data,
&framesize)) {
goto fail;
}
/* We've processed a complete AU */
if (au_completed) {
gst_h264_parse_trim_backlog (h264parse);
}
if (h264parse->bl_next_nal < h264parse->nal_backlog->len) {
bnalu = &g_array_index (h264parse->nal_backlog, GstH264NalUnit,
h264parse->bl_next_nal);
next_is_aud = bnalu->type == GST_H264_NAL_AU_DELIMITER;
}
/* Process all backlog. Used when draining or in NAL mode and nals still
* in backlog after completing or next is AUD. */
if ((au_completed || drain || next_is_aud)) {
if (!gst_h264_parse_process_backlog_loop (h264parse,
h264parse->nal_backlog->len, TRUE, aud_insert, data, &framesize)) {
goto fail;
}
}
/* Backlog content doesn't need to parsed again, adjust offset accordingly. */
h264parse->current_off -= framesize;
if (proc_size)
*proc_size = framesize;
return TRUE;
fail:
gst_h264_parse_clear_backlog (h264parse);
return FALSE;
}
static gboolean
gst_h264_parse_process_backlog (GstH264Parse * h264parse, gint * proc_size,
gboolean * aud_insert, guint8 * data, gboolean proc_nau, gboolean clear_bl)
{
GstH264NalUnit *bnalu;
gint framesize = 0;
g_assert (h264parse->nal_backlog != NULL);
g_assert (h264parse->nal_backlog->len > 0);
bnalu = &g_array_index (h264parse->nal_backlog, GstH264NalUnit,
h264parse->nal_backlog->len - 1);
h264parse->current_off = bnalu->offset + bnalu->size;
if (!gst_h264_parse_process_backlog_loop (h264parse,
h264parse->bl_next_au_first_nal, !proc_nau, aud_insert, data,
&framesize)) {
goto fail;
}
/* We've processed a complete AU */
if (h264parse->bl_next_au_first_nal < h264parse->nal_backlog->len) {
gst_h264_parse_trim_backlog (h264parse);
}
/* Process all backlog. Used when draining or output in NAL mode. */
if (proc_nau) {
gint drain_size = 0;
if (!gst_h264_parse_process_backlog_loop (h264parse,
h264parse->nal_backlog->len, TRUE, aud_insert, data, &drain_size)) {
goto fail;
}
/* returned size is pointing the byte position of the last nalu end.
* do not accumulate but replace with last nalu position */
if (drain_size > 0)
framesize = drain_size;
}
if (clear_bl) {
gst_h264_parse_clear_backlog (h264parse);
}
/* What is in the backlog doesn't need to parsed again, adjust offset
* accordingly.*/
h264parse->current_off -= framesize;
if (proc_size)
*proc_size = framesize;
return TRUE;
fail:
gst_h264_parse_clear_backlog (h264parse);
return FALSE;
}
static GstFlowReturn
gst_h264_parse_handle_frame (GstBaseParse * parse,
GstBaseParseFrame * frame, gint * skipsize)
@ -1838,12 +1352,9 @@ gst_h264_parse_handle_frame (GstBaseParse * parse,
GstH264NalUnit nalu;
GstH264ParserResult pres;
gint framesize;
GstH264ParseBacklogStatus blstatus = FALSE;
if (G_UNLIKELY (GST_BUFFER_FLAG_IS_SET (frame->buffer,
GST_BUFFER_FLAG_DISCONT))) {
// If any input buffer is marked discont we propagate discont
// to parsed output buffer.
h264parse->discont = TRUE;
}
@ -1887,28 +1398,14 @@ gst_h264_parse_handle_frame (GstBaseParse * parse,
/* The parser is being drain, but no new data was added, just prentend this
* AU is complete */
if (current_off == size) {
if (drain) {
GST_DEBUG_OBJECT (h264parse, "draining with no new data");
framesize = current_off;
if (!gst_h264_parse_process_backlog (h264parse, &framesize,
&h264parse->aud_insert, data, TRUE, FALSE)) {
*skipsize = current_off;
goto skip;
}
goto end;
} else {
/* All data already parsed, we need more data. */
goto more;
}
if (drain && current_off == size) {
GST_DEBUG_OBJECT (h264parse, "draining with no new data");
nalu.size = 0;
nalu.offset = current_off;
goto end;
}
/* In some case the base class can reduce the amount of data it gave us on
* previous call. When this happen we just ask for more data. */
if (current_off > size) {
goto more;
}
g_assert (current_off < size);
GST_DEBUG_OBJECT (h264parse, "last parse position %d", current_off);
/* check for initial skip */
@ -1948,9 +1445,6 @@ gst_h264_parse_handle_frame (GstBaseParse * parse,
case GST_H264_PARSER_OK:
GST_DEBUG_OBJECT (h264parse, "complete nal (offset, size): (%u, %u) ",
nalu.offset, nalu.size);
if ((nalu.offset + nalu.size) == size)
nonext = TRUE;
break;
case GST_H264_PARSER_NO_NAL:
/* In NAL alignment, assume the NAL is broken */
@ -2004,16 +1498,11 @@ gst_h264_parse_handle_frame (GstBaseParse * parse,
if (current_off == 0) {
GST_DEBUG_OBJECT (h264parse, "skipping broken nal");
*skipsize = nalu.offset;
h264parse->current_off = -1;
goto skip;
} else {
GST_DEBUG_OBJECT (h264parse, "terminating au");
framesize = nalu.sc_offset;
if (!gst_h264_parse_process_backlog (h264parse, &framesize,
&h264parse->aud_insert, data, FALSE, TRUE)) {
*skipsize = current_off;
goto skip;
}
nalu.size = 0;
nalu.offset = nalu.sc_offset;
goto end;
}
break;
@ -2022,73 +1511,79 @@ gst_h264_parse_handle_frame (GstBaseParse * parse,
break;
}
blstatus = gst_h264_parse_update_backlog (h264parse, &nalu);
if (blstatus == GST_H264_PARSE_BACKLOG_STATUS_UPD_FAILED) {
*skipsize = nalu.size + nalu.offset;
GST_WARNING_OBJECT (h264parse, "Failed to update backlog");
GST_DEBUG_OBJECT (h264parse, "%p complete nal found. Off: %u, Size: %u",
data, nalu.offset, nalu.size);
if (gst_h264_parse_collect_nal (h264parse, &nalu)) {
h264parse->aud_needed = TRUE;
/* complete current frame, if it exist */
if (current_off > 0) {
nalu.size = 0;
nalu.offset = nalu.sc_offset;
h264parse->marker = TRUE;
break;
}
}
if (!gst_h264_parse_process_nal (h264parse, &nalu)) {
GST_WARNING_OBJECT (h264parse,
"broken/invalid nal Type: %d %s, Size: %u will be dropped",
nalu.type, _nal_name (nalu.type), nalu.size);
*skipsize = nalu.size;
goto skip;
} else if (blstatus == GST_H264_PARSE_BACKLOG_STATUS_NOT_SUPPORTED) {
/* SVC is not supported */
GST_ELEMENT_ERROR (h264parse, STREAM, FORMAT,
("Error parsing H.264 stream"), ("Not supported H.264 stream"));
goto invalid_stream;
}
if (h264parse->align == GST_H264_PARSE_ALIGN_NAL) {
if (!gst_h264_parse_process_backlog_nal (h264parse, &framesize,
&h264parse->aud_insert, data, drain,
blstatus == GST_H264_PARSE_BACKLOG_STATUS_AU_COMPLETE)) {
*skipsize = current_off;
}
if (framesize > 0)
goto end;
} else if (h264parse->align == GST_H264_PARSE_ALIGN_AU) {
if (h264parse->in_align != GST_H264_PARSE_ALIGN_AU) {
if (blstatus == GST_H264_PARSE_BACKLOG_STATUS_AU_COMPLETE) {
if (!gst_h264_parse_process_backlog (h264parse, &framesize,
&h264parse->aud_insert, data, FALSE, FALSE)) {
*skipsize = current_off;
goto skip;
}
if (framesize > 0)
goto end;
} else if (drain && nonext) {
if (!gst_h264_parse_process_backlog (h264parse, &framesize,
&h264parse->aud_insert, data, TRUE, FALSE)) {
*skipsize = current_off;
goto skip;
}
goto end;
}
} else {
/* Accumulate all NALs from current AU in backlog */
if (nonext) {
/* input and output alignment are AU, there's nothing to do more than
* inserting a AUD if it's missing. */
if (!gst_h264_parse_process_backlog (h264parse, &framesize,
&h264parse->aud_insert, data, TRUE, TRUE)) {
*skipsize = current_off;
goto skip;
}
goto end;
}
}
/* Make sure the next buffer will contain an AUD */
if (h264parse->aud_needed) {
h264parse->aud_insert = TRUE;
h264parse->aud_needed = FALSE;
}
/* Do not push immediately if we don't have all headers. This ensure that
* our caps are complete, avoiding a renegotiation */
if (h264parse->align == GST_H264_PARSE_ALIGN_NAL &&
!GST_H264_PARSE_STATE_VALID (h264parse,
GST_H264_PARSE_STATE_VALID_PICTURE_HEADERS))
frame->flags |= GST_BASE_PARSE_FRAME_FLAG_QUEUE;
/* if no next nal, we reached the end of this buffer */
if (nonext) {
/* If there is a marker flag, or input is AU, we know this is complete */
if (GST_BUFFER_FLAG_IS_SET (frame->buffer, GST_BUFFER_FLAG_MARKER) ||
h264parse->in_align == GST_H264_PARSE_ALIGN_AU) {
h264parse->marker = TRUE;
break;
}
/* or if we are draining */
if (drain || h264parse->align == GST_H264_PARSE_ALIGN_NAL)
break;
current_off = nalu.offset + nalu.size;
goto more;
}
/* If the output is NAL, we are done */
if (h264parse->align == GST_H264_PARSE_ALIGN_NAL)
break;
GST_DEBUG_OBJECT (h264parse, "Looking for more");
current_off = nalu.offset + nalu.size;
} /* while end */
/* expect at least 3 bytes start_code, and 1 bytes NALU header.
* the length of the NALU payload can be zero.
* (e.g. EOS/EOB placed at the end of an AU.) */
if (size - current_off < 4) {
/* Finish the frame if there is no more data in the stream */
if (drain)
break;
goto more;
}
}
end:
framesize = nalu.offset + nalu.size;
gst_buffer_unmap (buffer, &map);
@ -2115,10 +1610,8 @@ skip:
* slice NAL was received. This means that broken pictures are discarded */
if (h264parse->align != GST_H264_PARSE_ALIGN_AU ||
!(h264parse->state & GST_H264_PARSE_STATE_VALID_PICTURE_HEADERS) ||
(h264parse->state & GST_H264_PARSE_STATE_GOT_SLICE)) {
(h264parse->state & GST_H264_PARSE_STATE_GOT_SLICE))
gst_h264_parse_reset_frame (h264parse);
h264parse->current_off = -1;
}
goto out;
invalid_stream:

View file

@ -48,40 +48,6 @@ typedef struct _H264Params H264Params;
GType gst_h264_parse_get_type (void);
typedef struct
{
gboolean valid;
guint16 frame_num;
guint8 field_pic_flag;
guint8 bottom_field_flag;
guint16 idr_pic_id;
gint32 delta_pic_order_cnt[2];
guint16 pic_order_cnt_lsb;
guint32 delta_pic_order_cnt_bottom;
guint32 first_mb_in_slice;
} GstH264ParseHistorySlice;
typedef struct
{
guint16 ref_idc;
guint8 idr_pic_flag;
/* For MVC Extension */
guint16 view_id;
} GstH264ParseHistoryNalUnit;
typedef struct
{
guint8 pic_order_cnt_type;
guint8 profile_idc;
} GstH264ParseHistorySPS;
typedef struct
{
gint id;
} GstH264ParseHistoryPPS;
typedef struct _GstH264Parse GstH264Parse;
typedef struct _GstH264ParseClass GstH264ParseClass;
@ -191,24 +157,6 @@ struct _GstH264Parse
GstVideoMultiviewFlags multiview_flags;
gboolean first_in_bundle;
/* For insertion of AU Delimiter */
GArray *nal_backlog;
/* Index of last vcl nal of current AU in backlog */
gint bl_curr_au_last_vcl;
/* Index of first vcl nal of next AU in backlog */
gint bl_next_au_first_vcl;
/* Index of first nal of next AU in backlog */
gint bl_next_au_first_nal;
/* Index of next nal to be processed in backlog */
gint bl_next_nal;
/* Index of last AUD */
gint bl_last_aud_nal;
GstVideoParseUserData user_data;
GstVideoParseUserDataUnregistered user_data_unregistered;
@ -220,12 +168,6 @@ struct _GstH264Parse
/* For forward predicted trickmode */
gboolean discard_bidirectional;
/* First VCL NAL unit of primary code picuture detection context */
GstH264ParseHistorySlice history_slice[2];
GstH264ParseHistoryNalUnit history_nalu[2];
GstH264ParseHistorySPS history_sps[2];
GstH264ParseHistoryPPS history_pps[2];
};
struct _GstH264ParseClass

View file

@ -161,13 +161,13 @@ gst_video_parse_user_data (GstElement * elt, GstVideoParseUserData * user_data,
a53_process_708_cc_data =
(cc_count & CEA_708_PROCESS_CC_DATA_FLAG) != 0;
if (!a53_process_708_cc_data) {
GST_WARNING_OBJECT (elt,
GST_DEBUG_OBJECT (elt,
"ignoring closed captions as CEA_708_PROCESS_CC_DATA_FLAG is not set");
}
process_708_em_data = (cc_count & CEA_708_PROCESS_EM_DATA_FLAG) != 0;
if (!process_708_em_data) {
GST_WARNING_OBJECT (elt,
GST_DEBUG_OBJECT (elt,
"CEA_708_PROCESS_EM_DATA_FLAG flag is not set");
}
if (!gst_byte_reader_get_uint8 (br, &temp)) {
@ -175,7 +175,7 @@ gst_video_parse_user_data (GstElement * elt, GstVideoParseUserData * user_data,
break;
}
if (temp != 0xff) {
GST_WARNING_OBJECT (elt, "em data does not equal 0xFF");
GST_DEBUG_OBJECT (elt, "em data does not equal 0xFF");
}
process_708_em_data = process_708_em_data && (temp == 0xff);
/* ignore process_708_em_data as there is content that doesn't follow spec for this field */

View file

@ -1,5 +1,5 @@
project('gst-plugins-bad', 'c', 'cpp',
version : '1.24.0',
version : '1.24.2',
meson_version : '>= 1.1',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])

View file

@ -286,6 +286,74 @@ gst_caps_to_at_format (GstCaps * caps, AudioStreamBasicDescription * format)
return TRUE;
}
/* These are the position orders that AudioToolbox outputs,
* derived experimentally.
*/
/* *INDENT-OFF* */
static const struct
{
gint channels;
GstAudioChannelPosition positions[8];
}
channel_layouts[] = {
{3, {
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
}},
{4, {
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
}},
{5, {
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
}},
{6, {
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_LFE1,
}},
{8, {
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT,
GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_LFE1,
}},
};
/* *INDENT-ON* */
static void
gst_atdec_get_channel_positions (GstATDec * atdec, gint channels,
GstAudioChannelPosition * positions)
{
guint64 mask;
for (guint i = 0; i < G_N_ELEMENTS (channel_layouts); ++i) {
if (channel_layouts[i].channels == channels) {
memcpy (positions, channel_layouts[i].positions,
channels * sizeof (*positions));
return;
}
}
GST_WARNING_OBJECT (atdec, "Unknown channel count %u", channels);
mask = gst_audio_channel_get_fallback_mask (channels);
gst_audio_channel_positions_from_mask (channels, mask, positions);
}
static gboolean
gst_atdec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
{
@ -320,16 +388,32 @@ gst_atdec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
"rate", G_TYPE_INT, (int) input_format.mSampleRate,
"channels", G_TYPE_INT, input_format.mChannelsPerFrame, NULL);
/* The layout passed to AudioQueueSetOfflineRenderFormat() is ignored, and
* setting kAudioQueueProperty_ChannelLayout has no effect either.
* The actual layout is derived experimentally here.
* It's not in a valid order for GStreamer, so we have to reorder in
* gst_atdec_handle_frame().
*/
if (input_format.mChannelsPerFrame > 2) {
guint64 mask;
gst_atdec_get_channel_positions (atdec, input_format.mChannelsPerFrame,
atdec->at_channel_positions);
gst_audio_channel_positions_to_mask (atdec->at_channel_positions,
input_format.mChannelsPerFrame, FALSE, &mask);
/* gst_audio_info_from_caps() below will convert the mask back into a
* valid order, which we will use when reordering. */
gst_caps_set_simple (output_caps, "channel-mask", GST_TYPE_BITMASK, mask,
NULL);
}
/* configure output_format from caps */
gst_caps_to_at_format (output_caps, &output_format);
/* set the format we want to negotiate downstream */
gst_audio_info_from_caps (&output_info, output_caps);
gst_audio_info_set_format (&output_info,
output_format.mFormatFlags & kLinearPCMFormatFlagIsSignedInteger ?
GST_AUDIO_FORMAT_S16LE : GST_AUDIO_FORMAT_F32LE,
output_format.mSampleRate, output_format.mChannelsPerFrame, NULL);
gst_audio_decoder_set_output_format (decoder, &output_info);
gst_audio_decoder_set_output_caps (decoder, output_caps);
gst_caps_unref (output_caps);
status = AudioQueueNewOutput (&input_format, gst_atdec_buffer_emptied,
@ -337,12 +421,7 @@ gst_atdec_set_format (GstAudioDecoder * decoder, GstCaps * caps)
if (status)
goto create_queue_error;
/* FIXME: figure out how to map this properly */
if (output_format.mChannelsPerFrame == 1)
output_layout.mChannelLayoutTag = kAudioChannelLayoutTag_Mono;
else
output_layout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
output_layout.mChannelLayoutTag = kAudioChannelLayoutTag_Unknown;
status = AudioQueueSetOfflineRenderFormat (atdec->queue,
&output_format, &output_layout);
if (status)
@ -452,6 +531,12 @@ gst_atdec_offline_render (GstATDec * atdec, GstAudioInfo * audio_info)
gst_buffer_fill (out, 0, output_buffer->mAudioData,
output_buffer->mAudioDataByteSize);
if (GST_AUDIO_INFO_CHANNELS (audio_info) > 2)
gst_audio_buffer_reorder_channels (out,
GST_AUDIO_INFO_FORMAT (audio_info),
GST_AUDIO_INFO_CHANNELS (audio_info),
atdec->at_channel_positions, audio_info->position);
flow_ret =
gst_audio_decoder_finish_frame (GST_AUDIO_DECODER (atdec), out, 1);
GST_DEBUG_OBJECT (atdec, "Finished buffer: %s",

View file

@ -40,6 +40,8 @@ struct _GstATDec
AudioQueueRef queue;
gint spf;
guint64 input_position, output_position;
GstAudioChannelPosition at_channel_positions[64];
};
struct _GstATDecClass

View file

@ -80,7 +80,7 @@ static void gst_vtdec_finalize (GObject * object);
static gboolean gst_vtdec_start (GstVideoDecoder * decoder);
static gboolean gst_vtdec_stop (GstVideoDecoder * decoder);
static void gst_vtdec_loop (GstVtdec * self);
static void gst_vtdec_output_loop (GstVtdec * self);
static gboolean gst_vtdec_negotiate (GstVideoDecoder * decoder);
static gboolean gst_vtdec_set_format (GstVideoDecoder * decoder,
GstVideoCodecState * state);
@ -234,7 +234,7 @@ gst_vtdec_start (GstVideoDecoder * decoder)
/* Create the output task, but pause it immediately */
vtdec->pause_task = TRUE;
if (!gst_pad_start_task (GST_VIDEO_DECODER_SRC_PAD (decoder),
(GstTaskFunction) gst_vtdec_loop, vtdec, NULL)) {
(GstTaskFunction) gst_vtdec_output_loop, vtdec, NULL)) {
GST_ERROR_OBJECT (vtdec, "failed to start output thread");
return FALSE;
}
@ -295,7 +295,7 @@ gst_vtdec_stop (GstVideoDecoder * decoder)
}
static void
gst_vtdec_loop (GstVtdec * vtdec)
gst_vtdec_output_loop (GstVtdec * vtdec)
{
GstVideoCodecFrame *frame;
GstFlowReturn ret = GST_FLOW_OK;
@ -340,6 +340,8 @@ gst_vtdec_loop (GstVtdec * vtdec)
GST_LOG_OBJECT (vtdec, "dropping frame %d", frame->system_frame_number);
gst_video_decoder_drop_frame (decoder, frame);
} else {
GST_TRACE_OBJECT (vtdec, "pushing frame %d",
frame->system_frame_number);
ret = gst_video_decoder_finish_frame (decoder, frame);
}
@ -480,7 +482,22 @@ gst_vtdec_negotiate (GstVideoDecoder * decoder)
gst_video_codec_state_unref (output_state);
}
peercaps = gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (vtdec), NULL);
templcaps =
gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (decoder));
peercaps =
gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (vtdec), templcaps);
gst_caps_unref (templcaps);
if (gst_caps_is_empty (peercaps)) {
GST_INFO_OBJECT (vtdec, "empty peer caps, can't negotiate");
gst_caps_unref (peercaps);
if (prevcaps)
gst_caps_unref (prevcaps);
return FALSE;
}
if (prevcaps && gst_caps_can_intersect (prevcaps, peercaps)) {
/* The hardware decoder can become (temporarily) unavailable across
* VTDecompressionSessionCreate/Destroy calls. So if the currently configured
@ -490,14 +507,10 @@ gst_vtdec_negotiate (GstVideoDecoder * decoder)
GST_INFO_OBJECT (vtdec,
"current and peer caps are compatible, keeping current caps");
caps = gst_caps_ref (prevcaps);
gst_caps_unref (peercaps);
} else {
templcaps =
gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (decoder));
caps =
gst_caps_intersect_full (peercaps, templcaps, GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (templcaps);
caps = peercaps;
}
gst_caps_unref (peercaps);
caps = gst_caps_truncate (gst_caps_make_writable (caps));
@ -826,13 +839,9 @@ gst_vtdec_handle_frame (GstVideoDecoder * decoder, GstVideoCodecFrame * frame)
if (task_state == GST_TASK_STOPPED || task_state == GST_TASK_PAUSED) {
/* Abort if our loop failed to push frames downstream... */
if (vtdec->downstream_ret != GST_FLOW_OK) {
if (vtdec->downstream_ret == GST_FLOW_FLUSHING)
GST_DEBUG_OBJECT (vtdec,
"Output loop stopped because of flushing, ignoring frame");
else
GST_WARNING_OBJECT (vtdec,
"Output loop stopped with error (%s), leaving",
gst_flow_get_name (vtdec->downstream_ret));
GST_DEBUG_OBJECT (vtdec,
"Output loop stopped because of %s, ignoring frame",
gst_flow_get_name (vtdec->downstream_ret));
ret = vtdec->downstream_ret;
goto drop;
@ -1181,6 +1190,7 @@ gst_vtdec_session_output_callback (void *decompression_output_ref_con,
GstVtdec *vtdec = (GstVtdec *) decompression_output_ref_con;
GstVideoCodecFrame *frame = (GstVideoCodecFrame *) source_frame_ref_con;
GstVideoCodecState *state;
gboolean push_anyway = FALSE;
GST_LOG_OBJECT (vtdec, "got output frame %p %d and VT buffer %p", frame,
frame->decode_frame_number, image_buffer);
@ -1224,9 +1234,15 @@ gst_vtdec_session_output_callback (void *decompression_output_ref_con,
* to avoid processing too many frames ahead.
* The DPB * 2 size limit is completely arbitrary. */
g_mutex_lock (&vtdec->queue_mutex);
while (gst_queue_array_get_length (vtdec->reorder_queue) >
vtdec->dbp_size * 2) {
/* If negotiate() gets called from the output loop (via finish_frame()),
* it can attempt to drain and call VTDecompressionSessionWaitForAsynchronousFrames,
* which will lock up if we decide to wait in this callback, creating a deadlock. */
push_anyway = vtdec->is_flushing || vtdec->is_draining;
while (!push_anyway
&& gst_queue_array_get_length (vtdec->reorder_queue) >
vtdec->dbp_size * 2 + 1) {
g_cond_wait (&vtdec->queue_cond, &vtdec->queue_mutex);
push_anyway = vtdec->is_flushing || vtdec->is_draining;
}
gst_queue_array_push_sorted (vtdec->reorder_queue, frame, sort_frames_by_pts,
@ -1249,7 +1265,9 @@ gst_vtdec_drain_decoder (GstVideoDecoder * decoder, gboolean flush)
if (vtdec->session == NULL)
return GST_FLOW_OK;
if (vtdec->downstream_ret != GST_FLOW_OK
/* Only early-return here if we're draining (as that needs to output frames).
* Flushing doesn't care about errors from downstream. */
if (!flush && vtdec->downstream_ret != GST_FLOW_OK
&& vtdec->downstream_ret != GST_FLOW_FLUSHING) {
GST_WARNING_OBJECT (vtdec, "Output loop stopped with error (%s), leaving",
gst_flow_get_name (vtdec->downstream_ret));

View file

@ -321,7 +321,7 @@ gst_asio_sink_create_ringbuffer (GstAudioBaseSink * sink)
for (i = 0; i < max_output_ch; i++)
channel_indices.push_back (i);
} else {
for (auto iter : channel_indices)
for (auto iter : channel_list)
channel_indices.push_back (iter);
}

View file

@ -334,7 +334,7 @@ gst_asio_src_create_ringbuffer (GstAudioBaseSrc * src)
for (i = 0; i < max_input_ch; i++)
channel_indices.push_back (i);
} else {
for (auto iter : channel_indices)
for (auto iter : channel_list)
channel_indices.push_back (iter);
}

Some files were not shown because too many files have changed in this diff Show more