[nautilus/wip/hadess/block-gst-vaapi: 4/6] audio-video-properties: Add decoder disabler helper



commit f826da0fb2fb34d71a5755a78f7bffc3404641df
Author: Bastien Nocera <hadess hadess net>
Date:   Tue Feb 12 13:39:01 2019 +0100

    audio-video-properties: Add decoder disabler helper
    
    (Re-)add a helper to disable decoders that require windowing
    environments to even be used while gathering metadata.

 extensions/audio-video-properties/meson.build      |  2 +
 .../audio-video-properties/totem-gst-helpers.c     | 97 ++++++++++++++++++++++
 .../audio-video-properties/totem-gst-helpers.h     | 53 ++++++++++++
 3 files changed, 152 insertions(+)
---
diff --git a/extensions/audio-video-properties/meson.build b/extensions/audio-video-properties/meson.build
index 4ac5cd87d..0b8dcdc7f 100644
--- a/extensions/audio-video-properties/meson.build
+++ b/extensions/audio-video-properties/meson.build
@@ -11,6 +11,7 @@ libtotem_properties_page_sources = files(
   'totem-properties-main.c',
   'totem-properties-view.c',
   'bacon-video-widget-properties.c',
+  'totem-gst-helpers.c',
 ) + resources
 
 libtotem_properties_page_deps = [
@@ -35,6 +36,7 @@ test_properties_page_sources = files(
   'totem-properties-main.c',
   'totem-properties-view.c',
   'bacon-video-widget-properties.c',
+  'totem-gst-helpers.c',
   'test-properties-page.c'
 ) + resources
 
diff --git a/extensions/audio-video-properties/totem-gst-helpers.c 
b/extensions/audio-video-properties/totem-gst-helpers.c
new file mode 100644
index 000000000..93b81398c
--- /dev/null
+++ b/extensions/audio-video-properties/totem-gst-helpers.c
@@ -0,0 +1,97 @@
+/* 
+ * Copyright (C) 2003-2007 the GStreamer project
+ *      Julien Moutte <julien moutte net>
+ *      Ronald Bultje <rbultje ronald bitfreak net>
+ * Copyright (C) 2005-2008 Tim-Philipp Müller <tim centricular net>
+ * Copyright (C) 2009 Sebastian Dröge <sebastian droege collabora co uk>
+ * Copyright © 2009 Christian Persch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+ *
+ */
+
+#include "totem-gst-helpers.h"
+
+#include <gst/tag/tag.h>
+#include <gst/video/video-format.h>
+
+void
+totem_gst_message_print (GstMessage *msg,
+                        GstElement *play,
+                        const char *filename)
+{
+  GError *err = NULL;
+  char *dbg = NULL;
+
+  g_return_if_fail (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR);
+
+  if (play != NULL) {
+    g_return_if_fail (filename != NULL);
+
+    GST_DEBUG_BIN_TO_DOT_FILE (GST_BIN_CAST (play),
+                              GST_DEBUG_GRAPH_SHOW_ALL ^ GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS,
+                              filename);
+  }
+
+  gst_message_parse_error (msg, &err, &dbg);
+  if (err) {
+    char *uri;
+
+    g_object_get (play, "uri", &uri, NULL);
+    GST_ERROR ("message = %s", GST_STR_NULL (err->message));
+    GST_ERROR ("domain  = %d (%s)", err->domain,
+        GST_STR_NULL (g_quark_to_string (err->domain)));
+    GST_ERROR ("code    = %d", err->code);
+    GST_ERROR ("debug   = %s", GST_STR_NULL (dbg));
+    GST_ERROR ("source  = %" GST_PTR_FORMAT, msg->src);
+    GST_ERROR ("uri     = %s", GST_STR_NULL (uri));
+    g_free (uri);
+
+    g_error_free (err);
+  }
+  g_free (dbg);
+}
+
+/* Disable decoders that require a display environment to work,
+ * and that might cause crashes */
+void
+totem_gst_disable_display_decoders (void)
+{
+       GstRegistry *registry;
+       const char *blacklisted_plugins[] = {
+         "bmcdec",
+         "vaapi",
+         "video4linux2"
+       };
+       guint i;
+
+       /* Disable the vaapi plugin as it will not work with the
+        * fakesink we use:
+        * See: https://bugzilla.gnome.org/show_bug.cgi?id=700186 and
+        * https://bugzilla.gnome.org/show_bug.cgi?id=749605 */
+       registry = gst_registry_get ();
+
+       for (i = 0; i < G_N_ELEMENTS (blacklisted_plugins); i++) {
+               GstPlugin *plugin =
+                       gst_registry_find_plugin (registry,
+                                                 blacklisted_plugins[i]);
+               if (plugin)
+                       gst_registry_remove_plugin (registry, plugin);
+       }
+}
+
+/*
+ * vim: sw=2 ts=8 cindent noai bs=2
+ */
diff --git a/extensions/audio-video-properties/totem-gst-helpers.h 
b/extensions/audio-video-properties/totem-gst-helpers.h
new file mode 100644
index 000000000..edeeb1da6
--- /dev/null
+++ b/extensions/audio-video-properties/totem-gst-helpers.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2001,2002,2003,2004,2005 Bastien Nocera <hadess hadess net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
+ *
+ */
+
+#ifndef HAVE_TOTEM_GST_HELPERS_H
+#define HAVE_TOTEM_GST_HELPERS_H
+
+#define GST_USE_UNSTABLE_API 1
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+/* GstPlayFlags flags from playbin */
+typedef enum {
+  GST_PLAY_FLAG_VIDEO         = (1 << 0),
+  GST_PLAY_FLAG_AUDIO         = (1 << 1),
+  GST_PLAY_FLAG_TEXT          = (1 << 2),
+  GST_PLAY_FLAG_VIS           = (1 << 3),
+  GST_PLAY_FLAG_SOFT_VOLUME   = (1 << 4),
+  GST_PLAY_FLAG_NATIVE_AUDIO  = (1 << 5),
+  GST_PLAY_FLAG_NATIVE_VIDEO  = (1 << 6),
+  GST_PLAY_FLAG_DOWNLOAD      = (1 << 7),
+  GST_PLAY_FLAG_BUFFERING     = (1 << 8),
+  GST_PLAY_FLAG_DEINTERLACE   = (1 << 9),
+  GST_PLAY_FLAG_SOFT_COLORBALANCE = (1 << 10),
+  GST_PLAY_FLAG_FORCE_FILTERS = (1 << 11),
+} GstPlayFlags;
+
+void totem_gst_message_print (GstMessage *msg,
+                             GstElement *play,
+                             const char *filename);
+
+void totem_gst_disable_display_decoders (void);
+
+G_END_DECLS
+
+#endif                         /* HAVE_TOTEM_GST_HELPERS_H */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]