mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 20:42:30 +00:00
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:
parent
e52def4737
commit
e12ef8e6a2
3 changed files with 121 additions and 144 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue