Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package gstreamer-plugins-good for
openSUSE:Factory checked in at 2025-12-31 10:46:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-good (Old)
and /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-good"
Wed Dec 31 10:46:31 2025 rev:126 rq:1324799 version:1.26.10
Changes:
--------
---
/work/SRC/openSUSE:Factory/gstreamer-plugins-good/gstreamer-plugins-good.changes
2025-12-10 15:29:59.840895370 +0100
+++
/work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.1928/gstreamer-plugins-good.changes
2025-12-31 10:46:50.833059039 +0100
@@ -1,0 +2,30 @@
+Tue Dec 30 09:42:14 UTC 2025 - Bjørn Lie <[email protected]>
+
+- Update to version 1.26.10:
+ + aptivedemux2: Initialize start bitrate for dashdemux2 and
+ hlsdemux2
+ + dashdemux2: Unknown codec 'flac' when streaming a DASH MPD
+ manifest with a mp4 FLAC file
+ + deinterlace: Improve pool configuration
+ + flac: Fix 6.1 / 7.1 channel layouts
+ + flacdec: Don't forbid S32 sample size (0x07) unnecessarily
+ + flacenc: Support S32 samples
+ + flacdec: Decode 32-bit FLAC files
+ + level: fix crash if no caps have been sent
+ + level: Floating point exception (core dumped) when sending
+ buffers without caps
+ + matroskademux: Bump maximum block size from 15MB to 32MB to
+ allow 4k raw video
+ + matroskamux: Fix some more thread-safety issues
+ + matroskamux: Fix thread-safety issues when requesting new pads
+ + matroskamux: pad->track handling results in segmentation fault
+ + mxfdemux / aiffparse / matroskaparse: Remove segment closing on
+ non-flushing seeks
+ + qtdemux: Use gst_util_uint64_scale to scale guint64
+ + qtmux: Fix robust recording estimates
+ + splitmuxsrc - fix for seeking / flushing deadlock
+ + v4l2object: Add support for colorimetry 1:4:16:3
+ + wavenc: Fix downstream negotiation
+ + wavparse: prevent setting empty strings as title tag
+
+-------------------------------------------------------------------
Old:
----
gst-plugins-good-1.26.9.obscpio
New:
----
gst-plugins-good-1.26.10.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gstreamer-plugins-good.spec ++++++
--- /var/tmp/diff_new_pack.SA9bmq/_old 2025-12-31 10:46:51.649092433 +0100
+++ /var/tmp/diff_new_pack.SA9bmq/_new 2025-12-31 10:46:51.649092433 +0100
@@ -33,7 +33,7 @@
%endif
Name: gstreamer-plugins-good
-Version: 1.26.9
+Version: 1.26.10
Release: 0
Summary: GStreamer Streaming-Media Framework Plug-Ins
License: LGPL-2.1-or-later
++++++ _service ++++++
--- /var/tmp/diff_new_pack.SA9bmq/_old 2025-12-31 10:46:51.685093905 +0100
+++ /var/tmp/diff_new_pack.SA9bmq/_new 2025-12-31 10:46:51.689094070 +0100
@@ -5,7 +5,7 @@
<param
name="url">https://gitlab.freedesktop.org/gstreamer/gstreamer.git</param>
<param name="subdir">subprojects/gst-plugins-good</param>
<param name="filename">gst-plugins-good</param>
- <param name="revision">1.26.9</param>
+ <param name="revision">1.26.10</param>
<param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
<param name="versionrewrite-pattern">v?(.*)\+0</param>
<param name="versionrewrite-replacement">\1</param>
++++++ gst-plugins-good-1.26.9.obscpio -> gst-plugins-good-1.26.10.obscpio
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/NEWS
new/gst-plugins-good-1.26.10/NEWS
--- old/gst-plugins-good-1.26.9/NEWS 2025-12-01 18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/NEWS 2025-12-25 15:44:26.000000000 +0100
@@ -2,11 +2,11 @@
GStreamer 1.26.0 was originally released on 11 March 2025.
-The latest bug-fix release in the stable 1.26 series is 1.26.9 and was
released on 01 December 2025.
+The latest bug-fix release in the stable 1.26 series is 1.26.10 and was
released on 25 December 2025
See https://gstreamer.freedesktop.org/releases/1.26/ for the latest version of
this document.
-Last updated: Monday 01 December 2025, 17:00 UTC (log)
+Last updated: Thursday 25 December 2025, 15:00 UTC (log)
## Introduction
@@ -3120,6 +3120,191 @@
- List of Merge Requests applied in 1.26.9
- List of Issues fixed in 1.26.9
+1.26.10
+
+The tenth 1.26 bug-fix release (1.26.10) was released on 25 December 2025.
+
+This release only contains bugfixes and it should be safe to update from
1.26.x.
+
+Highlighted bugfixes in 1.26.10
+
+- curlhttpsrc fixes and improvements
+- decklinkvideosink: Fix frame completion callbacks for firmware 14.3+
+- flac: Fix 6.1 and 7.1 channel layouts and support encoding and decoding of
32-bit audio
+- glimagesink: Fix handling of odd height buffers
+- matroskademux: make maximum allowed block size large enough to support 4k
uncompressed video
+- mxf: Add support for custom Sony XDCAM video variant
+- opusenc: multichannel and surround sound handling improvements
+- playbin3: HLS/DASH stream selection handling improvements to fix disabling
and re-enabling of audio/video streams with
+ adaptivedemux2
+- qtmux: robust recording mode space left estimation fixes for streams that
start with a timestamp offset
+- splitmuxsrc seeking improvements
+- Support FLAC audio in DASH manifests
+- Python bindings: fix regression where buffers were no longer writable in
pad probe callbacks
+- cerbero: add python bindings for GstApp; Windows installer improvements
+- Various bug fixes,build fixes,memory leak fixes,and other stability and
reliability improvements
+
+gstreamer
+
+- pipeline: Improve resource cleanup logic for clock objects
+- filesink: fix the build with recent mingw-w64
+- basetransform, basesrc: Fix handling of buffer pool configuration failures
+
+gst-plugins-base
+
+- basetextoverlay: Don’t negotiate if caps haven’t changed
+- codec-utils: Update mime codec strings
+- fdmemory: Fix size calculation when sharing
+- gl elements add a yellow bar on JPEGs with non-even heights
+- glimagesink: Fix handling of odd height buffers
+- glwindow_cocoa: fix window not closing (w/o user window handle)
+- opusenc: Simplify Vorbis channel layout mapping code and fix 7.1 layout &
use surround multistream encoder
+- parsebin: Improve debug logging
+- playbin3: ensure GST_EVENT_SELECT_STREAMS event is sent to collection
source
+- tagdemux: propagate seek event seqnum to upstream
+- videodecoder: Don’t assume the ALLOCATION query contains a pool
+- videodecoder, videoaggregator: Fix handling of buffer pool configuration
failures
+
+gst-plugins-good
+
+- adaptivedemux2: Initialize start bitrate for dashdemux2 and hlsdemux2
+- dashdemux2: Unknown codec ‘flac’ when streaming a DASH MPD manifest with a
mp4 FLAC file
+- deinterlace: Improve pool configuration
+- flac: Fix 6.1 / 7.1 channel layouts
+- flacdec: Don’t forbid S32 sample size (0x07) unnecessarily
+- flacenc: Support S32 samples
+- flacdec: Decode 32-bit FLAC files
+- level: fix crash if no caps have been sent
+- level: Floating point exception (core dumped) when sending buffers without
caps
+- matroskademux: Bump maximum block size from 15MB to 32MB to allow 4k raw
video
+- matroskamux: Fix some more thread-safety issues
+- matroskamux: Fix thread-safety issues when requesting new pads
+- matroskamux: pad->track handling results in segmentation fault
+- mxfdemux / aiffparse / matroskaparse: Remove segment closing on
non-flushing seeks
+- qtdemux: Use gst_util_uint64_scale to scale guint64
+- qtmux: Fix robust recording estimates
+- splitmuxsrc - fix for seeking / flushing deadlock
+- v4l2object: Add support for colorimetry 1:4:16:3
+- wavenc: Fix downstream negotiation
+- wavparse: prevent setting empty strings as title tag
+
+gst-plugins-bad
+
+- aesenc / aesdec: use correct format specifier for buffer size in debug log
+- analytics: Fix build on MSVC by using libm dependency
+- curlhttpsrc: Various fixes
+- decklinkvideosink: Fix frame completion callbacks for firmware 14.3+
+- dtlsdec: mark generated cert agent with GST_OBJECT_FLAG_MAY_BE_LEAKED
+- fdkaacdec: Assertion on handling unsupported channel layouts
+- fdkaacdec: Invalidate channel_types/indices when setting a known config
+- hlssink: Guard NULL structure and use gst_structure_has_name()
+- midiparse: Fix a couple of potential out-of-bounds reads
+- mpegtsmux: Fix potential deadlock changing pmt-interval
+- mxfdemux: reconsider “closing running segment” for non flushing seeks
+- mxfdemux / aiffparse / matroskaparse: Remove segment closing on
non-flushing seeks
+- mxfdemux: Simplify timestamp tracking
+- mxfdemux: send event SegmentDone for segment seeks
+- mxfmpeg: Add custom Sony picture essence coding UL
+- playbin3: ensure GST_EVENT_SELECT_STREAMS event is sent to collection
source
+- vabasedec: Don’t assert when negotiating based on a gap event before the
first buffer
+- vkformat: Add VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16 format
+- webrtc: Keep a ref of the ICEStream in the TransportStream
+- GstPlay: set_audio_track_enabled / set_video_track_enabled not functioning
for adaptivedemux2 sources
+- video: decoders: Fix possible crash when flushing H265/H266 decoder
+
+gst-plugins-ugly
+
+- No changes
+
+GStreamer Rust plugins
+
+- cctost2038anc: Fix typo with c_not_y_channel property documentation
+- dav1d: Stop iteration after finding first working pool
+- dav1d: Various fixes to allocation query handling
+- gtk4paintablesink: Propose a udmabuf pool / allocator if upstream asks for
sysmem
+- gtk4: Fix typo in odd-size subsample workaround
+- rtp: Update to rtcp-types 0.3
+- st2038combiner: Some fixes
+- st2038extractor: Add always-add-st2038-pad property
+- threadshare: allow disabling the IPv4 or IPv6 socket in ts-udpsink
+- threadshare: Update to flume 0.12
+- tracers: add function and signal for writing logs to PadPushTimings
+- version-helper: Update to toml_edit 0.24
+- webrtc: mark static caps with GST_MINI_OBJECT_FLAG_MAY_BE_LEAKED
+- webrtcsink: don’t upscale when mitigating low bitrate
+- Fix new clippy 1.92 warnings
+- Update dependencies
+
+gst-libav
+
+- avviddec: Various fixes to allocation query handling
+- avviddec: Aggregate GstVideoAlignment on top of the meta api params,
instead of overriding them
+- avviddec: Set video alignment to internal pool
+
+gst-rtsp-server
+
+- No changes
+
+gstreamer-vaapi
+
+- No changes
+
+gstreamer-sharp
+
+- No changes
+
+gst-python
+
+- Override GstPadProbeInfo to get writable objects
+- Misc improvements
+- More typing fixes
+- 1.26.2 breaks Python bindings: No longer able to modify Gst.Buffer
metadata in pad probe callbacks
+
+gst-editing-services
+
+- python: More typing fixes
+
+gst-devtools,gst-validate + gst-integration-testsuites
+
+- dotsviewer: Update Rust dependencies
+
+gst-examples
+
+- webrtc: Update Rust dependencies
+
+gstreamer-docs
+
+- No changes
+
+Development build environment
+
+- No changes
+
+Cerbero build tool and packaging changes in 1.26.10
+
+- pkg-config: Ship it in the devel package
+- recipe: Update License enums to SPDX expressions
+- recipes: Fix GPL categorization of some plugins
+- recipes: Fix stray devel files making it into runtime
+- recipes: add GstApp python binding
+- Modernize MSI license.rtf formatting
+- Use ninja for all cmake recipes by default instead of GNU make
+- ci: Mark a racy xcode toolchain bug for retrying
+
+Contributors to 1.26.10
+
+Aaron Boxer, Brad Reitmeyer, Christoph Reiter, Doug Nazar, F. Duncanh,
François Laignel, Haejung Hwang, Hou Qi, Hyunjun Ko,
+Jakub Adam, Jan Schmidt, Jeongmin Kwak, Jerome Colle, L. E. Segovia, Mathieu
Duponchelle, Nicolas Dufresne, Nirbheek Chauhan,
+Philippe Normand, Piotr Brzeziński, Pratik Pachange, Robert Mader, Sanchayan
Maity, Sebastian Dröge, Stéphane Cerveau, Thibault
+Saunier, Tim-Philipp Müller, Tobias Schlager, Vivia Nikolaidou, Wilhelm
Bartel, Xavier Claessens, Yun Liu,
+
+… 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.26.10
+
+- List of Merge Requests applied in 1.26.10
+- List of Issues fixed in 1.26.10
+
Schedule for 1.28
Our next major feature release will be 1.28, and 1.27 will be the unstable
development version leading up to the stable 1.28
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/RELEASE
new/gst-plugins-good-1.26.10/RELEASE
--- old/gst-plugins-good-1.26.9/RELEASE 2025-12-01 18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/RELEASE 2025-12-25 15:44:26.000000000
+0100
@@ -1,4 +1,4 @@
-This is GStreamer gst-plugins-good 1.26.9.
+This is GStreamer gst-plugins-good 1.26.10.
The GStreamer team is thrilled to announce a new major feature release
of your favourite cross-platform multimedia framework!
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/docs/gst_plugins_cache.json
new/gst-plugins-good-1.26.10/docs/gst_plugins_cache.json
--- old/gst-plugins-good-1.26.9/docs/gst_plugins_cache.json 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/docs/gst_plugins_cache.json 2025-12-25
15:44:26.000000000 +0100
@@ -6980,7 +6980,7 @@
"long-name": "FLAC audio encoder",
"pad-templates": {
"sink": {
- "caps": "audio/x-raw:\n format: { S8, S16LE,
S24LE, S24_32LE }\n layout: interleaved\n rate: [ 1, 655350
]\n channels: 1\naudio/x-raw:\n format: { S8, S16LE, S24LE,
S24_32LE }\n layout: interleaved\n rate: [ 1, 655350 ]\n
channels: 2\n channel-mask: 0x0000000000000003\naudio/x-raw:\n
format: { S8, S16LE, S24LE, S24_32LE }\n layout: interleaved\n
rate: [ 1, 655350 ]\n channels: 3\n channel-mask:
0x0000000000000007\naudio/x-raw:\n format: { S8, S16LE, S24LE, S24_32LE
}\n layout: interleaved\n rate: [ 1, 655350 ]\n
channels: 4\n channel-mask: 0x0000000000000033\naudio/x-raw:\n
format: { S8, S16LE, S24LE, S24_32LE }\n layout: interleaved\n
rate: [ 1, 655350 ]\n channels: 5\n channel-mask:
0x0000000000000037\naudio/x-raw:\n format: { S8, S16LE, S24LE, S24_32LE
}\n layout: interleaved
\n rate: [ 1, 655350 ]\n channels: 6\n channel-mask:
0x000000000000003f\naudio/x-raw:\n format: { S8, S16LE, S24LE, S24_32LE
}\n layout: interleaved\n rate: [ 1, 655350 ]\n
channels: 7\n channel-mask: 0x000000000000013f\naudio/x-raw:\n
format: { S8, S16LE, S24LE, S24_32LE }\n layout: interleaved\n
rate: [ 1, 655350 ]\n channels: 8\n channel-mask:
0x0000000000000c3f\n",
+ "caps": "audio/x-raw:\n format: { S8, S16LE,
S24LE, S24_32LE, S32LE }\n layout: interleaved\n rate: [ 1,
655350 ]\n channels: 1\naudio/x-raw:\n format: { S8, S16LE,
S24LE, S24_32LE, S32LE }\n layout: interleaved\n rate: [ 1,
655350 ]\n channels: 2\n channel-mask:
0x0000000000000003\naudio/x-raw:\n format: { S8, S16LE, S24LE,
S24_32LE, S32LE }\n layout: interleaved\n rate: [ 1, 655350
]\n channels: 3\n channel-mask: 0x0000000000000007\naudio/x-raw:\n
format: { S8, S16LE, S24LE, S24_32LE, S32LE }\n layout:
interleaved\n rate: [ 1, 655350 ]\n channels: 4\n
channel-mask: 0x0000000000000033\naudio/x-raw:\n format: { S8, S16LE,
S24LE, S24_32LE, S32LE }\n layout: interleaved\n rate: [ 1,
655350 ]\n channels: 5\n channel-mask:
0x0000000000000037\naudio/x-raw:\n format: { S8, S16LE, S24LE, S24_3
2LE, S32LE }\n layout: interleaved\n rate: [ 1, 655350 ]\n
channels: 6\n channel-mask: 0x000000000000003f\naudio/x-raw:\n
format: { S8, S16LE, S24LE, S24_32LE, S32LE }\n layout: interleaved\n
rate: [ 1, 655350 ]\n channels: 7\n channel-mask:
0x0000000000000d0f\naudio/x-raw:\n format: { S8, S16LE, S24LE,
S24_32LE, S32LE }\n layout: interleaved\n rate: [ 1, 655350
]\n channels: 8\n channel-mask: 0x0000000000000c3f\n",
"direction": "sink",
"presence": "always"
},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/ext/adaptivedemux2/dash/gstdashdemux.c
new/gst-plugins-good-1.26.10/ext/adaptivedemux2/dash/gstdashdemux.c
--- old/gst-plugins-good-1.26.9/ext/adaptivedemux2/dash/gstdashdemux.c
2025-12-01 18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/ext/adaptivedemux2/dash/gstdashdemux.c
2025-12-25 15:44:26.000000000 +0100
@@ -689,6 +689,7 @@
demux->max_video_framerate_n = DEFAULT_MAX_VIDEO_FRAMERATE_N;
demux->max_video_framerate_d = DEFAULT_MAX_VIDEO_FRAMERATE_D;
demux->default_presentation_delay = g_strdup (DEFAULT_PRESENTATION_DELAY);
+ demux->start_bitrate = DEFAULT_START_BITRATE;
g_mutex_init (&demux->client_lock);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/ext/adaptivedemux2/hls/gsthlsdemux.c
new/gst-plugins-good-1.26.10/ext/adaptivedemux2/hls/gsthlsdemux.c
--- old/gst-plugins-good-1.26.9/ext/adaptivedemux2/hls/gsthlsdemux.c
2025-12-01 18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/ext/adaptivedemux2/hls/gsthlsdemux.c
2025-12-25 15:44:26.000000000 +0100
@@ -220,6 +220,7 @@
gst_hls_demux2_init (GstHLSDemux * demux)
{
demux->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
g_free);
+ demux->start_bitrate = DEFAULT_START_BITRATE;
g_mutex_init (&demux->keys_lock);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/ext/flac/gstflacdec.c
new/gst-plugins-good-1.26.10/ext/flac/gstflacdec.c
--- old/gst-plugins-good-1.26.9/ext/flac/gstflacdec.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/ext/flac/gstflacdec.c 2025-12-25
15:44:26.000000000 +0100
@@ -71,22 +71,20 @@
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE1,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
- GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT},
- /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */
- {
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
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_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE1,
- GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
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_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE1,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}
};
@@ -395,7 +393,7 @@
"got sync, vbs=%d,bs=%x,sr=%x,ca=%x,ss=%x,pb=%x", vbs, bs, sr, ca, ss,
pb);
- if (bs == 0 || sr == 0x0F || ca >= 0x0B || ss == 0x03 || ss == 0x07) {
+ if (bs == 0 || sr == 0x0F || ca >= 0x0B || ss == 0x03) {
return FALSE;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/ext/flac/gstflacenc.c
new/gst-plugins-good-1.26.10/ext/flac/gstflacenc.c
--- old/gst-plugins-good-1.26.9/ext/flac/gstflacenc.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/ext/flac/gstflacenc.c 2025-12-25
15:44:26.000000000 +0100
@@ -79,22 +79,20 @@
GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE1,
GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
- GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT},
- /* FIXME: 7/8 channel layouts are not defined in the FLAC specs */
- {
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT}, {
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_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE1,
- GST_AUDIO_CHANNEL_POSITION_REAR_CENTER}, {
+ GST_AUDIO_CHANNEL_POSITION_REAR_CENTER,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}, {
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_FRONT_CENTER,
GST_AUDIO_CHANNEL_POSITION_LFE1,
+ GST_AUDIO_CHANNEL_POSITION_REAR_LEFT,
+ GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT,
GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT}
};
@@ -847,6 +845,8 @@
gst_value_list_append_value (&v_list, &v);
g_value_set_static_string (&v, GST_AUDIO_NE (S24_32));
gst_value_list_append_value (&v_list, &v);
+ g_value_set_static_string (&v, GST_AUDIO_NE (S32));
+ gst_value_list_append_value (&v_list, &v);
g_value_unset (&v);
s = gst_structure_new_empty ("audio/x-raw");
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/gst/deinterlace/gstdeinterlace.c
new/gst-plugins-good-1.26.10/gst/deinterlace/gstdeinterlace.c
--- old/gst-plugins-good-1.26.9/gst/deinterlace/gstdeinterlace.c
2025-12-01 18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/deinterlace/gstdeinterlace.c
2025-12-25 15:44:26.000000000 +0100
@@ -2679,11 +2679,11 @@
{
GstQuery *query;
gboolean result = TRUE;
- GstBufferPool *pool;
+ GstBufferPool *pool = NULL;
GstAllocator *allocator;
GstAllocationParams params;
GstStructure *config;
- guint size, min, max;
+ guint size, min, max, n_pools;
if (self->passthrough) {
/* we are in passthrough, the input buffer is never copied and always
passed
@@ -2716,33 +2716,61 @@
gst_allocation_params_init (¶ms);
}
- if (gst_query_get_n_allocation_pools (query) > 0)
- gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
- else {
+ n_pools = gst_query_get_n_allocation_pools (query);
+ for (guint i = 0; i < n_pools; i++) {
+ gst_query_parse_nth_allocation_pool (query, i, &pool, &size, &min, &max);
+
+ if (!pool)
+ continue;
+
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
+ gst_buffer_pool_config_set_allocator (config, allocator, ¶ms);
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META);
+ if (gst_buffer_pool_has_option (pool,
+ GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT))
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT);
+
+ if (!gst_buffer_pool_set_config (pool, config)) {
+ config = gst_buffer_pool_get_config (pool);
+
+ if (!gst_buffer_pool_config_validate_params (config, outcaps, size, min,
+ max)) {
+ g_clear_object (&pool);
+ continue;
+ }
+
+ if (gst_buffer_pool_set_config (pool, config))
+ break;
+
+ g_clear_object (&pool);
+ }
+ }
+
+ if (!pool) {
GstVideoInfo out_info;
gst_video_info_from_caps (&out_info, outcaps);
- pool = NULL;
size = GST_VIDEO_INFO_SIZE (&out_info);
min =
MAX ((gst_deinterlace_method_get_fields_required (self->method) +
1) / 2 + 1, 4);
max = 0;
- }
- if (pool == NULL) {
/* no pool, we can make our own */
GST_DEBUG_OBJECT (self, "no pool, making new pool");
pool = gst_video_buffer_pool_new ();
- }
- /* now configure */
- config = gst_buffer_pool_get_config (pool);
- gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
- gst_buffer_pool_config_set_allocator (config, allocator, ¶ms);
- gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
- gst_buffer_pool_set_config (pool, config);
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
+ gst_buffer_pool_config_set_allocator (config, allocator, ¶ms);
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META);
+ gst_buffer_pool_set_config (pool, config);
+ }
/* now store */
result = gst_deinterlace_set_allocation (self, pool, allocator, ¶ms);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/isomp4/gstqtmux.c
new/gst-plugins-good-1.26.10/gst/isomp4/gstqtmux.c
--- old/gst-plugins-good-1.26.9/gst/isomp4/gstqtmux.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/isomp4/gstqtmux.c 2025-12-25
15:44:26.000000000 +0100
@@ -4748,11 +4748,23 @@
if (qtmux->last_moov_size > qtmux->base_moov_size && qtmux->last_dts > 0) {
GstClockTime remain;
GstClockTime time_muxed = qtmux->last_dts;
+ guint32 remain_bytes = qtmux->reserved_moov_size - qtmux->last_moov_size;
+ guint32 bytes_used_for_samples =
+ qtmux->last_moov_size - qtmux->base_moov_size;
+
+ /* Might need to account for an initial timestamp offset on this mux */
+ if (GST_CLOCK_TIME_IS_VALID (qtmux->first_ts)) {
+ if (time_muxed > qtmux->first_ts) {
+ time_muxed -= qtmux->first_ts;
+ } else {
+ time_muxed = 0;
+ }
+ }
remain =
- gst_util_uint64_scale (qtmux->reserved_moov_size -
- qtmux->last_moov_size, time_muxed,
- qtmux->last_moov_size - qtmux->base_moov_size);
+ gst_util_uint64_scale (time_muxed, remain_bytes,
+ bytes_used_for_samples);
+
/* Always under-estimate slightly, so users
* have time to stop muxing before we run out */
if (remain < GST_SECOND / 2)
@@ -4762,10 +4774,11 @@
GST_INFO_OBJECT (qtmux,
"Reserved %u header bytes. Used %u in %" GST_TIME_FORMAT
- ". Remaining now %u or approx %" G_GUINT64_FORMAT " ns\n",
- qtmux->reserved_moov_size, qtmux->last_moov_size,
+ " = %f bytes/sec. Remaining now %u or approx %" G_GUINT64_FORMAT
+ " ns\n", qtmux->reserved_moov_size, qtmux->last_moov_size,
GST_TIME_ARGS (qtmux->last_dts),
- qtmux->reserved_moov_size - qtmux->last_moov_size, remain);
+ (double) (bytes_used_for_samples) / ((double) time_muxed / GST_SECOND),
+ remain_bytes, remain);
GST_OBJECT_LOCK (qtmux);
qtmux->reserved_duration_remaining = remain;
@@ -7397,7 +7410,7 @@
else
remaining = 0;
GST_LOG_OBJECT (qtmux, "reserved duration remaining - reporting %"
- G_GUINT64_FORMAT "(%" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT,
+ G_GUINT64_FORMAT " (%" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT
")",
remaining, qtmux->reserved_duration_remaining,
qtmux->muxed_since_last_update);
g_value_set_uint64 (value, remaining);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/isomp4/qtdemux.c
new/gst-plugins-good-1.26.10/gst/isomp4/qtdemux.c
--- old/gst-plugins-good-1.26.9/gst/isomp4/qtdemux.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/isomp4/qtdemux.c 2025-12-25
15:44:26.000000000 +0100
@@ -14683,20 +14683,23 @@
/* don't overflow */
tdur1 = stream->timescale * (guint64) qtdemux->duration;
tdur2 = qtdemux->timescale * (guint64) stream->duration;
+ if (tdur1 != 0) {
+ guint64 divresult = gst_util_uint64_scale (tdur2, 10, tdur1);
- /* HACK:
- * some of those trailers, nowadays, have prologue images that are
- * themselves video tracks as well. I haven't really found a way to
- * identify those yet, except for just looking at their duration. */
- if (tdur1 != 0 && (tdur2 * 10 / tdur1) < 2) {
- GST_WARNING_OBJECT (qtdemux,
- "Track shorter than 20%% (%" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT
- " vs. %" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT ") of the stream "
- "found, assuming preview image or something; skipping track",
- stream->duration, stream->timescale, qtdemux->duration,
- qtdemux->timescale);
- gst_qtdemux_stream_unref (stream);
- return TRUE;
+ /* HACK:
+ * some of those trailers, nowadays, have prologue images that are
+ * themselves video tracks as well. I haven't really found a way to
+ * identify those yet, except for just looking at their duration. */
+ if (divresult < 2) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Track shorter than 20%% (%" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT
+ " vs. %" G_GUINT64_FORMAT "/%" G_GUINT32_FORMAT ") of the stream "
+ "found, assuming preview image or something; skipping track",
+ stream->duration, stream->timescale, qtdemux->duration,
+ qtdemux->timescale);
+ gst_qtdemux_stream_unref (stream);
+ return TRUE;
+ }
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/level/gstlevel.c
new/gst-plugins-good-1.26.10/gst/level/gstlevel.c
--- old/gst-plugins-good-1.26.9/gst/level/gstlevel.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/level/gstlevel.c 2025-12-25
15:44:26.000000000 +0100
@@ -626,6 +626,9 @@
filter = GST_LEVEL (trans);
+ if (!GST_AUDIO_INFO_IS_VALID (&filter->info))
+ return GST_FLOW_NOT_NEGOTIATED;
+
channels = GST_AUDIO_INFO_CHANNELS (&filter->info);
bps = GST_AUDIO_INFO_BPS (&filter->info);
rate = GST_AUDIO_INFO_RATE (&filter->info);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/gst/matroska/matroska-demux.c
new/gst-plugins-good-1.26.10/gst/matroska/matroska-demux.c
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-demux.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-demux.c 2025-12-25
15:44:26.000000000 +0100
@@ -5610,7 +5610,7 @@
#define GST_FLOW_OVERFLOW GST_FLOW_CUSTOM_ERROR
-#define MAX_BLOCK_SIZE (15 * 1024 * 1024)
+#define MAX_BLOCK_SIZE (32 * 1024 * 1024)
static inline GstFlowReturn
gst_matroska_demux_check_read_size (GstMatroskaDemux * demux, guint64 bytes)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/matroska/matroska-ids.c
new/gst-plugins-good-1.26.10/gst/matroska/matroska-ids.c
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-ids.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-ids.c 2025-12-25
15:44:26.000000000 +0100
@@ -127,7 +127,6 @@
*p_context = (GstMatroskaTrackContext *) subtitle_context;
(*p_context)->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE;
- subtitle_context->check_utf8 = TRUE;
subtitle_context->invalid_utf8 = FALSE;
subtitle_context->check_markup = TRUE;
subtitle_context->seen_markup_tag = FALSE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/matroska/matroska-ids.h
new/gst-plugins-good-1.26.10/gst/matroska/matroska-ids.h
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-ids.h 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-ids.h 2025-12-25
15:44:26.000000000 +0100
@@ -560,80 +560,91 @@
typedef struct _GstMatroskaTrackContext GstMatroskaTrackContext;
-/* TODO: check if all fields are used */
struct _GstMatroskaTrackContext {
- GstPad *pad;
- GstCaps *caps;
- guint index;
- /* reverse playback */
- GstClockTime from_time;
- gint64 from_offset;
- gint64 to_offset;
-
- GArray *index_table;
-
- gint index_writer_id;
-
- /* some often-used info */
- gchar *codec_id, *codec_name, *name, *language;
- gpointer codec_priv;
- gsize codec_priv_size;
- gpointer codec_state;
- gsize codec_state_size;
+ //
+ // common fields
+ //
+ gchar *codec_id, *codec_name, *name, *language;
+ gpointer codec_priv;
+ gsize codec_priv_size;
GstMatroskaTrackType type;
- guint64 uid, num;
+ guint64 uid, num;
GstMatroskaTrackFlags flags;
- guint64 default_duration;
- guint64 pos;
- gdouble timecodescale;
- guint64 seek_preroll;
- guint64 codec_delay;
+ guint64 default_duration;
+ gdouble timecodescale;
+ guint64 seek_preroll;
+ guint64 codec_delay;
+
+ /* for compatibility with VFW files, where timestamp represents DTS */
+ gboolean dts_only;
+
+ //
+ // Used only by demuxer / parser
+ //
+
+ GstPad *pad;
+ GstCaps *caps;
+ guint index;
+ guint64 pos;
+
+ /* reverse playback */
+ GstClockTime from_time;
+ gint64 from_offset;
+ gint64 to_offset;
- gboolean set_discont; /* TRUE = set DISCONT flag on next buffer */
+ GArray *index_table;
+
+ gint index_writer_id;
+
+ gpointer codec_state;
+ gsize codec_state_size;
+
+ gboolean set_discont; /* TRUE = set DISCONT flag on next buffer */
/* Queue to save the GST_PROTECTION events which will be sent before the
first source buffer */
GQueue protection_event_queue;
/* Protection information structure which will be added in protection
metadata for each encrypted buffer */
- GstStructure * protection_info;
+ GstStructure *protection_info;
/* Stream header buffer, to put into caps and send before any other buffers
*/
- GstBufferList * stream_headers;
- gboolean send_stream_headers;
-
- /* Special flag for VobSub, for which we have to send colour table info
- * (if available) first before sending any data, and just testing
- * for time == 0 is not enough to detect that. Used by demuxer */
- gboolean send_dvd_event;
-
- /* Special counter for muxer to skip the first N vorbis/theora headers -
- * they are put into codec private data, not muxed into the stream */
- guint xiph_headers_to_skip;
-
- /* Used for postprocessing a frame before it is pushed from the demuxer */
- GstFlowReturn (*postprocess_frame) (GstElement *element,
- GstMatroskaTrackContext *context,
- GstBuffer **buffer);
+ GstBufferList *stream_headers;
+ gboolean send_stream_headers;
/* List of tags for this stream */
- GstTagList *tags;
+ GstTagList *tags;
/* Tags changed and should be pushed again */
- gboolean tags_changed;
+ gboolean tags_changed;
/* A GArray of GstMatroskaTrackEncoding structures which contain the
* encoding (compression/encryption) settings for this track, if any */
- GArray *encodings;
+ GArray *encodings;
/* Whether the stream is EOS */
- gboolean eos;
+ gboolean eos;
+
+ /* indicate that the track is raw (jpeg,raw variants) and so pts=dts */
+ gboolean intra_only;
/* any alignment we need our output buffers to have */
- gint alignment;
+ gint alignment;
- /* for compatibility with VFW files, where timestamp represents DTS */
- gboolean dts_only;
+ /* Special flag for VobSub, for which we have to send colour table info
+ * (if available) first before sending any data, and just testing
+ * for time == 0 is not enough to detect that. Used by demuxer */
+ gboolean send_dvd_event;
- /* indicate that the track is raw (jpeg,raw variants) and so pts=dts */
- gboolean intra_only;
+ /* Used for postprocessing a frame before it is pushed from the demuxer */
+ GstFlowReturn (*postprocess_frame) (GstElement *element,
+ GstMatroskaTrackContext *context,
+ GstBuffer **buffer);
+
+ //
+ // Used only by muxer
+ //
+
+ /* Special counter for muxer to skip the first N vorbis/theora headers -
+ * they are put into codec private data, not muxed into the stream */
+ guint xiph_headers_to_skip;
};
typedef struct _GstMatroskaTrackVideoContext {
@@ -653,9 +664,6 @@
gboolean alpha_mode;
- /* QoS */
- GstClockTime earliest_time;
-
GstBuffer *dirac_unit;
GstVideoColorimetry colorimetry;
GstVideoChromaSite chroma_site;
@@ -664,6 +672,10 @@
gboolean mastering_display_info_present;
GstVideoContentLightLevel content_light_level;
+
+ // Only used by demuxer / parser
+ /* QoS */
+ GstClockTime earliest_time;
} GstMatroskaTrackVideoContext;
typedef struct _GstMatroskaTrackAudioContext {
@@ -671,16 +683,17 @@
guint samplerate, channels, bitdepth;
+ // Only used by demuxer / parser
guint32 wvpk_block_index;
} GstMatroskaTrackAudioContext;
typedef struct _GstMatroskaTrackSubtitleContext {
GstMatroskaTrackContext parent;
- gboolean check_utf8; /* buffers should be valid UTF-8 */
+ // Only used by demuxer
+ gboolean invalid_utf8; /* work around broken files */
gboolean check_markup; /* check if buffers contain markup
* or plaintext and escape characters */
- gboolean invalid_utf8; /* work around broken files */
gboolean seen_markup_tag; /* markup found in text */
} GstMatroskaTrackSubtitleContext;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/matroska/matroska-mux.c
new/gst-plugins-good-1.26.10/gst/matroska/matroska-mux.c
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-mux.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-mux.c 2025-12-25
15:44:26.000000000 +0100
@@ -243,7 +243,7 @@
GstAggregatorPad * agg_pad, GstBuffer * buffer);
static GstClockTime gst_matroska_mux_get_next_time (GstAggregator * agg);
-static GstPad *gst_matroska_mux_request_new_pad (GstElement * element,
+static GstAggregatorPad *gst_matroska_mux_create_new_pad (GstAggregator * agg,
GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
static void gst_matroska_mux_release_pad (GstElement * element, GstPad * pad);
@@ -408,11 +408,11 @@
G_MAXUINT64, DEFAULT_CLUSTER_TIMESTAMP_OFFSET,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
- gstelement_class->request_new_pad =
- GST_DEBUG_FUNCPTR (gst_matroska_mux_request_new_pad);
gstelement_class->release_pad =
GST_DEBUG_FUNCPTR (gst_matroska_mux_release_pad);
+ gstaggregator_class->create_new_pad =
+ GST_DEBUG_FUNCPTR (gst_matroska_mux_create_new_pad);
gstaggregator_class->aggregate =
GST_DEBUG_FUNCPTR (gst_matroska_mux_aggregate);
gstaggregator_class->clip = GST_DEBUG_FUNCPTR (gst_matroska_mux_clip);
@@ -484,7 +484,6 @@
GstMatroskaMuxPad *pad = GST_MATROSKA_MUX_PAD (object);
gst_matroska_pad_reset (pad, TRUE);
- gst_clear_tag_list (&pad->tags);
G_OBJECT_CLASS (gst_matroska_mux_pad_parent_class)->finalize (object);
}
@@ -509,6 +508,10 @@
{
pad->frame_duration = DEFAULT_PAD_FRAME_DURATION;
pad->frame_duration_user = FALSE;
+ pad->start_ts = GST_CLOCK_TIME_NONE;
+ pad->end_ts = GST_CLOCK_TIME_NONE;
+ pad->tags = gst_tag_list_new_empty ();
+ gst_tag_list_set_scope (pad->tags, GST_TAG_SCOPE_STREAM);
}
/*
@@ -533,7 +536,6 @@
/* initialize internal variables */
mux->index = NULL;
- mux->num_streams = 0;
mux->num_a_streams = 0;
mux->num_t_streams = 0;
mux->num_v_streams = 0;
@@ -574,68 +576,81 @@
static void
gst_matroska_pad_reset (GstMatroskaMuxPad * pad, gboolean full)
{
- gchar *name = NULL;
- GstMatroskaTrackType type = 0;
+ // Happens if the pad was instantiated by type and not requested
+ // from matroskamux, e.g. by the docs build.
+ if (!pad->track)
+ return;
+
+ /* reset track information */
+
+ g_clear_pointer (&pad->track->codec_id, g_free);
+ g_clear_pointer (&pad->track->codec_name, g_free);
+ g_clear_pointer (&pad->track->language, g_free);
+ g_clear_pointer (&pad->track->codec_priv, g_free);
+ pad->track->uid = gst_matroska_mux_create_uid ();
+ pad->track->num = 0;
+ /* TODO: check default values for the context */
+ pad->track->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT;
+ pad->track->default_duration = 0;
+ pad->track->timecodescale = 0.0;
+ pad->track->seek_preroll = 0;
+ pad->track->codec_delay = 0;
+ pad->track->dts_only = FALSE;
+ pad->track->xiph_headers_to_skip = 0;
- /* free track information */
- if (pad->track != NULL) {
- /* retrieve for optional later use */
- name = pad->track->name;
- type = pad->track->type;
- /* extra for video */
- if (type == GST_MATROSKA_TRACK_TYPE_VIDEO) {
- GstMatroskaTrackVideoContext *ctx =
+ switch (pad->track->type) {
+ case GST_MATROSKA_TRACK_TYPE_VIDEO:{
+ GstMatroskaTrackVideoContext *context =
(GstMatroskaTrackVideoContext *) pad->track;
- if (ctx->dirac_unit) {
- gst_buffer_unref (ctx->dirac_unit);
- ctx->dirac_unit = NULL;
- }
+ context->pixel_width = context->pixel_height = 0;
+ context->display_width = context->display_height = 0;
+ context->default_fps = 0.0;
+ context->asr_mode = GST_MATROSKA_ASPECT_RATIO_MODE_FREE;
+ context->fourcc = 0;
+ context->field_order = GST_VIDEO_FIELD_ORDER_UNKNOWN;
+ context->multiview_mode = GST_VIDEO_MULTIVIEW_MODE_MONO;
+ context->multiview_flags = 0;
+ context->alpha_mode = FALSE;
+ gst_clear_buffer (&context->dirac_unit);
+ memset (&context->colorimetry, 0, sizeof (context->colorimetry));
+ context->chroma_site = GST_VIDEO_CHROMA_SITE_UNKNOWN;
+ memset (&context->mastering_display_info, 0,
+ sizeof (context->mastering_display_info));
+ context->mastering_display_info_present = FALSE;
+ memset (&context->content_light_level, 0,
+ sizeof (context->content_light_level));
+ break;
+ }
+ case GST_MATROSKA_TRACK_TYPE_AUDIO:{
+ GstMatroskaTrackAudioContext *context =
+ (GstMatroskaTrackAudioContext *) pad->track;
+ context->samplerate = context->channels = context->bitdepth = 0;
+ break;
}
- g_free (pad->track->codec_id);
- g_free (pad->track->codec_name);
- if (full)
- g_free (pad->track->name);
- g_free (pad->track->language);
- g_free (pad->track->codec_priv);
- g_free (pad->track);
- pad->track = NULL;
- if (pad->tags) {
- gst_tag_list_unref (pad->tags);
- pad->tags = NULL;
+ case GST_MATROSKA_TRACK_TYPE_SUBTITLE:{
+ GstMatroskaTrackSubtitleContext *context =
+ (GstMatroskaTrackSubtitleContext *) pad->track;
+
+ if (!full) {
+ /* setcaps may only provide proper one a lot later */
+ context->parent.codec_id = g_strdup ("S_SUB_UNKNOWN");
+ }
+ break;
}
+ default:
+ g_assert_not_reached ();
+ return;
}
- if (!full && type != 0) {
- GstMatroskaTrackContext *context;
-
- /* create a fresh context */
- switch (type) {
- case GST_MATROSKA_TRACK_TYPE_VIDEO:
- context = (GstMatroskaTrackContext *)
- g_new0 (GstMatroskaTrackVideoContext, 1);
- break;
- case GST_MATROSKA_TRACK_TYPE_AUDIO:
- context = (GstMatroskaTrackContext *)
- g_new0 (GstMatroskaTrackAudioContext, 1);
- break;
- case GST_MATROSKA_TRACK_TYPE_SUBTITLE:
- context = (GstMatroskaTrackContext *)
- g_new0 (GstMatroskaTrackSubtitleContext, 1);
- break;
- default:
- g_assert_not_reached ();
- return;
- }
+ pad->start_ts = GST_CLOCK_TIME_NONE;
+ pad->end_ts = GST_CLOCK_TIME_NONE;
+ gst_clear_tag_list (&pad->tags);
- context->type = type;
- context->name = name;
- context->uid = gst_matroska_mux_create_uid ();
- /* TODO: check default values for the context */
- context->flags = GST_MATROSKA_TRACK_ENABLED | GST_MATROSKA_TRACK_DEFAULT;
- pad->track = context;
- pad->start_ts = GST_CLOCK_TIME_NONE;
- pad->end_ts = GST_CLOCK_TIME_NONE;
+ if (full) {
+ g_clear_pointer (&pad->track->name, g_free);
+ g_clear_pointer (&pad->track, g_free);
+ } else {
pad->tags = gst_tag_list_new_empty ();
gst_tag_list_set_scope (pad->tags, GST_TAG_SCOPE_STREAM);
}
@@ -2395,7 +2410,6 @@
through GStreamer and VLC */
GstMatroskaTrackContext *context = NULL;
- GstMatroskaTrackSubtitleContext *scontext;
const gchar *mimetype;
GstStructure *structure;
const GValue *value = NULL;
@@ -2423,14 +2437,11 @@
context = mux_pad->track;
g_assert (context);
g_assert (context->type == GST_MATROSKA_TRACK_TYPE_SUBTITLE);
- scontext = (GstMatroskaTrackSubtitleContext *) context;
structure = gst_caps_get_structure (caps, 0);
mimetype = gst_structure_get_name (structure);
/* general setup */
- scontext->check_utf8 = 1;
- scontext->invalid_utf8 = 0;
context->default_duration = 0;
if (!strcmp (mimetype, "subtitle/x-kate")) {
@@ -2508,19 +2519,18 @@
}
-static GstPad *
-gst_matroska_mux_request_new_pad (GstElement * element,
+static GstAggregatorPad *
+gst_matroska_mux_create_new_pad (GstAggregator * agg,
GstPadTemplate * templ, const gchar * req_name, const GstCaps * caps)
{
- GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
- GstMatroskaMux *mux = GST_MATROSKA_MUX (element);
+ GstElementClass *klass = GST_ELEMENT_GET_CLASS (agg);
+ GstMatroskaMux *mux = GST_MATROSKA_MUX (agg);
GstMatroskaMuxPad *pad;
gchar *name = NULL;
const gchar *pad_name = NULL;
GstMatroskaCapsFunc capsfunc = NULL;
GstMatroskaTrackContext *context = NULL;
gint pad_id;
- const gchar *id = NULL;
if (templ == gst_element_class_get_pad_template (klass, "audio_%u")) {
/* don't mix named and unnamed pads, if the pad already exists we fail when
@@ -2528,7 +2538,9 @@
if (req_name != NULL && sscanf (req_name, "audio_%u", &pad_id) == 1) {
pad_name = req_name;
} else {
- name = g_strdup_printf ("audio_%u", mux->num_a_streams++);
+ name =
+ g_strdup_printf ("audio_%u", g_atomic_int_add (&mux->num_a_streams,
+ 1));
pad_name = name;
}
capsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_audio_pad_setcaps);
@@ -2542,7 +2554,9 @@
if (req_name != NULL && sscanf (req_name, "video_%u", &pad_id) == 1) {
pad_name = req_name;
} else {
- name = g_strdup_printf ("video_%u", mux->num_v_streams++);
+ name =
+ g_strdup_printf ("video_%u", g_atomic_int_add (&mux->num_v_streams,
+ 1));
pad_name = name;
}
capsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_video_pad_setcaps);
@@ -2556,7 +2570,9 @@
if (req_name != NULL && sscanf (req_name, "subtitle_%u", &pad_id) == 1) {
pad_name = req_name;
} else {
- name = g_strdup_printf ("subtitle_%u", mux->num_t_streams++);
+ name =
+ g_strdup_printf ("subtitle_%u", g_atomic_int_add
(&mux->num_t_streams,
+ 1));
pad_name = name;
}
capsfunc = GST_DEBUG_FUNCPTR (gst_matroska_mux_subtitle_pad_setcaps);
@@ -2564,32 +2580,24 @@
g_new0 (GstMatroskaTrackSubtitleContext, 1);
context->type = GST_MATROSKA_TRACK_TYPE_SUBTITLE;
context->name = g_strdup ("Subtitle");
- /* setcaps may only provide proper one a lot later */
- id = "S_SUB_UNKNOWN";
} else {
GST_WARNING_OBJECT (mux, "This is not our template!");
return NULL;
}
pad = (GstMatroskaMuxPad *)
- GST_ELEMENT_CLASS (parent_class)->request_new_pad (element,
+ GST_AGGREGATOR_CLASS (parent_class)->create_new_pad (agg,
templ, pad_name, caps);
pad->track = context;
gst_matroska_pad_reset (pad, FALSE);
- if (id)
- gst_matroska_mux_set_codec_id (pad->track, id);
- pad->track->dts_only = FALSE;
-
pad->capsfunc = capsfunc;
g_free (name);
- mux->num_streams++;
-
GST_DEBUG_OBJECT (pad, "Added new request pad");
- return GST_PAD (pad);
+ return GST_AGGREGATOR_PAD (pad);
}
static void
@@ -2625,8 +2633,6 @@
GST_OBJECT_UNLOCK (mux);
GST_ELEMENT_CLASS (parent_class)->release_pad (element, pad);
-
- mux->num_streams--;
}
static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/matroska/matroska-mux.h
new/gst-plugins-good-1.26.10/gst/matroska/matroska-mux.h
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-mux.h 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-mux.h 2025-12-25
15:44:26.000000000 +0100
@@ -91,8 +91,7 @@
GstEbmlWrite *ebml_write;
- guint num_streams,
- num_v_streams, num_a_streams, num_t_streams;
+ guint num_v_streams, num_a_streams, num_t_streams;
/* Application name (for the writing application header element) */
gchar *writing_app;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/gst/matroska/matroska-parse.c
new/gst-plugins-good-1.26.10/gst/matroska/matroska-parse.c
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-parse.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-parse.c 2025-12-25
15:44:26.000000000 +0100
@@ -258,11 +258,6 @@
parse->seek_index = NULL;
parse->seek_entry = 0;
- if (parse->close_segment) {
- gst_event_unref (parse->close_segment);
- parse->close_segment = NULL;
- }
-
if (parse->new_segment) {
gst_event_unref (parse->new_segment);
parse->new_segment = NULL;
@@ -2863,12 +2858,8 @@
guint64 length;
guint needed;
- /* If we have to close a segment, send a new segment to do this now */
+ /* If we have to send a new segment, do this now */
if (G_LIKELY (parse->common.state == GST_MATROSKA_READ_STATE_DATA)) {
- if (G_UNLIKELY (parse->close_segment)) {
- gst_matroska_parse_send_event (parse, parse->close_segment);
- parse->close_segment = NULL;
- }
if (G_UNLIKELY (parse->new_segment)) {
gst_matroska_parse_send_event (parse, parse->new_segment);
parse->new_segment = NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/gst/matroska/matroska-parse.h
new/gst-plugins-good-1.26.10/gst/matroska/matroska-parse.h
--- old/gst-plugins-good-1.26.9/gst/matroska/matroska-parse.h 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/matroska/matroska-parse.h 2025-12-25
15:44:26.000000000 +0100
@@ -73,7 +73,6 @@
gboolean segment_running;
GstClockTime last_stop_end;
- GstEvent *close_segment;
GstEvent *new_segment;
/* some state saving */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.26.9/gst/multifile/gstsplitmuxsrc.c
new/gst-plugins-good-1.26.10/gst/multifile/gstsplitmuxsrc.c
--- old/gst-plugins-good-1.26.9/gst/multifile/gstsplitmuxsrc.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/multifile/gstsplitmuxsrc.c 2025-12-25
15:44:26.000000000 +0100
@@ -794,7 +794,7 @@
if (gst_splitmux_end_of_part (splitmux, splitpad))
// Continuing to next part, drop the EOS
goto drop_event;
- if (splitmux->segment_seqnum) {
+ if (splitmux->segment_seqnum != GST_SEQNUM_INVALID) {
event = gst_event_make_writable (event);
gst_event_set_seqnum (event, splitmux->segment_seqnum);
}
@@ -850,7 +850,7 @@
gst_event_unref (event);
event = gst_event_new_segment (&seg);
- if (splitmux->segment_seqnum)
+ if (splitmux->segment_seqnum != GST_SEQNUM_INVALID)
gst_event_set_seqnum (event, splitmux->segment_seqnum);
splitpad->sent_segment = TRUE;
break;
@@ -1232,6 +1232,8 @@
}
}
+ splitmux->segment_seqnum = GST_SEQNUM_INVALID;
+
splitmux->pads_complete = FALSE;
splitmux->running = TRUE;
@@ -1455,14 +1457,14 @@
return NULL;
}
+/* Called holding the pads RLOCK */
static void
-gst_splitmux_push_event (GstSplitMuxSrc * splitmux, GstEvent * e,
- guint32 seqnum)
+gst_splitmux_push_flush_start_locked (GstSplitMuxSrc * splitmux, guint32
seqnum)
{
+ GstEvent *e = gst_event_new_flush_start ();
GList *cur;
- if (seqnum) {
- e = gst_event_make_writable (e);
+ if (seqnum != GST_SEQNUM_INVALID) {
gst_event_set_seqnum (e, seqnum);
}
@@ -1479,17 +1481,15 @@
}
static void
-gst_splitmux_push_flush_stop (GstSplitMuxSrc * splitmux, guint32 seqnum)
+gst_splitmux_push_flush_stop_locked (GstSplitMuxSrc * splitmux, guint32 seqnum)
{
GstEvent *e = gst_event_new_flush_stop (TRUE);
GList *cur;
- if (seqnum) {
- e = gst_event_make_writable (e);
+ if (seqnum != GST_SEQNUM_INVALID) {
gst_event_set_seqnum (e, seqnum);
}
- SPLITMUX_SRC_PADS_RLOCK (splitmux);
for (cur = g_list_first (splitmux->pads);
cur != NULL; cur = g_list_next (cur)) {
SplitMuxSrcPad *target = (SplitMuxSrcPad *) (cur->data);
@@ -1499,7 +1499,6 @@
target->sent_caps = FALSE;
target->sent_segment = FALSE;
}
- SPLITMUX_SRC_PADS_RUNLOCK (splitmux);
gst_event_unref (e);
}
@@ -1722,11 +1721,11 @@
}
gst_segment_copy_into (&splitmux->play_segment, &tmp);
+ SPLITMUX_SRC_UNLOCK (splitmux);
if (!gst_segment_do_seek (&tmp, rate,
format, flags, start_type, start, stop_type, stop, NULL)) {
/* Invalid seek requested, ignore it */
- SPLITMUX_SRC_UNLOCK (splitmux);
goto error;
}
position = tmp.position;
@@ -1737,12 +1736,11 @@
GST_DEBUG_OBJECT (splitmux,
"Handling flushing seek. Sending flush start");
+ SPLITMUX_SRC_PADS_RLOCK (splitmux);
/* Send flush_start */
- gst_splitmux_push_event (splitmux, gst_event_new_flush_start (), seqnum);
+ gst_splitmux_push_flush_start_locked (splitmux, seqnum);
/* Stop all parts, which will work because of the flush */
- SPLITMUX_SRC_PADS_RLOCK (splitmux);
- SPLITMUX_SRC_UNLOCK (splitmux);
for (cur = g_list_first (splitmux->pads);
cur != NULL; cur = g_list_next (cur)) {
SplitMuxSrcPad *target = (SplitMuxSrcPad *) (cur->data);
@@ -1757,13 +1755,14 @@
GstPad *splitpad = (GstPad *) (cur->data);
gst_pad_pause_task (GST_PAD (splitpad));
}
- SPLITMUX_SRC_PADS_RUNLOCK (splitmux);
- SPLITMUX_SRC_LOCK (splitmux);
/* Send flush stop */
GST_DEBUG_OBJECT (splitmux, "Sending flush stop");
- gst_splitmux_push_flush_stop (splitmux, seqnum);
+ gst_splitmux_push_flush_stop_locked (splitmux, seqnum);
+ SPLITMUX_SRC_PADS_RUNLOCK (splitmux);
+
+ SPLITMUX_SRC_LOCK (splitmux);
/* Everything is stopped, so update the play_segment */
gst_segment_copy_into (&tmp, &splitmux->play_segment);
splitmux->segment_seqnum = seqnum;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/wavenc/gstwavenc.c
new/gst-plugins-good-1.26.10/gst/wavenc/gstwavenc.c
--- old/gst-plugins-good-1.26.9/gst/wavenc/gstwavenc.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/wavenc/gstwavenc.c 2025-12-25
15:44:26.000000000 +0100
@@ -1034,13 +1034,21 @@
GstStructure *s;
GstCaps *caps = gst_pad_get_allowed_caps (wavenc->srcpad);
+ wavenc->use_rf64 = FALSE;
GST_DEBUG_OBJECT (wavenc, "allowed src caps: %" GST_PTR_FORMAT, caps);
- if (!gst_caps_is_fixed (caps)) {
- caps = gst_caps_truncate (caps);
+ if (caps) {
+ if (!gst_caps_is_empty (caps)) {
+ s = gst_caps_get_structure (caps, 0);
+ wavenc->use_rf64 = gst_structure_has_name (s, "audio/x-rf64");
+ }
+ gst_caps_unref (caps);
}
- s = gst_caps_get_structure (caps, 0);
- wavenc->use_rf64 = gst_structure_has_name (s, "audio/x-rf64");
+ if (wavenc->use_rf64) {
+ caps = gst_caps_new_empty_simple ("audio/x-rf64");
+ } else {
+ caps = gst_caps_new_empty_simple ("audio/x-wav");
+ }
gst_pad_set_caps (wavenc->srcpad, caps);
gst_caps_unref (caps);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst/wavparse/gstwavparse.c
new/gst-plugins-good-1.26.10/gst/wavparse/gstwavparse.c
--- old/gst-plugins-good-1.26.9/gst/wavparse/gstwavparse.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst/wavparse/gstwavparse.c 2025-12-25
15:44:26.000000000 +0100
@@ -1047,7 +1047,7 @@
id = g_strdup_printf ("%08x", labl->cue_point_id);
tags = gst_wavparse_get_tags_toc_entry (toc, id);
g_free (id);
- if (tags != NULL) {
+ if (tags != NULL && strlen (labl->text) > 0) {
gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_TITLE, labl->text,
NULL);
}
@@ -1059,7 +1059,7 @@
id = g_strdup_printf ("%08x", note->cue_point_id);
tags = gst_wavparse_get_tags_toc_entry (toc, id);
g_free (id);
- if (tags != NULL) {
+ if (tags != NULL && strlen (note->text) > 0) {
gst_tag_list_add (tags, GST_TAG_MERGE_PREPEND, GST_TAG_COMMENT,
note->text, NULL);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/gst-plugins-good.doap
new/gst-plugins-good-1.26.10/gst-plugins-good.doap
--- old/gst-plugins-good-1.26.9/gst-plugins-good.doap 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/gst-plugins-good.doap 2025-12-25
15:44:26.000000000 +0100
@@ -34,6 +34,16 @@
<release>
<Version>
+ <revision>1.26.10</revision>
+ <branch>1.26</branch>
+ <name></name>
+ <created>2025-12-25</created>
+ <file-release
rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.26.10.tar.xz"
/>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>1.26.9</revision>
<branch>1.26</branch>
<name></name>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/meson.build
new/gst-plugins-good-1.26.10/meson.build
--- old/gst-plugins-good-1.26.9/meson.build 2025-12-01 18:27:07.000000000
+0100
+++ new/gst-plugins-good-1.26.10/meson.build 2025-12-25 15:44:26.000000000
+0100
@@ -1,5 +1,5 @@
project('gst-plugins-good', 'c',
- version : '1.26.9',
+ version : '1.26.10',
meson_version : '>= 1.4',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.26.9/sys/v4l2/gstv4l2object.c
new/gst-plugins-good-1.26.10/sys/v4l2/gstv4l2object.c
--- old/gst-plugins-good-1.26.9/sys/v4l2/gstv4l2object.c 2025-12-01
18:27:07.000000000 +0100
+++ new/gst-plugins-good-1.26.10/sys/v4l2/gstv4l2object.c 2025-12-25
15:44:26.000000000 +0100
@@ -103,6 +103,47 @@
#define MAP_ENC_FMT(v4l2_format, gst_format) \
V4L2_PIX_FMT_##v4l2_format, GST_VIDEO_FORMAT_##gst_format,
DRM_FORMAT_INVALID, DRM_FORMAT_MOD_INVALID
+typedef struct
+{
+ enum v4l2_colorspace colorspace;
+ enum v4l2_quantization quantization;
+ enum v4l2_xfer_func xfer_func;
+ GstVideoColorPrimaries primaries;
+} GstV4l2ColorspaceVariant;
+
+/* Colorspace variant definitions */
+static const GstV4l2ColorspaceVariant rec709_full_range = {
+ .colorspace = V4L2_COLORSPACE_REC709,
+ .quantization = V4L2_QUANTIZATION_FULL_RANGE,
+ .xfer_func = 0,
+ .primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN
+};
+
+static const GstV4l2ColorspaceVariant bt470bg_full_range = {
+ .colorspace = V4L2_COLORSPACE_470_SYSTEM_BG,
+ .quantization = V4L2_QUANTIZATION_FULL_RANGE,
+ .xfer_func = 0,
+ .primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN
+};
+
+static const GstV4l2ColorspaceVariant bt2020_pq = {
+ .colorspace = V4L2_COLORSPACE_BT2020,
+ .quantization = 0,
+ .xfer_func = V4L2_XFER_FUNC_SMPTE2084,
+ .primaries = GST_VIDEO_COLOR_PRIMARIES_UNKNOWN
+};
+
+static const GstV4l2ColorspaceVariant smpte170m_full_range = {
+ .colorspace = V4L2_COLORSPACE_SMPTE170M,
+ .quantization = V4L2_QUANTIZATION_FULL_RANGE,
+ .xfer_func = 0,
+ .primaries = GST_VIDEO_COLOR_PRIMARIES_BT470BG
+};
+
+static const GstV4l2ColorspaceVariant colorspace_variants[] = {
+ rec709_full_range, bt470bg_full_range, bt2020_pq, smpte170m_full_range
+};
+
/* *INDENT-OFF* */
static GstV4L2FormatDesc gst_v4l2_formats[] = {
/* RGB formats */
@@ -244,6 +285,7 @@
};
#undef MAP_FMT
/* *INDENT-ON* */
+
#define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats))
static GSList *gst_v4l2_object_get_format_list (GstV4l2Object * v4l2object);
@@ -2560,6 +2602,54 @@
g_value_unset (&colorimetry);
}
+static gboolean
+gst_v4l2_object_try_colorspace_variant (GstV4l2Object * v4l2object,
+ struct v4l2_format *fmt, const GstV4l2ColorspaceVariant * variant,
+ GValue * list)
+{
+ struct v4l2_format alt_fmt;
+ enum v4l2_colorspace colorspace;
+ enum v4l2_quantization quantization;
+ enum v4l2_xfer_func xfer_func;
+ GstVideoColorimetry cinfo;
+
+ memcpy (&alt_fmt, fmt, sizeof (alt_fmt));
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
+ alt_fmt.fmt.pix_mp.quantization = variant->quantization;
+ alt_fmt.fmt.pix_mp.xfer_func = variant->xfer_func;
+ } else {
+ alt_fmt.fmt.pix.quantization = variant->quantization;
+ alt_fmt.fmt.pix.xfer_func = variant->xfer_func;
+ }
+
+ if (gst_v4l2_object_try_fmt (v4l2object, &alt_fmt) < 0)
+ return FALSE;
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
+ colorspace = alt_fmt.fmt.pix_mp.colorspace;
+ quantization = alt_fmt.fmt.pix_mp.quantization;
+ xfer_func = alt_fmt.fmt.pix_mp.xfer_func;
+ } else {
+ colorspace = alt_fmt.fmt.pix.colorspace;
+ quantization = alt_fmt.fmt.pix.quantization;
+ xfer_func = alt_fmt.fmt.pix.xfer_func;
+ }
+
+ if (colorspace != variant->colorspace ||
+ quantization != variant->quantization || xfer_func != variant->xfer_func)
+ return FALSE;
+
+ if (!gst_v4l2_object_get_colorspace (v4l2object, &alt_fmt, &cinfo))
+ return FALSE;
+
+ if (variant->primaries != GST_VIDEO_COLOR_PRIMARIES_UNKNOWN)
+ cinfo.primaries = variant->primaries;
+
+ gst_v4l2_object_fill_colorimetry_list (list, &cinfo);
+ return TRUE;
+}
+
static void
gst_v4l2_object_add_colorspace (GstV4l2Object * v4l2object, GstStructure * s,
guint32 width, guint32 height, guint32 pixelformat)
@@ -2590,6 +2680,8 @@
* with low-speed devices (UVC...) */
for (req_cspace = V4L2_COLORSPACE_SMPTE170M;
req_cspace <= V4L2_COLORSPACE_RAW; req_cspace++) {
+ enum v4l2_colorspace colorspace;
+
/* V4L2_COLORSPACE_BT878 is deprecated and shall not be used, so skip */
if (req_cspace == V4L2_COLORSPACE_BT878)
continue;
@@ -2599,79 +2691,27 @@
else
fmt.fmt.pix.colorspace = req_cspace;
- if (gst_v4l2_object_try_fmt (v4l2object, &fmt) == 0) {
- enum v4l2_colorspace colorspace;
-
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type))
- colorspace = fmt.fmt.pix_mp.colorspace;
- else
- colorspace = fmt.fmt.pix.colorspace;
-
- if (colorspace != req_cspace)
- continue;
-
- if (gst_v4l2_object_get_colorspace (v4l2object, &fmt, &cinfo))
- gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
+ if (gst_v4l2_object_try_fmt (v4l2object, &fmt) < 0)
+ continue;
- if (colorspace == V4L2_COLORSPACE_REC709 ||
- colorspace == V4L2_COLORSPACE_470_SYSTEM_BG) {
- /* support for full-range variants of colorspaces
V4L2_COLORSPACE_REC709
- * (such as Apple's full-range bt709 variant 1:3:5:1) and colorspace
- * V4L2_COLORSPACE_470_SYSTEM_BG */
- struct v4l2_format alt_fmt;
- enum v4l2_quantization quantization;
- memcpy (&alt_fmt, &fmt, sizeof (alt_fmt));
-
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type))
- alt_fmt.fmt.pix_mp.quantization = V4L2_QUANTIZATION_FULL_RANGE;
- else
- alt_fmt.fmt.pix.quantization = V4L2_QUANTIZATION_FULL_RANGE;
-
- if (gst_v4l2_object_try_fmt (v4l2object, &alt_fmt) == 0) {
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
- colorspace = alt_fmt.fmt.pix_mp.colorspace;
- quantization = alt_fmt.fmt.pix_mp.quantization;
- } else {
- colorspace = alt_fmt.fmt.pix.colorspace;
- quantization = alt_fmt.fmt.pix.quantization;
- }
+ if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type))
+ colorspace = fmt.fmt.pix_mp.colorspace;
+ else
+ colorspace = fmt.fmt.pix.colorspace;
- if (colorspace != req_cspace
- || quantization != V4L2_QUANTIZATION_FULL_RANGE)
- continue;
+ if (colorspace != req_cspace)
+ continue;
- if (gst_v4l2_object_get_colorspace (v4l2object, &alt_fmt, &cinfo))
- gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
- }
- }
- if (colorspace == V4L2_COLORSPACE_BT2020) {
- /* support for colorimetry bt2100-pq, variant of colorspace
- * V4L2_COLORSPACE_BT2020 */
- struct v4l2_format alt_fmt;
- enum v4l2_xfer_func xfer_func;
- memcpy (&alt_fmt, &fmt, sizeof (alt_fmt));
-
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type))
- alt_fmt.fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_SMPTE2084;
- else
- alt_fmt.fmt.pix.xfer_func = V4L2_XFER_FUNC_SMPTE2084;
-
- if (gst_v4l2_object_try_fmt (v4l2object, &alt_fmt) == 0) {
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
- colorspace = alt_fmt.fmt.pix_mp.colorspace;
- xfer_func = alt_fmt.fmt.pix_mp.xfer_func;
- } else {
- colorspace = alt_fmt.fmt.pix.colorspace;
- xfer_func = alt_fmt.fmt.pix.xfer_func;
- }
+ if (gst_v4l2_object_get_colorspace (v4l2object, &fmt, &cinfo))
+ gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
- if (colorspace != req_cspace || xfer_func !=
V4L2_XFER_FUNC_SMPTE2084)
- continue;
+ /* Try variants of this colorspace */
+ for (guint i = 0; i < G_N_ELEMENTS (colorspace_variants); i++) {
+ if (colorspace_variants[i].colorspace != req_cspace)
+ continue;
- if (gst_v4l2_object_get_colorspace (v4l2object, &alt_fmt, &cinfo))
- gst_v4l2_object_fill_colorimetry_list (&list, &cinfo);
- }
- }
+ gst_v4l2_object_try_colorspace_variant (v4l2object, &fmt,
+ &colorspace_variants[i], &list);
}
}
++++++ gst-plugins-good.obsinfo ++++++
--- /var/tmp/diff_new_pack.SA9bmq/_old 2025-12-31 10:46:53.681175588 +0100
+++ /var/tmp/diff_new_pack.SA9bmq/_new 2025-12-31 10:46:53.701176407 +0100
@@ -1,5 +1,5 @@
name: gst-plugins-good
-version: 1.26.9
-mtime: 1764610027
-commit: f313fae193089408e278c0dd3450145e5a12307b
+version: 1.26.10
+mtime: 1766673866
+commit: bfdc62185e243d3633aa916187a566d03a587792