vaapisink: handle sub video-buffers.

Intermediate elements may produce a sub-buffer from a valid GstVaapiVideoBuffer
for non raw YUV cases. Make sure vaapisink now understands those buffers.
This commit is contained in:
Gwenole Beauchesne 2012-12-04 11:01:42 +01:00
parent cb3c0a3e8f
commit d19c59ba31

View file

@ -854,32 +854,31 @@ gst_vaapisink_put_surface(
} }
static GstFlowReturn static GstFlowReturn
gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer) gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *src_buffer)
{ {
GstVaapiSink * const sink = GST_VAAPISINK(base_sink); GstVaapiSink * const sink = GST_VAAPISINK(base_sink);
GstVideoOverlayComposition *composition;
GstVaapiVideoBuffer *vbuffer; GstVaapiVideoBuffer *vbuffer;
GstVaapiSurface *surface; GstVaapiSurface *surface;
GstBuffer *buffer;
guint flags; guint flags;
gboolean success; gboolean success;
GstVideoOverlayComposition * const composition =
gst_video_buffer_get_overlay_composition(buffer);
if (!sink->use_video_raw) if (GST_VAAPI_IS_VIDEO_BUFFER(src_buffer))
buffer = gst_buffer_ref(buffer); buffer = gst_buffer_ref(src_buffer);
else { else if (GST_VAAPI_IS_VIDEO_BUFFER(src_buffer->parent))
GstBuffer * const src_buffer = buffer; buffer = gst_buffer_ref(src_buffer->parent);
if (GST_VAAPI_IS_VIDEO_BUFFER(buffer)) else if (sink->use_video_raw)
buffer = gst_buffer_ref(src_buffer); buffer = gst_vaapi_uploader_get_buffer(sink->uploader);
else if (GST_VAAPI_IS_VIDEO_BUFFER(buffer->parent)) else
buffer = gst_buffer_ref(src_buffer->parent); buffer = NULL;
else { if (!buffer)
buffer = gst_vaapi_uploader_get_buffer(sink->uploader); return GST_FLOW_UNEXPECTED;
if (!buffer)
return GST_FLOW_UNEXPECTED; if (sink->use_video_raw && !gst_vaapi_uploader_process(sink->uploader,
} src_buffer, buffer))
if (!gst_vaapi_uploader_process(sink->uploader, src_buffer, buffer)) goto error;
goto error;
}
vbuffer = GST_VAAPI_VIDEO_BUFFER(buffer); vbuffer = GST_VAAPI_VIDEO_BUFFER(buffer);
g_return_val_if_fail(vbuffer != NULL, GST_FLOW_UNEXPECTED); g_return_val_if_fail(vbuffer != NULL, GST_FLOW_UNEXPECTED);
@ -902,6 +901,7 @@ gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer)
flags = gst_vaapi_video_buffer_get_render_flags(vbuffer); flags = gst_vaapi_video_buffer_get_render_flags(vbuffer);
composition = gst_video_buffer_get_overlay_composition(src_buffer);
if (!gst_vaapi_surface_set_subpictures_from_composition(surface, if (!gst_vaapi_surface_set_subpictures_from_composition(surface,
composition, TRUE)) composition, TRUE))
GST_WARNING("could not update subtitles"); GST_WARNING("could not update subtitles");