Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gstreamer-plugins-bad for 
openSUSE:Factory checked in at 2025-11-13 17:25:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-bad (Old)
 and      /work/SRC/openSUSE:Factory/.gstreamer-plugins-bad.new.2061 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gstreamer-plugins-bad"

Thu Nov 13 17:25:49 2025 rev:192 rq:1317125 version:1.26.8

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/gstreamer-plugins-bad/gstreamer-plugins-bad.changes  
    2025-10-18 14:36:05.598098055 +0200
+++ 
/work/SRC/openSUSE:Factory/.gstreamer-plugins-bad.new.2061/gstreamer-plugins-bad.changes
    2025-11-13 17:26:06.771903221 +0100
@@ -1,0 +2,20 @@
+Tue Nov 11 09:16:44 UTC 2025 - Bjørn Lie <[email protected]>
+
+- Update to version 1.26.8:
+  + av1parse: Fix duplicated frames issue in frame splitting
+  + avwait: Unify conditions between the different modes
+  + d3d11converter & d3d12converter: Initialize video_direction
+  + dtlsconnection: Increase DTLS MTU to 1200
+  + h264parser: fix uint32 to int32 truncation
+  + mpegtsmux: ID3 tag handling fixes and cleanup
+  + ristsink: Fix double free regression
+  + scte-section: fix resource leak in splice component parsing
+  + tsmux: Reset PUSI flag after writing stream packet
+  + uvcgadget: always ensure to switch to fakesink
+  + v4l2codecs: Free sub-request on allocation failure
+  + wasapi2: Handle GetActivateResult failure
+  + wayland: Fix using uninitialized value of data.wbuf
+  + gstwasapi2.dll error on machines with no audio devices
+  + x265enc: Calculate latency based on encoder parameters
+
+-------------------------------------------------------------------

Old:
----
  gst-plugins-bad-1.26.7.obscpio

New:
----
  gst-plugins-bad-1.26.8.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gstreamer-plugins-bad.spec ++++++
--- /var/tmp/diff_new_pack.iYxnHt/_old  2025-11-13 17:26:07.747945047 +0100
+++ /var/tmp/diff_new_pack.iYxnHt/_new  2025-11-13 17:26:07.747945047 +0100
@@ -81,7 +81,7 @@
 %endif
 
 Name:           gstreamer-plugins-bad
-Version:        1.26.7
+Version:        1.26.8
 Release:        0
 Summary:        GStreamer Streaming-Media Framework Plug-Ins
 License:        LGPL-2.1-or-later

++++++ _service ++++++
--- /var/tmp/diff_new_pack.iYxnHt/_old  2025-11-13 17:26:07.783946591 +0100
+++ /var/tmp/diff_new_pack.iYxnHt/_new  2025-11-13 17:26:07.787946762 +0100
@@ -5,7 +5,7 @@
     <param 
name="url">https://gitlab.freedesktop.org/gstreamer/gstreamer.git</param>
     <param name="subdir">subprojects/gst-plugins-bad</param>
     <param name="filename">gst-plugins-bad</param>
-    <param name="revision">1.26.7</param>
+    <param name="revision">1.26.8</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">v?(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>

++++++ gst-plugins-bad-1.26.7.obscpio -> gst-plugins-bad-1.26.8.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/NEWS 
new/gst-plugins-bad-1.26.8/NEWS
--- old/gst-plugins-bad-1.26.7/NEWS     2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/NEWS     2025-11-10 18:22:05.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.7 and was 
released on 14 October 2025.
+The latest bug-fix release in the stable 1.26 series is 1.26.8 and was 
released on 10 November 2025.
 
 See https://gstreamer.freedesktop.org/releases/1.26/ for the latest version of 
this document.
 
-Last updated: Tuesday 14 October 2025, 16:30 UTC (log)
+Last updated: Monday 10 November 2025, 17:00 UTC (log)
 
 ## Introduction
 
@@ -2766,6 +2766,180 @@
 -   List of Merge Requests applied in 1.26.7
 -   List of Issues fixed in 1.26.7
 
+1.26.8
+
+The eighth 1.26 bug-fix release (1.26.8) was released on 10 November 2025.
+
+This release only contains bugfixes including some important playback fixes, 
and it should be safe to update from 1.26.x.
+
+Highlighted bugfixes in 1.26.8
+
+-   Fix showtime video player showing washed-out colours for HDR videos when 
subtitles are active
+-   core: performance improvements for elements with many source pads
+-   aacparse: support streams which do not have frequent LOAS config
+-   av1parse: Fix duplicated frames issue in frame splitting
+-   fmp4mux: Fix EAC3 datarate calculation and substream writing
+-   gtk4painablesink: fixes glitches with padded buffers such as for 
sub-sampled video formats with odd sizes
+-   mpegtsmux: PUSI flag and ID3 tag handling fixes
+-   rtpbaseaudiopay2: Fix marker bit handling for DISCONT and RESYNC buffer 
flags
+-   rtpvp9pay: Fix parsing of show-existing-frame flag, fixes compatibility 
with vavp9lpenc
+-   splitmuxsink: accept pads named ‘sink_%u’ on the muxer for fmp4 muxer 
support
+-   webrtcsink: Correct lock ordering to prevent deadlock
+-   gst-plugins-rs meson build gained an auto_plugin_features option and no 
longer requires all gstreamer libraries to be
+    available
+-   v4l2 device monitor fixes
+-   x265enc: advertise latency based on encoder parameters instead of 
hard-coding it to 5 frames
+-   cerbero package builder: Add Rust support for 32-bit Linux x86
+-   Various bug fixes, build fixes, memory leak fixes, and other stability and 
reliability improvements
+
+gstreamer
+
+-   info : Added parentheses to ensure proper evaluation of conditions in 
logging level checks.
+-   info: Fix test pattern to check for an expected debug log line
+-   pad: make gst_pad_forward not O(n²)
+-   parse: Move g_strfreev() a bit later to avoid use-after-free
+-   structure: Don’t crash if GArray has NULL value
+-   utils: Fix leak in gst_util_filename_compare
+-   vasnprintf: free dynamic tmp buffer on error to prevent memory leak
+-   gst-launch-1.0: Print details of error message
+
+gst-plugins-base
+
+-   encoding-target: Fix memory leak in gst_encoding_target_save
+-   gl: Support DMABuf passthrough with meta:GstVideoOverlayComposition
+-   gl: egl: fix memory leak in _print_all_dma_formats()
+-   gltestsrc: Fix memory leaks on shader creation failure
+-   id3: fix csets memory leak in string_utf8_dup
+-   opusdec: Unref intersected caps when empty to avoid leaks
+-   parsebin: Free missing plugin details and return failure when plugin is 
not found
+-   pbutils: Don’t throw critical for unknown mime codec
+-   rtsp: fix memory leaks in gst_rtsp_connection_connect_with_response_usec
+
+gst-plugins-good
+
+-   aacparse: support streams which do not have frequent loas config
+-   multifile: verify format identifiers in filename template strings
+-   rtp: Fix usage of uninitialized variable
+-   rtph263pay: Fix Out-of-bounds access (OVERRUN)
+-   rtpvp9depay: fix wrong event referencing, use same packet lost logic from 
neighboring rtpvp8depay
+-   rtpvp9pay: Fix parsing of show-existing-frame
+-   rtpvp9pay: vavp9lpenc does not work with rtpvp9pay but does with rtpvp9pay2
+-   splitmuxsink: accept pads named ‘sink_%u’ on the muxer
+-   v4l2: Fix NULL pointer dereference in probe error path
+-   v4l2videoenc: fix memory leak about output state and caps
+
+gst-plugins-bad
+
+-   alphacombine: Only reset once both pads are done flushing
+-   av1parse: Fix duplicated frames issue in frame splitting
+-   avwait: Unify conditions between the different modes
+-   d3d11converter & d3d12converter: Initialize video_direction
+-   dtlsconnection: Increase DTLS MTU to 1200
+-   h264parser: fix uint32 to int32 truncation
+-   mpegtsmux: ID3 tag handling fixes and cleanup
+-   ristsink: Fix double free regression
+-   scte-section: fix resource leak in splice component parsing
+-   tsmux: Reset PUSI flag after writing stream packet
+-   uvcgadget: always ensure to switch to fakesink
+-   v4l2codecs: Free sub-request on allocation failure
+-   wasapi2: Handle GetActivateResult failure
+-   wayland: Fix using uninitialized value of data.wbuf
+-   gstwasapi2.dll error on machines with no audio devices
+-   x265enc: Calculate latency based on encoder parameters
+
+gst-plugins-ugly
+
+-   No changes
+
+GStreamer Rust plugins
+
+-   aws, webrtc, cargo: Remove all constraints on AWS SDK and tune 
optimizations
+-   closedcaption: Return FlowError from scan_duration
+-   fmp4mux: Fix EAC3 datarate calculation
+-   fmp4mux: Fix EAC3 substream writing in EC3SpecificBox
+-   fmp4mux: Update to dash-mpd 0.19
+-   gtk4: Implement cropped imports without viewport
+-   json: Return FlowError from scan_duration
+-   rtp: baseaudiopay: Fix marker bit handling
+-   threadshare: fix Pad mod diagram
+-   threadshare: Update to getifaddrs 0.6
+-   tracers: Fix inability to create new log files (regression)
+-   tracers: Fix inverted append logic when writing log files
+-   uriplaylistbin: Propagate error message source
+-   webrtc: document grant requirement for livekitwebrtcsink auth token
+-   webrtcsink: Correct lock ordering to prevent Lock (A), Lock (B) + Lock(B), 
Lock(A) deadlock between
+    on_remote_description_set() and handle_ice()
+-   webrtcsrc: Clean up EOS and session handling
+-   meson: Add auto_plugin_features option
+-   meson: Don’t require all gstreamer libraries
+-   Document the tags and branches in this repository
+-   Fix a couple of new 1.91 clippy warnings
+-   Update dependencies
+
+gst-libav
+
+-   No changes
+
+gst-rtsp-server
+
+-   No changes
+
+gstreamer-vaapi
+
+-   No changes
+
+gstreamer-sharp
+
+-   No changes
+
+gst-python
+
+-   python: Fix GDir leak in gst_python_load_directory
+
+gst-editing-services
+
+-   ges: add error reporting to base bin timeline setup
+
+gst-devtools, gst-validate + gst-integration-testsuites
+
+-   validate: add missing GST_VALIDATE_API annotation
+-   validate: use meson compile instead of ninja directly
+-   dots-viewer: Update Rust dependencies
+
+gst-examples
+
+-   Fix signal lookup in GTK player example
+-   Update Rust dependencies
+
+gstreamer-docs
+
+-   No changes
+
+Development build environment
+
+-   libnice.wrap: add upstream patch from libnice to fix parsing of incomplete 
TCP ICE candidates
+
+Cerbero build tool and packaging changes in 1.26.8
+
+-   Add Rust support for Linux x86
+-   Open log files as utf-8 and with error resilience
+-   harfbuzz: disable documentation
+
+Contributors to 1.26.8
+
+Amy Ko, Artem Martus, Carlos Bentzen, Christo Joseph, David Maseda Neira, 
DongJoo Kim, Doug Nazar, François Laignel, Havard
+Graff, He Junyan, Inbok Kim, Jan Alexander Steffens (heftig), Jan Schmidt, 
Jeehyun Lee, Jeongmin Kwak, Jihoon Lee, Kevin Wolf,
+L. E. Segovia, Loïc Le Page, Manuel Torres, Marek Olejnik, Matthew Waters, 
Mazdak Farzone, Michael Grzeschik, Nicolas Dufresne,
+Nirbheek Chauhan, Oz Donner, Pablo García, Piotr Brzeziński, Qian Hu (胡骞), 
Rares Branici, Robert Mader, Ross Burton, Ruben
+Gonzalez, Sebastian Dröge, Seungha Yang, Thibault Saunier, Tim-Philipp Müller, 
Xavier Claessens,
+
+… and many others who have contributed bug reports, translations, sent 
suggestions or helped testing. Thank you all!
+
+List of merge requests and issues fixed in 1.26.8
+
+-   List of Merge Requests applied in 1.26.8
+-   List of Issues fixed in 1.26.8
+
 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-bad-1.26.7/RELEASE 
new/gst-plugins-bad-1.26.8/RELEASE
--- old/gst-plugins-bad-1.26.7/RELEASE  2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/RELEASE  2025-11-10 18:22:05.000000000 +0100
@@ -1,4 +1,4 @@
-This is GStreamer gst-plugins-bad 1.26.7.
+This is GStreamer gst-plugins-bad 1.26.8.
 
 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-bad-1.26.7/ext/dtls/gstdtlsconnection.c 
new/gst-plugins-bad-1.26.8/ext/dtls/gstdtlsconnection.c
--- old/gst-plugins-bad-1.26.7/ext/dtls/gstdtlsconnection.c     2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/ext/dtls/gstdtlsconnection.c     2025-11-10 
18:22:05.000000000 +0100
@@ -1285,8 +1285,8 @@
       GST_LOG_OBJECT (self, "BIO: flushing");
       return 1;
     case BIO_CTRL_DGRAM_QUERY_MTU:
-      GST_DEBUG_OBJECT (self, "BIO: MTU query, returning 0...");
-      return 0;
+      GST_DEBUG_OBJECT (self, "BIO: MTU query, returning 1200...");
+      return 1200;
     case BIO_CTRL_DGRAM_MTU_EXCEEDED:
       GST_WARNING_OBJECT (self, "BIO: MTU exceeded");
       return 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/ext/x265/gstx265enc.c 
new/gst-plugins-bad-1.26.8/ext/x265/gstx265enc.c
--- old/gst-plugins-bad-1.26.7/ext/x265/gstx265enc.c    2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/ext/x265/gstx265enc.c    2025-11-10 
18:22:05.000000000 +0100
@@ -996,6 +996,9 @@
     return FALSE;
   }
 
+  /* Get actual params x265 is using (they may be adjusted from what we set) */
+  encoder->api->encoder_parameters (encoder->x265enc, &encoder->x265param);
+
   encoder->push_header = TRUE;
 
   return TRUE;
@@ -1263,12 +1266,11 @@
   gint max_delayed_frames;
   GstClockTime latency;
 
-  /* FIXME get a real value from the encoder, this is currently not exposed */
-  if (encoder->tune > 0 && encoder->tune <= G_N_ELEMENTS (x265_tune_names) &&
-      strcmp (x265_tune_names[encoder->tune - 1], "zerolatency") == 0)
-    max_delayed_frames = 0;
-  else
-    max_delayed_frames = 5;
+  /* Get actual delay from encoder parameters (bframes + lookahead + (thread
+   * queue depth -1 )) */
+  max_delayed_frames =
+      encoder->x265param.bframes + encoder->x265param.lookaheadDepth +
+      encoder->x265param.frameNumThreads - 1;
 
   if (info->fps_n) {
     latency = gst_util_uint64_scale_ceil (GST_SECOND * info->fps_d,
@@ -1282,8 +1284,10 @@
   }
 
   GST_INFO_OBJECT (encoder,
-      "Updating latency to %" GST_TIME_FORMAT " (%d frames)",
-      GST_TIME_ARGS (latency), max_delayed_frames);
+      "Updating latency to %" GST_TIME_FORMAT
+      " (%d frames) [bframes=%d, lookahead=%d, threads=%d]",
+      GST_TIME_ARGS (latency), max_delayed_frames, encoder->x265param.bframes,
+      encoder->x265param.lookaheadDepth, encoder->x265param.frameNumThreads);
 
   gst_video_encoder_set_latency (GST_VIDEO_ENCODER (encoder), latency, 
latency);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst/codecalpha/gstalphacombine.c 
new/gst-plugins-bad-1.26.8/gst/codecalpha/gstalphacombine.c
--- old/gst-plugins-bad-1.26.7/gst/codecalpha/gstalphacombine.c 2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/codecalpha/gstalphacombine.c 2025-11-10 
18:22:05.000000000 +0100
@@ -201,6 +201,17 @@
   self->alpha_format_cookie = 0;
 }
 
+/* Has to be called with buffer_lock held */
+static void
+gst_alpha_combine_reset (GstAlphaCombine * self)
+{
+  gst_alpha_combine_clear_sink_pad_probe (self);
+  gst_buffer_replace (&self->alpha_buffer, NULL);
+  gst_buffer_replace (&self->last_alpha_buffer, NULL);
+  self->last_flow_ret = GST_FLOW_OK;
+  self->alpha_eos = FALSE;
+}
+
 static void
 gst_alpha_combine_unlock_stop (GstAlphaCombine * self, GstPad * pad)
 {
@@ -212,7 +223,7 @@
     if (self->flush_stops == 2) {
       GST_DEBUG_OBJECT (self,
           "Both sink pads received FLUSH_STOP, unblocking them");
-      gst_alpha_combine_clear_sink_pad_probe (self);
+      gst_alpha_combine_reset (self);
     } else {
       GST_DEBUG_OBJECT (pad, "FLUSH_STOP received, blocking");
       g_assert (!self->pad_block_id);
@@ -230,18 +241,6 @@
   g_mutex_unlock (&self->buffer_lock);
 }
 
-static void
-gst_alpha_combine_reset (GstAlphaCombine * self)
-{
-  g_mutex_lock (&self->buffer_lock);
-  gst_alpha_combine_clear_sink_pad_probe (self);
-  gst_buffer_replace (&self->alpha_buffer, NULL);
-  gst_buffer_replace (&self->last_alpha_buffer, NULL);
-  self->last_flow_ret = GST_FLOW_OK;
-  self->alpha_eos = FALSE;
-  g_mutex_unlock (&self->buffer_lock);
-}
-
 /*
  * gst_alpha_combine_negotiate:
  * @self: #GstAlphaCombine pointer
@@ -592,7 +591,6 @@
       break;
     case GST_EVENT_FLUSH_STOP:
       gst_alpha_combine_unlock_stop (self, pad);
-      gst_alpha_combine_reset (self);
       break;
     case GST_EVENT_CAPS:
     {
@@ -686,7 +684,9 @@
 
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
+      g_mutex_lock (&self->buffer_lock);
       gst_alpha_combine_reset (self);
+      g_mutex_unlock (&self->buffer_lock);
       self->src_format = GST_VIDEO_FORMAT_UNKNOWN;
       gst_video_info_init (&self->sink_vinfo);
       gst_video_info_init (&self->alpha_vinfo);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/gst/mpegtsmux/gstbasetsmux.c 
new/gst-plugins-bad-1.26.8/gst/mpegtsmux/gstbasetsmux.c
--- old/gst-plugins-bad-1.26.7/gst/mpegtsmux/gstbasetsmux.c     2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/mpegtsmux/gstbasetsmux.c     2025-11-10 
18:22:05.000000000 +0100
@@ -1698,15 +1698,6 @@
     header = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_HEADER);
   }
 
-  if (best->stream->internal_stream_type == TSMUX_ST_PS_KLV &&
-      gst_buffer_get_size (buf) > (G_MAXUINT16 - 3)) {
-    GST_WARNING_OBJECT (mux, "KLV meta unit too big, splitting not supported");
-
-    gst_buffer_unref (buf);
-    g_mutex_unlock (&mux->lock);
-    return GST_FLOW_OK;
-  }
-
   GST_DEBUG_OBJECT (mux, "delta: %d", delta);
 
   if (gst_buffer_get_size (buf) > 0) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/gst/mpegtsmux/tsmux/tsmux.c 
new/gst-plugins-bad-1.26.8/gst/mpegtsmux/tsmux/tsmux.c
--- old/gst-plugins-bad-1.26.7/gst/mpegtsmux/tsmux/tsmux.c      2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/mpegtsmux/tsmux/tsmux.c      2025-11-10 
18:22:05.000000000 +0100
@@ -1689,6 +1689,7 @@
 
   /* Reset all dynamic flags */
   stream->pi.flags &= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
+  pi->packet_start_unit_indicator = FALSE;
 
   return res;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst/mpegtsmux/tsmux/tsmuxstream.c 
new/gst-plugins-bad-1.26.8/gst/mpegtsmux/tsmux/tsmuxstream.c
--- old/gst-plugins-bad-1.26.7/gst/mpegtsmux/tsmux/tsmuxstream.c        
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/mpegtsmux/tsmux/tsmuxstream.c        
2025-11-10 18:22:05.000000000 +0100
@@ -76,6 +76,9 @@
 
 #define GST_CAT_DEFAULT gst_base_ts_mux_debug
 
+/* start_code prefix + stream_id + pes_packet_length = 6 bytes */
+#define PES_PACKET_PREFIX_LEN 6
+
 static guint8 tsmux_stream_pes_header_length (TsMuxStream * stream);
 static void tsmux_stream_write_pes_header (TsMuxStream * stream, guint8 * 
data);
 static void tsmux_stream_find_pts_dts_within (TsMuxStream * stream, guint 
bound,
@@ -90,6 +93,8 @@
   gint64 pts;
   gint64 dts;
 
+  gboolean pts_dts_consumed;
+
   /* data represents random access point */
   gboolean random_access;
 
@@ -210,7 +215,7 @@
           TSMUX_PACKET_FLAG_PES_EXT_STREAMID;
       break;
     case TSMUX_ST_PS_TELETEXT:
-      /* needs fixes PES header length */
+      /* needs fixed PES header length */
       stream->pi.pes_header_length = 36;
       stream->id = 0xBD;
       stream->stream_type = TSMUX_ST_PRIVATE_DATA;
@@ -437,7 +442,9 @@
  * tsmux_stream_bytes_avail:
  * @stream: a #TsMuxStream
  *
- * Calculate how much bytes are available.
+ * Calculate how many bytes are currently available for
+ * writing from this stream, including a PES header
+ * if one needs writing.
  *
  * Returns: The number of bytes available.
  */
@@ -492,7 +499,7 @@
  *
  * Initializes the PES packet.
  *
- * Returns: TRUE if we the packet was initialized.
+ * Returns: TRUE if the packet was initialized.
  */
 gboolean
 tsmux_stream_initialize_pes_packet (TsMuxStream * stream)
@@ -532,18 +539,21 @@
     }
   }
 
-  if (stream->gst_stream_type == GST_STREAM_TYPE_VIDEO) {
-    guint8 hdr_len;
-
-    hdr_len = tsmux_stream_pes_header_length (stream);
+  guint8 hdr_len = tsmux_stream_pes_header_length (stream);
+  guint max_payload_len = G_MAXUINT16 - (hdr_len - PES_PACKET_PREFIX_LEN);
 
-    /* Unbounded for video streams if pes packet length is over 16 bit */
-    if ((stream->cur_pes_payload_size + hdr_len - 6) > G_MAXUINT16)
+  if (stream->cur_pes_payload_size > max_payload_len) {
+    if (stream->gst_stream_type == GST_STREAM_TYPE_VIDEO) {
+      /* Unbounded for video streams if pes packet length is over 16 bit */
       stream->cur_pes_payload_size = 0;
-  }
-  // stream_type specific flags
-  if (stream->stream_type == TSMUX_ST_PES_METADATA) {
-    stream->pi.flags |= TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
+    } else {
+      /* Else, clamp this PES packet to maximum size and put the rest
+       * in another PES */
+      TS_DEBUG
+          ("Splitting input packet to multiple PES. Writing %u bytes of 
incoming payload",
+          max_payload_len);
+      stream->cur_pes_payload_size = max_payload_len;
+    }
   }
 
   return TRUE;
@@ -636,7 +646,7 @@
   /* Calculate the length of the header for this stream */
 
   /* start_code prefix + stream_id + pes_packet_length = 6 bytes */
-  packet_len = 6;
+  packet_len = PES_PACKET_PREFIX_LEN;
 
   if (stream->pi.flags & TSMUX_PACKET_FLAG_PES_FULL_HEADER) {
     /* For a PES 'full header' we have at least 3 more bytes,
@@ -654,8 +664,9 @@
     }
     if (stream->pi.pes_header_length) {
       /* check for consistency, then we can add stuffing */
-      g_assert (packet_len <= stream->pi.pes_header_length + 6 + 3);
-      packet_len = stream->pi.pes_header_length + 6 + 3;
+      g_assert (packet_len <=
+          stream->pi.pes_header_length + PES_PACKET_PREFIX_LEN + 3);
+      packet_len = stream->pi.pes_header_length + PES_PACKET_PREFIX_LEN + 3;
     }
   }
 
@@ -676,12 +687,18 @@
   for (cur = stream->buffers; cur; cur = cur->next) {
     TsMuxStreamBuffer *curbuf = cur->data;
 
+    if (curbuf->pts_dts_consumed) {
+      /* Don't repeat PTS/DTS when partially consuming buffers */
+      continue;
+    }
+
     /* FIXME: This isn't quite correct - if the 'bound' is within this
      * buffer, we don't know if the timestamp is before or after the split
      * so we shouldn't return it */
     if (bound <= curbuf->size) {
       *pts = curbuf->pts;
       *dts = curbuf->dts;
+      curbuf->pts_dts_consumed = TRUE;
       return;
     }
 
@@ -690,6 +707,7 @@
         || GST_CLOCK_STIME_IS_VALID (curbuf->dts)) {
       *pts = curbuf->pts;
       *dts = curbuf->dts;
+      curbuf->pts_dts_consumed = TRUE;
       return;
     }
 
@@ -714,7 +732,8 @@
   /* Write 2 byte PES packet length here. 0 (unbounded) is only
    * valid for video packets */
   if (stream->cur_pes_payload_size != 0) {
-    length_to_write = hdr_len + stream->cur_pes_payload_size - 6;
+    length_to_write =
+        hdr_len + stream->cur_pes_payload_size - PES_PACKET_PREFIX_LEN;
   } else {
     length_to_write = 0;
   }
@@ -726,8 +745,14 @@
 
     /* Not scrambled, original, not-copyrighted, data_alignment not specified 
*/
     flags = 0x81;
-    if (stream->pi.flags & TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT)
+
+    /* If this stream has PES data alignment *and* this PES is the start of
+     * an input buffer, set the data aligment mark */
+    if (stream->pi.flags & TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT &&
+        stream->cur_buffer_consumed == 0) {
+      TS_DEBUG ("Marking data_alignment flag for this PES");
       flags |= 0x4;
+    }
     *data++ = flags;
     flags = 0;
 
@@ -875,6 +900,7 @@
 
   packet->pts = pts;
   packet->dts = dts;
