mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-06 23:48:53 +00:00
glcolorconvert: should copy metadatas from the incoming buffer
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2094>
This commit is contained in:
parent
0746b02aa9
commit
199b62570f
1 changed files with 46 additions and 2 deletions
|
@ -65,6 +65,12 @@ static gboolean _do_convert_draw (GstGLContext * context,
|
||||||
|
|
||||||
/* *INDENT-OFF* */
|
/* *INDENT-OFF* */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
GstGLColorConvert *convert;
|
||||||
|
GstBuffer *outbuf;
|
||||||
|
} CopyMetaData;
|
||||||
|
|
||||||
#define YUV_TO_RGB_COEFFICIENTS \
|
#define YUV_TO_RGB_COEFFICIENTS \
|
||||||
"uniform vec3 offset;\n" \
|
"uniform vec3 offset;\n" \
|
||||||
"uniform vec3 coeff1;\n" \
|
"uniform vec3 coeff1;\n" \
|
||||||
|
@ -2859,6 +2865,31 @@ out:
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
foreach_metadata (GstBuffer * inbuf, GstMeta ** meta, gpointer user_data)
|
||||||
|
{
|
||||||
|
CopyMetaData *data = user_data;
|
||||||
|
GstGLColorConvert *convert = data->convert;
|
||||||
|
const GstMetaInfo *info = (*meta)->info;
|
||||||
|
GstBuffer *outbuf = data->outbuf;
|
||||||
|
|
||||||
|
if (!gst_meta_api_type_has_tag (info->api, _gst_meta_tag_memory) &&
|
||||||
|
info->api != gst_video_overlay_composition_meta_api_get_type () &&
|
||||||
|
info->api != gst_gl_sync_meta_api_get_type ()) {
|
||||||
|
GstMetaTransformCopy copy_data = { FALSE, 0, -1 };
|
||||||
|
if (info->transform_func) {
|
||||||
|
GST_TRACE_OBJECT (convert, "copy metadata %s", g_type_name (info->api));
|
||||||
|
info->transform_func (outbuf, *meta, inbuf,
|
||||||
|
_gst_meta_transform_copy, ©_data);
|
||||||
|
} else {
|
||||||
|
GST_DEBUG_OBJECT (convert, "couldn't copy metadata %s",
|
||||||
|
g_type_name (info->api));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Called by the idle function in the gl thread */
|
/* Called by the idle function in the gl thread */
|
||||||
void
|
void
|
||||||
_do_convert (GstGLContext * context, GstGLColorConvert * convert)
|
_do_convert (GstGLContext * context, GstGLColorConvert * convert)
|
||||||
|
@ -2982,9 +3013,18 @@ _do_convert (GstGLContext * context, GstGLColorConvert * convert)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (convert->outbuf) {
|
if (convert->outbuf) {
|
||||||
|
CopyMetaData data;
|
||||||
GstVideoOverlayCompositionMeta *composition_meta;
|
GstVideoOverlayCompositionMeta *composition_meta;
|
||||||
GstGLSyncMeta *sync_meta =
|
GstGLSyncMeta *sync_meta;
|
||||||
gst_buffer_add_gl_sync_meta (convert->context, convert->outbuf);
|
|
||||||
|
if (G_UNLIKELY (!gst_buffer_is_writable (convert->outbuf))) {
|
||||||
|
GST_WARNING_OBJECT (convert,
|
||||||
|
"buffer is not writable at this point, bailing out");
|
||||||
|
convert->priv->result = FALSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sync_meta = gst_buffer_add_gl_sync_meta (convert->context, convert->outbuf);
|
||||||
|
|
||||||
if (sync_meta)
|
if (sync_meta)
|
||||||
gst_gl_sync_meta_set_sync_point (sync_meta, convert->context);
|
gst_gl_sync_meta_set_sync_point (sync_meta, convert->context);
|
||||||
|
@ -2996,6 +3036,10 @@ _do_convert (GstGLContext * context, GstGLColorConvert * convert)
|
||||||
gst_buffer_add_video_overlay_composition_meta
|
gst_buffer_add_video_overlay_composition_meta
|
||||||
(convert->outbuf, composition_meta->overlay);
|
(convert->outbuf, composition_meta->overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data.convert = convert;
|
||||||
|
data.outbuf = convert->outbuf;
|
||||||
|
gst_buffer_foreach_meta (convert->inbuf, foreach_metadata, &data);
|
||||||
}
|
}
|
||||||
|
|
||||||
convert->priv->result = res;
|
convert->priv->result = res;
|
||||||
|
|
Loading…
Reference in a new issue