videobuffer: factor out base and GLX implementations.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 24 Jul 2012 11:52:06 +0000 (13:52 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Tue, 24 Jul 2012 13:57:57 +0000 (15:57 +0200)
Introduce new typed constructors internal to gstreamer-vaapi plugin elements.
This avoids duplication of code, and makes it possible to further implement
generic video buffer creation routines that automatically map to base or GLX
variants.

gst-libs/gst/vaapi/gstvaapivideobuffer.c
gst-libs/gst/vaapi/gstvaapivideobuffer_glx.c
gst-libs/gst/vaapi/gstvaapivideobuffer_priv.h

index 7d80e50..ef4f235 100644 (file)
@@ -160,6 +160,20 @@ gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer)
     priv->render_flags  = 0;
 }
 
+static inline gboolean
+gst_vaapi_video_buffer_is_a(GstBuffer *buffer, GType type)
+{
+    return G_TYPE_CHECK_INSTANCE_TYPE(buffer, type);
+}
+
+static inline gpointer
+_gst_vaapi_video_buffer_typed_new(GType type)
+{
+    g_return_val_if_fail(g_type_is_a(type, GST_VAAPI_TYPE_VIDEO_BUFFER), NULL);
+
+    return gst_mini_object_new(type);
+}
+
 /**
  * gst_vaapi_video_buffer_new:
  * @display: a #GstVaapiDisplay
@@ -170,20 +184,14 @@ gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer)
  *
  * Return value: the newly allocated #GstBuffer, or %NULL or error
  */
-static inline gpointer
-_gst_vaapi_video_buffer_new(void)
-{
-    return gst_mini_object_new(GST_VAAPI_TYPE_VIDEO_BUFFER);
-}
-
 GstBuffer *
-gst_vaapi_video_buffer_new(GstVaapiDisplay *display)
+gst_vaapi_video_buffer_typed_new(GType type, GstVaapiDisplay *display)
 {
     GstBuffer *buffer;
 
     g_return_val_if_fail(GST_VAAPI_IS_DISPLAY(display), NULL);
 
-    buffer = _gst_vaapi_video_buffer_new();
+    buffer = _gst_vaapi_video_buffer_typed_new(type);
     if (!buffer)
         return NULL;
 
@@ -191,6 +199,13 @@ gst_vaapi_video_buffer_new(GstVaapiDisplay *display)
     return buffer;
 }
 