+  packet->pts_dts_consumed = FALSE;
 
   if (stream->bytes_avail == 0) {
     stream->last_pts = pts;
@@ -971,7 +997,6 @@
       /* FIXME */
       break;
     case TSMUX_ST_PES_METADATA:
-
       if (stream->internal_stream_type == TSMUX_ST_PS_ID3) {
         // metadata_descriptor
         GstMpegtsMetadataDescriptor metadata_descriptor;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/gst/rist/gstristsink.c 
new/gst-plugins-bad-1.26.8/gst/rist/gstristsink.c
--- old/gst-plugins-bad-1.26.7/gst/rist/gstristsink.c   2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/rist/gstristsink.c   2025-11-10 
18:22:05.000000000 +0100
@@ -561,6 +561,7 @@
   GstPadTemplate *pad_template;
 
   sink->rtpext = gst_element_factory_make ("ristrtpext", "ristrtpext");
+  gst_object_ref_sink (sink->rtpext);
 
   g_mutex_init (&sink->bonds_lock);
   sink->bonds = g_ptr_array_new ();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/gst/timecode/gstavwait.c 
new/gst-plugins-bad-1.26.8/gst/timecode/gstavwait.c
--- old/gst-plugins-bad-1.26.7/gst/timecode/gstavwait.c 2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/timecode/gstavwait.c 2025-11-10 
18:22:05.000000000 +0100
@@ -542,22 +542,12 @@
     case PROP_TARGET_RUNNING_TIME:{
       g_mutex_lock (&self->mutex);
       self->target_running_time = g_value_get_uint64 (value);
-      if (self->mode == MODE_RUNNING_TIME) {
-        if (self->target_running_time > self->last_seen_video_running_time) {
-          self->dropping = TRUE;
-        }
-      }
       g_mutex_unlock (&self->mutex);
       break;
     }
     case PROP_END_RUNNING_TIME:{
       g_mutex_lock (&self->mutex);
       self->end_running_time = g_value_get_uint64 (value);
-      if (self->mode == MODE_RUNNING_TIME) {
-        if (self->end_running_time >= self->last_seen_video_running_time) {
-          self->dropping = TRUE;
-        }
-      }
       g_mutex_unlock (&self->mutex);
       break;
     }
@@ -568,31 +558,8 @@
       old_mode = self->mode;
       self->mode = g_value_get_enum (value);
       if (self->mode != old_mode) {
-        switch (self->mode) {
-          case MODE_TIMECODE:
-            if (self->last_seen_tc && self->tc &&
-                gst_video_time_code_compare (self->last_seen_tc,
-                    self->tc) < 0) {
-              self->running_time_to_wait_for = GST_CLOCK_TIME_NONE;
-              self->running_time_to_end_at = GST_CLOCK_TIME_NONE;
-              self->dropping = TRUE;
-            }
-            break;
-          case MODE_RUNNING_TIME:
-            self->running_time_to_wait_for = GST_CLOCK_TIME_NONE;
-            self->running_time_to_end_at = GST_CLOCK_TIME_NONE;
-            if (self->target_running_time > self->last_seen_video_running_time
-                || self->end_running_time >=
-                self->last_seen_video_running_time) {
-              self->dropping = TRUE;
-            }
-            break;
-            /* Let the chain functions handle the rest */
-          case MODE_VIDEO_FIRST:
-            /* pass-through */
-          default:
-            break;
-        }
+        GST_DEBUG_OBJECT (self, "Changing mode from %d to %d", old_mode,
+            self->mode);
       }
       g_mutex_unlock (&self->mutex);
       break;
@@ -891,6 +858,8 @@
 
   switch (self->mode) {
     case MODE_TIMECODE:{
+      gboolean emit_passthrough_signal = FALSE;
+
       if (self->tc && self->end_tc
           && gst_video_time_code_compare (self->tc, self->end_tc) != -1) {
         gchar *tc_str, *end_tc;
@@ -908,75 +877,106 @@
       }
 
       if (self->tc != NULL && tc != NULL) {
-        gboolean emit_passthrough_signal = FALSE;
-
         if (gst_video_time_code_compare (tc, self->tc) < 0
             && self->running_time_to_wait_for == GST_CLOCK_TIME_NONE) {
           GST_DEBUG_OBJECT (self, "Timecode not yet reached, ignoring frame");
           gst_buffer_unref (inbuf);
           inbuf = NULL;
         } else if (self->running_time_to_wait_for == GST_CLOCK_TIME_NONE) {
-          GST_INFO_OBJECT (self, "Target timecode reached at %" 
GST_TIME_FORMAT,
-              GST_TIME_ARGS (self->vsegment.position));
+          gchar *target_tc_str, *tc_str;
+
+          target_tc_str = gst_video_time_code_to_string (self->tc);
+          tc_str = gst_video_time_code_to_string (tc);
+
+          GST_INFO_OBJECT (self,
+              "Target timecode %s reached at %s (%" GST_TIME_FORMAT ")",
+              target_tc_str, tc_str, GST_TIME_ARGS (self->vsegment.position));
+
+          g_free (target_tc_str);
+          g_free (tc_str);
+
           /* Don't emit a signal if we weren't dropping (e.g. settings changed
            * mid-flight) */
           emit_passthrough_signal = self->dropping;
           self->dropping = FALSE;
           self->running_time_to_wait_for = running_time;
           if (self->recording) {
-            self->audio_running_time_to_wait_for =
-                self->running_time_to_wait_for;
+            self->audio_running_time_to_wait_for = running_time;
+            send_message = TRUE;
+            message_running_time = running_time;
+            message_dropping = FALSE;
           }
         }
+      }
 
-        if (self->end_tc && gst_video_time_code_compare (tc, self->end_tc) >= 
0) {
-          if (self->running_time_to_end_at == GST_CLOCK_TIME_NONE) {
-            GST_INFO_OBJECT (self, "End timecode reached at %" GST_TIME_FORMAT,
-                GST_TIME_ARGS (self->vsegment.position));
-            self->dropping = TRUE;
-            self->running_time_to_end_at = running_time;
-            if (self->recording) {
-              self->audio_running_time_to_end_at = 
self->running_time_to_end_at;
-              self->must_send_end_message |= END_MESSAGE_STREAM_ENDED;
-            }
-          }
+      if (tc != NULL && self->end_tc
+          && gst_video_time_code_compare (tc, self->end_tc) >= 0) {
+        if (self->running_time_to_end_at == GST_CLOCK_TIME_NONE) {
+          gchar *end_tc_str, *tc_str;
+
+          end_tc_str = gst_video_time_code_to_string (self->end_tc);
+          tc_str = gst_video_time_code_to_string (tc);
 
-          if (inbuf) {
-            gst_buffer_unref (inbuf);
-            inbuf = NULL;
+          GST_INFO_OBJECT (self,
+              "End timecode %s reached at %s (%" GST_TIME_FORMAT ")",
+              end_tc_str, tc_str, GST_TIME_ARGS (self->vsegment.position));
+
+          g_free (end_tc_str);
+          g_free (tc_str);
+
+          self->dropping = TRUE;
+          self->running_time_to_end_at = running_time;
+          if (self->recording) {
+            self->audio_running_time_to_end_at = self->running_time_to_end_at;
+            self->must_send_end_message |= END_MESSAGE_STREAM_ENDED;
           }
-        } else if (emit_passthrough_signal && self->recording) {
-          send_message = TRUE;
-          message_running_time = self->running_time_to_wait_for;
-          message_dropping = FALSE;
         }
+
+        if (inbuf) {
+          gst_buffer_unref (inbuf);
+          inbuf = NULL;
+        }
+
+        emit_passthrough_signal = FALSE;
+      }
+
+      if (emit_passthrough_signal && self->recording) {
+        send_message = TRUE;
+        message_running_time = self->running_time_to_wait_for;
+        message_dropping = FALSE;
       }
       break;
     }
     case MODE_RUNNING_TIME:{
       gboolean emit_passthrough_signal = FALSE;
 
-      if (self->target_running_time != GST_CLOCK_TIME_NONE
-          && running_time < self->target_running_time) {
-        GST_DEBUG_OBJECT (self,
-            "Have %" GST_TIME_FORMAT ", waiting for %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (running_time),
-            GST_TIME_ARGS (self->target_running_time));
-        gst_buffer_unref (inbuf);
-        inbuf = NULL;
-      } else if (self->running_time_to_wait_for == GST_CLOCK_TIME_NONE) {
-        /* Don't emit a signal if we weren't dropping (e.g. settings changed
-         * mid-flight) */
-        emit_passthrough_signal = self->dropping;
-        self->dropping = FALSE;
-        self->running_time_to_wait_for = running_time;
-        if (self->recording) {
-          self->audio_running_time_to_wait_for = running_time;
-        }
-        if (self->recording) {
-          send_message = TRUE;
-          message_running_time = running_time;
-          message_dropping = FALSE;
+      if (self->target_running_time != GST_CLOCK_TIME_NONE) {
+        if (running_time < self->target_running_time) {
+          GST_DEBUG_OBJECT (self,
+              "Have %" GST_TIME_FORMAT ", waiting for %" GST_TIME_FORMAT,
+              GST_TIME_ARGS (running_time),
+              GST_TIME_ARGS (self->target_running_time));
+          gst_buffer_unref (inbuf);
+          inbuf = NULL;
+        } else if (self->running_time_to_wait_for == GST_CLOCK_TIME_NONE) {
+          GST_DEBUG_OBJECT (self,
+              "Target running time %" GST_TIME_FORMAT " reached at %"
+              GST_TIME_FORMAT "(%" GST_TIME_FORMAT ")",
+              GST_TIME_ARGS (self->target_running_time),
+              GST_TIME_ARGS (running_time),
+              GST_TIME_ARGS (self->vsegment.position));
+
+          /* Don't emit a signal if we weren't dropping (e.g. settings changed
+           * mid-flight) */
+          emit_passthrough_signal = self->dropping;
+          self->dropping = FALSE;
+          self->running_time_to_wait_for = running_time;
+          if (self->recording) {
+            self->audio_running_time_to_wait_for = running_time;
+            send_message = TRUE;
+            message_running_time = running_time;
+            message_dropping = FALSE;
+          }
         }
       }
 
@@ -985,8 +985,11 @@
         if (self->running_time_to_end_at == GST_CLOCK_TIME_NONE) {
           GST_INFO_OBJECT (self,
               "End running time %" GST_TIME_FORMAT " reached at %"
-              GST_TIME_FORMAT, GST_TIME_ARGS (self->end_running_time),
+              GST_TIME_FORMAT "(%" GST_TIME_FORMAT ")",
+              GST_TIME_ARGS (self->end_running_time),
+              GST_TIME_ARGS (running_time),
               GST_TIME_ARGS (self->vsegment.position));
+
           self->dropping = TRUE;
           self->running_time_to_end_at = running_time;
           if (self->recording) {
@@ -999,7 +1002,11 @@
           gst_buffer_unref (inbuf);
           inbuf = NULL;
         }
-      } else if (emit_passthrough_signal && self->recording) {
+
+        emit_passthrough_signal = FALSE;
+      }
+
+      if (emit_passthrough_signal && self->recording) {
         send_message = TRUE;
         message_running_time = self->running_time_to_wait_for;
         message_dropping = FALSE;
@@ -1008,22 +1015,28 @@
       break;
     }
     case MODE_VIDEO_FIRST:{
+      gboolean emit_passthrough_signal = FALSE;
+
       if (self->running_time_to_wait_for == GST_CLOCK_TIME_NONE) {
-        self->running_time_to_wait_for = running_time;
         GST_DEBUG_OBJECT (self, "First video running time is %" 
GST_TIME_FORMAT,
-            GST_TIME_ARGS (self->running_time_to_wait_for));
+            GST_TIME_ARGS (running_time));
+
+        emit_passthrough_signal = self->dropping;
+        self->dropping = FALSE;
+        self->running_time_to_wait_for = running_time;
         if (self->recording) {
-          self->audio_running_time_to_wait_for = 
self->running_time_to_wait_for;
-        }
-        if (self->dropping) {
-          self->dropping = FALSE;
-          if (self->recording) {
-            send_message = TRUE;
-            message_running_time = self->running_time_to_wait_for;
-            message_dropping = FALSE;
-          }
+          self->audio_running_time_to_wait_for = running_time;
+          send_message = TRUE;
+          message_running_time = running_time;
+          message_dropping = FALSE;
         }
       }
+
+      if (emit_passthrough_signal && self->recording) {
+        send_message = TRUE;
+        message_running_time = self->running_time_to_wait_for;
+        message_dropping = FALSE;
+      }
       break;
     }
   }
@@ -1115,6 +1128,9 @@
                 GST_FORMAT_TIME,
                 GST_BUFFER_TIMESTAMP (inbuf) + GST_BUFFER_DURATION (inbuf))));
     ret = gst_pad_push (self->vsrcpad, inbuf);
+  } else {
+    GST_DEBUG_OBJECT (self,
+        "Dropped video buffer %" GST_TIME_FORMAT, GST_TIME_ARGS 
(running_time));
   }
 
   g_mutex_lock (&self->mutex);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst/videoparsers/gstav1parse.c 
new/gst-plugins-bad-1.26.8/gst/videoparsers/gstav1parse.c
--- old/gst-plugins-bad-1.26.7/gst/videoparsers/gstav1parse.c   2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst/videoparsers/gstav1parse.c   2025-11-10 
18:22:05.000000000 +0100
@@ -1643,6 +1643,7 @@
           && gst_av1_parse_frame_start_new_temporal_unit (self, obu)) {
         if (check_new_tu) {
           *check_new_tu = TRUE;
+          *frame_complete = TRUE;
           res = GST_AV1_PARSER_OK;
           goto out;
         }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst-libs/gst/codecparsers/gsth264parser.c 
new/gst-plugins-bad-1.26.8/gst-libs/gst/codecparsers/gsth264parser.c
--- old/gst-plugins-bad-1.26.7/gst-libs/gst/codecparsers/gsth264parser.c        
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst-libs/gst/codecparsers/gsth264parser.c        
2025-11-10 18:22:05.000000000 +0100
@@ -2941,8 +2941,8 @@
 gst_h264_video_calculate_framerate (const GstH264SPS * sps,
     guint field_pic_flag, guint pic_struct, gint * fps_num, gint * fps_den)
 {
-  gint num = 0;
-  gint den = 1;
+  gint64 num = 0;
+  gint64 den = 1;
 
   /* To calculate framerate, we use this formula:
    *          time_scale                1                         1
@@ -2993,6 +2993,11 @@
     }
   }
 
+  while (num > G_MAXINT32 || den > G_MAXINT32) {
+    num >>= 1;
+    den >>= 1;
+  }
+
   *fps_num = num;
   *fps_den = den;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst-libs/gst/d3d11/gstd3d11converter.cpp 
new/gst-plugins-bad-1.26.8/gst-libs/gst/d3d11/gstd3d11converter.cpp
--- old/gst-plugins-bad-1.26.7/gst-libs/gst/d3d11/gstd3d11converter.cpp 
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst-libs/gst/d3d11/gstd3d11converter.cpp 
2025-11-10 18:22:05.000000000 +0100
@@ -383,7 +383,7 @@
   GstVideoInfo piv_info;
   GstBuffer *piv_inbuf = nullptr;
 
-  GstVideoOrientationMethod video_direction;
+  GstVideoOrientationMethod video_direction = GST_VIDEO_ORIENTATION_IDENTITY;
 
   std::mutex prop_lock;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst-libs/gst/d3d12/gstd3d12converter.cpp 
new/gst-plugins-bad-1.26.8/gst-libs/gst/d3d12/gstd3d12converter.cpp
--- old/gst-plugins-bad-1.26.7/gst-libs/gst/d3d12/gstd3d12converter.cpp 
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst-libs/gst/d3d12/gstd3d12converter.cpp 
2025-11-10 18:22:05.000000000 +0100
@@ -428,7 +428,7 @@
   FLOAT clear_color[4][4];
   GstD3D12ColorMatrix clear_color_matrix;
 
-  GstVideoOrientationMethod video_direction;
+  GstVideoOrientationMethod video_direction = GST_VIDEO_ORIENTATION_IDENTITY;
   gboolean color_balance_enabled = FALSE;
   gboolean mipgen_enabled = FALSE;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst-libs/gst/mpegts/gst-scte-section.c 
new/gst-plugins-bad-1.26.8/gst-libs/gst/mpegts/gst-scte-section.c
--- old/gst-plugins-bad-1.26.7/gst-libs/gst/mpegts/gst-scte-section.c   
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst-libs/gst/mpegts/gst-scte-section.c   
2025-11-10 18:22:05.000000000 +0100
@@ -125,6 +125,7 @@
   {
     if (event)
       _gst_mpegts_scte_splice_event_free (event);
+    g_free (component);
     return NULL;
   }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/gst-libs/gst/wayland/gstwllinuxdmabuf.c 
new/gst-plugins-bad-1.26.8/gst-libs/gst/wayland/gstwllinuxdmabuf.c
--- old/gst-plugins-bad-1.26.7/gst-libs/gst/wayland/gstwllinuxdmabuf.c  
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst-libs/gst/wayland/gstwllinuxdmabuf.c  
2025-11-10 18:22:05.000000000 +0100
@@ -110,7 +110,7 @@
   guint nplanes = 0, flags = 0;
   struct zwp_linux_buffer_params_v1 *params;
   gint64 timeout;
-  ConstructBufferData data;
+  ConstructBufferData data = { 0 };
 
   g_return_val_if_fail (gst_wl_display_check_format_for_dmabuf (display,
           drm_info), NULL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/gst-plugins-bad.doap 
new/gst-plugins-bad-1.26.8/gst-plugins-bad.doap
--- old/gst-plugins-bad-1.26.7/gst-plugins-bad.doap     2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/gst-plugins-bad.doap     2025-11-10 
18:22:05.000000000 +0100
@@ -35,6 +35,16 @@
 
  <release>
   <Version>
+   <revision>1.26.8</revision>
+   <branch>1.26</branch>
+   <name></name>
+   <created>2025-11-10</created>
+   <file-release 
rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.26.8.tar.xz";
 />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
    <revision>1.26.7</revision>
    <branch>1.26</branch>
    <name></name>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/meson.build 
new/gst-plugins-bad-1.26.8/meson.build
--- old/gst-plugins-bad-1.26.7/meson.build      2025-10-14 19:25:43.000000000 
+0200
+++ new/gst-plugins-bad-1.26.8/meson.build      2025-11-10 18:22:05.000000000 
+0100
@@ -1,5 +1,5 @@
 project('gst-plugins-bad', 'c', 'cpp',
-  version : '1.26.7',
+  version : '1.26.8',
   meson_version : '>= 1.4',
   default_options : [ 'warning_level=1',
                       'buildtype=debugoptimized' ])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/sys/uvcgadget/gstuvcsink.c 
new/gst-plugins-bad-1.26.8/sys/uvcgadget/gstuvcsink.c
--- old/gst-plugins-bad-1.26.7/sys/uvcgadget/gstuvcsink.c       2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/sys/uvcgadget/gstuvcsink.c       2025-11-10 
18:22:05.000000000 +0100
@@ -1005,6 +1005,7 @@
 
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
+      gst_uvc_sink_to_fakesink (self);
       break;
     case GST_STATE_CHANGE_NULL_TO_READY:
       if (!gst_uvc_sink_watch (self))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/sys/v4l2codecs/gstv4l2decoder.c 
new/gst-plugins-bad-1.26.8/sys/v4l2codecs/gstv4l2decoder.c
--- old/gst-plugins-bad-1.26.7/sys/v4l2codecs/gstv4l2decoder.c  2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/sys/v4l2codecs/gstv4l2decoder.c  2025-11-10 
18:22:05.000000000 +0100
@@ -1245,6 +1245,7 @@
     if (ret < 0) {
       GST_ERROR_OBJECT (self, "MEDIA_IOC_REQUEST_ALLOC failed: %s",
           g_strerror (errno));
+      g_free (request);
       return NULL;
     }
 
@@ -1291,6 +1292,7 @@
     if (ret < 0) {
       GST_ERROR_OBJECT (self, "MEDIA_IOC_REQUEST_ALLOC failed: %s",
           g_strerror (errno));
+      g_free (request);
       return NULL;
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/sys/wasapi2/gstwasapi2activator.cpp 
new/gst-plugins-bad-1.26.8/sys/wasapi2/gstwasapi2activator.cpp
--- old/gst-plugins-bad-1.26.7/sys/wasapi2/gstwasapi2activator.cpp      
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/sys/wasapi2/gstwasapi2activator.cpp      
2025-11-10 18:22:05.000000000 +0100
@@ -89,16 +89,32 @@
 {
   ComPtr<IUnknown> iface;
   HRESULT hr = S_OK;
-  hr = op->GetActivateResult (&hr, &iface);
+  HRESULT activate_hr = S_OK;
+  hr = op->GetActivateResult (&activate_hr, &iface);
+  if (!gst_wasapi2_result (hr))
+    GST_WARNING ("Couldn't get activate result, hr: 0x%x", (guint) hr);
+
+  if (!gst_wasapi2_result (activate_hr)) {
+    GST_WARNING ("GetActivateResult failed, hr: 0x%x", (guint) activate_hr);
+    hr = activate_hr;
+  }
+
+  if (SUCCEEDED (hr) && !iface) {
+    GST_ERROR ("Couldn't get inteface from asyncop");
+    hr = E_FAIL;
+  }
+
   if (FAILED (hr)) {
-    GST_ERROR ("Couldn't get activate result, hr: 0x%x", (guint) hr);
     activate_hr_ = hr;
     SetEvent (event_);
     return hr;
   }
 
-  hr = iface.As (&client_);
-  activate_hr_ = hr;
+  {
+    std::lock_guard<std::mutex> lk (lock_);
+    hr = iface.As (&client_);
+    activate_hr_ = hr;
+  }
 
   GST_LOG ("Activation result 0x%x", (guint) hr);
 
@@ -133,6 +149,10 @@
   if (!client)
     return S_OK;
 
+  std::lock_guard<std::mutex> lk (lock_);
+  if (!client_)
+    return E_FAIL;
+
   *client = client_.Get ();
   (*client)->AddRef ();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gst-plugins-bad-1.26.7/sys/wasapi2/gstwasapi2activator.h 
new/gst-plugins-bad-1.26.8/sys/wasapi2/gstwasapi2activator.h
--- old/gst-plugins-bad-1.26.7/sys/wasapi2/gstwasapi2activator.h        
2025-10-14 19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/sys/wasapi2/gstwasapi2activator.h        
2025-11-10 18:22:05.000000000 +0100
@@ -24,6 +24,7 @@
 #include <wrl.h>
 #include <atomic>
 #include <string>
+#include <mutex>
 
 /* Copy of audioclientactivationparams.h since those types are defined only for
  * NTDDI_VERSION >= NTDDI_WIN10_FE */
@@ -85,6 +86,7 @@
 private:
   Microsoft::WRL::ComPtr<IAudioClient> client_;
   std::atomic<HRESULT> activate_hr_ = { E_FAIL };
+  std::mutex lock_;
   HANDLE event_;
   PROPVARIANT prop_ = { };
   AUDIOCLIENT_ACTIVATION_PARAMS params_ = { };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gst-plugins-bad-1.26.7/tests/check/libs/h264parser.c 
new/gst-plugins-bad-1.26.8/tests/check/libs/h264parser.c
--- old/gst-plugins-bad-1.26.7/tests/check/libs/h264parser.c    2025-10-14 
19:25:43.000000000 +0200
+++ new/gst-plugins-bad-1.26.8/tests/check/libs/h264parser.c    2025-11-10 
18:22:05.000000000 +0100
@@ -1078,6 +1078,53 @@
 
 GST_END_TEST;
 
+// This SPS block with vui parameters defines:
+// - frame_mbs_only_flag: 1 (progressive)
+// - time_scale: 4294967294 (overflows int32 capacity)
+// - num_units_in_tick: 71834980
+// The expected framerate is 29,894678707 fps.
+static const guint8 nalu_sps_with_overflow_framerate[] = {
+  0x00, 0x00, 0x00, 0x01, 0x27, 0x64, 0x00, 0x1f,
+  0xac, 0x72, 0x14, 0x05, 0x00, 0x5b, 0xb0, 0x11,
+  0x04, 0x48, 0x1d, 0x64, 0xff, 0xff, 0xff, 0xfe,
+  0xe2, 0x20, 0x00, 0x74, 0xc1, 0x00, 0x00, 0x74,
+  0xc1, 0x3b, 0xde, 0xe0, 0x3e, 0x10, 0x08, 0x32,
+  0xc0
+};
+
+GST_START_TEST (test_h264_parse_overflow_framerate)
+{
+  GstH264ParserResult res;
+  GstH264NalUnit nalu;
+  GstH264SPS sps;
+  gint fps_num, fps_den;
+  GstH264NalParser *const parser = gst_h264_nal_parser_new ();
+
+  res = gst_h264_parser_identify_nalu (parser, 
nalu_sps_with_overflow_framerate,
+      0, sizeof (nalu_sps_with_overflow_framerate), &nalu);
+  assert_equals_int (res, GST_H264_PARSER_NO_NAL_END);
+  assert_equals_int (nalu.type, GST_H264_NAL_SPS);
+  assert_equals_int (nalu.size, 37);
+
+  res = gst_h264_parser_parse_sps (parser, &nalu, &sps);
+  assert_equals_int (res, GST_H264_PARSER_OK);
+  fail_unless (sps.valid);
+  fail_unless (sps.frame_mbs_only_flag);
+  fail_unless (sps.vui_parameters_present_flag);
+  fail_unless (sps.vui_parameters.timing_info_present_flag);
+  assert_equals_uint64 (sps.vui_parameters.time_scale, 4294967294);
+  assert_equals_uint64 (sps.vui_parameters.num_units_in_tick, 71834980);
+
+  gst_h264_video_calculate_framerate (&sps, 0, 0, &fps_num, &fps_den);
+  assert_equals_int (fps_num, 2147483647);
+  assert_equals_int (fps_den, 71834980);
+
+  gst_h264_sps_clear (&sps);
+  gst_h264_nal_parser_free (parser);
+}
+
+GST_END_TEST;
+
 static Suite *
 h264parser_suite (void)
 {
@@ -1095,6 +1142,7 @@
   tcase_add_test (tc_chain, test_h264_decoder_config_record);
   tcase_add_test (tc_chain, test_h264_parse_partial_nal_header);
   tcase_add_test (tc_chain, test_h264_split_avc);
+  tcase_add_test (tc_chain, test_h264_parse_overflow_framerate);
 
   return s;
 }

++++++ gst-plugins-bad.obsinfo ++++++
--- /var/tmp/diff_new_pack.iYxnHt/_old  2025-11-13 17:26:17.792375485 +0100
+++ /var/tmp/diff_new_pack.iYxnHt/_new  2025-11-13 17:26:17.832377199 +0100
@@ -1,5 +1,5 @@
 name: gst-plugins-bad
-version: 1.26.7
-mtime: 1760462743
-commit: c5a5c302f5e7218182c0633decec16b25de82add
+version: 1.26.8
+mtime: 1762795325
+commit: 16d77e12ad213ef24e76a8cc34d347b8221c9975
 

Reply via email to