videobuffer: add surface render flags.

Allow rendering flags, as a combination of GstVaapiSurfaceRenderFlags,
to be set to the video buffer. In particular, this is mostly useful for
basic deinterlacing.
This commit is contained in:
Gwenole Beauchesne 2012-03-26 12:01:36 +02:00
parent 3b67533d3d
commit a5144358d1
5 changed files with 47 additions and 4 deletions

View file

@ -200,6 +200,8 @@ gst_vaapi_video_buffer_get_surface_proxy
gst_vaapi_video_buffer_set_surface
gst_vaapi_video_buffer_set_surface_proxy
gst_vaapi_video_buffer_set_surface_from_pool
gst_vaapi_video_buffer_get_render_flags
gst_vaapi_video_buffer_set_render_flags
<SUBSECTION Standard>
GST_VAAPI_VIDEO_BUFFER
GST_VAAPI_IS_VIDEO_BUFFER

View file

@ -50,6 +50,7 @@ struct _GstVaapiVideoBufferPrivate {
GstVaapiSurface *surface;
GstVaapiSurfaceProxy *proxy;
GstBuffer *buffer;
guint render_flags;
};
static void
@ -168,6 +169,7 @@ gst_vaapi_video_buffer_init(GstVaapiVideoBuffer *buffer)
priv->surface = NULL;
priv->proxy = NULL;
priv->buffer = NULL;
priv->render_flags = 0;
}
/**
@ -597,3 +599,36 @@ gst_vaapi_video_buffer_set_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
*
* Retrieves the surface render flags bound to the @buffer.
*
* Return value: a combination for #GstVaapiSurfaceRenderFlags
*/
guint
gst_vaapi_video_buffer_get_render_flags(GstVaapiVideoBuffer *buffer)
{
g_return_val_if_fail(GST_VAAPI_IS_VIDEO_BUFFER(buffer), 0);
g_return_val_if_fail(GST_VAAPI_IS_SURFACE(buffer->priv->surface), 0);
return buffer->priv->render_flags;
}
/**
* gst_vaapi_video_buffer_set_render_flags:
* @buffer: a #GstVaapiVideoBuffer
* @flags: a set of surface render flags
*
* Sets #GstVaapiSurfaceRenderFlags to the @buffer.
*/
void
gst_vaapi_video_buffer_set_render_flags(GstVaapiVideoBuffer *buffer, guint flags)
{
g_return_if_fail(GST_VAAPI_IS_VIDEO_BUFFER(buffer));
g_return_if_fail(GST_VAAPI_IS_SURFACE(buffer->priv->surface));
buffer->priv->render_flags = flags;
}

View file

@ -145,6 +145,12 @@ gst_vaapi_video_buffer_set_surface_proxy(
GstVaapiSurfaceProxy *proxy
);
guint
gst_vaapi_video_buffer_get_render_flags(GstVaapiVideoBuffer *buffer);
void
gst_vaapi_video_buffer_set_render_flags(GstVaapiVideoBuffer *buffer, guint flags);
G_END_DECLS
#endif /* GST_VAAPI_VIDEO_BUFFER_H */

View file

@ -117,8 +117,8 @@ gst_vaapi_video_converter_glx_upload (GstSurfaceConverter *converter,
{
GstVaapiVideoConverterGLXPrivate *priv =
GST_VAAPI_VIDEO_CONVERTER_GLX (converter)->priv;
GstVaapiSurface *surface = gst_vaapi_video_buffer_get_surface (
GST_VAAPI_VIDEO_BUFFER (buffer));
GstVaapiVideoBuffer * const vbuffer = GST_VAAPI_VIDEO_BUFFER (buffer);
GstVaapiSurface *surface = gst_vaapi_video_buffer_get_surface (vbuffer);
GstVaapiDisplay *new_dpy, *old_dpy;
GstVideoOverlayComposition * const composition =
gst_video_buffer_get_overlay_composition (GST_BUFFER (buffer));
@ -140,5 +140,5 @@ gst_vaapi_video_converter_glx_upload (GstSurfaceConverter *converter,
GST_WARNING ("could not update subtitles");
return gst_vaapi_texture_put_surface (priv->texture, surface,
GST_VAAPI_PICTURE_STRUCTURE_FRAME);
gst_vaapi_video_buffer_get_render_flags (vbuffer));
}

View file

@ -691,7 +691,7 @@ gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer)
GST_DEBUG("render surface %" GST_VAAPI_ID_FORMAT,
GST_VAAPI_ID_ARGS(gst_vaapi_surface_get_id(surface)));
flags = GST_VAAPI_PICTURE_STRUCTURE_FRAME;
flags = gst_vaapi_video_buffer_get_render_flags(vbuffer);
if (!gst_vaapi_surface_set_subpictures_from_composition(surface,
composition, TRUE))