+GstBuffer *
+gst_vaapi_video_buffer_new(GstVaapiDisplay *display)
+{
+    return gst_vaapi_video_buffer_typed_new(
+        GST_VAAPI_TYPE_VIDEO_BUFFER, display);
+}
+
 /**
  * gst_vaapi_video_buffer_new_from_pool:
  * @pool: a #GstVaapiVideoPool
@@ -204,7 +219,7 @@ gst_vaapi_video_buffer_new(GstVaapiDisplay *display)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
+gst_vaapi_video_buffer_typed_new_from_pool(GType type, GstVaapiVideoPool *pool)
 {
     GstVaapiVideoBuffer *buffer;
     gboolean is_image_pool, is_surface_pool;
@@ -217,7 +232,7 @@ gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
     if (!is_image_pool && !is_surface_pool)
         return NULL;
 
-    buffer = _gst_vaapi_video_buffer_new();
+    buffer = _gst_vaapi_video_buffer_typed_new(type);
     if (buffer &&
         ((is_image_pool &&
           gst_vaapi_video_buffer_set_image_from_pool(buffer, pool)) ||
@@ -231,6 +246,13 @@ gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
     return NULL;
 }
 
+GstBuffer *
+gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
+{
+    return gst_vaapi_video_buffer_typed_new_from_pool(
+        GST_VAAPI_TYPE_VIDEO_BUFFER, pool);
+}
+
 /**
  * gst_vaapi_video_buffer_new_from_buffer:
  * @buffer: a #GstBuffer
@@ -241,18 +263,19 @@ gst_vaapi_video_buffer_new_from_pool(GstVaapiVideoPool *pool)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer)
+gst_vaapi_video_buffer_typed_new_from_buffer(GType type, GstBuffer *buffer)
 {
     GstVaapiVideoBuffer *inbuf, *outbuf;
 
-    if (!GST_VAAPI_IS_VIDEO_BUFFER(buffer)) {
-        if (!buffer->parent || !GST_VAAPI_IS_VIDEO_BUFFER(buffer->parent))
+    if (!gst_vaapi_video_buffer_is_a(buffer, type)) {
+        if (!buffer->parent ||
+            !gst_vaapi_video_buffer_is_a(buffer->parent, type))
             return NULL;
         buffer = buffer->parent;
     }
     inbuf = GST_VAAPI_VIDEO_BUFFER(buffer);
 
-    outbuf = _gst_vaapi_video_buffer_new();
+    outbuf = _gst_vaapi_video_buffer_typed_new(type);
     if (!outbuf)
         return NULL;
 
@@ -267,6 +290,13 @@ gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer)
     return GST_BUFFER(outbuf);
 }
 
+GstBuffer *
+gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer)
+{
+    return gst_vaapi_video_buffer_typed_new_from_buffer(
+        GST_VAAPI_TYPE_VIDEO_BUFFER, buffer);
+}
+
 /**
  * gst_vaapi_video_buffer_new_with_image:
  * @image: a #GstVaapiImage
@@ -277,18 +307,25 @@ gst_vaapi_video_buffer_new_from_buffer(GstBuffer *buffer)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image)
+gst_vaapi_video_buffer_typed_new_with_image(GType type, GstVaapiImage *image)
 {
     GstVaapiVideoBuffer *buffer;
 
     g_return_val_if_fail(GST_VAAPI_IS_IMAGE(image), NULL);
 
-    buffer = _gst_vaapi_video_buffer_new();
+    buffer = _gst_vaapi_video_buffer_typed_new(type);
     if (buffer)
         gst_vaapi_video_buffer_set_image(buffer, image);
     return GST_BUFFER(buffer);
 }
 
+GstBuffer *
+gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image)
+{
+    return gst_vaapi_video_buffer_typed_new_with_image(
+        GST_VAAPI_TYPE_VIDEO_BUFFER, image);
+}
+
 /**
  * gst_vaapi_video_buffer_new_with_surface:
  * @surface: a #GstVaapiSurface
@@ -299,18 +336,28 @@ gst_vaapi_video_buffer_new_with_image(GstVaapiImage *image)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_new_with_surface(GstVaapiSurface *surface)
+gst_vaapi_video_buffer_typed_new_with_surface(
+    GType            type,
+    GstVaapiSurface *surface
+)
 {
     GstVaapiVideoBuffer *buffer;
 
     g_return_val_if_fail(GST_VAAPI_IS_SURFACE(surface), NULL);
 
-    buffer = _gst_vaapi_video_buffer_new();
+    buffer = _gst_vaapi_video_buffer_typed_new(type);
     if (buffer)
         gst_vaapi_video_buffer_set_surface(buffer, surface);
     return GST_BUFFER(buffer);
 }
 
+GstBuffer *
+gst_vaapi_video_buffer_new_with_surface(GstVaapiSurface *surface)
+{
+    return gst_vaapi_video_buffer_typed_new_with_surface(
+        GST_VAAPI_TYPE_VIDEO_BUFFER, surface);
+}
+
 /**
  * gst_vaapi_video_buffer_new_with_surface_proxy:
  * @proxy: a #GstVaapiSurfaceProxy
@@ -321,18 +368,28 @@ gst_vaapi_video_buffer_new_with_surface(GstVaapiSurface *surface)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy)
+gst_vaapi_video_buffer_typed_new_with_surface_proxy(
+    GType                 type,
+    GstVaapiSurfaceProxy *proxy
+)
 {
     GstVaapiVideoBuffer *buffer;
 
     g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), NULL);
 
-    buffer = _gst_vaapi_video_buffer_new();
+    buffer = _gst_vaapi_video_buffer_typed_new(type);
     if (buffer)
         gst_vaapi_video_buffer_set_surface_proxy(buffer, proxy);
     return GST_BUFFER(buffer);
 }
 
+GstBuffer *
+gst_vaapi_video_buffer_new_with_surface_proxy(GstVaapiSurfaceProxy *proxy)
+{
+    return gst_vaapi_video_buffer_typed_new_with_surface_proxy(
+        GST_VAAPI_TYPE_VIDEO_BUFFER, proxy);
+}
+
 /**
  * gst_vaapi_video_buffer_get_display:
  * @buffer: a #GstVaapiVideoBuffer
@@ -556,39 +613,6 @@ gst_vaapi_video_buffer_set_surface_proxy(
 }
 
 /**
- * gst_vaapi_video_buffer_set_display:
- * @buffer: a #GstVaapiVideoBuffer
- * @display a #GstVaapiDisplay
- *
- * For subclass only, don't use.
- */
-void
-gst_vaapi_video_buffer_set_display(
-    GstVaapiVideoBuffer *buffer,
-    GstVaapiDisplay     *display
-)
-{
-  set_display(buffer, display);
-}
-
-/**
- * gst_vaapi_video_buffer_set_display:
- * @buffer: a #GstVaapiVideoBuffer
- * @other_buffer: a #GstBuffer
- *
- * For subclass only, don't use.
- */
-void
-gst_vaapi_video_buffer_set_buffer(
-    GstVaapiVideoBuffer *buffer,
-    GstBuffer           *other_buffer
-)
-{
-  g_return_if_fail (buffer->priv->buffer == NULL);
-  buffer->priv->buffer = gst_buffer_ref (other_buffer);
-}
-
-/**
  * gst_vaapi_video_buffer_get_render_flags:
  * @buffer: a #GstVaapiVideoBuffer
  *
index da49a0d..4f3ef43 100644 (file)
 
 #include "sysdeps.h"
 #include "gstvaapivideobuffer_glx.h"
-#include "gstvaapivideobuffer_priv.h"
 #include "gstvaapivideoconverter_glx.h"
-#include "gstvaapiobject_priv.h"
-#include "gstvaapiimagepool.h"
-#include "gstvaapisurfacepool.h"
+#include "gstvaapivideopool.h"
+#include "gstvaapivideobuffer_priv.h"
+#include "gstvaapidisplay_priv.h"
 
 #define DEBUG 1
 #include "gstvaapidebug.h"
 
-G_DEFINE_TYPE (GstVaapiVideoBufferGLX, gst_vaapi_video_buffer_glx,
-               GST_VAAPI_TYPE_VIDEO_BUFFER);
+G_DEFINE_TYPE(GstVaapiVideoBufferGLX,
+              gst_vaapi_video_buffer_glx,
+              GST_VAAPI_TYPE_VIDEO_BUFFER);
 
 static void
-gst_vaapi_video_buffer_glx_class_init(GstVaapiVideoBufferGLXClass * klass)
+gst_vaapi_video_buffer_glx_class_init(GstVaapiVideoBufferGLXClass *klass)
 {
-  GstSurfaceBufferClass * const surface_class = GST_SURFACE_BUFFER_CLASS (klass);
-  surface_class->create_converter = gst_vaapi_video_converter_glx_new;
-}
+    GstSurfaceBufferClass * const surface_class =
+        GST_SURFACE_BUFFER_CLASS(klass);
 
-static void
-gst_vaapi_video_buffer_glx_init (GstVaapiVideoBufferGLX * buffer)
-{
+    surface_class->create_converter = gst_vaapi_video_converter_glx_new;
 }
 
-static inline gpointer
-_gst_vaapi_video_buffer_glx_new (void)
+static void
+gst_vaapi_video_buffer_glx_init(GstVaapiVideoBufferGLX *buffer)
 {
-  return gst_mini_object_new (GST_VAAPI_TYPE_VIDEO_BUFFER_GLX);
 }
 
 /**
@@ -69,19 +65,12 @@ _gst_vaapi_video_buffer_glx_new (void)
  * Return value: the newly allocated #GstBuffer, or %NULL or error
  */
 GstBuffer *
-gst_vaapi_video_buffer_glx_new(GstVaapiDisplayGLX * display)
+gst_vaapi_video_buffer_glx_new(GstVaapiDisplayGLX *display)
 {
-  GstBuffer *buffer;
-
-  g_return_val_if_fail (GST_VAAPI_IS_DISPLAY_GLX (display), NULL);
+    g_return_val_if_fail(GST_VAAPI_IS_DISPLAY_GLX(display), NULL);
 
-  buffer = _gst_vaapi_video_buffer_glx_new ();
-  if (!buffer)
-    return NULL;
-
-  gst_vaapi_video_buffer_set_display (GST_VAAPI_VIDEO_BUFFER (buffer),
-      GST_VAAPI_DISPLAY (display));
-  return buffer;
+    return gst_vaapi_video_buffer_typed_new(
+        GST_VAAPI_TYPE_VIDEO_BUFFER_GLX, GST_VAAPI_DISPLAY_CAST(display));
 }
 
 /**
@@ -97,32 +86,10 @@ gst_vaapi_video_buffer_glx_new(GstVaapiDisplayGLX * display)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_glx_new_from_pool (GstVaapiVideoPool * pool)
+gst_vaapi_video_buffer_glx_new_from_pool(GstVaapiVideoPool *pool)
 {
-  GstVaapiVideoBuffer *buffer;
-  gboolean is_image_pool, is_surface_pool;
-
-  g_return_val_if_fail (GST_VAAPI_IS_VIDEO_POOL (pool), NULL);
-
-  is_image_pool   = GST_VAAPI_IS_IMAGE_POOL (pool);
-  is_surface_pool = GST_VAAPI_IS_SURFACE_POOL (pool);
-
-  if (!is_image_pool && !is_surface_pool)
-    return NULL;
-
-  buffer = _gst_vaapi_video_buffer_glx_new ();
-  if (buffer &&
-      ((is_image_pool &&
-        gst_vaapi_video_buffer_set_image_from_pool (buffer, pool)) ||
-       (is_surface_pool &&
-        gst_vaapi_video_buffer_set_surface_from_pool (buffer, pool)))) {
-    gst_vaapi_video_buffer_set_display (buffer,
-        gst_vaapi_video_pool_get_display (pool));
-    return GST_BUFFER (buffer);
-  }
-
-  gst_mini_object_unref (GST_MINI_OBJECT(buffer));
-  return NULL;
+    return gst_vaapi_video_buffer_typed_new_from_pool(
+        GST_VAAPI_TYPE_VIDEO_BUFFER_GLX, pool);
 }
 
 /**
@@ -135,36 +102,8 @@ gst_vaapi_video_buffer_glx_new_from_pool (GstVaapiVideoPool * pool)
  * Return value: the newly allocated #GstBuffer, or %NULL on error
  */
 GstBuffer *
