mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
plugins: allow copies of GstVaapiVideoMeta objects.
Make it possible to copy GstVaapiVideoMeta objects, unless they contain VA objects created from GstVaapiVideoPool. This is mostly useful to clone a GstVaapiVideoMeta object containing a VA surface proxy so that to alter its rendering flags.
This commit is contained in:
parent
8fe0011450
commit
c8db926547
2 changed files with 59 additions and 3 deletions
|
@ -137,12 +137,24 @@ gst_vaapi_video_meta_init(GstVaapiVideoMeta *meta)
|
||||||
meta->render_flags = 0;
|
meta->render_flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline GstVaapiVideoMeta *
|
||||||
|
_gst_vaapi_video_meta_create(void)
|
||||||
|
{
|
||||||
|
return g_slice_new(GstVaapiVideoMeta);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
_gst_vaapi_video_meta_destroy(GstVaapiVideoMeta *meta)
|
||||||
|
{
|
||||||
|
g_slice_free1(sizeof(*meta), meta);
|
||||||
|
}
|
||||||
|
|
||||||
static inline GstVaapiVideoMeta *
|
static inline GstVaapiVideoMeta *
|
||||||
_gst_vaapi_video_meta_new(void)
|
_gst_vaapi_video_meta_new(void)
|
||||||
{
|
{
|
||||||
GstVaapiVideoMeta *meta;
|
GstVaapiVideoMeta *meta;
|
||||||
|
|
||||||
meta = g_slice_alloc(sizeof(*meta));
|
meta = _gst_vaapi_video_meta_create();
|
||||||
if (!meta)
|
if (!meta)
|
||||||
return NULL;
|
return NULL;
|
||||||
gst_vaapi_video_meta_init(meta);
|
gst_vaapi_video_meta_init(meta);
|
||||||
|
@ -157,7 +169,44 @@ _gst_vaapi_video_meta_free(GstVaapiVideoMeta *meta)
|
||||||
gst_vaapi_video_meta_finalize(meta);
|
gst_vaapi_video_meta_finalize(meta);
|
||||||
|
|
||||||
if (G_LIKELY(g_atomic_int_dec_and_test(&meta->ref_count)))
|
if (G_LIKELY(g_atomic_int_dec_and_test(&meta->ref_count)))
|
||||||
g_slice_free1(sizeof(*meta), meta);
|
_gst_vaapi_video_meta_destroy(meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_video_meta_copy:
|
||||||
|
* @meta: a #GstVaapiVideoMeta
|
||||||
|
*
|
||||||
|
* Creates a copy of #GstVaapiVideoMeta object @meta. The original
|
||||||
|
* @meta object shall not contain any VA objects created from a
|
||||||
|
* #GstVaapiVideoPool.
|
||||||
|
*
|
||||||
|
* Return value: the newly allocated #GstVaapiVideoMeta, or %NULL on error
|
||||||
|
*/
|
||||||
|
GstVaapiVideoMeta *
|
||||||
|
gst_vaapi_video_meta_copy(GstVaapiVideoMeta *meta)
|
||||||
|
{
|
||||||
|
GstVaapiVideoMeta *copy;
|
||||||
|
|
||||||
|
g_return_val_if_fail(GST_VAAPI_IS_VIDEO_META(meta), NULL);
|
||||||
|
|
||||||
|
if (meta->image_pool || meta->surface_pool)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
copy = _gst_vaapi_video_meta_create();
|
||||||
|
if (!copy)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
copy->ref_count = 1;
|
||||||
|
copy->display = g_object_ref(meta->display);
|
||||||
|
copy->image_pool = NULL;
|
||||||
|
copy->image = meta->image ? g_object_ref(meta->image) : NULL;
|
||||||
|
copy->surface_pool = NULL;
|
||||||
|
copy->surface = meta->surface ? g_object_ref(meta->surface) : NULL;
|
||||||
|
copy->proxy = meta->proxy ?
|
||||||
|
gst_vaapi_surface_proxy_ref(meta->proxy) : NULL;
|
||||||
|
copy->converter = meta->converter;
|
||||||
|
copy->render_flags = meta->render_flags;
|
||||||
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -681,7 +730,10 @@ gst_vaapi_video_meta_holder_transform(GstBuffer *dst_buffer, GstMeta *meta,
|
||||||
GST_VAAPI_VIDEO_META_HOLDER(meta);
|
GST_VAAPI_VIDEO_META_HOLDER(meta);
|
||||||
|
|
||||||
if (GST_META_TRANSFORM_IS_COPY(type)) {
|
if (GST_META_TRANSFORM_IS_COPY(type)) {
|
||||||
gst_buffer_set_vaapi_video_meta(dst_buffer, src_meta->meta);
|
GstVaapiVideoMeta * const dst_meta =
|
||||||
|
gst_vaapi_video_meta_copy(src_meta->meta);
|
||||||
|
gst_buffer_set_vaapi_video_meta(dst_buffer, dst_meta);
|
||||||
|
gst_vaapi_video_meta_unref(dst_meta);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -42,6 +42,10 @@ GType
|
||||||
gst_vaapi_video_meta_api_get_type(void) G_GNUC_CONST;
|
gst_vaapi_video_meta_api_get_type(void) G_GNUC_CONST;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
G_GNUC_INTERNAL
|
||||||
|
GstVaapiVideoMeta *
|
||||||
|
gst_vaapi_video_meta_copy(GstVaapiVideoMeta *meta);
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
GstVaapiVideoMeta *
|
GstVaapiVideoMeta *
|
||||||
gst_vaapi_video_meta_new(GstVaapiDisplay *display);
|
gst_vaapi_video_meta_new(GstVaapiDisplay *display);
|
||||||
|
|
Loading…
Reference in a new issue