Add helper interface that all VA-API sinks must implement. e.g. vaapisink.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Thu, 11 Mar 2010 10:50:27 +0000 (10:50 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Thu, 11 Mar 2010 10:50:27 +0000 (10:50 +0000)
gst-libs/gst/vaapi/Makefile.am
gst-libs/gst/vaapi/gstvaapisinkbase.c [new file with mode: 0644]
gst-libs/gst/vaapi/gstvaapisinkbase.h [new file with mode: 0644]

index edef4fa..bf7cd16 100644 (file)
@@ -4,6 +4,7 @@ libgstvaapi_source_c =                          \
        gstvaapidisplay.c                       \
        gstvaapiimage.c                         \
        gstvaapiimageformat.c                   \
+       gstvaapisinkbase.c                      \
        gstvaapisubpicture.c                    \
        gstvaapisurface.c                       \
        vaapi_utils.c                           \
@@ -13,6 +14,7 @@ libgstvaapi_source_h =                                \
        gstvaapidisplay.h                       \
        gstvaapiimage.h                         \
        gstvaapiimageformat.h                   \
+       gstvaapisinkbase.h                      \
        gstvaapisubpicture.h                    \
        gstvaapisurface.h                       \
        vaapi_debug.h                           \
diff --git a/gst-libs/gst/vaapi/gstvaapisinkbase.c b/gst-libs/gst/vaapi/gstvaapisinkbase.c
new file mode 100644 (file)
index 0000000..73eede9
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ *  gstvaapisinkbase.c - VA sink interface
+ *
+ *  gstreamer-vaapi (C) 2010 Splitted-Desktop Systems
+ *
+ *  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 "config.h"
+#include "gstvaapisinkbase.h"
+
+static void
+gst_vaapisink_base_base_init(gpointer g_class)
+{
+    static gboolean is_initialized = FALSE;
+
+    if (!is_initialized) {
+        is_initialized = TRUE;
+    }
+}
+
+GType
+gst_vaapisink_base_get_type(void)
+{
+    static GType iface_type = 0;
+
+    if (G_UNLIKELY(!iface_type)) {
+        static const GTypeInfo info = {
+            sizeof(GstVaapiSinkBaseInterface),
+            gst_vaapisink_base_base_init,       /* base_init */
+            NULL,                               /* base_finalize */
+        };
+
+        iface_type = g_type_register_static(
+            G_TYPE_INTERFACE,
+            "GstVaapiSinkBase",
+            &info,
+            0
+        );
+    }
+    return iface_type;
+}
+
+GstVaapiDisplay *
+gst_vaapisink_base_get_display(GstVaapiSinkBase *sink)
+{
+    g_return_val_if_fail(GST_IS_VAAPISINK_BASE(sink), NULL);
+
+    return GST_VAAPISINK_BASE_GET_INTERFACE(sink)->get_display(sink);
+}
+
+GstVaapiSinkBase *
+gst_vaapisink_base_lookup(GstElement *element)
+{
+    GstVaapiSinkBase *sink = NULL;
+    GstPad *pad, *peer;
+
+    g_return_val_if_fail(GST_IS_ELEMENT(element), NULL);
+
+    while (!sink) {
+        pad = gst_element_get_static_pad(element, "src");
+        if (!pad)
+            break;
+
+        peer = gst_pad_get_peer(pad);
+        g_object_unref(pad);
+        if (!peer)
+            break;
+
+        element = gst_pad_get_parent_element(peer);
+        if (element) {
+            if (GST_IS_VAAPISINK_BASE(element))
+                sink = GST_VAAPISINK_BASE(element);
+            g_object_unref(element);
+        }
+        g_object_unref(peer);
+    }
+    return sink;
+}
diff --git a/gst-libs/gst/vaapi/gstvaapisinkbase.h b/gst-libs/gst/vaapi/gstvaapisinkbase.h
new file mode 100644 (file)
index 0000000..b436f01
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ *  gstvaapisinkbase.h - VA sink interface
+ *
+ *  gstreamer-vaapi (C) 2010 Splitted-Desktop Systems
+ *
+ *  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 GST_VAAPISINK_BASE_H
+#define GST_VAAPISINK_BASE_H
+
+#include <gst/gstelement.h>
+#include <gst/vaapi/gstvaapidisplay.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_VAAPISINK_BASE \
+    (gst_vaapisink_base_get_type())
+
+#define GST_VAAPISINK_BASE(obj)                                 \
+    (G_TYPE_CHECK_INSTANCE_CAST((obj),                          \
+                                GST_TYPE_VAAPISINK_BASE,        \
+                                GstVaapiSinkBase))
+
+#define GST_IS_VAAPISINK_BASE(obj) \
+    (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_VAAPISINK_BASE))
+
+#define GST_VAAPISINK_BASE_GET_INTERFACE(obj)                   \
+    (G_TYPE_INSTANCE_GET_INTERFACE((obj),                       \
+                               GST_TYPE_VAAPISINK_BASE,         \
+                               GstVaapiSinkBaseInterface))
+
+typedef struct _GstVaapiSinkBase                GstVaapiSinkBase; /* dummy */
+typedef struct _GstVaapiSinkBaseInterface       GstVaapiSinkBaseInterface;
+
+struct _GstVaapiSinkBaseInterface {
+    /*< private >*/
+    GTypeInterface g_iface;
+
+    GstVaapiDisplay *(*get_display)(GstVaapiSinkBase *sink);
+};
+
+GType
+gst_vaapisink_base_get_type(void);
+
+GstVaapiDisplay *
+gst_vaapisink_base_get_display(GstVaapiSinkBase *sink);
+
+GstVaapiSinkBase *
+gst_vaapisink_base_lookup(GstElement *element);
+
+G_END_DECLS
+
+#endif /* GST_VAAPISINK_BASE_H */