vapostproc: Move up color balance detection to plugin.
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Tue, 10 Aug 2021 15:55:43 +0000 (17:55 +0200)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Fri, 10 Sep 2021 12:45:00 +0000 (14:45 +0200)
In order to install the color balance interface, a GstVaFilter is
instantiated and queried to know if it supports color balance
filter. It was done just after the GObject was registered. Now, it's
done before.

The reason of this change is that deinterlace element has to be
registered only if deinterlace filter is available, using only one
instantiate of GstVaFilter.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2495>

sys/va/gstvavpp.c
sys/va/gstvavpp.h
sys/va/plugin.c

index 1e43bace3a98bf9268c80d94dae6db94af805b8e..b0ec392eb661f4c11aa9556ffc6a54bed7b22876 100644 (file)
@@ -1893,7 +1893,8 @@ _register_debug_category (gpointer data)
 }
 
 gboolean
-gst_va_vpp_register (GstPlugin * plugin, GstVaDevice * device, guint rank)
+gst_va_vpp_register (GstPlugin * plugin, GstVaDevice * device,
+    gboolean has_colorbalance, guint rank)
 {
   static GOnce debug_once = G_ONCE_INIT;
   GType type;
@@ -1940,14 +1941,9 @@ gst_va_vpp_register (GstPlugin * plugin, GstVaDevice * device, guint rank)
   type = g_type_register_static (GST_TYPE_VA_BASE_TRANSFORM, type_name,
       &type_info, 0);
 
-  {
-    GstVaFilter *filter = gst_va_filter_new (device->display);
-    if (gst_va_filter_open (filter)
-        && gst_va_filter_has_filter (filter, VAProcFilterColorBalance)) {
-      const GInterfaceInfo info = { gst_va_vpp_colorbalance_init, NULL, NULL };
-      g_type_add_interface_static (type, GST_TYPE_COLOR_BALANCE, &info);
-    }
-    gst_object_unref (filter);
+  if (has_colorbalance) {
+    const GInterfaceInfo info = { gst_va_vpp_colorbalance_init, NULL, NULL };
+    g_type_add_interface_static (type, GST_TYPE_COLOR_BALANCE, &info);
   }
 
   ret = gst_element_register (plugin, feature_name, rank, type);
index db9b3ee3bc29c305c63e46a0a5edbf06ebf837bf..68443283a70c1aedfbdb00f44600b54b3a1b56cf 100644 (file)
@@ -26,6 +26,7 @@ G_BEGIN_DECLS
 
 gboolean              gst_va_vpp_register                 (GstPlugin * plugin,
                                                            GstVaDevice * device,
+                                                          gboolean has_colorbalance,
                                                            guint rank);
 
 G_END_DECLS
index d8f5cbf3dfc3c0f88c422a77cda70264aa0e198c..b78f7ef69dffa94fab7013fba4070fb1756bd52a 100644 (file)
 #include "config.h"
 #endif
 
+#include "gstvaav1dec.h"
 #include "gstvacaps.h"
 #include "gstvadevice.h"
+#include "gstvafilter.h"
 #include "gstvah264dec.h"
 #include "gstvah265dec.h"
 #include "gstvampeg2dec.h"
 #include "gstvaprofile.h"
 #include "gstvavp8dec.h"
 #include "gstvavp9dec.h"
-#include "gstvaav1dec.h"
 #include "gstvavpp.h"
 
 #define GST_CAT_DEFAULT gstva_debug
@@ -188,7 +189,22 @@ plugin_register_encoders (GstPlugin * plugin, GstVaDevice * device,
 static void
 plugin_register_vpp (GstPlugin * plugin, GstVaDevice * device)
 {
-  if (!gst_va_vpp_register (plugin, device, GST_RANK_NONE))
+  GstVaFilter *filter;
+  gboolean has_colorbalance;
+
+  has_colorbalance = FALSE;
+  filter = gst_va_filter_new (device->display);
+  if (gst_va_filter_open (filter)) {
+    has_colorbalance =
+        gst_va_filter_has_filter (filter, VAProcFilterColorBalance);
+  } else {
+    GST_WARNING ("Failed open VA filter");
+    gst_object_unref (filter);
+    return;
+  }
+  gst_object_unref (filter);
+
+  if (!gst_va_vpp_register (plugin, device, has_colorbalance, GST_RANK_NONE))
     GST_WARNING ("Failed to register postproc: %s", device->render_device_path);
 }