videobuffer: add surface render flags.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Mon, 26 Mar 2012 10:01:36 +0000 (12:01 +0200)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Mon, 26 Mar 2012 10:01:36 +0000 (12:01 +0200)
Allow rendering flags, as a combination of GstVaapiSurfaceRenderFlags,
to be set to the video buffer. In particular, this is mostly useful for
basic deinterlacing.

docs/reference/libs/libs-sections.txt
gst-libs/gst/vaapi/gstvaapivideobuffer.c
gst-libs/gst/vaapi/gstvaapivideobuffer.h
gst-libs/gst/vaapi/gstvaapivideoconverter_glx.c
gst/vaapi/gstvaapisink.c

index 29fa8c0..d60213a 100644 (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
index a225981..81176ff 100644 (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;
+}
index d076b43..520191c 100644 (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 */
index a9ba30d..646a82f 100644 (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));
 }
index 5958754..6769be2 100644 (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))