-gst_vaapi_video_buffer_glx_new_from_buffer (GstBuffer * buffer)
+gst_vaapi_video_buffer_glx_new_from_buffer(GstBuffer *buffer)
 {
-  GstVaapiVideoBuffer *inbuf, *outbuf;
-  GstVaapiImage *image;
-  GstVaapiSurface *surface;
-  GstVaapiSurfaceProxy *proxy;
-
-  if (!GST_VAAPI_IS_VIDEO_BUFFER_GLX (buffer)) {
-    if (!buffer->parent || !GST_VAAPI_IS_VIDEO_BUFFER_GLX (buffer->parent))
-      return NULL;
-    buffer = buffer->parent;
-  }
-  inbuf = GST_VAAPI_VIDEO_BUFFER (buffer);
-
-  outbuf = _gst_vaapi_video_buffer_glx_new ();
-  if (!outbuf)
-    return NULL;
-
-  image = gst_vaapi_video_buffer_get_image (inbuf);
-  surface = gst_vaapi_video_buffer_get_surface (inbuf);
-  proxy =
-    gst_vaapi_video_buffer_get_surface_proxy (inbuf);
-
-  if (image)
-    gst_vaapi_video_buffer_set_image (outbuf, image);
-  if (surface)
-    gst_vaapi_video_buffer_set_surface (outbuf, surface);
-  if (proxy)
-    gst_vaapi_video_buffer_set_surface_proxy (outbuf, proxy);
-
-  gst_vaapi_video_buffer_set_buffer (outbuf, buffer);
-  return GST_BUFFER (outbuf);
+    return gst_vaapi_video_buffer_typed_new_from_buffer(
+        GST_VAAPI_TYPE_VIDEO_BUFFER_GLX, buffer);
 }
index d72ab63..a08edbd 100644 (file)
 
 G_BEGIN_DECLS
 
-void
-gst_vaapi_video_buffer_set_display(
-    GstVaapiVideoBuffer *buffer,
-    GstVaapiDisplay     *display
+/* Private API for gstreamer-vaapi plugin elements only */
+
+GstBuffer *
+gst_vaapi_video_buffer_typed_new(GType type, GstVaapiDisplay *display);
+
+GstBuffer *
+gst_vaapi_video_buffer_typed_new_from_pool(GType type, GstVaapiVideoPool *pool);
+
+GstBuffer *
+gst_vaapi_video_buffer_typed_new_from_buffer(GType type, GstBuffer *buffer);
+
+GstBuffer *
+gst_vaapi_video_buffer_typed_new_with_image(GType type, GstVaapiImage *image);
+
+GstBuffer *
+gst_vaapi_video_buffer_typed_new_with_surface(
+    GType            type,
+    GstVaapiSurface *surface
 );
 
-void
-gst_vaapi_video_buffer_set_buffer(
-    GstVaapiVideoBuffer *buffer,
-    GstBuffer           *other_buffer
+GstBuffer *
+gst_vaapi_video_buffer_typed_new_with_surface_proxy(
+    GType                 type,
+    GstVaapiSurfaceProxy *proxy
 );
 
 G_END_DECLS