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 (&params);
   }
 
-  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, &params);
+    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, &params);
-  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, &params);
+    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, &params);
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
 

Reply via email to