Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package gstreamer-plugins-good for
openSUSE:Factory checked in at 2026-05-13 17:18:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-good (Old)
and /work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.1966 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-good"
Wed May 13 17:18:44 2026 rev:130 rq:1352703 version:1.28.3
Changes:
--------
---
/work/SRC/openSUSE:Factory/gstreamer-plugins-good/gstreamer-plugins-good.changes
2026-04-15 16:04:53.303782769 +0200
+++
/work/SRC/openSUSE:Factory/.gstreamer-plugins-good.new.1966/gstreamer-plugins-good.changes
2026-05-13 17:19:00.310469612 +0200
@@ -1,0 +2,28 @@
+Tue May 12 07:01:26 UTC 2026 - Bjørn Lie <[email protected]>
+
+- Update to version 1.28.3:
+ + adaptivedemux/hlsdemux assertions / fixes
+ + avidemux:
+ - Fix divide by zero if VPRP contains fields==0
+ - Divide-by-Zero in vprp parser
+ + isomp4:
+ - Fix memory leak when file is corrupted
+ - qtdemux: Add bounds checks for ESDS descriptors
+ + matroska: Fix wrong object type bug
+ + qml6glsink: Fix redraw issues on buffer change
+ + qtdemux: Check for minimum stride requirements and width/height
+ constraints with uncompressed video
+ + rtspsrc:
+ - mki is optional upon crypto update
+ - mikey without mki failure
+ - include user-agent property in HTTP tunnel requests
+ + v4l2: object: Fix caps filtering in caps negotiation
+ + v4l2transform: release input buffers earlier
+ + wavparse:
+ - Remove assertion about upstream file size
+ - Recover from invalid av_bps instead of failing
+ - Assert and execute an integer overflow on invalid duration
+ + Require C std gnu11 or c11, remove custom 'restrict'
+ definition, fixing build with Qt 6.11
+
+-------------------------------------------------------------------
Old:
----
gst-plugins-good-1.28.2.obscpio
New:
----
gst-plugins-good-1.28.3.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gstreamer-plugins-good.spec ++++++
--- /var/tmp/diff_new_pack.DCtMQl/_old 2026-05-13 17:19:01.114503204 +0200
+++ /var/tmp/diff_new_pack.DCtMQl/_new 2026-05-13 17:19:01.118503372 +0200
@@ -33,7 +33,7 @@
%endif
Name: gstreamer-plugins-good
-Version: 1.28.2
+Version: 1.28.3
Release: 0
Summary: GStreamer Streaming-Media Framework Plug-Ins
License: LGPL-2.1-or-later
++++++ _service ++++++
--- /var/tmp/diff_new_pack.DCtMQl/_old 2026-05-13 17:19:01.174505712 +0200
+++ /var/tmp/diff_new_pack.DCtMQl/_new 2026-05-13 17:19:01.182506046 +0200
@@ -5,7 +5,7 @@
<param
name="url">https://gitlab.freedesktop.org/gstreamer/gstreamer.git</param>
<param name="subdir">subprojects/gst-plugins-good</param>
<param name="filename">gst-plugins-good</param>
- <param name="revision">1.28.2</param>
+ <param name="revision">1.28.3</param>
<param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
<param name="versionrewrite-pattern">v?(.*)\+0</param>
<param name="versionrewrite-replacement">\1</param>
++++++ gst-plugins-good-1.28.2.obscpio -> gst-plugins-good-1.28.3.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.28.2/ext/adaptivedemux2/gstadaptivedemux-stream.c
new/gst-plugins-good-1.28.3/ext/adaptivedemux2/gstadaptivedemux-stream.c
--- old/gst-plugins-good-1.28.2/ext/adaptivedemux2/gstadaptivedemux-stream.c
2026-04-07 21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/ext/adaptivedemux2/gstadaptivedemux-stream.c
2026-05-11 19:28:12.000000000 +0200
@@ -2089,8 +2089,6 @@
/* Restarting download, figure out new position
* FIXME : Move this to a separate function ? */
if (G_UNLIKELY (stream->state == GST_ADAPTIVE_DEMUX2_STREAM_STATE_RESTART)) {
- GstClockTimeDiff stream_time = 0;
-
GST_DEBUG_OBJECT (stream, "Activating stream after restart");
if (stream->parsebin_sink != NULL) {
@@ -2103,12 +2101,14 @@
}
GST_ADAPTIVE_DEMUX_SEGMENT_LOCK (demux);
- stream_time = stream->start_position;
GST_DEBUG_OBJECT (stream, "Restarting stream at "
- "stream position %" GST_STIME_FORMAT, GST_STIME_ARGS (stream_time));
+ "stream position %" GST_TIME_FORMAT,
+ GST_TIME_ARGS (stream->start_position));
+
+ if (GST_CLOCK_TIME_IS_VALID (stream->start_position)) {
+ GstClockTimeDiff stream_time = stream->start_position;
- if (GST_CLOCK_STIME_IS_VALID (stream_time)) {
/* TODO check return */
gst_adaptive_demux2_stream_seek (stream, demux->segment.rate >= 0,
0, stream_time, &stream_time);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.28.2/ext/adaptivedemux2/hls/gsthlsdemux-stream.c
new/gst-plugins-good-1.28.3/ext/adaptivedemux2/hls/gsthlsdemux-stream.c
--- old/gst-plugins-good-1.28.2/ext/adaptivedemux2/hls/gsthlsdemux-stream.c
2026-04-07 21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/ext/adaptivedemux2/hls/gsthlsdemux-stream.c
2026-05-11 19:28:12.000000000 +0200
@@ -1466,7 +1466,10 @@
stream->playlist_fetched = TRUE;
stream->pending_discont = TRUE;
- gst_hls_demux_reset_for_lost_sync (demux);
+ if (!gst_hls_demux_reset_for_lost_sync (demux)) {
+ GST_ELEMENT_ERROR (demux, STREAM, DEMUX,
+ ("Failed to resynchronise streams after a discontinuity"), (NULL));
+ }
}
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.28.2/ext/adaptivedemux2/hls/gsthlsdemux.c
new/gst-plugins-good-1.28.3/ext/adaptivedemux2/hls/gsthlsdemux.c
--- old/gst-plugins-good-1.28.2/ext/adaptivedemux2/hls/gsthlsdemux.c
2026-04-07 21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/ext/adaptivedemux2/hls/gsthlsdemux.c
2026-05-11 19:28:12.000000000 +0200
@@ -300,14 +300,18 @@
GstAdaptiveDemux2Stream *stream =
GST_ADAPTIVE_DEMUX2_STREAM (hlsdemux->main_stream);
- if (stream->state != GST_ADAPTIVE_DEMUX2_STREAM_STATE_STOPPED) {
- stream->state = GST_ADAPTIVE_DEMUX2_STREAM_STATE_WAITING_PREPARE;
+ if (stream->state == GST_ADAPTIVE_DEMUX2_STREAM_STATE_STOPPED) {
+ GST_DEBUG_OBJECT (hlsdemux,
+ "Interrupted waiting for stream to be prepared");
+ return GST_FLOW_FLUSHING;
+ }
- if (!gst_adaptive_demux2_stream_wait_prepared (stream)) {
- GST_DEBUG_OBJECT (hlsdemux,
- "Interrupted waiting for stream to be prepared");
- return GST_FLOW_FLUSHING;
- }
+ stream->state = GST_ADAPTIVE_DEMUX2_STREAM_STATE_WAITING_PREPARE;
+
+ if (!gst_adaptive_demux2_stream_wait_prepared (stream)) {
+ GST_DEBUG_OBJECT (hlsdemux,
+ "Interrupted waiting for stream to be prepared");
+ return GST_FLOW_FLUSHING;
}
}
@@ -1208,7 +1212,7 @@
/* Reset hlsdemux in case of live synchronization loss (i.e. when a media
* playlist update doesn't match at all with the previous one) */
-void
+gboolean
gst_hls_demux_reset_for_lost_sync (GstHLSDemux * hlsdemux)
{
GstAdaptiveDemux *demux = (GstAdaptiveDemux *) hlsdemux;
@@ -1229,7 +1233,12 @@
GstM3U8SeekResult seek_result;
/* Resynchronize the variant stream */
- g_assert (stream->current_position != GST_CLOCK_STIME_NONE);
+ if (stream->current_position == GST_CLOCK_TIME_NONE) {
+ GST_ERROR_OBJECT (stream,
+ "Variant doesn't have a current position to recalculate sync");
+ return FALSE;
+ }
+
if (gst_hls_media_playlist_get_starting_segment (hls_stream->playlist,
&seek_result)) {
hls_stream->current_segment = seek_result.segment;
@@ -1261,6 +1270,8 @@
hls_stream->playlist_fetched = FALSE;
}
}
+
+ return TRUE;
}
static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.28.2/ext/adaptivedemux2/hls/gsthlsdemux.h
new/gst-plugins-good-1.28.3/ext/adaptivedemux2/hls/gsthlsdemux.h
--- old/gst-plugins-good-1.28.2/ext/adaptivedemux2/hls/gsthlsdemux.h
2026-04-07 21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/ext/adaptivedemux2/hls/gsthlsdemux.h
2026-05-11 19:28:12.000000000 +0200
@@ -116,7 +116,7 @@
GstCaps * caps, GstStreamFlags flags, GstTagList * tags);
void gst_hls_demux_start_rendition_streams (GstHLSDemux * hlsdemux);
-void gst_hls_demux_reset_for_lost_sync (GstHLSDemux * hlsdemux);
+gboolean gst_hls_demux_reset_for_lost_sync (GstHLSDemux * hlsdemux);
const GstHLSKey *gst_hls_demux_get_key (GstHLSDemux * demux,
const gchar * key_url, const gchar * referer, gboolean allow_cache);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/ext/qt6/qt6glitem.cc
new/gst-plugins-good-1.28.3/ext/qt6/qt6glitem.cc
--- old/gst-plugins-good-1.28.2/ext/qt6/qt6glitem.cc 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/ext/qt6/qt6glitem.cc 2026-05-11
19:28:12.000000000 +0200
@@ -337,6 +337,7 @@
} else if (!was_bound) {
GST_TRACE ("old buffer %p was not bound yet, unreffing", old_buffer);
gst_buffer_unref (old_buffer);
+ texNode->markDirty(QSGNode::DirtyMaterial);
} else {
texNode->markDirty(QSGNode::DirtyMaterial);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/gst/avi/gstavidemux.c
new/gst-plugins-good-1.28.3/gst/avi/gstavidemux.c
--- old/gst-plugins-good-1.28.2/gst/avi/gstavidemux.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/gst/avi/gstavidemux.c 2026-05-11
19:28:12.000000000 +0200
@@ -1806,6 +1806,12 @@
vprp->fields = GUINT32_FROM_LE (vprp->fields);
#endif
+ if (vprp->fields == 0) {
+ g_free (vprp);
+ gst_buffer_unref (buf);
+ return FALSE;
+ }
+
/* size checking */
/* calculate fields based on size */
k = (size - G_STRUCT_OFFSET (gst_riff_vprp, field_info)) / vprp->fields;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/gst/isomp4/qtdemux.c
new/gst-plugins-good-1.28.3/gst/isomp4/qtdemux.c
--- old/gst-plugins-good-1.28.2/gst/isomp4/qtdemux.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/gst/isomp4/qtdemux.c 2026-05-11
19:28:12.000000000 +0200
@@ -12784,14 +12784,14 @@
return GST_VIDEO_FORMAT_UNKNOWN;
}
-static void
+static gboolean
qtdemux_set_info_from_uncv (GstQTDemux * qtdemux,
QtDemuxStreamStsdEntry * entry, UncompressedFrameConfigBox * uncC,
GstVideoInfo * info)
{
guint32 num_components = uncC->component_count;
guint32 row_align_size = uncC->row_align_size;
- gint height = entry->height;
+ guint height = entry->height;
if (uncC->version == 1) {
switch (uncC->profile) {
@@ -12805,38 +12805,84 @@
default:
GST_WARNING_OBJECT (qtdemux, "Unsupported uncv profile: %u",
uncC->profile);
- return;
+ return FALSE;
}
info->stride[0] = entry->width * num_components;
info->size = info->stride[0] * height;
- return;
+ return TRUE;
}
- gint default_stride = 0;
+ guint default_stride;
+ // We only support 8/16 bit formats right now, and r210. Other formats need
+ // updating below to calculate the correct strides and sizes.
+ g_assert (uncC->components[0].bit_depth % 8 == 0
+ || info->finfo->format == GST_VIDEO_FORMAT_r210);
if (row_align_size) {
default_stride = row_align_size;
} else {
- default_stride = entry->width;
+ default_stride = (uncC->components[0].bit_depth / 8) * entry->width;
}
switch (uncC->sampling_type) {
- case SAMPLING_444:
- if (uncC->interleave_type == INTERLEAVE_PIXEL) {
- if (row_align_size) {
- info->stride[0] = row_align_size;
- } else {
- info->stride[0] = entry->width * num_components;
+ case SAMPLING_444:{
+ switch (uncC->interleave_type) {
+ case INTERLEAVE_PIXEL:{
+ guint min_stride =
+ (uncC->components[0].bit_depth / 8) * entry->width *
+ num_components;
+
+ // Special case for r210
+ if (info->finfo->format == GST_VIDEO_FORMAT_r210)
+ min_stride = entry->width * 4;
+
+ if (row_align_size) {
+ if (row_align_size < min_stride) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Invalid row align size %u smaller than minimum %u",
+ row_align_size, min_stride);
+ return FALSE;
+ }
+ info->stride[0] = row_align_size;
+ } else {
+ info->stride[0] = min_stride;
+ }
+ info->size = info->stride[0] * height;
+ break;
}
- info->size = info->stride[0] * height;
- } else {
- for (gint i = 0; i < num_components; i++) {
- info->stride[i] = default_stride;
+ case INTERLEAVE_COMPONENT:{
+ guint min_stride = (uncC->components[0].bit_depth / 8) *
entry->width;
+ if (default_stride < min_stride) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Invalid row align size %u smaller than minimum %u",
+ default_stride, min_stride);
+ return FALSE;
+ }
+
+ for (gint i = 0; i < num_components; i++) {
+ info->stride[i] = default_stride;
+ }
+ info->size = info->stride[0] * height * num_components;
+ break;
}
- info->size = info->stride[0] * height * num_components;
+ default:
+ return FALSE;
}
break;
+ }
+ case SAMPLING_422:{
+ guint min_stride = (uncC->components[0].bit_depth / 8) * entry->width;
+ if (default_stride < min_stride) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Invalid row align size %u smaller than minimum %u",
default_stride,
+ min_stride);
+ return FALSE;
+ }
+ if (entry->width % 2 != 0) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Require even widths for 4:2:2 subsampling");
+ return FALSE;
+ }
- case SAMPLING_422:
info->stride[0] = default_stride;
switch (uncC->interleave_type) {
case INTERLEAVE_COMPONENT:
@@ -12846,16 +12892,31 @@
case INTERLEAVE_MIXED:
info->stride[1] = info->stride[0];
break;
- case INTERLEAVE_MULTI_Y:
- // TODO
- break;
default:
- break; // Error
+ return FALSE;
}
info->size = info->stride[0] * height * 2;
break;
+ }
+ case SAMPLING_420:{
+ guint min_stride = (uncC->components[0].bit_depth / 8) * entry->width;
+ if (default_stride < min_stride) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Invalid row align size %u smaller than minimum %u",
default_stride,
+ min_stride);
+ return FALSE;
+ }
+ if (entry->width % 2 != 0) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Require even widths for 4:2:0 subsampling");
+ return FALSE;
+ }
+ if (entry->height % 2 != 0) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Require even heights for 4:2:0 subsampling");
+ return FALSE;
+ }
- case SAMPLING_420:
info->stride[0] = default_stride;
switch (uncC->interleave_type) {
case INTERLEAVE_COMPONENT:
@@ -12866,12 +12927,25 @@
info->stride[1] = info->stride[0];
break;
default:
- break; // Error
+ return FALSE;
}
info->size = info->stride[0] * height * 3 / 2;
break;
+ }
+ case SAMPLING_411:{
+ guint min_stride = (uncC->components[0].bit_depth / 8) * entry->width;
+ if (default_stride < min_stride) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Invalid row align size %u smaller than minimum %u",
default_stride,
+ min_stride);
+ return FALSE;
+ }
+ if (entry->width % 4 != 0) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Require widths that are an integer multiple of 4 for 4:1:1
subsampling");
+ return FALSE;
+ }
- case SAMPLING_411:
info->stride[0] = default_stride;
switch (uncC->interleave_type) {
case INTERLEAVE_COMPONENT:
@@ -12881,17 +12955,17 @@
case INTERLEAVE_MIXED:
info->stride[1] = info->stride[0];
break;
- case INTERLEAVE_MULTI_Y:
- // TODO
default:
- break; // Error
+ return FALSE;
}
info->size = info->stride[0] * height * 3 / 2;
break;
+ }
default:
- break;
+ return FALSE;
}
+ return TRUE;
}
/* *INDENT-OFF* */
@@ -16615,6 +16689,7 @@
dops = qtdemux_tree_get_child_by_type (stsd_entry, FOURCC_dops);
if (dops == NULL) {
GST_WARNING_OBJECT (qtdemux, "Opus Specific Box not found");
+ g_free (codec);
goto corrupt_file;
}
@@ -16640,12 +16715,14 @@
if (len < offset + dops_len) {
GST_WARNING_OBJECT (qtdemux,
"Opus Sample Entry has bogus size %" G_GUINT32_FORMAT, len);
+ g_free (codec);
goto corrupt_file;
}
if (dops_len < 19) {
GST_WARNING_OBJECT (qtdemux,
"Opus Specific Box has bogus size %" G_GUINT32_FORMAT,
dops_len);
+ g_free (codec);
goto corrupt_file;
}
@@ -16658,6 +16735,7 @@
GST_WARNING_OBJECT (qtdemux,
"Opus Specific Box has bogus size %" G_GUINT32_FORMAT,
dops_len);
+ g_free (codec);
goto corrupt_file;
}
@@ -16680,6 +16758,7 @@
GST_WARNING_OBJECT (qtdemux,
"Opus unexpected nb of channels %d without channel mapping",
n_channels);
+ g_free (codec);
goto corrupt_file;
}
@@ -18451,6 +18530,11 @@
switch (tag) {
case ES_DESCRIPTOR_TAG:
+ if (len < 3) {
+ GST_WARNING_OBJECT (qtdemux, "ES descriptor too short (%d < 3)",
len);
+ ptr += len;
+ break;
+ }
GST_DEBUG_OBJECT (qtdemux, "ID 0x%04x", QT_UINT16 (ptr));
GST_DEBUG_OBJECT (qtdemux, "priority 0x%04x", QT_UINT8 (ptr + 2));
ptr += 3;
@@ -18458,6 +18542,13 @@
case DECODER_CONFIG_DESC_TAG:{
guint max_bitrate, avg_bitrate;
+ if (len < 13) {
+ GST_WARNING_OBJECT (qtdemux,
+ "Decoder config descriptor too short (%d < 13)", len);
+ ptr += len;
+ break;
+ }
+
object_type_id = QT_UINT8 (ptr);
stream_type = QT_UINT8 (ptr + 1) >> 2;
max_bitrate = QT_UINT32 (ptr + 5);
@@ -18519,6 +18610,12 @@
ptr += len;
break;
case SL_CONFIG_DESC_TAG:
+ if (len < 1) {
+ GST_WARNING_OBJECT (qtdemux,
+ "SL config descriptor too short (%d < 1)", len);
+ ptr += len;
+ break;
+ }
GST_DEBUG_OBJECT (qtdemux, "data %02x", QT_UINT8 (ptr));
ptr += 1;
break;
@@ -19337,10 +19434,13 @@
format = qtdemux_get_format_from_uncv (qtdemux, &uncC, &cmpd);
if (format != GST_VIDEO_FORMAT_UNKNOWN) {
+ stream->alignment = 32;
+
gst_video_info_set_format (&stream->pre_info, format, entry->width,
entry->height);
- qtdemux_set_info_from_uncv (qtdemux, entry, &uncC, &stream->pre_info);
- stream->alignment = 32;
+ if (!qtdemux_set_info_from_uncv (qtdemux, entry, &uncC,
+ &stream->pre_info))
+ format = GST_VIDEO_FORMAT_UNKNOWN;
}
/* Free Memory */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/gst/matroska/ebml-read.c
new/gst-plugins-good-1.28.3/gst/matroska/ebml-read.c
--- old/gst-plugins-good-1.28.2/gst/matroska/ebml-read.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/gst/matroska/ebml-read.c 2026-05-11
19:28:12.000000000 +0200
@@ -602,7 +602,7 @@
for (iter = str; *iter != '\0'; iter++) {
if (G_UNLIKELY (*iter & 0x80)) {
- GST_ERROR_OBJECT (ebml,
+ GST_ERROR_OBJECT (ebml->el,
"Invalid ASCII string at offset %" G_GUINT64_FORMAT, oldoff);
g_free (str);
return GST_FLOW_ERROR;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/gst/rtsp/gstrtspsrc.c
new/gst-plugins-good-1.28.3/gst/rtsp/gstrtspsrc.c
--- old/gst-plugins-good-1.28.2/gst/rtsp/gstrtspsrc.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/gst/rtsp/gstrtspsrc.c 2026-05-11
19:28:12.000000000 +0200
@@ -4217,12 +4217,12 @@
}
static void
-update_srtcp_params (GstRTSPStream * stream)
+update_srtcp_params (GstRTSPStream * stream, gboolean update)
{
GstStructure *s = gst_caps_get_structure (stream->srtcpparams, 0);
if (s) {
GstBuffer *buf;
- GstBuffer *mki_buf;
+ GstBuffer *mki_buf = NULL;
const gchar *str;
GType ciphertype, authtype;
GValue rtcp_cipher = G_VALUE_INIT, rtcp_auth = G_VALUE_INIT;
@@ -4239,6 +4239,22 @@
gst_structure_get (s, "srtp-key", GST_TYPE_BUFFER, &buf, NULL);
gst_structure_get (s, "mki", GST_TYPE_BUFFER, &mki_buf, NULL);
+ if (update) {
+ GstBuffer *current_mki_buf = NULL;
+
+ g_object_get (stream->srtpenc, "mki", ¤t_mki_buf, NULL);
+
+ if ((current_mki_buf != NULL) != (mki_buf != NULL)) {
+ GstRTSPSrc *rtspsrc = GST_RTSPSRC (stream->parent);
+ GST_WARNING_OBJECT (rtspsrc,
+ "Mixed MKI and non-MKI keys detected in the same SRTP session. "
+ "Current key has %s MKI, new key has %s MKI",
+ current_mki_buf ? "an" : "no", mki_buf ? "an" : "no");
+ }
+
+ gst_clear_buffer (¤t_mki_buf);
+ }
+
g_object_set_property (G_OBJECT (stream->srtpenc), "rtp-cipher",
&rtcp_cipher);
g_object_set_property (G_OBJECT (stream->srtpenc), "rtp-auth", &rtcp_auth);
@@ -4251,7 +4267,7 @@
g_value_unset (&rtcp_cipher);
g_value_unset (&rtcp_auth);
gst_buffer_unref (buf);
- gst_buffer_unref (mki_buf);
+ gst_clear_buffer (&mki_buf);
}
}
@@ -4294,7 +4310,7 @@
gst_caps_unref (stream->srtcpparams);
stream->srtcpparams = signal_get_srtcp_params (rtspsrc, stream);
- update_srtcp_params (stream);
+ update_srtcp_params (stream, TRUE);
} else {
GST_ERROR_OBJECT (rtspsrc, "No MIKEYs for stream with id %u", stream->id);
return NULL;
@@ -4414,7 +4430,7 @@
}
/* get RTCP crypto parameters from caps */
- update_srtcp_params (stream);
+ update_srtcp_params (stream, FALSE);
}
name = g_strdup_printf ("rtcp_sink_%d", session);
pad = gst_element_request_pad_simple (stream->srtpenc, name);
@@ -5806,6 +5822,15 @@
gst_rtsp_connection_set_tunneled (info->connection, TRUE);
gst_rtsp_connection_set_ignore_x_server_reply (info->connection,
src->ignore_x_server_reply);
+
+ if (src->user_agent) {
+ GString *user_agent = g_string_new (src->user_agent);
+
+ g_string_replace (user_agent, "{VERSION}", PACKAGE_VERSION, 0);
+ gst_rtsp_connection_add_extra_http_request_header (info->connection,
+ "User-Agent", user_agent->str);
+ g_string_free (user_agent, TRUE);
+ }
}
if (src->proxy_host) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/gst/wavparse/gstwavparse.c
new/gst-plugins-good-1.28.3/gst/wavparse/gstwavparse.c
--- old/gst-plugins-good-1.28.2/gst/wavparse/gstwavparse.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/gst/wavparse/gstwavparse.c 2026-05-11
19:28:12.000000000 +0200
@@ -1258,7 +1258,17 @@
case GST_RIFF_WAVE_FORMAT_PCM:
if (wav->blockalign > wav->channels * ((wav->depth + 7) / 8))
goto invalid_blockalign;
- /* fall through */
+ /* For PCM, av_bps is fully determined by blockalign * rate. Some
+ * writers produce bogus av_bps values; recompute instead of failing
+ * so playback and seeking work correctly. */
+ if (wav->av_bps != wav->blockalign * wav->rate) {
+ GST_WARNING_OBJECT (wav,
+ "Stream claims av_bps = %u, expected %u for PCM - recomputing",
+ wav->av_bps, wav->blockalign * wav->rate);
+ wav->av_bps = wav->blockalign * wav->rate;
+ }
+ wav->bps = wav->av_bps;
+ break;
default:
if (wav->av_bps > wav->blockalign * wav->rate)
goto invalid_bps;
@@ -1360,11 +1370,14 @@
}
/* Clip to upstream size if known */
- if (upstream_size > 0 && size + 8 + wav->offset > upstream_size) {
- GST_WARNING_OBJECT (wav, "Clipping chunk size to file size");
- g_assert (upstream_size >= wav->offset);
- g_assert (upstream_size - wav->offset >= 8);
- size = upstream_size - wav->offset - 8;
+ if (upstream_size > 0) {
+ if (upstream_size < wav->offset + 8) {
+ GST_WARNING_OBJECT (wav, "Bogus file size");
+ upstream_size = -1;
+ } else if (size > upstream_size - wav->offset - 8) {
+ GST_WARNING_OBJECT (wav, "Clipping chunk size to file size");
+ size = upstream_size - wav->offset - 8;
+ }
}
/* wav is a st00pid format, we don't know for sure where data starts.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/gst-plugins-good.doap
new/gst-plugins-good-1.28.3/gst-plugins-good.doap
--- old/gst-plugins-good-1.28.2/gst-plugins-good.doap 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/gst-plugins-good.doap 2026-05-11
19:28:12.000000000 +0200
@@ -34,6 +34,16 @@
<release>
<Version>
+ <revision>1.28.3</revision>
+ <branch>1.28</branch>
+ <name></name>
+ <created>2026-05-11</created>
+ <file-release
rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.28.3.tar.xz"
/>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>1.28.2</revision>
<branch>1.28</branch>
<name></name>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/meson.build
new/gst-plugins-good-1.28.3/meson.build
--- old/gst-plugins-good-1.28.2/meson.build 2026-04-07 21:02:23.000000000
+0200
+++ new/gst-plugins-good-1.28.3/meson.build 2026-05-11 19:28:12.000000000
+0200
@@ -1,8 +1,9 @@
project('gst-plugins-good', 'c',
- version : '1.28.2',
+ version : '1.28.3',
meson_version : '>= 1.4',
default_options : [ 'warning_level=1',
- 'buildtype=debugoptimized' ])
+ 'buildtype=debugoptimized',
+ 'c_std=gnu11,c11' ])
gst_version = meson.project_version()
version_arr = gst_version.split('.')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/gst-plugins-good-1.28.2/sys/osxaudio/gstosxcoreaudiocommon.h
new/gst-plugins-good-1.28.3/sys/osxaudio/gstosxcoreaudiocommon.h
--- old/gst-plugins-good-1.28.2/sys/osxaudio/gstosxcoreaudiocommon.h
2026-04-07 21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/sys/osxaudio/gstosxcoreaudiocommon.h
2026-05-11 19:28:12.000000000 +0200
@@ -28,6 +28,9 @@
G_BEGIN_DECLS
+/* Master was renamed to Main in Xcode 13, and Master was deprecated */
+#define kAudioObjectPropertyElementMain 0
+
typedef struct
{
GMutex lock;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2bufferpool.c
new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2bufferpool.c
--- old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2bufferpool.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2bufferpool.c 2026-05-11
19:28:12.000000000 +0200
@@ -1929,6 +1929,30 @@
}
/**
+ * gst_v4l2_buffer_pool_release_buffers:
+ * @pool: a #GstBufferPool
+ *
+ * Dequeue and release all buffers that are ready. This can be used for output
+ * devices or the output side of M2M devices to release buffers for use in the
+ * upstream pipeline.
+ *
+ * Must be called with the stream lock held.
+ */
+void
+gst_v4l2_buffer_pool_release_buffers (GstV4l2BufferPool * pool)
+{
+ GstBufferPool *bpool = GST_BUFFER_POOL_CAST (pool);
+ GstBuffer *buffer;
+ gboolean outstanding;
+
+ while (gst_v4l2_buffer_pool_dqbuf (pool, &buffer, &outstanding,
+ FALSE) == GST_FLOW_OK) {
+ if (!outstanding)
+ gst_v4l2_buffer_pool_complete_release_buffer (bpool, buffer, FALSE);
+ }
+}
+
+/**
* gst_v4l2_buffer_pool_process:
* @bpool: a #GstBufferPool
* @buf: a #GstBuffer, maybe be replaced
@@ -2202,12 +2226,7 @@
gst_clear_buffer (&to_queue);
/* release as many buffer as possible */
- while (gst_v4l2_buffer_pool_dqbuf (pool, &buffer, &outstanding,
- FALSE) == GST_FLOW_OK) {
- if (!outstanding)
- gst_v4l2_buffer_pool_complete_release_buffer (bpool, buffer,
- FALSE);
- }
+ gst_v4l2_buffer_pool_release_buffers (pool);
num_queued = g_atomic_int_get (&pool->num_queued);
if (num_queued >= pool->min_latency && num_queued > split_count) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2bufferpool.h
new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2bufferpool.h
--- old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2bufferpool.h 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2bufferpool.h 2026-05-11
19:28:12.000000000 +0200
@@ -122,6 +122,8 @@
void gst_v4l2_buffer_pool_enable_resolution_change
(GstV4l2BufferPool *self);
+void gst_v4l2_buffer_pool_release_buffers (GstV4l2BufferPool *
pool);
+
G_END_DECLS
#endif /*__GST_V4L2_BUFFER_POOL_H__ */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2object.c
new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2object.c
--- old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2object.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2object.c 2026-05-11
19:28:12.000000000 +0200
@@ -5446,7 +5446,12 @@
if (dmabuf_tmpl) {
gst_caps_append_structure (format_caps,
gst_structure_copy (dmabuf_tmpl));
- add_alternate_variant (v4l2object, format_caps, dmabuf_tmpl, NULL);
+ gst_caps_set_features (filter, 0,
+ gst_caps_features_new_single_static_str
+ (GST_CAPS_FEATURE_MEMORY_DMABUF));
+ add_alternate_variant (v4l2object, format_caps, dmabuf_tmpl,
+ gst_caps_features_new_single_static_str
+ (GST_CAPS_FEATURE_MEMORY_DMABUF));
}
if (sysmem_tmpl) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2transform.c
new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2transform.c
--- old/gst-plugins-good-1.28.2/sys/v4l2/gstv4l2transform.c 2026-04-07
21:02:23.000000000 +0200
+++ new/gst-plugins-good-1.28.3/sys/v4l2/gstv4l2transform.c 2026-05-11
19:28:12.000000000 +0200
@@ -986,6 +986,13 @@
} while (ret == GST_V4L2_FLOW_CORRUPTED_BUFFER);
+ if (pool)
+ g_object_unref (pool);
+
+ pool = gst_v4l2_object_get_buffer_pool (self->v4l2output);
+ /* release the output buffer that is no longer needed */
+ gst_v4l2_buffer_pool_release_buffers (GST_V4L2_BUFFER_POOL (pool));
+
if (ret != GST_FLOW_OK) {
gst_buffer_unref (*outbuf);
*outbuf = NULL;
++++++ gst-plugins-good.obsinfo ++++++
--- /var/tmp/diff_new_pack.DCtMQl/_old 2026-05-13 17:19:03.606607322 +0200
+++ /var/tmp/diff_new_pack.DCtMQl/_new 2026-05-13 17:19:03.610607490 +0200
@@ -1,5 +1,5 @@
name: gst-plugins-good
-version: 1.28.2
-mtime: 1775588543
-commit: 43421c2a5b8ac5cceb52b11749df40301e1de5c0
+version: 1.28.3
+mtime: 1778520492
+commit: 62d8936e70b11a2e21ea3c68b7672b675e142945