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