mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-02 13:39:26 +00:00
Compare commits
159 commits
Author | SHA1 | Date | |
---|---|---|---|
2d82731515 | |||
380511f14d | |||
10ffbdbb1f | |||
7ce569359f | |||
2aff9380c7 | |||
a0e870263e | |||
17db91c7c1 | |||
72c6cac8db | |||
bba6f097b1 | |||
38ec8f1299 | |||
f5500906ce | |||
50bd2f2109 | |||
b96072b810 | |||
9289fb5ce4 | |||
59230efdd9 | |||
83038c3daf | |||
115b4792b5 | |||
9bbf246cc4 | |||
5453976f03 | |||
ee7026925f | |||
c259674ed5 | |||
b3d6a14737 | |||
4b6cbca300 | |||
88dd91cb30 | |||
993d8b89bc | |||
4ea7d5ae64 | |||
7aa75e590a | |||
e1b82701df | |||
b7a4b9e1ab | |||
ce4f0d5746 | |||
984b1f413a | |||
078ef786d2 | |||
99bdbd78ca | |||
ef72daea70 | |||
81a800ab9e | |||
22315a435d | |||
f85d1efafb | |||
d2aa3829b8 | |||
56ac5e9041 | |||
9301f64d72 | |||
85a78f56dc | |||
6f7d62eb73 | |||
db387f1b13 | |||
124ceabafe | |||
e1fa26e16f | |||
1d7b7b04d1 | |||
4a51579cb2 | |||
4836312360 | |||
648a1cb03a | |||
5fcc15514f | |||
d556c02aa8 | |||
6f0ad951c3 | |||
651ccd0175 | |||
0bf962dbdf | |||
e5b4f09172 | |||
9cedabae5a | |||
e47f9e8f87 | |||
3fe9a6dc8c | |||
a1c30bc6a6 | |||
25dc99f81f | |||
11eb88178b | |||
092c0eec66 | |||
ac23e04236 | |||
c4bb6d301e | |||
f1d28fdcf7 | |||
ca97570da5 | |||
1dc3fe831c | |||
e6e3ed5679 | |||
d2aeaeb73f | |||
bb43b96d2c | |||
98ed7a8201 | |||
fa44d14d2b | |||
c42d3fc6e3 | |||
5f499b7932 | |||
91ded3fa77 | |||
2980981618 | |||
0d04d702bd | |||
4020144a65 | |||
6eab0524ca | |||
d2f20d546d | |||
fe8b80704a | |||
256d990aea | |||
7a8663d051 | |||
c0d35575a8 | |||
175d116f94 | |||
0d0a1d9d16 | |||
5a80a146f0 | |||
11c6432cca | |||
bf88fb152d | |||
db6803bd55 | |||
77fa0ae0e7 | |||
9ce063f5f6 | |||
257de579b3 | |||
f8d8c6795d | |||
b547c8eebb | |||
c8f42ab3af | |||
f8ae970db2 | |||
559278420b | |||
93255efece | |||
9061e464a8 | |||
80cd85d03d | |||
2d875b5ed2 | |||
aef872944e | |||
383545d856 | |||
84d015cabb | |||
b5fe2319f3 | |||
7b6d6fe080 | |||
4295e1dd30 | |||
9048bea3d3 | |||
615b7ca7ca | |||
0fe3ffe0c0 | |||
470bcd4ec9 | |||
6e57362f35 | |||
8ca53a1a67 | |||
5a2f99a255 | |||
07e1f13e2c | |||
6b369d8470 | |||
eff6167d2d | |||
1a7d34a0e4 | |||
a7b128bb27 | |||
c04cdddd37 | |||
cee1a14bb2 | |||
8c850dba9e | |||
44d4eb096d | |||
89041ad29d | |||
45ce449854 | |||
48e0c6218d | |||
c6a5ea3825 | |||
92c0f7ddb5 | |||
d89da0f5c4 | |||
31feb293c7 | |||
381d38eb82 | |||
1c80cde250 | |||
3f9665eed2 | |||
5132c679a7 | |||
bcb016d6d2 | |||
18399d9fac | |||
b5686f4eb8 | |||
5f8f174a76 | |||
555bb8ece2 | |||
3a727fde2c | |||
0d1a0cec5e | |||
172221a2cf | |||
a620e4e0d8 | |||
d804e133e0 | |||
a4d3d80e95 | |||
538cafbd9c | |||
464cd9f9a3 | |||
fc3be23863 | |||
d3f57a9748 | |||
03cfc78059 | |||
6566f33274 | |||
5e44b3b8e0 | |||
c0fe3de2d7 | |||
5d0e8e4dbd | |||
0f3099ef5c | |||
202e255724 | |||
dd80bf8cde | |||
2c7bb61580 |
|
@ -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'
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
2
.gitlint
2
.gitlint
|
@ -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]
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -11,7 +11,6 @@ echo "-> Running ${TEST_SUITE}"
|
|||
|
||||
./gst-env.py \
|
||||
gst-validate-launcher ${TEST_SUITE} \
|
||||
--check-bugs \
|
||||
--dump-on-failure \
|
||||
--mute \
|
||||
--shuffle \
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
13
subprojects/flac.wrap
Normal 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
|
|
@ -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 GstCudaMemory’s 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. GStreamer’s 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 that’s 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: Don’t 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: Don’t install test executable
|
||||
- gst-inspect: fix –exists for plugins with versions other than GStreamer’s version, like the Rust plugins
|
||||
- identity: Don’t refuse seeks unless single-segment=true
|
||||
|
||||
gst-plugins-base
|
||||
|
||||
- audiobasesink: Don’t 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: Don’t 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: Don’t invoke close when stopping if we’ve 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: Don’t 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: Don’t include deprecated audio/video fields in publish messages
|
||||
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
|
||||
- livekitwebrtc: Fix shutdown behaviour
|
||||
- rtpgccbwe: Don’t forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
|
||||
- sccparse: Ignore invalid timecodes during seeking
|
||||
- webrtcsink: Don’t 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: Don’t 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: Don’t 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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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 GstCudaMemory’s 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. GStreamer’s 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 that’s 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: Don’t 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: Don’t install test executable
|
||||
- gst-inspect: fix –exists for plugins with versions other than GStreamer’s version, like the Rust plugins
|
||||
- identity: Don’t refuse seeks unless single-segment=true
|
||||
|
||||
gst-plugins-base
|
||||
|
||||
- audiobasesink: Don’t 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: Don’t 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: Don’t invoke close when stopping if we’ve 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: Don’t 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: Don’t include deprecated audio/video fields in publish messages
|
||||
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
|
||||
- livekitwebrtc: Fix shutdown behaviour
|
||||
- rtpgccbwe: Don’t forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
|
||||
- sccparse: Ignore invalid timecodes during seeking
|
||||
- webrtcsink: Don’t 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: Don’t 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: Don’t 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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -66,7 +66,11 @@ struct _GESFrameCompositionMeta {
|
|||
gdouble height;
|
||||
gdouble width;
|
||||
guint zorder;
|
||||
#ifdef __cplusplus
|
||||
gint _operator;
|
||||
#else
|
||||
gint operator;
|
||||
#endif
|
||||
};
|
||||
|
||||
GES_API
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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' ])
|
||||
|
|
49
subprojects/gst-editing-services/tests/check/gescpp.cc
Normal file
49
subprojects/gst-editing-services/tests/check/gescpp.cc
Normal 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);
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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 GstCudaMemory’s 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. GStreamer’s 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 that’s 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: Don’t 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: Don’t install test executable
|
||||
- gst-inspect: fix –exists for plugins with versions other than GStreamer’s version, like the Rust plugins
|
||||
- identity: Don’t refuse seeks unless single-segment=true
|
||||
|
||||
gst-plugins-base
|
||||
|
||||
- audiobasesink: Don’t 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: Don’t 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: Don’t invoke close when stopping if we’ve 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: Don’t 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: Don’t include deprecated audio/video fields in publish messages
|
||||
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
|
||||
- livekitwebrtc: Fix shutdown behaviour
|
||||
- rtpgccbwe: Don’t forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
|
||||
- sccparse: Ignore invalid timecodes during seeking
|
||||
- webrtcsink: Don’t 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: Don’t 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: Don’t 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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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[] =
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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' ])
|
||||
|
|
|
@ -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 GstCudaMemory’s 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. GStreamer’s 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 that’s 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: Don’t 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: Don’t install test executable
|
||||
- gst-inspect: fix –exists for plugins with versions other than GStreamer’s version, like the Rust plugins
|
||||
- identity: Don’t refuse seeks unless single-segment=true
|
||||
|
||||
gst-plugins-base
|
||||
|
||||
- audiobasesink: Don’t 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: Don’t 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: Don’t invoke close when stopping if we’ve 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: Don’t 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: Don’t include deprecated audio/video fields in publish messages
|
||||
- janusvrwebrtcsink: Handle various other messages to avoid printing errors
|
||||
- livekitwebrtc: Fix shutdown behaviour
|
||||
- rtpgccbwe: Don’t forward buffer lists with buffers from different SSRCs to avoid breaking assumptions in rtpsession
|
||||
- sccparse: Ignore invalid timecodes during seeking
|
||||
- webrtcsink: Don’t 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: Don’t 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: Don’t 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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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 = ¶ms,
|
||||
}
|
||||
};
|
||||
|
@ -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 =
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -73,6 +73,7 @@ struct _GstRtpOnvifTimestamp {
|
|||
GQueue *event_queue;
|
||||
GstBuffer *buffer;
|
||||
GstBufferList *list;
|
||||
guint current_list_size;
|
||||
};
|
||||
|
||||
struct _GstRtpOnvifTimestampClass {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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' ])
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -40,6 +40,8 @@ struct _GstATDec
|
|||
AudioQueueRef queue;
|
||||
gint spf;
|
||||
guint64 input_position, output_position;
|
||||
|
||||
GstAudioChannelPosition at_channel_positions[64];
|
||||
};
|
||||
|
||||
struct _GstATDecClass
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
Loading…
Reference in a new issue