Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gstreamer-plugins-base for openSUSE:Factory checked in at 2023-07-27 16:50:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gstreamer-plugins-base (Old) and /work/SRC/openSUSE:Factory/.gstreamer-plugins-base.new.32662 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gstreamer-plugins-base" Thu Jul 27 16:50:21 2023 rev:94 rq:1100814 version:1.22.5 Changes: -------- --- /work/SRC/openSUSE:Factory/gstreamer-plugins-base/gstreamer-plugins-base.changes 2023-07-01 23:17:25.262033635 +0200 +++ /work/SRC/openSUSE:Factory/.gstreamer-plugins-base.new.32662/gstreamer-plugins-base.changes 2023-07-27 16:50:37.613752701 +0200 @@ -1,0 +2,22 @@ +Tue Jul 25 11:05:58 UTC 2023 - Bjørn Lie <bjorn....@gmail.com> + +- Update to version 1.22.5: + + appsink: add missing make_writable call + + audioaggregator: Do not post message before being constructed + + decodebin3: + - Prevent a critical warning when reassigning output slots + - Fix slot input linking when the associated stream has changed + - Remove spurious input locking during parsebin reconfiguration + + urisourcebin: Set source element to READY before querying it + + gl/viv-fb: meson build updates + + plugins: fix compiler warnings with GLib >= 2.76 + + subtitleoverlay: fix mutex error if sink caps is not video + + video: + - timecode: Add support for framerates lower than 1fps + - accept timecode of 119.88 (120/1.001) FPS + - cannot attach time code meta when frame rate is 119.88 + (120000/1001) + + videodecoder: fix copying buffer metas +- Rebase reduce-required-meson.patch. + +------------------------------------------------------------------- Old: ---- gst-plugins-base-1.22.4.tar.xz New: ---- gst-plugins-base-1.22.5.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gstreamer-plugins-base.spec ++++++ --- /var/tmp/diff_new_pack.uW7nDH/_old 2023-07-27 16:50:38.313756657 +0200 +++ /var/tmp/diff_new_pack.uW7nDH/_new 2023-07-27 16:50:38.317756680 +0200 @@ -20,7 +20,7 @@ %define gst_branch 1.0 %define gstreamer_req_version %(echo %{version} | sed -e "s/+.*//") Name: gstreamer-plugins-base -Version: 1.22.4 +Version: 1.22.5 Release: 0 Summary: GStreamer Streaming-Media Framework Plug-Ins License: GPL-2.0-or-later AND LGPL-2.1-or-later ++++++ gst-plugins-base-1.22.4.tar.xz -> gst-plugins-base-1.22.5.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/ChangeLog new/gst-plugins-base-1.22.5/ChangeLog --- old/gst-plugins-base-1.22.4/ChangeLog 2023-06-20 18:44:10.143448800 +0200 +++ new/gst-plugins-base-1.22.5/ChangeLog 2023-07-20 16:23:40.389558000 +0200 @@ -1,3 +1,179 @@ +=== release 1.22.5 === + +2023-07-20 15:22:48 +0100 Tim-Philipp Müller <t...@centricular.com> + + * NEWS: + * RELEASE: + * gst-plugins-base.doap: + * meson.build: + Release 1.22.5 + +2023-07-18 01:25:47 +0000 Ruslan Khamidullin <rusl...@borisfx.com> + + * tests/check/libs/videotimecode.c: + video: add extensive tests for gst_video_time_code_is_valid() + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5061> + +2023-07-12 22:45:28 +0000 Ruslan Khamidullin <rusl...@borisfx.com> + + * gst-libs/gst/video/gstvideotimecode.c: + video: accept timecode of 119.88 (120/1.001) FPS + The drop-frame rules are specified in âSMPTE ST 12-3:2016â and are + consistent with the traditional ones: + â + To minimize fractional time deviation from real time, the first two + super-frame numbers (00 and 01) shall be omitted from the count at the + start of each minute except minutes 00, 10, 20, 30, 40, and 50. Thus the + first eight frame numbers (0 through 7) are omitted from the count at + the start of each minute except minutes 00, 10, 20, 30, 40, and 50. + â + Where âsuper-frameâ is a group of 4 frames for 120 FPS. + Fixes #2797 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5061> + +2023-04-10 12:54:51 +0300 Sebastian Dröge <sebast...@centricular.com> + + * gst-libs/gst/video/gstvideotimecode.c: + * tests/check/libs/videotimecode.c: + video: timecode: Add support for framerates lower than 1fps + These are not explicitly defined but the existing calculations can be + extended to also cover that case by inverting them to avoid floating + point calculations. + Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2465 + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5074> + +2023-07-18 15:15:40 +0100 Philippe Normand <ph...@igalia.com> + + * gst/playback/gstdecodebin3.c: + decodebin3: Prevent a critical warning when reassigning output slots + Do not attempt to send a streams-selected message when reassigning + an output slot in case upstream signalled that it is handling stream selection. + In this case decodebin3 doesn't keep track of stream + collections (`dbin->collection` is NULL). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5069> + +2023-07-17 15:23:35 +0100 Philippe Normand <ph...@igalia.com> + + * gst/playback/gstdecodebin3.c: + decodebin3: Fix slot input linking when the associated stream has changed + Setting the input field on the empty slot prevents future linking of it and will + result in flow errors later on. + This was observed in WebKit's MediaStream source element, when it changes the + caps on one of its associated streams, from an encoded format to a raw video + format. The associated stream-id on the sticky stream-start event doesn´t + change, but the element creates a new GstStream with a different ID and sets it + on the stream-start event. Stream parsing is disabled in urisourcebin, so + decodebin3 handles the parsing. Without this patch we would end-up with unlinked + pads in decodebin3 after switching to the raw video format. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5067> + +2023-01-31 16:12:17 +0100 Edward Hervey <edw...@centricular.com> + + * gst/playback/gsturisourcebin.c: + urisourcebin: Set source element to READY before querying it + Generating the source element is done when urisourcebin is doing the READY to + PAUSED state change, so it is reasonable to set the new source element to that + state. + This also allows detecting early failures with backing libraries or + hardware (checks done in NULL->READY). + Finally it makes more sense to have an element in READY when attempting to query + information from it (such as SCHEDULING queries or probing live-ness). + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5058> + +2023-06-21 13:45:13 +0200 Andoni Morales Alastruey <ylat...@gmail.com> + + * gst-libs/gst/video/gstvideodecoder.c: + * tests/check/libs/videodecoder.c: + videodecoder: fix segfault copying buffer metas + The current implementation copies metas without checking if the buffer + is writable. + The operation that needs to be done, replacing the input buffer and + copying the metas, is only part of that process. We create a new function + that does both. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5054> + +2023-07-12 17:08:32 +0100 Philippe Normand <ph...@igalia.com> + + * gst/playback/gstdecodebin3.c: + decodebin3: Remove spurious input locking during parsebin reconfiguration + Commit 22917b140ffac5208eff173321fa7cdad8976cca added extra locks in + `reset_input_parsebin()` but all call sites of that function already take the + input lock. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5025> + +2023-05-16 21:24:44 +1000 Matthew Waters <matt...@centricular.com> + + * gst-libs/gst/gl/meson.build: + * gst-libs/gst/gl/viv-fb/gstglviv-fb.h: + gl: provide a pkg-config/gir file for the viv-fb backend + Required to be able to generate coherent bindings for window system + specific APIs due to limitations in gobject-introspection. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4959> + +2023-05-16 22:09:48 +1000 Matthew Waters <matt...@centricular.com> + + * gst-libs/gst/gl/meson.build: + gl: don't install the viv-fb window header file + It is not needed at all by any external implementations and should not + be exposed to the outside world. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4959> + +2023-06-30 13:53:19 +0200 Carlos Rafael Giani <crg7...@mailbox.org> + + * gst-libs/gst/gl/meson.build: + gl: Separate viv direct texture checks from viv-fb winsys check + Vivante direct textures do not depend on the viv-fb windowing system. + Decouple these two to be able to use direct textures even when viv-fb + is not enabled. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4959> + +2023-03-09 00:25:51 +0530 Nirbheek Chauhan <nirbh...@centricular.com> + + * gst-libs/gst/gl/meson.build: + meson: Install viv-fb GL headers, needed by i.MX + Needed by qmlglsink at build time to allocate a viv-fb display. + Without this, the GL fastpath doesn't work, and performance is really + bad. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4959> + +2023-03-26 16:40:28 +0100 Tim-Philipp Müller <t...@centricular.com> + + * gst/subparse/gstsubparse.c: + taglist, plugins: fix compiler warnings with GLib >= 2.76 + Fix compiler warnings about not using the return value when + freeing the GString segment with g_string_free(.., FALSE): + ignoring return value of âg_string_free_and_stealâ declared with attribute âwarn_unused_resultâ + which we get with newer GLib versions. These were all harmless. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5015> + +2023-07-07 16:01:33 +0300 Maksym Khomenko <maksym.khomenko@skelia.partners> + + * gst-libs/gst/app/gstappsink.c: + appsink: add missing make_writable call + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5013> + +2023-07-05 14:27:22 -0400 Thibault Saunier <tsaun...@igalia.com> + + * gst-libs/gst/audio/gstaudioaggregator.c: + bad: audioaggregator: Do not post message before being constructed + `gst_aggregator_set_latency` will post a message on the bus which + triggers traces for not constructed objects which fails in rust tracers + as object should have names in all traces. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4984> + +2023-07-04 15:37:16 +0200 Guillaume Desmottes <guillaume.desmot...@onestream.live> + + * gst/playback/gstsubtitleoverlay.c: + subtitleoverlay: fix mutex error if sink caps is not video + We were trying to unlock a mutex that was not locked. + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4972> + +2023-06-20 19:10:38 +0100 Tim-Philipp Müller <t...@centricular.com> + + * meson.build: + Back to development + Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4907> + === release 1.22.4 === 2023-06-20 17:42:25 +0100 Tim-Philipp Müller <t...@centricular.com> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/NEWS new/gst-plugins-base-1.22.5/NEWS --- old/gst-plugins-base-1.22.4/NEWS 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/NEWS 2023-07-20 16:22:48.000000000 +0200 @@ -2,13 +2,13 @@ GStreamer 1.22.0 was originally released on 23 January 2023. -The latest bug-fix release in the stable 1.22 series is 1.22.4 and was -released on 20 June 2023. +The latest bug-fix release in the stable 1.22 series is 1.22.5 and was +released on 20 July 2023. See https://gstreamer.freedesktop.org/releases/1.22/ for the latest version of this document. -Last updated: Tuesday 20 June 2023, 16:30 UTC (log) +Last updated: Thursday 20 July 2023, 12:00 UTC (log) Introduction @@ -2008,6 +2008,187 @@ - List of Merge Requests applied in 1.22.4 - List of Issues fixed in 1.22.4 +1.22.5 + +The fifth 1.22 bug-fix release (1.22.5) was released on 20 July 2023. + +This release only contains bugfixes and security fixes and it should be +safe to update from 1.22.x. + +Highlighted bugfixes in 1.22.5 + +- Security fixes for the RealMedia demuxer +- vaapi decoders, postproc: Disable DMAbuf from caps negotiation to + fix garbled video in some cases +- decodebin3, playbin3, parsebin fixes, especially for stream + reconfiguration +- hlsdemux2: fix early seeking; donât pass referer when updating + playlists; webvtt fixes +- gtk: Fix critical caused by pointer movement when stream is getting + ready +- qt6: Set sampler filtering method, fixes bad quality with qml6glsink + and gstqt6d3d11 +- v4l2src: handle resolution change when buffers are copied +- videoflip: update orientation tag in auto mode +- video timecode: Add support for framerates lower than 1fps and + accept 119.88 (120/1.001) fps +- webrtcsink: fixes for x264enc and NVIDIA encoders +- cerbero: Pull ninja from system if possible, avoid spurious + bootstrap of cmake +- packages: Recipe updates for ffmpeg, libsoup, orc +- various bug fixes, memory leak fixes, and other stability and + reliability improvements + +gstreamer + +- taglist, plugins: fix compiler warnings with GLib >= 2.76 +- tracerutils: allow casting parameter types +- inputselector: fix playing variable is never set + +gst-plugins-base + +- appsink: add missing make_writable call +- audioaggregator: Do not post message before being constructed +- decodebin3: Prevent a critical warning when reassigning output slots +- decodebin3: Fix slot input linking when the associated stream has + changed +- decodebin3: Remove spurious input locking during parsebin + reconfiguration +- urisourcebin: Set source element to READY before querying it +- gl/viv-fb: meson build updates +- plugins: fix compiler warnings with GLib >= 2.76 +- subtitleoverlay: fix mutex error if sink caps is not video +- video: timecode: Add support for framerates lower than 1fps +- video: accept timecode of 119.88 (120/1.001) FPS +- video: cannot attach time code meta when frame rate is 119.88 + (120000/1001) +- videodecoder: fix copying buffer metas + +gst-plugins-good + +- adaptivedemux2: Fix early seeking +- hlsdemux2: Ensure processed webvtt ends with empty new line +- hlsdemux2: Donât set a referer when updating playlists +- matroska: demux: Strip signal byte when encrypted +- rtspsrc: Fix crash when is-live=false +- gtk: Fix critical caused by pointer movement when stream is getting + ready +- qt6: Set sampler filtering method, fixes bad quality with qml6glsink + and gstqt6d3d11 +- qtdemux: opus: set entry as sampled +- v4l2src: handle resolution change when buffers are copied +- v4l2videodec: Fix handling of initial gaps +- v4l2videodec: correctly register v4l2mpeg2dec +- v4l2videoenc: replace custom QUERY_CAPS handling with getcaps + callback +- videoflip: update orientation tag in auto mode +- videoflip: fix critical when tag list is not writable + +gst-plugins-bad + +- d3d11bufferpool: Fix heavy CPU usage in case of fixed-size pool +- jpegparser: jpegdecoder: Donât pollute bus and comply with spec +- plugins: fix compiler warnings with GLib >= 2.76 +- webrtcbin: Prevent critical warning when creating an additional data + channel +- webrtcstats: Properly report IceCandidate type + +gst-plugins-ugly + +- rmdemux: add some integer overflow checks + +gst-plugins-rs + +- fallbackswitch: Change the threshold for trailing buffers +- fallbackswitch: Fix pad health calculation and notifies +- fmp4mux: Fix draining in chunk mode if keyframes are too late +- livesync: Wait for the end timestamp of the previous buffer before + looking at queue +- livesync: Improve EOS handling +- togglerecord: Clip segment before calculating timestamp/duration +- togglerecord: Error out if main stream buffer has no valid running + time +- webrtcsink: fix pipeline when input caps contain max-framerate +- webrtcsink: Configure only 4 threads for x264enc +- webrtcsink: Translate force-keyunit events to force-IDR action + signal for NVIDIA encoders +- webrtcsink: Set config-interval=-1 and aggregate-mode=zero-latency + on rtph264pay and rtph265pay +- webrtcsink: Set VP8/VP9 payloader based on payloader element factory + name +- webrtcink: Use correct property types for nvvideoconvert +- webrtc/signalling: fix race condition in message ordering +- videofx: Minimize dependencies of the image crate + +gst-libav + +- No changes + +gst-rtsp-server + +- No changes + +gstreamer-vaapi + +- vaapidecode,vaapipostproc: Disable DMAbuf from caps negotiation. + +gstreamer-sharp + +- No changes + +gst-omx + +- No changes + +gst-python + +- No changes + +gst-editing-services + +- ges: some fixes for 32-bit systems +- ges, nle: Avoid setting state or sending query when constructing + objects + +gst-validate + gst-integration-testsuites + +- No changes + +gst-examples + +- No changes + +Development build environment + +- No changes + +Cerbero build tool and packaging changes in 1.22.5 + +- Pull ninja from system if possible, avoid spurious bootstrap of + cmake +- ffmpeg: update to 5.0.3 +- libsoup: update to 2.74.3 +- orc: update to 0.4.34 + +Contributors to 1.22.5 + +Andoni Morales Alastruey, Bastien Nocera, Carlos Rafael Giani, David +Craven, Doug Nazar, Edward Hervey, François Laignel, Guillaume +Desmottes, He Junyan, Hou Qi, Jan Alexander Steffens (heftig), Jan +Schmidt, Maksym Khomenko, Mathieu Duponchelle, Matthew Waters, Michael +Olbrich, Michael Tretter, Nicolas Dufresne, Nirbheek Chauhan, Philippe +Normand, Ruslan Khamidullin, Sebastian Dröge, Seungha Yang, Théo +Maillart, Thibault Saunier, Tim-Philipp Müller, VÃctor Manuel Jáquez +Leal, Vivia Nikolaidou, Yatin Maan, + +⦠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.22.5 + +- List of Merge Requests applied in 1.22.5 +- List of Issues fixed in 1.22.5 + Schedule for 1.24 Our next major feature release will be 1.24, and 1.23 will be the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/RELEASE new/gst-plugins-base-1.22.5/RELEASE --- old/gst-plugins-base-1.22.4/RELEASE 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/RELEASE 2023-07-20 16:22:48.000000000 +0200 @@ -1,4 +1,4 @@ -This is GStreamer gst-plugins-base 1.22.4. +This is GStreamer gst-plugins-base 1.22.5. 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-base-1.22.4/gst/playback/gstdecodebin3.c new/gst-plugins-base-1.22.5/gst/playback/gstdecodebin3.c --- old/gst-plugins-base-1.22.4/gst/playback/gstdecodebin3.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst/playback/gstdecodebin3.c 2023-07-20 16:22:48.000000000 +0200 @@ -1035,7 +1035,6 @@ GST_DEBUG_OBJECT (dbin, "Resetting %" GST_PTR_FORMAT, input->parsebin); - INPUT_LOCK (dbin); GST_STATE_LOCK (dbin); gst_element_set_state (input->parsebin, GST_STATE_NULL); input->drained = FALSE; @@ -1048,7 +1047,6 @@ } gst_element_sync_state_with_parent (input->parsebin); GST_STATE_UNLOCK (dbin); - INPUT_UNLOCK (dbin); } @@ -2220,6 +2218,11 @@ GST_LOG_OBJECT (dbin, "Checking"); + if (dbin->upstream_selected) { + GST_DEBUG ("Upstream handles stream selection, returning"); + return NULL; + } + if (dbin->to_activate != NULL) { GST_DEBUG ("Still have streams to activate"); return NULL; @@ -2659,7 +2662,6 @@ if (empty_slot) { GST_DEBUG_OBJECT (dbin, "Re-using existing unused slot %d", empty_slot->id); - empty_slot->input = input; return empty_slot; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst/playback/gstsubtitleoverlay.c new/gst-plugins-base-1.22.5/gst/playback/gstsubtitleoverlay.c --- old/gst-plugins-base-1.22.4/gst/playback/gstsubtitleoverlay.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst/playback/gstsubtitleoverlay.c 2023-07-20 16:22:48.000000000 +0200 @@ -1735,7 +1735,6 @@ if (!gst_video_info_from_caps (&info, caps)) { GST_ERROR_OBJECT (self, "Failed to parse caps"); ret = FALSE; - GST_SUBTITLE_OVERLAY_UNLOCK (self); goto out; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst/playback/gsturisourcebin.c new/gst-plugins-base-1.22.5/gst/playback/gsturisourcebin.c --- old/gst-plugins-base-1.22.4/gst/playback/gsturisourcebin.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst/playback/gsturisourcebin.c 2023-07-20 16:22:48.000000000 +0200 @@ -1465,8 +1465,6 @@ GObjectClass *source_class; GstElement *source; GParamSpec *pspec; - GstQuery *query; - GstSchedulingFlags flags; GError *err = NULL; if (!urisrc->uri) @@ -1486,31 +1484,9 @@ GST_LOG_OBJECT (urisrc, "found source type %s", G_OBJECT_TYPE_NAME (source)); - urisrc->is_stream = IS_STREAM_URI (urisrc->uri); - - query = gst_query_new_scheduling (); - if (gst_element_query (source, query)) { - gst_query_parse_scheduling (query, &flags, NULL, NULL, NULL); - if ((flags & GST_SCHEDULING_FLAG_BANDWIDTH_LIMITED)) - urisrc->is_stream = TRUE; - } - gst_query_unref (query); - source_class = G_OBJECT_GET_CLASS (source); - if (urisrc->is_stream) { - /* Live sources are not streamable */ - pspec = g_object_class_find_property (source_class, "is-live"); - if (pspec && G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_BOOLEAN) { - gboolean is_live; - g_object_get (G_OBJECT (source), "is-live", &is_live, NULL); - if (is_live) - urisrc->is_stream = FALSE; - } - } - - GST_LOG_OBJECT (urisrc, "source is stream: %d", urisrc->is_stream); - + /* Propagate connection speed */ pspec = g_object_class_find_property (source_class, "connection-speed"); if (pspec != NULL) { guint64 speed = urisrc->connection_speed / 1000; @@ -1750,6 +1726,38 @@ GstIterator *pads_iter; gboolean res = TRUE; + /* Collect generic information about the source */ + + urisrc->is_stream = IS_STREAM_URI (urisrc->uri); + + if (!urisrc->is_stream) { + GstQuery *query; + GstSchedulingFlags flags; + /* do a final check to see if the source element is streamable */ + query = gst_query_new_scheduling (); + if (gst_element_query (urisrc->source, query)) { + gst_query_parse_scheduling (query, &flags, NULL, NULL, NULL); + if ((flags & GST_SCHEDULING_FLAG_BANDWIDTH_LIMITED)) + urisrc->is_stream = TRUE; + } + gst_query_unref (query); + } + + if (urisrc->is_stream) { + GObjectClass *source_class = G_OBJECT_GET_CLASS (urisrc->source); + GParamSpec *pspec = g_object_class_find_property (source_class, "is-live"); + /* Live sources are not streamable */ + if (pspec && G_PARAM_SPEC_VALUE_TYPE (pspec) == G_TYPE_BOOLEAN) { + gboolean is_live; + g_object_get (G_OBJECT (urisrc->source), "is-live", &is_live, NULL); + if (is_live) + urisrc->is_stream = FALSE; + } + } + + GST_LOG_OBJECT (urisrc, "source is stream: %d", urisrc->is_stream); + + /* Handle the existing source pads */ pads_iter = gst_element_iterate_src_pads (urisrc->source); restart: @@ -2285,12 +2293,16 @@ * handled by the application right after. */ gst_bin_add (GST_BIN_CAST (urisrc), urisrc->source); - /* notify of the new source used */ + /* notify of the new source used and allow external users to do final + * modifications before activating the element */ g_object_notify (G_OBJECT (urisrc), "source"); g_signal_emit (urisrc, gst_uri_source_bin_signals[SIGNAL_SOURCE_SETUP], 0, urisrc->source); + if (gst_element_set_state (urisrc->source, + GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) + goto state_fail; /* see if the source element emits raw audio/video all by itself, * if so, we can create streams for the pads and be done with it. * Also check that is has source pads, if not, we assume it will @@ -2323,6 +2335,12 @@ (_("Source element is invalid.")), (NULL)); return FALSE; } +state_fail: + { + GST_ELEMENT_ERROR (urisrc, CORE, FAILED, + (_("Source element can't be prepared")), (NULL)); + return FALSE; + } no_pads: { GST_ELEMENT_ERROR (urisrc, CORE, FAILED, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst/subparse/gstsubparse.c new/gst-plugins-base-1.22.5/gst/subparse/gstsubparse.c --- old/gst-plugins-base-1.22.4/gst/subparse/gstsubparse.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst/subparse/gstsubparse.c 2023-07-20 16:22:48.000000000 +0200 @@ -610,8 +610,7 @@ break; } } - ret = markup->str; - g_string_free (markup, FALSE); + ret = g_string_free (markup, FALSE); GST_DEBUG ("parse_mdvdsub returning (%f+%f): %s", state->start_time / (double) GST_SECOND, state->duration / (double) GST_SECOND, ret); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-libs/gst/app/gstappsink.c new/gst-plugins-base-1.22.5/gst-libs/gst/app/gstappsink.c --- old/gst-plugins-base-1.22.4/gst-libs/gst/app/gstappsink.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst-libs/gst/app/gstappsink.c 2023-07-20 16:22:48.000000000 +0200 @@ -1048,6 +1048,7 @@ if (G_UNLIKELY (!priv->last_caps && gst_pad_has_current_caps (GST_BASE_SINK_PAD (psink)))) { priv->last_caps = gst_pad_get_current_caps (GST_BASE_SINK_PAD (psink)); + priv->sample = gst_sample_make_writable (priv->sample); gst_sample_set_caps (priv->sample, priv->last_caps); GST_DEBUG_OBJECT (appsink, "activating pad caps %" GST_PTR_FORMAT, priv->last_caps); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-libs/gst/audio/gstaudioaggregator.c new/gst-plugins-base-1.22.5/gst-libs/gst/audio/gstaudioaggregator.c --- old/gst-plugins-base-1.22.4/gst-libs/gst/audio/gstaudioaggregator.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst-libs/gst/audio/gstaudioaggregator.c 2023-07-20 16:22:48.000000000 +0200 @@ -638,12 +638,24 @@ GST_OBJECT_UNLOCK (aagg); } + +static void +gst_audio_aggregator_constructed (GObject * object) +{ + GstAudioAggregator *aagg = GST_AUDIO_AGGREGATOR (object); + + gst_audio_aggregator_translate_output_buffer_duration (aagg, + DEFAULT_OUTPUT_BUFFER_DURATION); + gst_audio_aggregator_recalculate_latency (aagg); +} + static void gst_audio_aggregator_class_init (GstAudioAggregatorClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstAggregatorClass *gstaggregator_class = (GstAggregatorClass *) klass; + gobject_class->constructed = gst_audio_aggregator_constructed; gobject_class->set_property = gst_audio_aggregator_set_property; gobject_class->get_property = gst_audio_aggregator_get_property; gobject_class->dispose = gst_audio_aggregator_dispose; @@ -759,10 +771,6 @@ aagg->priv->alignment_threshold = DEFAULT_ALIGNMENT_THRESHOLD; aagg->priv->discont_wait = DEFAULT_DISCONT_WAIT; - gst_audio_aggregator_translate_output_buffer_duration (aagg, - DEFAULT_OUTPUT_BUFFER_DURATION); - gst_audio_aggregator_recalculate_latency (aagg); - aagg->current_caps = NULL; aagg->priv->selected_samples_info = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-libs/gst/gl/meson.build new/gst-plugins-base-1.22.5/gst-libs/gst/gl/meson.build --- old/gst-plugins-base-1.22.4/gst-libs/gst/gl/meson.build 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst-libs/gst/gl/meson.build 2023-07-20 16:22:48.000000000 +0200 @@ -3,6 +3,7 @@ gstglx11_dep = dependency('', required : false) gstglwayland_dep = dependency('', required : false) gstglegl_dep = dependency('', required : false) +gstglviv_fb_dep = dependency('', required : false) if get_option('gl').disabled() message('GStreamer OpenGL integration disabled via options.') @@ -111,6 +112,8 @@ gl_wayland_headers = [] gl_egl_sources = [] gl_egl_headers = [] +gl_viv_fb_sources = [] +gl_viv_fb_headers = [] glconf = configuration_data() glconf_options = [ @@ -918,18 +921,27 @@ endif endif +if cc.has_function ('glTexDirectVIV', dependencies : gles2_dep) + glconf.set('GST_GL_HAVE_VIV_DIRECTVIV', 1) +endif + if need_platform_egl != 'no' and need_win_viv_fb != 'no' if egl_dep.found() and cc.has_function ('fbGetDisplay', dependencies : egl_dep) - if cc.has_function ('glTexDirectVIV', dependencies : gles2_dep) - enabled_gl_winsys += 'viv-fb' - glconf.set('GST_GL_HAVE_WINDOW_VIV_FB', 1) - glconf.set('GST_GL_HAVE_VIV_DIRECTVIV', 1) - gl_priv_sources += [ - 'viv-fb/gstgldisplay_viv_fb.c', - 'viv-fb/gstglwindow_viv_fb_egl.c', - ] - gl_cpp_args += ['-DEGL_API_FB'] - endif + enabled_gl_winsys += 'viv-fb' + glconf.set('GST_GL_HAVE_WINDOW_VIV_FB', 1) + gl_priv_sources += files([ + 'viv-fb/gstgldisplay_viv_fb.c', + 'viv-fb/gstglwindow_viv_fb_egl.c', + ]) + gl_viv_fb_sources += files([ + 'viv-fb/gstgldisplay_viv_fb.c', + ]) + + gl_cpp_args += ['-DEGL_API_FB'] + gl_viv_fb_headers = files([ + 'viv-fb/gstglviv-fb.h', + 'viv-fb/gstgldisplay_viv_fb.h', + ]) endif endif @@ -1051,7 +1063,7 @@ common_args += '-I@0@'.format(meson.current_build_dir()) gstgl = library('gstgl-' + api_version, - gl_sources, gl_egl_sources, gl_x11_sources, gl_wayland_sources, gl_priv_sources, gl_enumtypes_c, gl_enumtypes_h, + gl_sources, gl_egl_sources, gl_x11_sources, gl_wayland_sources, gl_viv_fb_sources, gl_priv_sources, gl_enumtypes_c, gl_enumtypes_h, c_args : common_args, cpp_args : common_args, objc_args : common_args + gl_objc_args, @@ -1235,6 +1247,42 @@ meson.override_dependency(pkg_name, gstglegl_dep) endif + if gl_viv_fb_headers.length() > 0 + install_headers(gl_viv_fb_headers, subdir : 'gstreamer-1.0/gst/gl/viv-fb') + pkg_name = 'gstreamer-gl-viv-fb-1.0' + pkgconfig.generate( + libraries : [gstgl], + subdirs : pkgconfig_subdirs, + name : pkg_name, + description : 'Streaming media framework, OpenGL plugins libraries (Vivante Framebuffer specifics)', + ) + gl_viv_fb_gir = [] + if build_gir + gir = { + 'sources' : gl_viv_fb_sources + gl_viv_fb_headers, + 'namespace' : 'GstGLVivFB', + 'nsversion' : api_version, + 'identifier_prefix' : 'Gst', + 'symbol_prefix' : 'gst', + 'export_packages' : pkg_name, + 'includes' : ['Gst-1.0', 'GstBase-1.0', 'GstVideo-1.0'], + 'install' : true, + 'extra_args' : gir_init_section + ['--c-include=gst/gl/viv-fb/gstglviv-fb.h'], + 'dependencies' : [video_dep, gst_dep, gst_base_dep] + } + gir_dict = gir + {'includes': gir['includes'] + ['GstGL-1.0']} + gst_libraries += [[pkg_name, {'gir': gir_dict}]] + if not static_build + gir += {'includes': gir['includes'] + [gl_gir[0]]} + gl_viv_fb_gir = gnome.generate_gir(gstgl, kwargs: gir) + library_def += {'gir_targets': library_def.get('gir_targets', []) + [gl_viv_fb_gir]} + endif + endif + gstglviv_fb_dep = declare_dependency(dependencies : [gstgl_dep], + sources : gl_viv_fb_gir) + meson.override_dependency(pkg_name, gstglviv_fb_dep) + endif + elif get_option('gl').enabled() error('GStreamer OpenGL integration required via options, but needed dependencies not found.') endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-libs/gst/gl/viv-fb/gstglviv-fb.h new/gst-plugins-base-1.22.5/gst-libs/gst/gl/viv-fb/gstglviv-fb.h --- old/gst-plugins-base-1.22.4/gst-libs/gst/gl/viv-fb/gstglviv-fb.h 1970-01-01 01:00:00.000000000 +0100 +++ new/gst-plugins-base-1.22.5/gst-libs/gst/gl/viv-fb/gstglviv-fb.h 2023-07-20 16:22:48.000000000 +0200 @@ -0,0 +1,27 @@ +/* + * GStreamer + * Copyright (C) 2023 Matthew Waters <matt...@centricular.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_GL_VIV_FB_H__ +#define __GST_GL_VIV_FB_H__ + +#include <gst/gl/gl.h> +#include <gst/gl/viv-fb/gstgldisplay_viv_fb.h> + +#endif /* __GST_GL_VIV_FB_H__ */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-libs/gst/video/gstvideodecoder.c new/gst-plugins-base-1.22.5/gst-libs/gst/video/gstvideodecoder.c --- old/gst-plugins-base-1.22.4/gst-libs/gst/video/gstvideodecoder.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst-libs/gst/video/gstvideodecoder.c 2023-07-20 16:22:48.000000000 +0200 @@ -542,6 +542,9 @@ static gboolean gst_video_decoder_handle_missing_data_default (GstVideoDecoder * decoder, GstClockTime timestamp, GstClockTime duration); +static void gst_video_decoder_replace_input_buffer (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame, GstBuffer ** dest_buffer); + static void gst_video_decoder_copy_metas (GstVideoDecoder * decoder, GstVideoCodecFrame * frame, GstBuffer * src_buffer, GstBuffer * dest_buffer); @@ -2470,11 +2473,7 @@ GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); } - if (frame->input_buffer) { - gst_video_decoder_copy_metas (decoder, frame, frame->input_buffer, buf); - gst_buffer_unref (frame->input_buffer); - } - frame->input_buffer = buf; + gst_video_decoder_replace_input_buffer (decoder, frame, &buf); if (decoder->input_segment.rate < 0.0) { priv->parse_gather = g_list_prepend (priv->parse_gather, frame); @@ -3401,6 +3400,20 @@ } } +static void +gst_video_decoder_replace_input_buffer (GstVideoDecoder * decoder, + GstVideoCodecFrame * frame, GstBuffer ** dest_buffer) +{ + if (frame->input_buffer) { + *dest_buffer = gst_buffer_make_writable (*dest_buffer); + gst_video_decoder_copy_metas (decoder, frame, frame->input_buffer, + *dest_buffer); + gst_buffer_unref (frame->input_buffer); + } + + frame->input_buffer = *dest_buffer; +} + /** * gst_video_decoder_finish_frame: * @decoder: a #GstVideoDecoder @@ -3841,12 +3854,8 @@ buffer = gst_buffer_new_and_alloc (0); } - if (priv->current_frame->input_buffer) { - gst_video_decoder_copy_metas (decoder, priv->current_frame, - priv->current_frame->input_buffer, buffer); - gst_buffer_unref (priv->current_frame->input_buffer); - } - priv->current_frame->input_buffer = buffer; + gst_video_decoder_replace_input_buffer (decoder, priv->current_frame, + &buffer); gst_video_decoder_get_buffer_info_at_offset (decoder, priv->frame_offset, &pts, &dts, &duration, &flags); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-libs/gst/video/gstvideotimecode.c new/gst-plugins-base-1.22.5/gst-libs/gst/video/gstvideotimecode.c --- old/gst-plugins-base-1.22.4/gst-libs/gst/video/gstvideotimecode.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst-libs/gst/video/gstvideotimecode.c 2023-07-20 16:22:48.000000000 +0200 @@ -81,30 +81,42 @@ /* We can't have more frames than rounded up frames per second */ fr = (tc->config.fps_n + (tc->config.fps_d >> 1)) / tc->config.fps_d; - if (tc->frames >= fr && (tc->config.fps_n != 0 || tc->config.fps_d != 1)) - return FALSE; + if (tc->config.fps_d > tc->config.fps_n) { + guint64 s; + + if (tc->frames > 0) + return FALSE; + /* For less than 1 fps only certain second values are allowed */ + s = tc->seconds + (60 * (tc->minutes + (60 * tc->hours))); + if ((s * tc->config.fps_n) % tc->config.fps_d != 0) + return FALSE; + } else { + if (tc->frames >= fr && (tc->config.fps_n != 0 || tc->config.fps_d != 1)) + return FALSE; + } - /* We either need a specific X/1001 framerate or otherwise an integer - * framerate */ + /* We need either a specific X/1001 framerate, or less than 1 FPS, + * otherwise an integer framerate. */ if (tc->config.fps_d == 1001) { if (tc->config.fps_n != 30000 && tc->config.fps_n != 60000 && - tc->config.fps_n != 24000) + tc->config.fps_n != 24000 && tc->config.fps_n != 120000) return FALSE; - } else if (tc->config.fps_n % tc->config.fps_d != 0) { + } else if (tc->config.fps_n >= tc->config.fps_d + && tc->config.fps_n % tc->config.fps_d != 0) { return FALSE; } - /* We only support 30000/1001 and 60000/1001 as drop-frame framerates. - * 24000/1001 is *not* a drop-frame framerate! */ + /* We support only 30000/1001, 60000/1001, and 120000/1001 (see above) as + * drop-frame framerates. 24000/1001 is *not* a drop-frame framerate! */ if (tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) { - if (tc->config.fps_d != 1001 || (tc->config.fps_n != 30000 - && tc->config.fps_n != 60000)) + if (tc->config.fps_d != 1001 || tc->config.fps_n == 24000) return FALSE; } /* Drop-frame framerates require skipping over the first two - * timecodes every minutes except for every tenth minute in case - * of 30000/1001 and the first four timecodes for 60000/1001 */ + * timecodes every minute except for every tenth minute in case + * of 30000/1001, the first four timecodes for 60000/1001, + * and the first eight timecodes for 120000/1001. */ if ((tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) && tc->minutes % 10 && tc->seconds == 0 && tc->frames < fr / 15) { return FALSE; @@ -256,8 +268,6 @@ GDateTime * dt, GstVideoTimeCodeFlags flags, guint field_count) { GDateTime *jam; - guint64 frames; - gboolean add_a_frame = FALSE; g_return_val_if_fail (tc != NULL, FALSE); g_return_val_if_fail (dt != NULL, FALSE); @@ -268,31 +278,51 @@ jam = g_date_time_new_local (g_date_time_get_year (dt), g_date_time_get_month (dt), g_date_time_get_day_of_month (dt), 0, 0, 0.0); - /* Note: This might be inaccurate for 1 frame - * in case we have a drop frame timecode */ - frames = - gst_util_uint64_scale_round (g_date_time_get_microsecond (dt) * - G_GINT64_CONSTANT (1000), fps_n, fps_d * GST_SECOND); - if (G_UNLIKELY (((frames == fps_n) && (fps_d == 1)) || - ((frames == fps_n / 1000) && (fps_d == 1001)))) { - /* Avoid invalid timecodes */ - frames--; - add_a_frame = TRUE; - } + if (fps_d > fps_n) { + guint64 hour, min, sec; - gst_video_time_code_init (tc, fps_n, fps_d, jam, flags, - g_date_time_get_hour (dt), g_date_time_get_minute (dt), - g_date_time_get_second (dt), frames, field_count); + sec = + g_date_time_get_second (dt) + (60 * (g_date_time_get_minute (dt) + + (60 * g_date_time_get_hour (dt)))); + sec -= (sec * fps_n) % fps_d; + + min = sec / 60; + sec = sec % 60; + hour = min / 60; + min = min % 60; - if (tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) { - guint df = (tc->config.fps_n + (tc->config.fps_d >> 1)) / - (15 * tc->config.fps_d); - if (tc->minutes % 10 && tc->seconds == 0 && tc->frames < df) { - tc->frames = df; + gst_video_time_code_init (tc, fps_n, fps_d, jam, flags, + hour, min, sec, 0, field_count); + } else { + guint64 frames; + gboolean add_a_frame = FALSE; + + /* Note: This might be inaccurate for 1 frame + * in case we have a drop frame timecode */ + frames = + gst_util_uint64_scale_round (g_date_time_get_microsecond (dt) * + G_GINT64_CONSTANT (1000), fps_n, fps_d * GST_SECOND); + if (G_UNLIKELY (((frames == fps_n) && (fps_d == 1)) || + ((frames == fps_n / 1000) && (fps_d == 1001)))) { + /* Avoid invalid timecodes */ + frames--; + add_a_frame = TRUE; } + + gst_video_time_code_init (tc, fps_n, fps_d, jam, flags, + g_date_time_get_hour (dt), g_date_time_get_minute (dt), + g_date_time_get_second (dt), frames, field_count); + + if (tc->config.flags & GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME) { + guint df = (tc->config.fps_n + (tc->config.fps_d >> 1)) / + (15 * tc->config.fps_d); + if (tc->minutes % 10 && tc->seconds == 0 && tc->frames < df) { + tc->frames = df; + } + } + if (add_a_frame) + gst_video_time_code_increment_frame (tc); } - if (add_a_frame) - gst_video_time_code_increment_frame (tc); g_date_time_unref (jam); @@ -366,6 +396,9 @@ (ff_minutes * tc->minutes) + dropframe_multiplier * ((gint) (tc->minutes / 10)) + (ff_hours * tc->hours); + } else if (tc->config.fps_d > tc->config.fps_n) { + return gst_util_uint64_scale (tc->seconds + (60 * (tc->minutes + + (60 * tc->hours))), tc->config.fps_n, tc->config.fps_d); } else { return tc->frames + (ff_nom * (tc->seconds + (60 * (tc->minutes + (60 * tc->hours))))); @@ -468,6 +501,17 @@ framecount - (ff_nom * sec_new) - (ff_minutes * min_new) - (dropframe_multiplier * ((gint) (min_new / 10))) - (ff_hours * h_notmod24); + } else if (tc->config.fps_d > tc->config.fps_n) { + frames_new = + frames + gst_util_uint64_scale (tc->seconds + (60 * (tc->minutes + + (60 * tc->hours))), tc->config.fps_n, tc->config.fps_d); + sec_new = + gst_util_uint64_scale (frames_new, tc->config.fps_d, tc->config.fps_n); + frames_new = 0; + min_new = sec_new / 60; + sec_new = sec_new % 60; + h_notmod24 = min_new / 60; + min_new = min_new % 60; } else { framecount = frames + tc->frames + (ff_nom * (tc->seconds + (sixty * (tc->minutes + @@ -492,7 +536,7 @@ /* The calculations above should always give correct results */ g_assert (min_new < 60); g_assert (sec_new < 60); - g_assert (frames_new < ff_nom); + g_assert (frames_new < ff_nom || (ff_nom == 0 && frames_new == 0)); tc->hours = h_new; tc->minutes = min_new; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/gst-plugins-base.doap new/gst-plugins-base-1.22.5/gst-plugins-base.doap --- old/gst-plugins-base-1.22.4/gst-plugins-base.doap 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/gst-plugins-base.doap 2023-07-20 16:22:48.000000000 +0200 @@ -36,6 +36,16 @@ <release> <Version> + <revision>1.22.5</revision> + <branch>1.22</branch> + <name></name> + <created>2023-07-20</created> + <file-release rdf:resource="https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-1.22.5.tar.xz" /> + </Version> + </release> + + <release> + <Version> <revision>1.22.4</revision> <branch>1.22</branch> <name></name> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/meson.build new/gst-plugins-base-1.22.5/meson.build --- old/gst-plugins-base-1.22.4/meson.build 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/meson.build 2023-07-20 16:22:48.000000000 +0200 @@ -1,5 +1,5 @@ project('gst-plugins-base', 'c', - version : '1.22.4', + version : '1.22.5', meson_version : '>= 0.62', default_options : [ 'warning_level=1', 'buildtype=debugoptimized' ]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/po/gst-plugins-base-1.0.pot new/gst-plugins-base-1.22.5/po/gst-plugins-base-1.0.pot --- old/gst-plugins-base-1.22.4/po/gst-plugins-base-1.0.pot 2023-06-20 18:44:09.739450500 +0200 +++ new/gst-plugins-base-1.22.5/po/gst-plugins-base-1.0.pot 2023-07-20 16:23:40.065552700 +0200 @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-base-1.22.4\n" +"Project-Id-Version: gst-plugins-base-1.22.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-06-20 17:44+0100\n" +"POT-Creation-Date: 2023-07-20 15:23+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <l...@li.org>\n" @@ -102,7 +102,7 @@ #: gst/playback/gstplaysink.c:3652 gst/playback/gstplaysink.c:4581 #: gst/playback/gstplaysinkconvertbin.c:97 #: gst/playback/gstplaysinkconvertbin.c:117 gst/playback/gsturidecodebin.c:1548 -#: gst/playback/gsturisourcebin.c:1638 +#: gst/playback/gsturisourcebin.c:1614 #, c-format msgid "Missing element '%s' - check your GStreamer installation." msgstr "" @@ -174,33 +174,33 @@ msgid "No decoder available for type '%s'." msgstr "" -#: gst/playback/gsturidecodebin.c:1457 gst/playback/gsturisourcebin.c:1558 +#: gst/playback/gsturidecodebin.c:1457 gst/playback/gsturisourcebin.c:1534 msgid "No URI specified to play from." msgstr "" -#: gst/playback/gsturidecodebin.c:1463 gst/playback/gsturisourcebin.c:1564 +#: gst/playback/gsturidecodebin.c:1463 gst/playback/gsturisourcebin.c:1540 #, c-format msgid "Invalid URI \"%s\"." msgstr "" -#: gst/playback/gsturidecodebin.c:1470 gst/playback/gsturisourcebin.c:1571 +#: gst/playback/gsturidecodebin.c:1470 gst/playback/gsturisourcebin.c:1547 msgid "This stream type cannot be played yet." msgstr "" -#: gst/playback/gsturidecodebin.c:1488 gst/playback/gsturisourcebin.c:1589 +#: gst/playback/gsturidecodebin.c:1488 gst/playback/gsturisourcebin.c:1565 #, c-format msgid "No URI handler implemented for \"%s\"." msgstr "" -#: gst/playback/gsturidecodebin.c:2382 +#: gst/playback/gsturidecodebin.c:2382 gst/playback/gsturisourcebin.c:2341 msgid "Source element can't be prepared" msgstr "" -#: gst/playback/gsturidecodebin.c:2388 gst/playback/gsturisourcebin.c:2323 +#: gst/playback/gsturidecodebin.c:2388 gst/playback/gsturisourcebin.c:2335 msgid "Source element is invalid." msgstr "" -#: gst/playback/gsturisourcebin.c:2329 +#: gst/playback/gsturisourcebin.c:2347 msgid "Source element has no pads." msgstr "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/po/gst-plugins-base.pot new/gst-plugins-base-1.22.5/po/gst-plugins-base.pot --- old/gst-plugins-base-1.22.4/po/gst-plugins-base.pot 2023-06-20 18:44:09.739450500 +0200 +++ new/gst-plugins-base-1.22.5/po/gst-plugins-base.pot 2023-07-20 16:23:40.065552700 +0200 @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: gst-plugins-base-1.22.4\n" +"Project-Id-Version: gst-plugins-base-1.22.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-06-20 17:44+0100\n" +"POT-Creation-Date: 2023-07-20 15:23+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <l...@li.org>\n" @@ -102,7 +102,7 @@ #: gst/playback/gstplaysink.c:3652 gst/playback/gstplaysink.c:4581 #: gst/playback/gstplaysinkconvertbin.c:97 #: gst/playback/gstplaysinkconvertbin.c:117 gst/playback/gsturidecodebin.c:1548 -#: gst/playback/gsturisourcebin.c:1638 +#: gst/playback/gsturisourcebin.c:1614 #, c-format msgid "Missing element '%s' - check your GStreamer installation." msgstr "" @@ -174,33 +174,33 @@ msgid "No decoder available for type '%s'." msgstr "" -#: gst/playback/gsturidecodebin.c:1457 gst/playback/gsturisourcebin.c:1558 +#: gst/playback/gsturidecodebin.c:1457 gst/playback/gsturisourcebin.c:1534 msgid "No URI specified to play from." msgstr "" -#: gst/playback/gsturidecodebin.c:1463 gst/playback/gsturisourcebin.c:1564 +#: gst/playback/gsturidecodebin.c:1463 gst/playback/gsturisourcebin.c:1540 #, c-format msgid "Invalid URI \"%s\"." msgstr "" -#: gst/playback/gsturidecodebin.c:1470 gst/playback/gsturisourcebin.c:1571 +#: gst/playback/gsturidecodebin.c:1470 gst/playback/gsturisourcebin.c:1547 msgid "This stream type cannot be played yet." msgstr "" -#: gst/playback/gsturidecodebin.c:1488 gst/playback/gsturisourcebin.c:1589 +#: gst/playback/gsturidecodebin.c:1488 gst/playback/gsturisourcebin.c:1565 #, c-format msgid "No URI handler implemented for \"%s\"." msgstr "" -#: gst/playback/gsturidecodebin.c:2382 +#: gst/playback/gsturidecodebin.c:2382 gst/playback/gsturisourcebin.c:2341 msgid "Source element can't be prepared" msgstr "" -#: gst/playback/gsturidecodebin.c:2388 gst/playback/gsturisourcebin.c:2323 +#: gst/playback/gsturidecodebin.c:2388 gst/playback/gsturisourcebin.c:2335 msgid "Source element is invalid." msgstr "" -#: gst/playback/gsturisourcebin.c:2329 +#: gst/playback/gsturisourcebin.c:2347 msgid "Source element has no pads." msgstr "" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/tests/check/libs/videodecoder.c new/gst-plugins-base-1.22.5/tests/check/libs/videodecoder.c --- old/gst-plugins-base-1.22.4/tests/check/libs/videodecoder.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/tests/check/libs/videodecoder.c 2023-07-20 16:22:48.000000000 +0200 @@ -1315,12 +1315,18 @@ GST_END_TEST; +/* + * MODE_META_COPY: takes an extra ref to the input buffer to check metas + * are copied to a writable buffer. + * see: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4912 + */ typedef enum { MODE_NONE = 0, MODE_SUBFRAMES = 1, MODE_PACKETIZED = 1 << 1, MODE_META_ROI = 1 << 2, + MODE_META_COPY = 1 << 3, } SubframeMode; static void @@ -1379,10 +1385,19 @@ gst_buffer_add_video_region_of_interest_meta (buffer, "face", 0, 0, 10, 10); + /* Take an extra ref to check that we ensure buffer is writable when copying metas + * https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4912 + */ + if (mode & MODE_META_COPY) { + gst_buffer_ref (buffer); + } fail_unless (gst_pad_push (mysrcpad, buffer) == GST_FLOW_OK); fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, gst_structure_new_empty ("custom1")))); + if (mode & MODE_META_COPY) { + gst_buffer_unref (buffer); + } } /* Send EOS */ fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ())); @@ -1540,6 +1555,14 @@ GST_END_TEST; +GST_START_TEST (videodecoder_playback_packetized_subframes_metadata_copy) +{ + videodecoder_playback_subframe_mode (MODE_SUBFRAMES | + MODE_PACKETIZED | MODE_META_ROI | MODE_META_COPY); +} + +GST_END_TEST; + GST_START_TEST (videodecoder_playback_invalid_ts_packetized) { videodecoder_playback_invalid_ts_subframe_mode (MODE_PACKETIZED); @@ -1589,6 +1612,7 @@ tcase_add_test (tc, videodecoder_playback_parsed_subframes); tcase_add_test (tc, videodecoder_playback_packetized_subframes); tcase_add_test (tc, videodecoder_playback_packetized_subframes_metadata); + tcase_add_test (tc, videodecoder_playback_packetized_subframes_metadata_copy); tcase_add_test (tc, videodecoder_playback_invalid_ts_packetized); tcase_add_test (tc, videodecoder_playback_invalid_ts_packetized_subframes); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gst-plugins-base-1.22.4/tests/check/libs/videotimecode.c new/gst-plugins-base-1.22.5/tests/check/libs/videotimecode.c --- old/gst-plugins-base-1.22.4/tests/check/libs/videotimecode.c 2023-06-20 18:42:25.000000000 +0200 +++ new/gst-plugins-base-1.22.5/tests/check/libs/videotimecode.c 2023-07-20 16:22:48.000000000 +0200 @@ -584,26 +584,65 @@ GST_END_TEST; -GST_START_TEST (videotimecode_invalid) +GST_START_TEST (videotimecode_validation) { - GstVideoTimeCode *tc; - - tc = gst_video_time_code_new (25, 1, NULL, - GST_VIDEO_TIME_CODE_FLAGS_NONE, 1, 67, 4, 5, 0); - fail_unless (gst_video_time_code_is_valid (tc) == FALSE); - gst_video_time_code_free (tc); - tc = gst_video_time_code_new (60, 1, NULL, - GST_VIDEO_TIME_CODE_FLAGS_NONE, 28, 1, 2, 3, 0); - fail_unless (gst_video_time_code_is_valid (tc) == FALSE); - gst_video_time_code_free (tc); - tc = gst_video_time_code_new (30000, 1001, NULL, - GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME, 1, 23, 0, 0, 0); - fail_unless (gst_video_time_code_is_valid (tc) == FALSE); - gst_video_time_code_free (tc); - tc = gst_video_time_code_new (25, 1, NULL, - GST_VIDEO_TIME_CODE_FLAGS_NONE, 10, 11, 12, 13, 0); - fail_unless (gst_video_time_code_is_valid (tc) == TRUE); - gst_video_time_code_free (tc); +#define CHECK_TC(fps_n, fps_d, drop, hours, minutes, seconds, frames, valid) \ + G_STMT_START { GstVideoTimeCode *tc = \ + gst_video_time_code_new (fps_n, fps_d, /*latest_daily_jam=*/ NULL,\ + drop ? GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME \ + : GST_VIDEO_TIME_CODE_FLAGS_NONE, \ + hours, minutes, seconds, frames, /*field_count=*/ 0); \ + if (valid) /* not '...(tc) == valid' for nicer error messages */ \ + fail_unless (gst_video_time_code_is_valid (tc)); \ + else \ + fail_if (gst_video_time_code_is_valid (tc)); \ + gst_video_time_code_free (tc); \ + } G_STMT_END + + /* plain vanilla valid */ + CHECK_TC (25, 1, FALSE, 10, 11, 12, 13, TRUE); + + /* disallowed invalid frame rate */ + CHECK_TC (25, 0, FALSE, 0, 0, 0, 0, FALSE); + /* disallowed unknown frame rate */ + CHECK_TC (0, 1, FALSE, 0, 0, 0, 0, FALSE); + /* disallowed fractional frame rate */ + CHECK_TC (90000, 1001, FALSE, 0, 0, 0, 0, FALSE); + /* allowed fractional frame rate */ + CHECK_TC (24000, 1001, FALSE, 0, 0, 0, 0, TRUE); + /* allowed frame rate less than 1 FPS */ + CHECK_TC (900, 1000, FALSE, 0, 0, 0, 0, TRUE); + /* allowed integer frame rate */ + CHECK_TC (9000, 100, FALSE, 0, 0, 0, 0, TRUE); + /* TODO: CHECK_TC (60060, 1001, FALSE, 0, 0, 0, 0, TRUE); + * https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2823 + */ + + /* 'hours' >= 24 */ + CHECK_TC (60, 1, FALSE, 28, 1, 2, 3, FALSE); + /* 'minutes' >= 60 */ + CHECK_TC (30, 1, FALSE, 1, 67, 4, 5, FALSE); + /* 'seconds' >= 60 */ + CHECK_TC (25, 1, FALSE, 0, 1, 234, 5, FALSE); + /* 'frames' >= FPS */ + CHECK_TC (24, 1, FALSE, 0, 1, 2, 34, FALSE); + /* TODO Add tests for dis-/allowed 'seconds' when FPS<1.0 */ + + /* 23.976 is not a drop-frame frame rate */ + CHECK_TC (24000, 1001, TRUE, 0, 0, 0, 11, FALSE); + /* non-dropped frame at 29.97 FPS */ + CHECK_TC (30000, 1001, TRUE, 0, 20, 0, 0, TRUE); + /* dropped frame at 29.97 FPS */ + CHECK_TC (30000, 1001, TRUE, 0, 25, 0, 1, FALSE); + /* non-dropped frame at 59.94 FPS */ + CHECK_TC (60000, 1001, TRUE, 1, 30, 0, 2, TRUE); + /* dropped frame at 59.94 FPS */ + CHECK_TC (60000, 1001, TRUE, 1, 36, 0, 3, FALSE); + /* non-dropped frame at 119.88 FPS */ + CHECK_TC (120000, 1001, TRUE, 12, 40, 0, 6, TRUE); + /* dropped frame at 119.88 FPS */ + CHECK_TC (120000, 1001, TRUE, 12, 49, 0, 7, FALSE); +#undef CHECK_TC } GST_END_TEST; @@ -714,6 +753,56 @@ GST_END_TEST; +GST_START_TEST (videotimecode_half_fps) +{ + GstVideoTimeCode *tc; + GDateTime *dt; + + dt = g_date_time_new_utc (2016, 7, 29, 10, 32, 50); + + tc = gst_video_time_code_new (1, 2, dt, + GST_VIDEO_TIME_CODE_FLAGS_NONE, 0, 0, 0, 0, 0); + + fail_unless (gst_video_time_code_is_valid (tc)); + fail_unless_equals_uint64 (gst_video_time_code_nsec_since_daily_jam (tc), 0); + fail_unless_equals_uint64 (gst_video_time_code_frames_since_daily_jam (tc), + 0); + fail_unless_equals_int (tc->frames, 0); + fail_unless_equals_int (tc->seconds, 0); + fail_unless_equals_int (tc->minutes, 0); + fail_unless_equals_int (tc->hours, 0); + + gst_video_time_code_add_frames (tc, 10); + fail_unless (gst_video_time_code_is_valid (tc)); + fail_unless_equals_uint64 (gst_video_time_code_nsec_since_daily_jam (tc), + 20 * GST_SECOND); + fail_unless_equals_uint64 (gst_video_time_code_frames_since_daily_jam (tc), + 10); + fail_unless_equals_int (tc->frames, 0); + fail_unless_equals_int (tc->seconds, 20); + fail_unless_equals_int (tc->minutes, 0); + fail_unless_equals_int (tc->hours, 0); + + gst_video_time_code_add_frames (tc, 40); + fail_unless (gst_video_time_code_is_valid (tc)); + fail_unless_equals_uint64 (gst_video_time_code_nsec_since_daily_jam (tc), + 100 * GST_SECOND); + fail_unless_equals_uint64 (gst_video_time_code_frames_since_daily_jam (tc), + 50); + fail_unless_equals_int (tc->frames, 0); + fail_unless_equals_int (tc->seconds, 40); + fail_unless_equals_int (tc->minutes, 1); + fail_unless_equals_int (tc->hours, 0); + + tc->seconds += 1; + fail_if (gst_video_time_code_is_valid (tc)); + + gst_video_time_code_free (tc); + g_date_time_unref (dt); +} + +GST_END_TEST; + static Suite * gst_videotimecode_suite (void) { @@ -747,7 +836,7 @@ tcase_add_test (tc, videotimecode_dailyjam_distance); tcase_add_test (tc, videotimecode_serialize_deserialize); tcase_add_test (tc, videotimecode_interval); - tcase_add_test (tc, videotimecode_invalid); + tcase_add_test (tc, videotimecode_validation); tcase_add_test (tc, videotimecode_from_date_time_1s); tcase_add_test (tc, videotimecode_from_date_time_halfsecond); @@ -755,6 +844,8 @@ tcase_add_test (tc, videotimecode_from_to_string); + tcase_add_test (tc, videotimecode_half_fps); + return s; } ++++++ reduce-required-meson.patch ++++++ --- /var/tmp/diff_new_pack.uW7nDH/_old 2023-07-27 16:50:39.209761719 +0200 +++ /var/tmp/diff_new_pack.uW7nDH/_new 2023-07-27 16:50:39.213761742 +0200 @@ -1,10 +1,10 @@ -Index: gst-plugins-base-1.22.4/meson.build +Index: gst-plugins-base-1.22.5/meson.build =================================================================== ---- gst-plugins-base-1.22.4.orig/meson.build -+++ gst-plugins-base-1.22.4/meson.build +--- gst-plugins-base-1.22.5.orig/meson.build ++++ gst-plugins-base-1.22.5/meson.build @@ -1,6 +1,6 @@ project('gst-plugins-base', 'c', - version : '1.22.4', + version : '1.22.5', - meson_version : '>= 0.62', + meson_version : '>= 0.61', default_options : [ 'warning_level=1',