mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 10:41:04 +00:00
vaapisink: error handling if rendering fails
This patch enhance the code path when an error is found when rendering a buffer. If the video meta doesn't contain a surface proxy or a surface, a warning message is printed. If the rendering backend fails, a error message is posted in the bus. https://bugzilla.gnome.org/show_bug.cgi?id=749382
This commit is contained in:
parent
34a4748d3d
commit
0df96e1c3b
1 changed files with 19 additions and 8 deletions
|
@ -1356,19 +1356,19 @@ gst_vaapisink_show_frame_unlocked (GstVaapiSink * sink, GstBuffer * src_buffer)
|
||||||
|
|
||||||
proxy = gst_vaapi_video_meta_get_surface_proxy (meta);
|
proxy = gst_vaapi_video_meta_get_surface_proxy (meta);
|
||||||
if (!proxy)
|
if (!proxy)
|
||||||
goto error;
|
goto no_surface;
|
||||||
|
|
||||||
surface = gst_vaapi_video_meta_get_surface (meta);
|
surface = gst_vaapi_video_meta_get_surface (meta);
|
||||||
if (!surface)
|
if (!surface)
|
||||||
goto error;
|
goto no_surface;
|
||||||
|
|
||||||
/* Validate view component to display */
|
/* Validate view component to display */
|
||||||
view_id = GST_VAAPI_SURFACE_PROXY_VIEW_ID (proxy);
|
view_id = GST_VAAPI_SURFACE_PROXY_VIEW_ID (proxy);
|
||||||
if (G_UNLIKELY (sink->view_id == -1))
|
if (G_UNLIKELY (sink->view_id == -1))
|
||||||
sink->view_id = view_id;
|
sink->view_id = view_id;
|
||||||
else if (sink->view_id != view_id) {
|
else if (sink->view_id != view_id) {
|
||||||
gst_buffer_unref (buffer);
|
ret = GST_FLOW_OK;
|
||||||
return GST_FLOW_OK;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_vaapisink_ensure_colorbalance (sink);
|
gst_vaapisink_ensure_colorbalance (sink);
|
||||||
|
@ -1404,13 +1404,24 @@ gst_vaapisink_show_frame_unlocked (GstVaapiSink * sink, GstBuffer * src_buffer)
|
||||||
|
|
||||||
/* Retain VA surface until the next one is displayed */
|
/* Retain VA surface until the next one is displayed */
|
||||||
gst_buffer_replace (&sink->video_buffer, buffer);
|
gst_buffer_replace (&sink->video_buffer, buffer);
|
||||||
gst_buffer_unref (buffer);
|
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
ret = GST_FLOW_OK;
|
||||||
|
|
||||||
|
done:
|
||||||
|
gst_buffer_unref (buffer);
|
||||||
|
return ret;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
gst_buffer_unref (buffer);
|
GST_ELEMENT_ERROR (sink, RESOURCE, WRITE,
|
||||||
return GST_FLOW_EOS;
|
("Internal error: could not render surface"), (NULL));
|
||||||
|
ret = GST_FLOW_ERROR;
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
no_surface:
|
||||||
|
/* No surface or surface proxy. That's very bad! */
|
||||||
|
GST_WARNING_OBJECT (sink, "could not get surface");
|
||||||
|
ret = GST_FLOW_ERROR;
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
|
|
Loading…
Reference in a new issue