Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package gstreamer-plugins-libav for
openSUSE:Factory checked in at 2026-04-15 16:03:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-libav (Old)
and /work/SRC/openSUSE:Factory/.gstreamer-plugins-libav.new.21863 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-libav"
Wed Apr 15 16:03:45 2026 rev:70 rq:1346832 version:1.28.2
Changes:
--------
---
/work/SRC/openSUSE:Factory/gstreamer-plugins-libav/gstreamer-plugins-libav.changes
2026-03-05 17:13:59.679772967 +0100
+++
/work/SRC/openSUSE:Factory/.gstreamer-plugins-libav.new.21863/gstreamer-plugins-libav.changes
2026-04-15 16:04:57.435952644 +0200
@@ -1,0 +2,6 @@
+Wed Apr 8 12:24:23 UTC 2026 - Bjørn Lie <[email protected]>
+
+- Update to version 1.28.2:
+ + avviddec: Refcount codec frame associated with video frame
+
+-------------------------------------------------------------------
Old:
----
gst-libav-1.28.1.obscpio
New:
----
gst-libav-1.28.2.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ gstreamer-plugins-libav.spec ++++++
--- /var/tmp/diff_new_pack.mr3L8h/_old 2026-04-15 16:05:00.204066443 +0200
+++ /var/tmp/diff_new_pack.mr3L8h/_new 2026-04-15 16:05:00.208066607 +0200
@@ -19,7 +19,7 @@
%define gst_branch 1.0
Name: gstreamer-plugins-libav
-Version: 1.28.1
+Version: 1.28.2
Release: 0
Summary: A ffmpeg/libav plugin for GStreamer
License: LGPL-2.1-or-later
++++++ _service ++++++
--- /var/tmp/diff_new_pack.mr3L8h/_old 2026-04-15 16:05:00.264068910 +0200
+++ /var/tmp/diff_new_pack.mr3L8h/_new 2026-04-15 16:05:00.268069074 +0200
@@ -5,7 +5,7 @@
<param
name="url">https://gitlab.freedesktop.org/gstreamer/gstreamer.git</param>
<param name="subdir">subprojects/gst-libav</param>
<param name="filename">gst-libav</param>
- <param name="revision">1.28.1</param>
+ <param name="revision">1.28.2</param>
<param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
<param name="versionrewrite-pattern">v?(.*)\+0</param>
<param name="versionrewrite-replacement">\1</param>
++++++ gst-libav-1.28.1.obscpio -> gst-libav-1.28.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.28.1/ext/libav/gstavviddec.c
new/gst-libav-1.28.2/ext/libav/gstavviddec.c
--- old/gst-libav-1.28.1/ext/libav/gstavviddec.c 2026-02-26
03:09:39.000000000 +0100
+++ new/gst-libav-1.28.2/ext/libav/gstavviddec.c 2026-04-07
21:02:23.000000000 +0200
@@ -795,6 +795,68 @@
AVBufferRef *avbuffer;
} GstFFMpegVidDecVideoFrame;
+typedef struct
+{
+ /* Keep track of how many decoded frames are referencing the codec frame,
+ * so we know when we can release the codec frame from the decoder.
+ *
+ * With certain content, FFmpeg can call `get_buffer2` multiple times for the
+ * same codec frame, so we end up with multiple VidDecVideoFrames referencing
+ * the same codec frame.
+ */
+ guint refcount;
+} GstFFMpegVidDecCodecFrameData;
+
+/* Replaces the 'frame' reference of a VidDecVideoFrame to its codec frame.
+ * Consumes the passed 'frame'. Can be passed NULL as the new 'frame' to clear
+ * the reference.
+ *
+ * Unrefs an old 'frame', if any. Instead of just unreffing, will release the
+ * codec frame from the decoder if this was the last VidDecVideoFrame
+ * referencing it.
+ */
+static void
+gst_ffmpegviddec_video_frame_take_frame (GstFFMpegVidDecVideoFrame * dframe,
+ GstVideoCodecFrame * frame)
+{
+ if (dframe->frame) {
+ GstFFMpegVidDecCodecFrameData *data =
+ gst_video_codec_frame_get_user_data (dframe->frame);
+
+ data->refcount--;
+
+ GST_DEBUG_OBJECT (dframe->ffmpegdec,
+ "unreffed codec frame %p sfn # %u ref ->%u", dframe->frame,
+ dframe->frame->system_frame_number, data->refcount);
+
+ if (data->refcount == 0) {
+ GST_VIDEO_CODEC_FRAME_FLAG_UNSET (dframe->frame,
+ GST_FFMPEG_VIDEO_CODEC_FRAME_FLAG_ALLOCATED);
+ gst_video_decoder_release_frame (GST_VIDEO_DECODER (dframe->ffmpegdec),
+ dframe->frame);
+ } else {
+ gst_video_codec_frame_unref (dframe->frame);
+ }
+ }
+
+ dframe->frame = frame;
+
+ if (frame) {
+ GstFFMpegVidDecCodecFrameData *data =
+ gst_video_codec_frame_get_user_data (frame);
+
+ if (data == NULL) {
+ data = g_new0 (GstFFMpegVidDecCodecFrameData, 1);
+ gst_video_codec_frame_set_user_data (frame, data, g_free);
+ }
+ data->refcount++;
+
+ GST_DEBUG_OBJECT (dframe->ffmpegdec,
+ "reffed codec frame %p sfn # %u ref ->%u", frame,
+ frame->system_frame_number, data->refcount);
+ }
+}
+
static GstFFMpegVidDecVideoFrame *
gst_ffmpegviddec_video_frame_new (GstFFMpegVidDec * ffmpegdec,
GstVideoCodecFrame * frame)
@@ -803,7 +865,7 @@
dframe = g_new0 (GstFFMpegVidDecVideoFrame, 1);
dframe->ffmpegdec = ffmpegdec;
- dframe->frame = frame;
+ gst_ffmpegviddec_video_frame_take_frame (dframe, frame);
GST_DEBUG_OBJECT (ffmpegdec, "new video frame %p for sfn # %d", dframe,
frame->system_frame_number);
@@ -816,13 +878,11 @@
GstFFMpegVidDecVideoFrame * frame)
{
GST_DEBUG_OBJECT (ffmpegdec, "free video frame %p for sfn # %d", frame,
- frame->frame->system_frame_number);
+ frame->frame ? frame->frame->system_frame_number : -1);
if (frame->mapped)
gst_video_frame_unmap (&frame->vframe);
- GST_VIDEO_CODEC_FRAME_FLAG_UNSET (frame->frame,
- GST_FFMPEG_VIDEO_CODEC_FRAME_FLAG_ALLOCATED);
- gst_video_decoder_release_frame (GST_VIDEO_DECODER (ffmpegdec),
frame->frame);
+ gst_ffmpegviddec_video_frame_take_frame (frame, NULL);
gst_buffer_replace (&frame->buffer, NULL);
if (frame->avbuffer) {
av_buffer_unref (&frame->avbuffer);
@@ -1077,7 +1137,7 @@
if (picture->opaque) {
GST_DEBUG_OBJECT (ffmpegdec, "Re-using opaque %p", picture->opaque);
dframe = picture->opaque;
- dframe->frame = frame;
+ gst_ffmpegviddec_video_frame_take_frame (dframe, frame);
} else {
picture->opaque = dframe =
gst_ffmpegviddec_video_frame_new (ffmpegdec, frame);
@@ -1996,6 +2056,9 @@
output_frame = gst_video_codec_frame_ref (out_dframe->frame);
#endif
+ GST_LOG_OBJECT (ffmpegdec, "Got frame from ffmpeg, sfn # %"
+ G_GUINT32_FORMAT, output_frame->system_frame_number);
+
/* also give back a buffer allocated by the frame, if any */
if (out_dframe) {
gst_buffer_replace (&output_frame->output_buffer, out_dframe->buffer);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.28.1/gst-libav.doap
new/gst-libav-1.28.2/gst-libav.doap
--- old/gst-libav-1.28.1/gst-libav.doap 2026-02-26 03:09:39.000000000 +0100
+++ new/gst-libav-1.28.2/gst-libav.doap 2026-04-07 21:02:23.000000000 +0200
@@ -34,6 +34,16 @@
<release>
<Version>
+ <revision>1.28.2</revision>
+ <branch>1.28</branch>
+ <name></name>
+ <created>2026-04-07</created>
+ <file-release
rdf:resource="https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-1.28.2.tar.xz"
/>
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>1.28.1</revision>
<branch>1.28</branch>
<name></name>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/gst-libav-1.28.1/meson.build
new/gst-libav-1.28.2/meson.build
--- old/gst-libav-1.28.1/meson.build 2026-02-26 03:09:39.000000000 +0100
+++ new/gst-libav-1.28.2/meson.build 2026-04-07 21:02:23.000000000 +0200
@@ -1,5 +1,5 @@
project('gst-libav', 'c',
- version : '1.28.1',
+ version : '1.28.2',
meson_version : '>= 1.4',
default_options : [ 'warning_level=1',
'buildtype=debugoptimized' ])
++++++ gst-libav.obsinfo ++++++
--- /var/tmp/diff_new_pack.mr3L8h/_old 2026-04-15 16:05:00.840092590 +0200
+++ /var/tmp/diff_new_pack.mr3L8h/_new 2026-04-15 16:05:00.884094399 +0200
@@ -1,5 +1,5 @@
name: gst-libav
-version: 1.28.1
-mtime: 1772071779
-commit: dcb37e20147e3b59344bab1e1cbb57e908cc6b92
+version: 1.28.2
+mtime: 1775588543
+commit: 43421c2a5b8ac5cceb52b11749df40301e1de5c0