Bug#1107654: unblock (pre-approval): totem/43.2-3
Control: tags -1 confirmed moreinfo
On 2025-06-11 11:43:05 +0100, Simon McVittie wrote:
> Package: release.debian.org
> Severity: normal
> X-Debbugs-Cc: totem@packages.debian.org
> Control: affects -1 + src:totem
> User: release.debian.org@packages.debian.org
> Usertags: unblock
>
> [ Reason ]
> New upstream bugfix release, in particular fixing #986432
>
> [ Impact ]
> If not accepted, various bugs would be unfixed, notably:
> - #986432 which makes totem unusable on 32-bit;
> - totem#614 which can leak a lot of disk space in
> ~/.cache/totem/stream-buffer if I'm reading correctly
>
> If the release team is unhappy with the size of this upstream bugfix
> release, then I think we should cherry-pick the fixes for at least those
> two bugs instead. But following upstream and getting the benefit of
> other distros' testing seems safer than doing our own thing.
Let's take the new upstream release. Please remove the moreinfo once the
package is available in unstable.
Cheers
>
> [ Tests ]
> Manually tested by watching some videos with and without
> TOTEM_USE_GST_GTKSINK=1 environment variable.
>
> I tried streaming some videos over smb:// and http, but was unable to
> reproduce large temporary files appearing in
> ~/.cache/totem/stream-buffer, so I cannot confirm that totem#614 is
> fixed.
>
> Other distros are also shipping this version, e.g. it has been in Fedora
> 41 and 42 for 20 days.
>
> [ Risks ]
> Key package, installed by our default desktop environment.
>
> Adding support for falling back to gtksink is a larger change than I
> would normally expect in a stable-branch update, but it could be the
> difference between totem being usable or unusable on weaker hardware,
> and the code is not too complicated.
>
> Similarly using GStreamer's convert-sample instead of open-coding it is
> a larger change than I would have expected, but it's a code deletion
> rather than addition, and I trust GStreamer to get this right more than
> I trust Totem.
>
> We can revert any of these changes if they prove to be a problem.
>
> [ Checklist ]
> [x] all changes are documented in the d/changelog
> [x] I reviewed all changes and I approve them
> [x] attach debdiff against the package in testing
> - debdiff is testing vs. experimental, what I'm proposing to
> upload to unstable is this plus a changelog entry.
> I filtered out translation updates, upstream CI changes,
> and the content of the patches that were dropped.
> debdiff *.dsc | filterdiff -p1 -x.gitlab-ci.yml -x'debian/patches/*.patch' -x'po/*.po'
>
> NEWS | 16 +
> data/appdata/org.gnome.Totem.appdata.xml.in.in | 22 +
> data/mime-functions.sh | 2
> debian/changelog | 62 ++++
> debian/control | 3
> debian/patches/series | 9
> meson.build | 23 -
> po/LINGUAS | 1
> src/backend/bacon-video-widget.c | 134 ++++++++--
> src/backend/bacon-video-widget.h | 2
> src/backend/meson.build | 4
> src/gst/totem-gst-pixbuf-helpers.c | 289 ----------------------
> src/icon-helpers.c | 2
> src/plugins/open-directory/totem-open-directory.c | 8
> src/plugins/pythonconsole/console.py | 3
> src/plugins/recent/totem-recent.c | 2
> src/plugins/rotation/totem-rotation.c | 7
> src/plugins/save-file/totem-save-file.c | 2
> src/plugins/screenshot/totem-screenshot-plugin.c | 47 ---
> src/totem-object.c | 9
> src/totem-playlist.c | 2
> src/totem-resources.c | 10
> src/totem-resources.h | 3
> src/totem-video-thumbnailer.c | 15 -
> src/totem.c | 2
> 25 files changed, 277 insertions(+), 402 deletions(-)
>
> diff -Nru totem-43.1/data/appdata/org.gnome.Totem.appdata.xml.in.in totem-43.2/data/appdata/org.gnome.Totem.appdata.xml.in.in
> --- totem-43.1/data/appdata/org.gnome.Totem.appdata.xml.in.in 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/data/appdata/org.gnome.Totem.appdata.xml.in.in 2025-05-21 14:08:29.000000000 +0100
> @@ -20,17 +20,18 @@
> and support for recording DVDs.
> </p>
> </description>
> - <url type="homepage">https://wiki.gnome.org/Apps/Videos</url>
> + <url type="homepage">https://apps.gnome.org/Totem/</url>
> <url type="bugtracker">https://gitlab.gnome.org/GNOME/totem/issues</url>
> - <url type="donation">https://www.gnome.org/friends/</url>
> + <url type="donation">https://www.gnome.org/donate/</url>
> <url type="translate">https://l10n.gnome.org/module/totem/</url>
> <url type="help">https://help.gnome.org/users/totem/stable/</url>
> + <url type="vcs-browser">https://gitlab.gnome.org/GNOME/totem</url>
> <screenshots>
> <screenshot type="default">
> - <image>https://gitlab.gnome.org/GNOME/totem/raw/HEAD/data/appdata/ss-player.png</image>
> + <image>https://gitlab.gnome.org/GNOME/totem/raw/gnome-43/data/appdata/ss-player.png</image>
> </screenshot>
> <screenshot>
> - <image>https://gitlab.gnome.org/GNOME/totem/raw/HEAD/data/appdata/ss-videos.png</image>
> + <image>https://gitlab.gnome.org/GNOME/totem/raw/gnome-43/data/appdata/ss-videos.png</image>
> </screenshot>
> </screenshots>
> <update_contact>hadess@hadess.net</update_contact>
> @@ -39,6 +40,15 @@
> <translation type="gettext">totem</translation>
> <launchable type="desktop-id">@APPLICATION_ID@.desktop</launchable>
> <releases>
> + <release version="43.2" date="2025-05-21">
> + <description>
> + <p>
> + This new 43.2 version includes the use of gtksink as a video output
> + when native OpenGL support is not available, as well as many thumbnailer
> + related bug fixes, and translation updates.
> + </p>
> + </description>
> + </release>
> <release version="43.1" date="2024-10-22">
> <description>
> <p>
> @@ -113,4 +123,8 @@
> <kudo>UserDocs</kudo>
> </kudos>
> <content_rating type="oars-1.1" />
> + <branding>
> + <color type="primary" scheme_preference="light">#f8e45c</color>
> + <color type="primary" scheme_preference="dark">#613583</color>
> + </branding>
> </component>
> diff -Nru totem-43.1/data/mime-functions.sh totem-43.2/data/mime-functions.sh
> --- totem-43.1/data/mime-functions.sh 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/data/mime-functions.sh 2025-05-21 14:08:29.000000000 +0100
> @@ -8,7 +8,7 @@
>
> get_video_mimetypes ()
> {
> - MIMETYPES=`grep -v '^#' $1 | grep -v x-content/ | grep -v audio | grep -v "application/x-flac" | grep -v "text/google-video-pointer" | grep -v "application/x-quicktime-media-link" | grep -v "application/smil" | grep -v "application/smil+xml" | grep -v "application/x-smil" | grep -v "application/xspf+xml" | grep -v -E 'application/[a-z-]*ogg'`
> + MIMETYPES=`grep -v '^#' $1 | grep -v x-content/ | grep -v audio | grep -v "application/x-flac" | grep -v "text/google-video-pointer" | grep -v "application/x-quicktime-media-link" | grep -v -E 'application/.*smil.*' | grep -v "application/xspf+xml" | grep -v "mpegurl" | grep -v -E 'application/[a-z-]*ogg'`
> MIMETYPES="$MIMETYPES audio/x-pn-realaudio"
> }
>
> diff -Nru totem-43.1/debian/changelog totem-43.2/debian/changelog
> --- totem-43.1/debian/changelog 2025-05-05 20:28:32.000000000 +0100
> +++ totem-43.2/debian/changelog 2025-06-11 11:01:40.000000000 +0100
> @@ -1,3 +1,65 @@
> +totem (43.2-2) experimental; urgency=medium
> +
> + * Team upload
> + * Summarize upstream changes in previous changelog entry
> + * d/control: Increase libportal build-dependency to 0.7, now required
> + upstream due to totem!390.
> + This version is already present in trixie, but not in bookworm.
> + * d/control: Explicitly build-depend on libepoxy-dev, required by the
> + GL check in totem!379
> +
> + -- Simon McVittie <smcv@debian.org> Wed, 11 Jun 2025 11:01:40 +0100
> +
> +totem (43.2-1) experimental; urgency=medium
> +
> + * New upstream release
> + - Fix a crash on startup on 32-bit architectures
> + (Closes: #986432, totem!393 upstream)
> + - Fix memory leaks, one of which could have the side-effect of leaking
> + large amounts of disk space in ~/.cache/totem/stream-buffer
> + (totem#614, totem!409 upstream)
> + - Make the main video widget take keyboard focus when playback starts,
> + so that keyboard shortcuts like spacebar to pause work as expected
> + (totem!420 upstream)
> + - Don't crash the whole application if libportal fails to initialize:
> + use xdp_portal_initable_new() instead, which has error reporting
> + (totem!390 upstream)
> + - Match the window to the application ID so that Wayland compositors
> + will show the correct icon
> + (totem!391 upstream)
> + - Automatically fall back to plain GTK video sink if environment
> + variable TOTEM_USE_GST_GTKSINK=1 is set, if the GL driver is too old
> + to work, or if the GL driver name indicates software rendering
> + (totem!379 upstream)
> + - Use GStreamer playbin's convert-sample feature instead of
> + reimplementing equivalent functionality locally
> + (totem!261 upstream)
> + - Exclude m3u playlists from thumbnailing: they are not a video format,
> + and loading them from a sandbox with no network access will usually
> + fail anyway
> + (totem#626 upstream)
> + - Avoid a duplicate MIME-type registration for application/x-smil, etc.
> + (totem#635 upstream)
> + - Allow one thumbnailing process per CPU
> + (totem!399 upstream)
> + - Fix a deprecation warning in the pythonconsole plugin
> + (totem!400 upstream)
> + - Stop using a private gnome-shell API to show a "camera flash" effect
> + when taking screenshots: unprivileged apps are no longer allowed to
> + call into this API, so it had no practical effect
> + (totem!371 upstream)
> + - AppStream metadata improvements
> + + update URLs
> + + pin screenshots to the gnome-43 branch so they will not become
> + misleading if the UI changes in the main branch
> + + add branding colours
> + - Fix build system warnings
> + - Translation updates
> + * Remove all patches except d/p/Mark-lint-checks-as-part-of-a-suite.patch,
> + applied in new release
> +
> + -- Jeremy B�a <jbicha@ubuntu.com> Fri, 06 Jun 2025 13:20:12 -0400
> +
> totem (43.1-6) unstable; urgency=medium
>
> * Team upload
> diff -Nru totem-43.1/debian/control totem-43.2/debian/control
> --- totem-43.1/debian/control 2025-05-05 20:28:32.000000000 +0100
> +++ totem-43.2/debian/control 2025-06-11 11:01:40.000000000 +0100
> @@ -19,6 +19,7 @@
> libatk1.0-dev,
> libbluetooth-dev [linux-any],
> libcairo2-dev,
> + libepoxy-dev,
> libgdk-pixbuf-2.0-dev,
> libgirepository1.0-dev,
> libglib2.0-dev (>= 2.72.0),
> @@ -29,7 +30,7 @@
> libgtk-3-dev,
> libhandy-1-dev (>= 1.5.90),
> libpeas-dev,
> - libportal-gtk3-dev,
> + libportal-gtk3-dev (>= 0.7),
> librsvg2-dev,
> libtotem-plparser-dev,
> libx11-dev (>= 2:1.8),
> diff -Nru totem-43.1/debian/patches/series totem-43.2/debian/patches/series
> --- totem-43.1/debian/patches/series 2025-05-05 20:28:32.000000000 +0100
> +++ totem-43.2/debian/patches/series 2025-06-11 11:01:40.000000000 +0100
> @@ -1,10 +1 @@
> Mark-lint-checks-as-part-of-a-suite.patch
> -plugins-remove-apple-trailers-plugin.patch
> -plugins-Remove-vimeo-plug-in.patch
> -Update-POTFILES.in.patch
> -Update-POTFILES.in-1.patch
> -data-Add-new-canonical-mime-type-for-AVI-files.patch
> -Fix-totem-thumbnailer-fail-due-to-OpenBLAS-pthread-e.patch
> -thumbnailer-Bump-memory-usage-limit.patch
> -use-appstreamcli.patch
> -Fix-Thumbnailer-Gstreamer-threading.patch
> diff -Nru totem-43.1/meson.build totem-43.2/meson.build
> --- totem-43.1/meson.build 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/meson.build 2025-05-21 14:08:29.000000000 +0100
> @@ -1,6 +1,6 @@
> project(
> 'totem', 'c',
> - version: '43.1',
> + version: '43.2',
> license: 'GPL2+ with exception',
> default_options: 'buildtype=debugoptimized',
> meson_version: '>= 0.57.0'
> @@ -126,17 +126,18 @@
> glib_req_version = '>= 2.72.0'
> gtk_req_version = '>= 3.22.0'
> hdy_req_version = '>= 1.5.0'
> -gst_req_version = '>= 1.6.0'
> +gst_req_version = '>= 1.21.1'
> grilo_req_version = '>= 0.3.0'
> peas_req_version = '>= 1.1.0'
> totem_plparser_req_version = '>= 3.26.5'
> +libportal_req_version = '>= 0.7'
>
> glib_dep = dependency('glib-2.0', version: glib_req_version)
> gobject_dep = dependency('gobject-2.0', version: glib_req_version)
> gmodule_dep = dependency('gmodule-2.0', version: glib_req_version)
> gio_dep = dependency('gio-2.0', version: '>= 2.43.4')
> gtk_dep = dependency('gtk+-3.0', version: gtk_req_version)
> -targets = gtk_dep.get_pkgconfig_variable('targets')
> +targets = gtk_dep.get_variable(pkgconfig : 'targets')
> if targets.split(' ').contains('x11')
> x11_dep = dependency('x11', version: '>= 1.8')
> else
> @@ -144,9 +145,9 @@
> endif
> hdy_dep = dependency('libhandy-1', version: hdy_req_version)
> gst_dep = dependency('gstreamer-1.0', version: gst_req_version)
> -gst_tag_dep = dependency('gstreamer-tag-1.0', version: '>= 0.11.93')
> -gst_video_dep = dependency('gstreamer-video-1.0')
> -gst_pbutils_dep = dependency('gstreamer-pbutils-1.0')
> +gst_tag_dep = dependency('gstreamer-tag-1.0', version: gst_req_version)
> +gst_video_dep = dependency('gstreamer-video-1.0', version: gst_req_version)
> +gst_pbutils_dep = dependency('gstreamer-pbutils-1.0', version: gst_req_version)
> peas_dep = dependency('libpeas-1.0', version: peas_req_version)
> peas_gtk_dep = dependency('libpeas-gtk-1.0', version: peas_req_version)
> totem_plparser_dep = dependency('totem-plparser', version: totem_plparser_req_version)
> @@ -208,7 +209,7 @@
> endif
>
> # libportal support
> -libportal_dep = dependency('libportal-gtk3', required: get_option('libportal'))
> +libportal_dep = dependency('libportal-gtk3', version: libportal_req_version, required: get_option('libportal'))
> have_libportal = libportal_dep.found()
>
> configure_file(
> @@ -220,7 +221,7 @@
> i18n = import('i18n')
> pkg = import('pkgconfig')
>
> -po_dir = join_paths(meson.source_root(), 'po')
> +po_dir = join_paths(meson.project_source_root(), 'po')
>
> top_inc = include_directories('.')
>
> @@ -245,21 +246,21 @@
> totem_minor_version != 'rc')
> if is_stable
> meson.add_dist_script(
> - find_program('check-news.sh').path(),
> + find_program('check-news.sh').full_path(),
> '@0@'.format(meson.project_version()),
> 'NEWS',
> 'data/appdata/org.gnome.Totem.appdata.xml.in.in'
> )
> else
> meson.add_dist_script(
> - find_program('check-news.sh').path(),
> + find_program('check-news.sh').full_path(),
> '@0@'.format(meson.project_version()),
> 'NEWS',
> )
> endif
>
> meson.add_dist_script(
> - find_program('remove-flatpak-dist.sh').path()
> + find_program('remove-flatpak-dist.sh').full_path()
> )
>
> message('Totem was configured with the following options:')
> diff -Nru totem-43.1/NEWS totem-43.2/NEWS
> --- totem-43.1/NEWS 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/NEWS 2025-05-21 14:08:29.000000000 +0100
> @@ -1,5 +1,21 @@
> New features and significant updates in version...
>
> +Major changes in 43.2:
> +- Implement a gtksink video output fallback if native OpenGL support is
> + not available.
> +- Fix a lot of thumbnailing failures caused by memory hungry video decoders
> +- Hide the rotate menu items if rotation is not supported
> +- Fix some AVI files not being associated correctly
> +- Fix widget focus when starting video playback
> +- Fix left-over files when streaming a video and the player is closed
> +- Fix window not being matched to the application under Wayland
> +- Stop using gnome-shell to flash the screenshot area, that stopped
> + working a long time ago
> +- Stop thumbnailing m3u playlists
> +- Remove obsolete plugins (apple-trailers, vimeo)
> +- Fix a number of possible crashers
> +- Translation updates
> +
> Major changes in 43.1:
> - Fix scroll-by-page GTK setting breaking slider
> - Fix a number of MPRIS playback controls not working correctly
> diff -Nru totem-43.1/po/LINGUAS totem-43.2/po/LINGUAS
> --- totem-43.1/po/LINGUAS 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/po/LINGUAS 2025-05-21 14:08:29.000000000 +0100
> @@ -90,6 +90,7 @@
> tr
> ug
> uk
> +uz
> vi
> wa
> xh
> diff -Nru totem-43.1/src/backend/bacon-video-widget.c totem-43.2/src/backend/bacon-video-widget.c
> --- totem-43.1/src/backend/bacon-video-widget.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/backend/bacon-video-widget.c 2025-05-21 14:08:29.000000000 +0100
> @@ -63,6 +63,9 @@
> /* for the cover metadata info */
> #include <gst/tag/tag.h>
>
> +/* for detecting GL vendor/renderer */
> +#include <epoxy/gl.h>
> +
> /* system */
> #include <unistd.h>
> #include <time.h>
> @@ -192,6 +195,7 @@
> gint64 current_time;
> gdouble current_position;
> gboolean is_live;
> + gboolean use_gl;
>
> GstTagList *tagcache;
> GstTagList *audiotags;
> @@ -282,6 +286,7 @@
>
> static void bacon_video_widget_finalize (GObject * object);
>
> +static void bvw_init_video_sink (BaconVideoWidget *bvw);
> static void bvw_reconfigure_fill_timeout (BaconVideoWidget *bvw, guint msecs);
> static void bvw_stop_play_pipeline (BaconVideoWidget * bvw);
> static GError* bvw_error_from_gst_error (BaconVideoWidget *bvw, GstMessage *m);
> @@ -433,6 +438,8 @@
>
> GTK_WIDGET_CLASS (parent_class)->realize (widget);
>
> + bvw_init_video_sink (bvw);
> +
> window = gtk_widget_get_window (widget);
> display = gdk_window_get_display (window);
> bvw->hand_cursor = gdk_cursor_new_for_display (display, GDK_HAND2);
> @@ -3882,9 +3889,12 @@
> bvw->buffering_left = -1;
> bvw_reconfigure_fill_timeout (bvw, 0);
> g_signal_emit (bvw, bvw_signals[SIGNAL_BUFFERING], 0, 100.0);
> - g_object_set (bvw->video_sink,
> - "rotate-method", GST_VIDEO_ORIENTATION_AUTO,
> - NULL);
> +
> + if (bvw->use_gl)
> + g_object_set (bvw->video_sink,
> + "rotate-method", GST_VIDEO_ORIENTATION_AUTO,
> + NULL);
> +
> GST_DEBUG ("stopped");
> }
>
> @@ -4493,6 +4503,9 @@
> {
> g_return_if_fail (BACON_IS_VIDEO_WIDGET (bvw));
>
> + if (!bvw->use_gl)
> + return;
> +
> GST_DEBUG ("Rotating to %s (%f degrees) from %s",
> g_enum_to_string (BVW_TYPE_ROTATION, rotation),
> rotation * 90.0,
> @@ -4518,6 +4531,22 @@
> return bvw->rotation;
> }
>
> +/**
> + * bacon_video_widget_use_gl:
> + * @bvw: a #BaconVideoWidget
> + *
> + * Returns whether gl is used.
> + *
> + * Return value: %TRUE if gl is used, %FALSE otherwise
> + **/
> +gboolean
> +bacon_video_widget_use_gl (BaconVideoWidget *bvw)
> +{
> + g_return_val_if_fail (BACON_IS_VIDEO_WIDGET (bvw), FALSE);
> +
> + return bvw->use_gl;
> +}
> +
> /* Search for the color balance channel corresponding to type and return it. */
> static GstColorBalanceChannel *
> bvw_get_color_balance_channel (GstColorBalance * color_balance,
> @@ -5492,12 +5521,7 @@
> static void
> bacon_video_widget_init (BaconVideoWidget *bvw)
> {
> - GstElement *audio_sink = NULL;
> gchar *version_str;
> - GstPlayFlags flags;
> - GstElement *glsinkbin, *audio_bin;
> - GstPad *audio_pad;
> - char *template;
>
> gtk_widget_set_can_focus (GTK_WIDGET (bvw), TRUE);
>
> @@ -5538,19 +5562,84 @@
> GDK_BUTTON_RELEASE_MASK |
> GDK_KEY_PRESS_MASK);
> gtk_widget_init_template (GTK_WIDGET (bvw));
> +}
> +
> +static inline gboolean
> +bvw_gl_check (GtkWidget *widget)
> +{
> + static gsize gl_works = 0;
> +
> + if (is_feature_enabled ("TOTEM_USE_GST_GTKSINK")) {
> + return FALSE;
> + }
> +
> + if (g_once_init_enter (&gl_works)) {
> + GError *error = NULL;
> + gsize works = 1;
> + GdkGLContext *context;
> + GdkWindow *window;
> +
> + if ((window = gtk_widget_get_window (widget)) &&
> + (context = gdk_window_create_gl_context (window, &error))) {
> + const gchar *vendor, *renderer;
> +
> + gdk_gl_context_make_current (context);
> +
> + vendor = (const gchar *) glGetString (GL_VENDOR);
> + renderer = (const gchar *) glGetString (GL_RENDERER);
> +
> + GST_INFO ("GL Vendor: %s, renderer: %s", vendor, renderer);
> +
> + if (g_str_has_prefix (renderer, "llvmpipe") ||
> + g_str_has_prefix (renderer, "softpipe"))
> + GST_INFO ("Detected software GL rasterizer, falling back to gtksink");
> + else
> + works = 2;
> +
> + gdk_gl_context_clear_current ();
> + }
> +
> + if (error) {
> + GST_WARNING ("Could not window to create GL context, %s", error->message);
> + g_error_free (error);
> + }
> +
> + g_once_init_leave (&gl_works, works);
> + }
> +
> + return (gl_works > 1);
> +}
> +
> +static void
> +bvw_init_video_sink (BaconVideoWidget *bvw)
> +{
> + GstElement *audio_sink = NULL;
> + GstPlayFlags flags;
> + GstElement *glsinkbin = NULL;
> + GstElement *audio_bin;
> + GstPad *audio_pad;
> + char *template;
> +
> + bvw->use_gl = bvw_gl_check (GTK_WIDGET (bvw));
>
> /* Instantiate all the fallible plugins */
> bvw->play = element_make_or_warn ("playbin", "play");
> bvw->audio_pitchcontrol = element_make_or_warn ("scaletempo", "scaletempo");
> - bvw->video_sink = element_make_or_warn ("gtkglsink", "video-sink");
> - glsinkbin = element_make_or_warn ("glsinkbin", "glsinkbin");
> +
> + if (bvw->use_gl) {
> + bvw->video_sink = element_make_or_warn ("gtkglsink", "video-sink");
> + glsinkbin = element_make_or_warn ("glsinkbin", "glsinkbin");
> + } else {
> + bvw->video_sink = element_make_or_warn ("gtksink", "video-sink");
> + }
> +
> audio_sink = element_make_or_warn ("autoaudiosink", "audio-sink");
>
> if (!bvw->play ||
> !bvw->audio_pitchcontrol ||
> !bvw->video_sink ||
> !audio_sink ||
> - !glsinkbin) {
> + (bvw->use_gl && !glsinkbin)) {
> if (bvw->video_sink)
> g_object_ref_sink (bvw->video_sink);
> if (audio_sink)
> @@ -5595,23 +5684,34 @@
> if (is_feature_enabled ("FPS_DISPLAY")) {
> GstElement *fps;
> fps = gst_element_factory_make ("fpsdisplaysink", "fpsdisplaysink");
> - g_object_set (glsinkbin, "sink", fps, NULL);
> +
> + if (bvw->use_gl)
> + g_object_set (glsinkbin, "sink", fps, NULL);
> + else
> + g_object_set (bvw->play, "video-sink", fps, NULL);
> +
> g_object_set (fps, "video-sink", bvw->video_sink, NULL);
> } else {
> - g_object_set (glsinkbin, "sink", bvw->video_sink, NULL);
> + if (bvw->use_gl)
> + g_object_set (glsinkbin, "sink", bvw->video_sink, NULL);
> + else
> + g_object_set (bvw->play, "video-sink", bvw->video_sink, NULL);
> }
> +
> g_object_get (bvw->video_sink, "widget", &bvw->video_widget, NULL);
> gtk_widget_show (bvw->video_widget);
> gtk_stack_add_named (GTK_STACK (bvw->stack), bvw->video_widget, "video");
> g_object_unref (bvw->video_widget);
> gtk_stack_set_visible_child_name (GTK_STACK (bvw->stack), "video");
>
> - g_object_set (bvw->video_sink,
> - "rotate-method", GST_VIDEO_ORIENTATION_AUTO,
> - NULL);
> + if (bvw->use_gl)
> + g_object_set (bvw->video_sink,
> + "rotate-method", GST_VIDEO_ORIENTATION_AUTO,
> + NULL);
>
> /* And tell playbin */
> - g_object_set (bvw->play, "video-sink", glsinkbin, NULL);
> + if (bvw->use_gl)
> + g_object_set (bvw->play, "video-sink", glsinkbin, NULL);
>
> /* Link the audiopitch element */
> bvw->audio_capsfilter =
> diff -Nru totem-43.1/src/backend/bacon-video-widget.h totem-43.2/src/backend/bacon-video-widget.h
> --- totem-43.1/src/backend/bacon-video-widget.h 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/backend/bacon-video-widget.h 2025-05-21 14:08:29.000000000 +0100
> @@ -282,6 +282,8 @@
> void bacon_video_widget_set_rotation (BaconVideoWidget *bvw,
> BvwRotation rotation);
> BvwRotation bacon_video_widget_get_rotation (BaconVideoWidget *bvw);
> +gboolean bacon_video_widget_use_gl (BaconVideoWidget *bvw);
> +
>
> int bacon_video_widget_get_video_property (BaconVideoWidget *bvw,
> BvwVideoProperty type);
> diff -Nru totem-43.1/src/backend/meson.build totem-43.2/src/backend/meson.build
> --- totem-43.1/src/backend/meson.build 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/backend/meson.build 2025-05-21 14:08:29.000000000 +0100
> @@ -2,7 +2,7 @@
>
> gst_inspect = find_program(
> 'gst-inspect-1.0',
> - join_paths(gst_dep.get_pkgconfig_variable('toolsdir'), 'gst-inspect-1.0'),
> + join_paths(gst_dep.get_variable(pkgconfig : 'toolsdir'), 'gst-inspect-1.0'),
> required: false
> )
>
> @@ -23,6 +23,7 @@
> gst_good_plugins = [
> 'autoaudiosink',
> 'scaletempo',
> + 'gtksink',
> 'gtkglsink',
> 'glsinkbin'
> ]
> @@ -73,6 +74,7 @@
> libtotem_time_helpers_dep,
> gtk_dep,
> gmodule_dep,
> + dependency('epoxy'),
> ]
>
> libbacon_video_widget_cflags = common_flags + warn_flags + [
> diff -Nru totem-43.1/src/gst/totem-gst-pixbuf-helpers.c totem-43.2/src/gst/totem-gst-pixbuf-helpers.c
> --- totem-43.1/src/gst/totem-gst-pixbuf-helpers.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/gst/totem-gst-pixbuf-helpers.c 2025-05-21 14:08:29.000000000 +0100
> @@ -47,290 +47,12 @@
> gst_sample_unref (GST_SAMPLE (data));
> }
>
> -static gboolean
> -caps_are_raw (const GstCaps * caps)
> -{
> - guint i, len;
> -
> - len = gst_caps_get_size (caps);
> -
> - for (i = 0; i < len; i++) {
> - GstStructure *st = gst_caps_get_structure (caps, i);
> - if (gst_structure_has_name (st, "video/x-raw"))
> - return TRUE;
> - }
> -
> - return FALSE;
> -}
> -
> -static gboolean
> -create_element (const gchar * factory_name, GstElement ** element,
> - GError ** err)
> -{
> - *element = gst_element_factory_make (factory_name, NULL);
> - if (*element)
> - return TRUE;
> -
> - if (err && *err == NULL) {
> - *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_MISSING_PLUGIN,
> - "cannot create element '%s' - please check your GStreamer installation",
> - factory_name);
> - }
> -
> - return FALSE;
> -}
> -
> -static GstElement *
> -build_convert_frame_pipeline (FrameCaptureType capture_type,
> - GstElement ** src_element,
> - GstElement ** sink_element, const GstCaps * from_caps,
> - const GstCaps * to_caps, GError ** err)
> -{
> - GstElement *csp = NULL, *vscale = NULL;
> - GstElement *src = NULL, *sink = NULL, *dl = NULL, *pipeline;
> - GError *error = NULL;
> - gboolean ret;
> -
> - if (!caps_are_raw (to_caps))
> - goto no_pipeline;
> -
> - /* videoscale is here to correct for the pixel-aspect-ratio for us */
> - GST_DEBUG ("creating elements");
> - if (!create_element ("appsrc", &src, &error) ||
> - !create_element ("appsink", &sink, &error))
> - goto no_elements;
> - if (capture_type == FRAME_CAPTURE_TYPE_RAW) {
> - if (!create_element ("videoconvert", &csp, &error) ||
> - !create_element ("videoscale", &vscale, &error))
> - goto no_elements;
> - } else {
> - if (!create_element ("glcolorconvert", &csp, &error) ||
> - !create_element ("glcolorscale", &vscale, &error) ||
> - !create_element ("gldownload", &dl, &error))
> - goto no_elements;
> - }
> -
> - pipeline = gst_pipeline_new ("videoconvert-pipeline");
> - if (pipeline == NULL)
> - goto no_pipeline;
> -
> - /* Add black borders if necessary to keep the DAR */
> - if (g_object_class_find_property (G_OBJECT_GET_CLASS (vscale), "add-borders"))
> - g_object_set (vscale, "add-borders", TRUE, NULL);
> -
> - GST_DEBUG ("adding elements");
> - gst_bin_add_many (GST_BIN (pipeline), src, csp, vscale, sink, dl, NULL);
> -
> - /* set caps */
> - g_object_set (src, "caps", from_caps, NULL);
> - g_object_set (sink, "caps", to_caps, NULL);
> -
> - if (dl)
> - ret = gst_element_link_many (src, csp, vscale, dl, sink, NULL);
> - else
> - ret = gst_element_link_many (src, csp, vscale, sink, NULL);
> - if (!ret)
> - goto link_failed;
> -
> - g_object_set (src, "emit-signals", TRUE, NULL);
> - g_object_set (sink, "emit-signals", TRUE, NULL);
> -
> - *src_element = src;
> - *sink_element = sink;
> -
> - return pipeline;
> - /* ERRORS */
> -no_elements:
> - {
> - if (src)
> - gst_object_unref (src);
> - if (csp)
> - gst_object_unref (csp);
> - if (vscale)
> - gst_object_unref (vscale);
> - if (dl)
> - gst_object_unref (dl);
> - if (sink)
> - gst_object_unref (sink);
> - GST_ERROR ("Could not convert video frame: %s", error->message);
> - if (err)
> - *err = error;
> - else
> - g_error_free (error);
> - return NULL;
> - }
> -no_pipeline:
> - {
> - gst_object_unref (src);
> - gst_object_unref (csp);
> - gst_object_unref (vscale);
> - g_clear_pointer (&dl, gst_object_unref);
> - gst_object_unref (sink);
> -
> - GST_ERROR ("Could not convert video frame: no pipeline (unknown error)");
> - if (err)
> - *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
> - "Could not convert video frame: no pipeline (unknown error)");
> - return NULL;
> - }
> -link_failed:
> - {
> - gst_object_unref (pipeline);
> -
> - GST_ERROR ("Could not convert video frame: failed to link elements");
> - if (err)
> - *err = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
> - "Could not convert video frame: failed to link elements");
> - return NULL;
> - }
> -}
> -
> -/**
> - * totem_gst_video_convert_sample:
> - * @capture_type: capture type
> - * @sample: a #GstSample
> - * @to_caps: the #GstCaps to convert to
> - * @timeout: the maximum amount of time allowed for the processing.
> - * @error: pointer to a #GError. Can be %NULL.
> - *
> - * Converts a raw video buffer into the specified output caps.
> - *
> - * The output caps can be any raw video formats or any image formats (jpeg, png, ...).
> - *
> - * The width, height and pixel-aspect-ratio can also be specified in the output caps.
> - *
> - * Returns: The converted #GstSample, or %NULL if an error happened (in which case @err
> - * will point to the #GError).
> - */
> -static GstSample *
> -totem_gst_video_convert_sample (FrameCaptureType capture_type,
> - GstSample * sample, const GstCaps * to_caps,
> - GstClockTime timeout, GError ** error)
> -{
> - GstMessage *msg;
> - GstBuffer *buf;
> - GstSample *result = NULL;
> - GError *err = NULL;
> - GstBus *bus;
> - GstCaps *from_caps, *to_caps_copy = NULL;
> - GstFlowReturn ret;
> - GstElement *pipeline, *src, *sink;
> - guint i, n;
> -
> - g_return_val_if_fail (sample != NULL, NULL);
> - g_return_val_if_fail (to_caps != NULL, NULL);
> -
> - buf = gst_sample_get_buffer (sample);
> - g_return_val_if_fail (buf != NULL, NULL);
> -
> - from_caps = gst_sample_get_caps (sample);
> - g_return_val_if_fail (from_caps != NULL, NULL);
> -
> - to_caps_copy = gst_caps_new_empty ();
> - n = gst_caps_get_size (to_caps);
> - for (i = 0; i < n; i++) {
> - GstStructure *s = gst_caps_get_structure (to_caps, i);
> -
> - s = gst_structure_copy (s);
> - gst_structure_remove_field (s, "framerate");
> - gst_caps_append_structure (to_caps_copy, s);
> - }
> -
> - pipeline =
> - build_convert_frame_pipeline (capture_type, &src, &sink, from_caps,
> - to_caps_copy, &err);
> - if (!pipeline)
> - goto no_pipeline;
> -
> - /* now set the pipeline to the paused state, after we push the buffer into
> - * appsrc, this should preroll the converted buffer in appsink */
> - GST_DEBUG ("running conversion pipeline to caps %" GST_PTR_FORMAT,
> - to_caps_copy);
> - if (gst_element_set_state (pipeline,
> - GST_STATE_PAUSED) == GST_STATE_CHANGE_FAILURE)
> - goto state_change_failed;
> -
> - /* feed buffer in appsrc */
> - GST_DEBUG ("feeding buffer %p, size %" G_GSIZE_FORMAT ", caps %"
> - GST_PTR_FORMAT, buf, gst_buffer_get_size (buf), from_caps);
> - g_signal_emit_by_name (src, "push-buffer", buf, &ret);
> -
> - /* now see what happens. We either got an error somewhere or the pipeline
> - * prerolled */
> - bus = gst_element_get_bus (pipeline);
> - msg = gst_bus_timed_pop_filtered (bus,
> - timeout, GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE);
> -
> - if (msg) {
> - switch (GST_MESSAGE_TYPE (msg)) {
> - case GST_MESSAGE_ASYNC_DONE:
> - {
> - /* we're prerolled, get the frame from appsink */
> - g_signal_emit_by_name (sink, "pull-preroll", &result);
> -
> - if (result) {
> - GST_DEBUG ("conversion successful: result = %p", result);
> - } else {
> - GST_ERROR ("prerolled but no result frame?!");
> - }
> - break;
> - }
> - case GST_MESSAGE_ERROR:{
> - gchar *dbg = NULL;
> -
> - gst_message_parse_error (msg, &err, &dbg);
> - if (err) {
> - GST_ERROR ("Could not convert video frame: %s", err->message);
> - GST_DEBUG ("%s [debug: %s]", err->message, GST_STR_NULL (dbg));
> - if (error)
> - *error = err;
> - else
> - g_error_free (err);
> - }
> - g_free (dbg);
> - break;
> - }
> - default:{
> - g_return_val_if_reached (NULL);
> - }
> - }
> - gst_message_unref (msg);
> - } else {
> - GST_ERROR ("Could not convert video frame: timeout during conversion");
> - if (error)
> - *error = g_error_new (GST_CORE_ERROR, GST_CORE_ERROR_FAILED,
> - "Could not convert video frame: timeout during conversion");
> - }
> -
> - gst_element_set_state (pipeline, GST_STATE_NULL);
> - gst_object_unref (bus);
> - gst_object_unref (pipeline);
> - gst_caps_unref (to_caps_copy);
> -
> - return result;
> -
> - /* ERRORS */
> -no_pipeline:
> -state_change_failed:
> - {
> - gst_caps_unref (to_caps_copy);
> -
> - if (error)
> - *error = err;
> - else
> - g_error_free (err);
> -
> - return NULL;
> - }
> -}
> -
> GdkPixbuf *
> totem_gst_playbin_get_frame (GstElement *play, GError **error)
> {
> FrameCaptureType capture_type;
> GstStructure *s;
> GstSample *sample = NULL;
> - GstSample *last_sample = NULL;
> guint bpp;
> GdkPixbuf *pixbuf = NULL;
> GstCaps *to_caps, *sample_caps;
> @@ -359,19 +81,12 @@
> NULL);
>
> /* get frame */
> - g_object_get (G_OBJECT (play), "sample", &last_sample, NULL);
> - if (!last_sample) {
> - g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
> - "Failed to retrieve video frame");
> - return NULL;
> - }
> - sample = totem_gst_video_convert_sample (capture_type, last_sample, to_caps, 25 * GST_SECOND, error);
> - gst_sample_unref (last_sample);
> + g_signal_emit_by_name (play, "convert-sample", to_caps, &sample);
> gst_caps_unref (to_caps);
>
> if (!sample) {
> g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
> - "Failed to convert video frame");
> + "Failed to retrieve or convert video frame");
> return NULL;
> }
>
> diff -Nru totem-43.1/src/icon-helpers.c totem-43.2/src/icon-helpers.c
> --- totem-43.1/src/icon-helpers.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/icon-helpers.c 2025-05-21 14:08:29.000000000 +0100
> @@ -30,7 +30,7 @@
> #define GNOME_DESKTOP_USE_UNSTABLE_API 1
> #include <libgnome-desktop/gnome-desktop-thumbnail.h>
>
> -#define DEFAULT_MAX_THREADS 1
> +#define DEFAULT_MAX_THREADS g_get_num_processors ()
> #define THUMB_SEARCH_SIZE 256
> #define THUMB_SEARCH_HEIGHT THUMB_SEARCH_SIZE
> #define SOURCES_MAX_HEIGHT 64
> diff -Nru totem-43.1/src/plugins/open-directory/totem-open-directory.c totem-43.2/src/plugins/open-directory/totem-open-directory.c
> --- totem-43.1/src/plugins/open-directory/totem-open-directory.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/plugins/open-directory/totem-open-directory.c 2025-05-21 14:08:29.000000000 +0100
> @@ -135,11 +135,17 @@
> GMenu *menu;
> GMenuItem *item;
> char *mrl;
> + g_autoptr(GError) error = NULL;
>
> pi->totem = g_object_get_data (G_OBJECT (plugin), "object");
> - pi->portal = xdp_portal_new ();
> + pi->portal = xdp_portal_initable_new (&error);
> pi->cancellable = g_cancellable_new ();
>
> + if (error) {
> + g_warning ("Failed to create XdpPortal instance: %s", error->message);
> + return;
> + }
> +
> g_signal_connect (pi->totem,
> "file-opened",
> G_CALLBACK (totem_open_directory_file_opened),
> diff -Nru totem-43.1/src/plugins/pythonconsole/console.py totem-43.2/src/plugins/pythonconsole/console.py
> --- totem-43.1/src/plugins/pythonconsole/console.py 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/plugins/pythonconsole/console.py 2025-05-21 14:08:29.000000000 +0100
> @@ -291,7 +291,8 @@
> except SyntaxError:
> exec(command, self.namespace) # pylint: disable=W0122
> except: # pylint: disable=W0702
> - if hasattr(sys, 'last_type') and sys.last_type == SystemExit: # pylint: disable=E1101
> + last_type, = sys.exc_info()
> + if last_type == SystemExit:
> self.destroy()
> else:
> traceback.print_exc()
> diff -Nru totem-43.1/src/plugins/recent/totem-recent.c totem-43.2/src/plugins/recent/totem-recent.c
> --- totem-43.1/src/plugins/recent/totem-recent.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/plugins/recent/totem-recent.c 2025-05-21 14:08:29.000000000 +0100
> @@ -80,7 +80,7 @@
> }
>
> data.app_name = g_strdup (g_get_application_name ());
> - data.app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL);
> + data.app_exec = g_strdup ("totem %u");
> data.groups = groups;
> if (gtk_recent_manager_add_full (pi->recent_manager,
> uri, &data) == FALSE) {
> diff -Nru totem-43.1/src/plugins/rotation/totem-rotation.c totem-43.2/src/plugins/rotation/totem-rotation.c
> --- totem-43.1/src/plugins/rotation/totem-rotation.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/plugins/rotation/totem-rotation.c 2025-05-21 14:08:29.000000000 +0100
> @@ -219,6 +219,11 @@
>
> pi->totem = g_object_get_data (G_OBJECT (plugin), "object");
> pi->bvw = totem_object_get_video_widget (pi->totem);
> +
> + /* rotate-method is not supported by gtksink */
> + if (!bacon_video_widget_use_gl (BACON_VIDEO_WIDGET (pi->bvw)))
> + return;
> +
> pi->cancellable = g_cancellable_new ();
>
> g_signal_connect (pi->totem,
> @@ -290,5 +295,5 @@
> g_action_map_remove_action (G_ACTION_MAP (pi->totem), "rotate-right");
>
> pi->totem = NULL;
> - pi->bvw = NULL;
> + g_clear_object (&pi->bvw);
> }
> diff -Nru totem-43.1/src/plugins/save-file/totem-save-file.c totem-43.2/src/plugins/save-file/totem-save-file.c
> --- totem-43.1/src/plugins/save-file/totem-save-file.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/plugins/save-file/totem-save-file.c 2025-05-21 14:08:29.000000000 +0100
> @@ -477,7 +477,7 @@
> }
>
> pi->totem = NULL;
> - pi->bvw = NULL;
> + g_clear_object (&pi->bvw);
>
> g_clear_pointer (&pi->mrl, g_free);
> g_clear_pointer (&pi->cache_mrl, g_free);
> diff -Nru totem-43.1/src/plugins/screenshot/totem-screenshot-plugin.c totem-43.2/src/plugins/screenshot/totem-screenshot-plugin.c
> --- totem-43.1/src/plugins/screenshot/totem-screenshot-plugin.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/plugins/screenshot/totem-screenshot-plugin.c 2025-05-21 14:08:29.000000000 +0100
> @@ -152,51 +152,6 @@
> g_object_unref (save_file);
> }
>
> -static void
> -flash_area_done_cb (GObject *source_object,
> - GAsyncResult *res,
> - gpointer user_data)
> -{
> - GVariant *variant;
> -
> - variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, NULL);
> - if (variant != NULL)
> - g_variant_unref (variant);
> -}
> -
> -static void
> -flash_area (GtkWidget *widget)
> -{
> - GDBusProxy *proxy;
> - GdkWindow *window;
> - int x, y, w, h;
> -
> - window = gtk_widget_get_window (widget);
> - gdk_window_get_origin (window, &x, &y);
> - w = gdk_window_get_width (window);
> - h = gdk_window_get_height (window);
> -
> - proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
> - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES |
> - G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
> - G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
> - NULL,
> - "org.gnome.Shell",
> - "/org/gnome/Shell/Screenshot",
> - "org.gnome.Shell.Screenshot",
> - NULL, NULL);
> - if (proxy == NULL)
> - g_warning ("no proxy");
> -
> - g_dbus_proxy_call (proxy, "org.gnome.Shell.Screenshot.FlashArea",
> - g_variant_new ("(iiii)", x, y, w, h),
> - G_DBUS_CALL_FLAGS_NO_AUTO_START,
> - -1,
> - NULL,
> - flash_area_done_cb,
> - NULL);
> -}
> -
> static char *
> escape_video_name (const char *orig)
> {
> @@ -224,8 +179,6 @@
> return;
> }
>
> - flash_area (GTK_WIDGET (pi->bvw));
> -
> pixbuf = bacon_video_widget_get_current_frame (pi->bvw);
> if (pixbuf == NULL) {
> totem_object_show_error (pi->totem, _("Videos could not get a screenshot of the video."), _("This is not supposed to happen; please file a bug report."));
> diff -Nru totem-43.1/src/totem.c totem-43.2/src/totem.c
> --- totem-43.1/src/totem.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/totem.c 2025-05-21 14:08:29.000000000 +0100
> @@ -47,7 +47,7 @@
> bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
> textdomain (GETTEXT_PACKAGE);
>
> - g_set_prgname ("totem");
> + g_set_prgname (APPLICATION_ID);
> #if DEVELOPMENT_VERSION
> g_set_application_name (_("Videos Preview"));
> #else
> diff -Nru totem-43.1/src/totem-object.c totem-43.2/src/totem-object.c
> --- totem-43.1/src/totem-object.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/totem-object.c 2025-05-21 14:08:29.000000000 +0100
> @@ -268,8 +268,6 @@
>
> totem_callback_connect (totem);
>
> - gtk_widget_grab_focus (GTK_WIDGET (totem->bvw));
> -
> /* The prefs after the video widget is connected */
> totem->prefs = totem_preferences_dialog_new (totem);
> gtk_window_set_transient_for (GTK_WINDOW (totem->prefs), GTK_WINDOW(totem->win));
> @@ -1077,6 +1075,8 @@
> gtk_widget_show (totem->subtitles_button);
> gtk_widget_hide (totem->add_button);
> gtk_widget_hide (totem->main_menu_button);
> +
> + gtk_widget_grab_focus (GTK_WIDGET (totem->bvw));
> show_popup (totem);
> } else if (g_strcmp0 (page_id, "grilo") == 0) {
> totem_grilo_start (TOTEM_GRILO (totem->grilo));
> @@ -1379,8 +1379,11 @@
> if (totem == NULL)
> exit (0);
>
> - if (totem->bvw)
> + if (totem->bvw) {
> totem_object_save_size (totem);
> + bacon_video_widget_close (totem->bvw);
> + g_clear_object (&totem->bvw);
> + }
>
> if (totem->win != NULL) {
> gtk_widget_hide (totem->win);
> diff -Nru totem-43.1/src/totem-playlist.c totem-43.2/src/totem-playlist.c
> --- totem-43.1/src/totem-playlist.c 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/totem-playlist.c 2025-05-21 14:08:29.000000000 +0100
> @@ -1744,7 +1744,7 @@
> * hence the "steal" in the API name */
> gtk_list_store_set (GTK_LIST_STORE (playlist->model),
> &iter,
> - STARTTIME_COL, 0,
> + STARTTIME_COL, (gint64) 0,
> -1);
>
> return starttime;
> diff -Nru totem-43.1/src/totem-resources.c totem-43.2/src/totem-resources.c
> --- totem-43.1/src/totem-resources.c 2025-06-11 11:27:22.000000000 +0100
> +++ totem-43.2/src/totem-resources.c 2025-05-21 14:08:29.000000000 +0100
> @@ -49,7 +49,7 @@
> static gboolean finished = TRUE;
>
> static void
> -set_resource_limits (const char *input)
> +set_resource_limits (const char *input, gboolean verbose)
> {
> #ifdef G_OS_UNIX
> struct rlimit limit;
> @@ -81,6 +81,10 @@
> limit.rlim_cur = MAX_HELPER_SECONDS;
> limit.rlim_max = MAX_HELPER_SECONDS;
> setrlimit (RLIMIT_CPU, &limit);
> +
> + if (verbose)
> + g_message ("Setting limit to %lu MB RAM usage and %d seconds CPU time",
> + max / 1024 / 1024, MAX_HELPER_SECONDS);
> #else
> #warning unimplemented
> #endif
> @@ -108,9 +112,9 @@
> }
>
> void
> -totem_resources_monitor_start (const char *input, gint wall_clock_time)
> +totem_resources_monitor_start (const char *input, gint wall_clock_time, gboolean verbose)
> {
> - set_resource_limits (input);
> + set_resource_limits (input, verbose);
>
> if (wall_clock_time < 0)
> return;
> diff -Nru totem-43.1/src/totem-resources.h totem-43.2/src/totem-resources.h
> --- totem-43.1/src/totem-resources.h 2024-10-22 17:04:07.000000000 +0100
> +++ totem-43.2/src/totem-resources.h 2025-05-21 14:08:29.000000000 +0100
> @@ -28,6 +28,7 @@
> #include <glib.h>
>
> void totem_resources_monitor_start (const char *input,
> - gint wall_clock_time);
> + gint wall_clock_time,
> + gboolean verbose);
> void totem_resources_monitor_stop (void);
>
> diff -Nru totem-43.1/src/totem-video-thumbnailer.c totem-43.2/src/totem-video-thumbnailer.c
> --- totem-43.1/src/totem-video-thumbnailer.c 2025-06-11 11:27:22.000000000 +0100
> +++ totem-43.2/src/totem-video-thumbnailer.c 2025-05-21 14:08:29.000000000 +0100
> @@ -377,6 +377,9 @@
> return async_received;
> }
>
> +/* Manually set number of worker threads for decoders in order to reduce memory
> + * usage on setups with many cores, see
> + * https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4423 */
> static void
> element_setup_cb (GstElement * playbin, GstElement * element, gpointer udata)
> {
> @@ -637,14 +640,8 @@
> bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
> textdomain (GETTEXT_PACKAGE);
>
> - /* Limit the number of BLAS threads to avoid reaching our RLIMIT_DATA
> - * address space max size safeguard for the thumbnailer.
> - * This as GStreamer plugins call into OpenBLAS for linear algebra
> - * which automatically spawns as many threads as there are CPU cores
> - * and allocates static buffers for each of them.
> - * Thus our 512MB address space limit is too short for the video
> - * file size plus the currently 128 MB per OpenBLAS thread
> - * when we reach 4 CPU cores. */
> + /* Limit the number of OpenBLAS threads to avoid reaching our RLIMIT_DATA
> + * address space max size safeguard for the thumbnailer. */
> g_setenv("OMP_NUM_THREADS", "1", TRUE);
>
> /* Call before the global thread pool is setup */
> @@ -695,7 +692,7 @@
> PRINT_PROGRESS (6.0);
>
> if (time_limit != FALSE)
> - totem_resources_monitor_start (input, 0);
> + totem_resources_monitor_start (input, 0, verbose);
>
> PROGRESS_DEBUG("About to open video file");
>
--
Sebastian Ramacher
Reply to: