mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 03:19:40 +00:00
decoder: retain proxy surface until the GstVaapiPicture is destroyed.
Keep a valid reference to the proxy in GstVaapiPicture so that frames marked as "used for reference" could be kept during the lifetime of the picture. i.e. don't release them too soon as they could be re-used right away.
This commit is contained in:
parent
2897618b85
commit
4a46b5d6c4
2 changed files with 18 additions and 4 deletions
|
@ -71,6 +71,11 @@ gst_vaapi_picture_destroy(GstVaapiPicture *picture)
|
||||||
picture->bitplane = NULL;
|
picture->bitplane = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (picture->proxy) {
|
||||||
|
g_object_unref(picture->proxy);
|
||||||
|
picture->proxy = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
picture->surface_id = VA_INVALID_ID;
|
picture->surface_id = VA_INVALID_ID;
|
||||||
picture->surface = NULL;
|
picture->surface = NULL;
|
||||||
|
|
||||||
|
@ -110,6 +115,7 @@ gst_vaapi_picture_init(GstVaapiPicture *picture)
|
||||||
{
|
{
|
||||||
picture->type = GST_VAAPI_PICTURE_TYPE_NONE;
|
picture->type = GST_VAAPI_PICTURE_TYPE_NONE;
|
||||||
picture->surface = NULL;
|
picture->surface = NULL;
|
||||||
|
picture->proxy = NULL;
|
||||||
picture->surface_id = VA_INVALID_ID;
|
picture->surface_id = VA_INVALID_ID;
|
||||||
picture->param = NULL;
|
picture->param = NULL;
|
||||||
picture->param_id = VA_INVALID_ID;
|
picture->param_id = VA_INVALID_ID;
|
||||||
|
@ -227,12 +233,19 @@ gst_vaapi_picture_output(GstVaapiPicture *picture)
|
||||||
|
|
||||||
g_return_val_if_fail(GST_VAAPI_IS_PICTURE(picture), FALSE);
|
g_return_val_if_fail(GST_VAAPI_IS_PICTURE(picture), FALSE);
|
||||||
|
|
||||||
proxy = gst_vaapi_surface_proxy_new(GET_CONTEXT(picture), picture->surface);
|
proxy = picture->proxy;
|
||||||
if (!proxy)
|
if (!proxy) {
|
||||||
return FALSE;
|
proxy = gst_vaapi_surface_proxy_new(
|
||||||
|
GET_CONTEXT(picture),
|
||||||
|
picture->surface
|
||||||
|
);
|
||||||
|
if (!proxy)
|
||||||
|
return FALSE;
|
||||||
|
picture->proxy = proxy;
|
||||||
|
}
|
||||||
|
|
||||||
gst_vaapi_surface_proxy_set_timestamp(proxy, picture->pts);
|
gst_vaapi_surface_proxy_set_timestamp(proxy, picture->pts);
|
||||||
gst_vaapi_decoder_push_surface_proxy(GET_DECODER(picture), proxy);
|
gst_vaapi_decoder_push_surface_proxy(GET_DECODER(picture), g_object_ref(proxy));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,7 @@ struct _GstVaapiPicture {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
GstVaapiCodecObject parent_instance;
|
GstVaapiCodecObject parent_instance;
|
||||||
GstVaapiSurface *surface;
|
GstVaapiSurface *surface;
|
||||||
|
GstVaapiSurfaceProxy *proxy;
|
||||||
VABufferID param_id;
|
VABufferID param_id;
|
||||||
|
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
|
|
Loading…
Reference in a new issue