videobuffer: factor out base and GLX implementations.

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.
This commit is contained in:
Gwenole Beauchesne 2012-07-24 13:52:06 +02:00
parent e52def4737
commit e12ef8e6a2
3 changed files with 121 additions and 144 deletions

View 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
@ -555,39 +612,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

View file

@ -28,36 +28,32 @@
#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);
surface_class->create_converter = gst_vaapi_video_converter_glx_new;
}
static void
gst_vaapi_video_buffer_glx_init (GstVaapiVideoBufferGLX * buffer)
gst_vaapi_video_buffer_glx_init(GstVaapiVideoBufferGLX *buffer)
{
}
static inline gpointer
_gst_vaapi_video_buffer_glx_new (void)
{
return gst_mini_object_new (GST_VAAPI_TYPE_VIDEO_BUFFER_GLX);
}
/**
* gst_vaapi_video_buffer_glx_new:
* @display: a #GstVaapiDisplayGLX
@ -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);
}

View file

@ -28,16 +28,30 @@
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