summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2018-03-01 07:33:27 -0600
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2018-03-01 09:48:38 -0600
commit940afd290088ffe830a70db26def9aecc04b421b (patch)
tree66d2bed1f3663be259573396ee9d846b524e9fa5
parentfde55003ca58ab6114bb903969674da8fe5f3f74 (diff)
vaapipostproc: change how the metadata is copied
Instead of copying the metada in prepare_output_buffer() vmethod, it is done in append_output_buffer_metadata() thus deinterlaced buffers could also have the proper metas. GstVideoCropMeta now it is copied internally and it is decided via transform_meta() vmethod. A new internal method, copy_metadata() was added to handle VPP transformation where non-GstVideoVaapiMeta metas were lost.
-rw-r--r--gst/vaapi/gstvaapipostproc.c45
1 files changed, 26 insertions, 19 deletions
diff --git a/gst/vaapi/gstvaapipostproc.c b/gst/vaapi/gstvaapipostproc.c
index d5a0557c..2b888214 100644
--- a/gst/vaapi/gstvaapipostproc.c
+++ b/gst/vaapi/gstvaapipostproc.c
@@ -402,6 +402,24 @@ create_output_dump_buffer (GstVaapiPostproc * postproc)
&plugin->other_allocator_params);
}
+static void
+copy_metadata (GstVaapiPostproc * postproc, GstBuffer * outbuf,
+ GstBuffer * inbuf)
+{
+ GstBaseTransformClass *bclass = GST_BASE_TRANSFORM_GET_CLASS (postproc);
+ GstBaseTransform *trans = GST_BASE_TRANSFORM (postproc);
+
+ if (inbuf == outbuf)
+ return;
+ if (!bclass->copy_metadata)
+ return;
+ if (!bclass->copy_metadata (trans, inbuf, outbuf)) {
+ /* something failed, post a warning */
+ GST_ELEMENT_WARNING (trans, STREAM, NOT_IMPLEMENTED,
+ ("could not copy metadata"), (NULL));
+ }
+}
+
static gboolean
append_output_buffer_metadata (GstVaapiPostproc * postproc, GstBuffer * outbuf,
GstBuffer * inbuf, guint flags)
@@ -411,16 +429,7 @@ append_output_buffer_metadata (GstVaapiPostproc * postproc, GstBuffer * outbuf,
gst_buffer_copy_into (outbuf, inbuf, flags | GST_BUFFER_COPY_FLAGS, 0, -1);
- /* GstVideoCropMeta */
- if (!postproc->use_vpp) {
- GstVideoCropMeta *const crop_meta = gst_buffer_get_video_crop_meta (inbuf);
- if (crop_meta) {
- GstVideoCropMeta *const out_crop_meta =
- gst_buffer_add_video_crop_meta (outbuf);
- if (out_crop_meta)
- *out_crop_meta = *crop_meta;
- }
- }
+ copy_metadata (postproc, outbuf, inbuf);
/* GstVaapiVideoMeta */
inbuf_meta = gst_buffer_get_vaapi_video_meta (inbuf);
@@ -755,6 +764,7 @@ gst_vaapipostproc_process_vpp (GstBaseTransform * trans, GstBuffer * inbuf,
if (status != GST_VAAPI_FILTER_STATUS_SUCCESS)
goto error_process_vpp;
+ copy_metadata (postproc, fieldbuf, inbuf);
GST_BUFFER_TIMESTAMP (fieldbuf) = timestamp;
GST_BUFFER_DURATION (fieldbuf) = postproc->field_duration;
if (discont) {
@@ -820,6 +830,7 @@ gst_vaapipostproc_process_vpp (GstBaseTransform * trans, GstBuffer * inbuf,
discont = FALSE;
}
}
+ copy_metadata (postproc, outbuf, inbuf);
if (deint && deint_refs)
ds_add_buffer (ds, inbuf);
@@ -1264,6 +1275,11 @@ static gboolean
gst_vaapipostproc_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf,
GstMeta * meta, GstBuffer * inbuf)
{
+ GstVaapiPostproc *const postproc = GST_VAAPIPOSTPROC (trans);
+
+ /* dont' GstVideoCropMeta if use_vpp */
+ if (meta->info->api == GST_VIDEO_CROP_META_API_TYPE && postproc->use_vpp)
+ return FALSE;
return TRUE;
}
@@ -1332,7 +1348,6 @@ gst_vaapipostproc_prepare_output_buffer (GstBaseTransform * trans,
GstBuffer * inbuf, GstBuffer ** outbuf_ptr)
{
GstVaapiPostproc *const postproc = GST_VAAPIPOSTPROC (trans);
- GstBaseTransformClass *bclass = GST_BASE_TRANSFORM_GET_CLASS (trans);
if (gst_base_transform_is_passthrough (trans)) {
*outbuf_ptr = inbuf;
@@ -1348,14 +1363,6 @@ gst_vaapipostproc_prepare_output_buffer (GstBaseTransform * trans,
if (!*outbuf_ptr)
return GST_FLOW_ERROR;
- if (inbuf != *outbuf_ptr && bclass->copy_metadata) {
- if (!bclass->copy_metadata (trans, inbuf, *outbuf_ptr)) {
- /* something failed, post a warning */
- GST_ELEMENT_WARNING (trans, STREAM, NOT_IMPLEMENTED,
- ("could not copy metadata"), (NULL));
- }
- }
-
return GST_FLOW_OK;
}