mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
surfaceproxy: drop user-data support from GstVaapiSurfaceProxy.
Drop user-data support from GstVaapiSurfaceProxy. Rather make it explicit to call some user-provided function when the surface proxy is released.
This commit is contained in:
parent
2db47c0ade
commit
0bd929dfa2
5 changed files with 36 additions and 52 deletions
|
@ -523,11 +523,10 @@ GST_VAAPI_DECODER_VC1_GET_CLASS
|
||||||
<TITLE>GstVaapiSurfaceProxy</TITLE>
|
<TITLE>GstVaapiSurfaceProxy</TITLE>
|
||||||
gst_vaapi_surface_proxy_get_surface
|
gst_vaapi_surface_proxy_get_surface
|
||||||
gst_vaapi_surface_proxy_get_surface_id
|
gst_vaapi_surface_proxy_get_surface_id
|
||||||
gst_vaapi_surface_proxy_get_user_data
|
|
||||||
gst_vaapi_surface_proxy_new_from_pool
|
gst_vaapi_surface_proxy_new_from_pool
|
||||||
gst_vaapi_surface_proxy_ref
|
gst_vaapi_surface_proxy_ref
|
||||||
gst_vaapi_surface_proxy_replace
|
gst_vaapi_surface_proxy_replace
|
||||||
gst_vaapi_surface_proxy_set_user_data
|
gst_vaapi_surface_proxy_set_destroy_notify
|
||||||
gst_vaapi_surface_proxy_unref
|
gst_vaapi_surface_proxy_unref
|
||||||
<SUBSECTION Standard>
|
<SUBSECTION Standard>
|
||||||
GST_VAAPI_SURFACE_PROXY_SURFACE
|
GST_VAAPI_SURFACE_PROXY_SURFACE
|
||||||
|
|
|
@ -45,11 +45,16 @@ struct _GstVaapiSurfaceProxy {
|
||||||
|
|
||||||
GstVaapiVideoPool *pool;
|
GstVaapiVideoPool *pool;
|
||||||
GstVaapiSurface *surface;
|
GstVaapiSurface *surface;
|
||||||
|
GDestroyNotify destroy_func;
|
||||||
|
gpointer destroy_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_vaapi_surface_proxy_finalize(GstVaapiSurfaceProxy *proxy)
|
gst_vaapi_surface_proxy_finalize(GstVaapiSurfaceProxy *proxy)
|
||||||
{
|
{
|
||||||
|
if (proxy->destroy_func)
|
||||||
|
proxy->destroy_func(proxy->destroy_data);
|
||||||
|
|
||||||
if (proxy->surface) {
|
if (proxy->surface) {
|
||||||
if (proxy->pool)
|
if (proxy->pool)
|
||||||
gst_vaapi_video_pool_put_object(proxy->pool, proxy->surface);
|
gst_vaapi_video_pool_put_object(proxy->pool, proxy->surface);
|
||||||
|
@ -85,6 +90,7 @@ gst_vaapi_surface_proxy_new_from_pool(GstVaapiSurfacePool *pool)
|
||||||
proxy->surface = gst_vaapi_video_pool_get_object(proxy->pool);
|
proxy->surface = gst_vaapi_video_pool_get_object(proxy->pool);
|
||||||
if (!proxy->surface)
|
if (!proxy->surface)
|
||||||
goto error;
|
goto error;
|
||||||
|
proxy->destroy_func = NULL;
|
||||||
g_object_ref(proxy->surface);
|
g_object_ref(proxy->surface);
|
||||||
return proxy;
|
return proxy;
|
||||||
|
|
||||||
|
@ -144,45 +150,6 @@ gst_vaapi_surface_proxy_replace(GstVaapiSurfaceProxy **old_proxy_ptr,
|
||||||
GST_VAAPI_MINI_OBJECT(new_proxy));
|
GST_VAAPI_MINI_OBJECT(new_proxy));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_vaapi_surface_proxy_get_user_data:
|
|
||||||
* @proxy: a #GstVaapiSurfaceProxy
|
|
||||||
*
|
|
||||||
* Gets user-provided data set on the object via a previous call to
|
|
||||||
* gst_vaapi_surface_proxy_set_user_data().
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): The previously set user_data
|
|
||||||
*/
|
|
||||||
gpointer
|
|
||||||
gst_vaapi_surface_proxy_get_user_data(GstVaapiSurfaceProxy *proxy)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy), NULL);
|
|
||||||
|
|
||||||
return gst_vaapi_mini_object_get_user_data(GST_VAAPI_MINI_OBJECT(proxy));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_vaapi_surface_proxy_set_user_data:
|
|
||||||
* @proxy: a #GstVaapiSurfaceProxy
|
|
||||||
* @user_data: user-provided data
|
|
||||||
* @destroy_notify: (closure user_data): a #GDestroyNotify
|
|
||||||
*
|
|
||||||
* Sets @user_data on the object and the #GDestroyNotify that will be
|
|
||||||
* called when the data is freed.
|
|
||||||
*
|
|
||||||
* If some @user_data was previously set, then the former @destroy_notify
|
|
||||||
* function will be called before the @user_data is replaced.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
gst_vaapi_surface_proxy_set_user_data(GstVaapiSurfaceProxy *proxy,
|
|
||||||
gpointer user_data, GDestroyNotify destroy_notify)
|
|
||||||
{
|
|
||||||
g_return_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy));
|
|
||||||
|
|
||||||
gst_vaapi_mini_object_set_user_data(GST_VAAPI_MINI_OBJECT(proxy),
|
|
||||||
user_data, destroy_notify);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_vaapi_surface_proxy_get_surface:
|
* gst_vaapi_surface_proxy_get_surface:
|
||||||
* @proxy: a #GstVaapiSurfaceProxy
|
* @proxy: a #GstVaapiSurfaceProxy
|
||||||
|
@ -215,3 +182,24 @@ gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy)
|
||||||
|
|
||||||
return GST_VAAPI_OBJECT_ID(proxy->surface);
|
return GST_VAAPI_OBJECT_ID(proxy->surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_surface_proxy_set_destroy_notify:
|
||||||
|
* @proxy: a @GstVaapiSurfaceProxy
|
||||||
|
* @destroy_func: a #GDestroyNotify function
|
||||||
|
* @user_data: some extra data to pass to the @destroy_func function
|
||||||
|
*
|
||||||
|
* Sets @destroy_func as the function to call when the surface @proxy
|
||||||
|
* was released. At this point, the proxy object is considered
|
||||||
|
* released, i.e. the underlying data storage is no longer valid and
|
||||||
|
* the callback function shall not expect anything from that.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_vaapi_surface_proxy_set_destroy_notify(GstVaapiSurfaceProxy *proxy,
|
||||||
|
GDestroyNotify destroy_func, gpointer user_data)
|
||||||
|
{
|
||||||
|
g_return_if_fail(GST_VAAPI_IS_SURFACE_PROXY(proxy));
|
||||||
|
|
||||||
|
proxy->destroy_func = destroy_func;
|
||||||
|
proxy->destroy_data = user_data;
|
||||||
|
}
|
||||||
|
|
|
@ -50,19 +50,16 @@ void
|
||||||
gst_vaapi_surface_proxy_replace(GstVaapiSurfaceProxy **old_proxy_ptr,
|
gst_vaapi_surface_proxy_replace(GstVaapiSurfaceProxy **old_proxy_ptr,
|
||||||
GstVaapiSurfaceProxy *new_proxy);
|
GstVaapiSurfaceProxy *new_proxy);
|
||||||
|
|
||||||
gpointer
|
|
||||||
gst_vaapi_surface_proxy_get_user_data(GstVaapiSurfaceProxy *proxy);
|
|
||||||
|
|
||||||
void
|
|
||||||
gst_vaapi_surface_proxy_set_user_data(GstVaapiSurfaceProxy *proxy,
|
|
||||||
gpointer user_data, GDestroyNotify destroy_notify);
|
|
||||||
|
|
||||||
GstVaapiSurface *
|
GstVaapiSurface *
|
||||||
gst_vaapi_surface_proxy_get_surface(GstVaapiSurfaceProxy *proxy);
|
gst_vaapi_surface_proxy_get_surface(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
GstVaapiID
|
GstVaapiID
|
||||||
gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy);
|
gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy);
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_vaapi_surface_proxy_set_destroy_notify(GstVaapiSurfaceProxy *proxy,
|
||||||
|
GDestroyNotify destroy_func, gpointer user_data);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* GST_VAAPI_SURFACE_PROXY_H */
|
#endif /* GST_VAAPI_SURFACE_PROXY_H */
|
||||||
|
|
|
@ -284,8 +284,8 @@ gst_vaapidecode_push_decoded_frames(GstVideoDecoder *vdec)
|
||||||
if (!GST_VIDEO_CODEC_FRAME_IS_DECODE_ONLY(out_frame)) {
|
if (!GST_VIDEO_CODEC_FRAME_IS_DECODE_ONLY(out_frame)) {
|
||||||
proxy = gst_video_codec_frame_get_user_data(out_frame);
|
proxy = gst_video_codec_frame_get_user_data(out_frame);
|
||||||
|
|
||||||
gst_vaapi_surface_proxy_set_user_data(proxy,
|
gst_vaapi_surface_proxy_set_destroy_notify(proxy,
|
||||||
decode, (GDestroyNotify)gst_vaapidecode_release);
|
(GDestroyNotify)gst_vaapidecode_release, decode);
|
||||||
|
|
||||||
#if GST_CHECK_VERSION(1,0,0)
|
#if GST_CHECK_VERSION(1,0,0)
|
||||||
ret = gst_video_decoder_allocate_output_frame(vdec, out_frame);
|
ret = gst_video_decoder_allocate_output_frame(vdec, out_frame);
|
||||||
|
|
|
@ -266,8 +266,8 @@ decoder_thread(gpointer data)
|
||||||
status = gst_vaapi_decoder_get_surface(app->decoder, &proxy);
|
status = gst_vaapi_decoder_get_surface(app->decoder, &proxy);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case GST_VAAPI_DECODER_STATUS_SUCCESS:
|
case GST_VAAPI_DECODER_STATUS_SUCCESS:
|
||||||
gst_vaapi_surface_proxy_set_user_data(proxy,
|
gst_vaapi_surface_proxy_set_destroy_notify(proxy,
|
||||||
app, (GDestroyNotify)decoder_release);
|
(GDestroyNotify)decoder_release, app);
|
||||||
rfp = render_frame_new();
|
rfp = render_frame_new();
|
||||||
if (!rfp)
|
if (!rfp)
|
||||||
SEND_ERROR("failed to allocate render frame");
|
SEND_ERROR("failed to allocate render frame");
|
||||||
|
|
Loading…
Reference in a new issue