va: filter, deinterlace, vpp: Add gst_va_buffer_get_surface_flags().
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Tue, 5 Oct 2021 15:41:57 +0000 (17:41 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Wed, 13 Oct 2021 14:59:09 +0000 (14:59 +0000)
Add a helper function to get, from GstVideoInfo and GstBuffers flags,
the VA interlace surface flags. This is used currently by vainterlace
element, but it will be used in vapostproc too if it can process
interlaced frames.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1109>

subprojects/gst-plugins-bad/sys/va/gstvadeinterlace.c
subprojects/gst-plugins-bad/sys/va/gstvafilter.c
subprojects/gst-plugins-bad/sys/va/gstvafilter.h
subprojects/gst-plugins-bad/sys/va/gstvavpp.c

index 454551c..2698088 100644 (file)
@@ -396,32 +396,7 @@ gst_va_deinterlace_transform (GstBaseTransform * trans, GstBuffer * inbuf,
   g_assert (self->curr_field == FIRST_FIELD
       || self->curr_field == SECOND_FIELD);
 
-  surface_flags = 0;
-  if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED
-      || (GST_VIDEO_INFO_INTERLACE_MODE (info) ==
-          GST_VIDEO_INTERLACE_MODE_INTERLEAVED
-          && GST_VIDEO_INFO_FIELD_ORDER (info) ==
-          GST_VIDEO_FIELD_ORDER_UNKNOWN)) {
-    if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_VIDEO_BUFFER_FLAG_INTERLACED)) {
-      if (GST_BUFFER_FLAG_IS_SET (inbuf, GST_VIDEO_BUFFER_FLAG_TFF)) {
-        surface_flags = VA_TOP_FIELD_FIRST;
-      } else {
-        surface_flags = VA_BOTTOM_FIELD_FIRST;
-      }
-    } else {
-      /* complete frame? do it twice */
-      surface_flags = VA_FRAME_PICTURE;
-    }
-  } else if (GST_VIDEO_INFO_FIELD_ORDER (info) ==
-      GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST) {
-    surface_flags = VA_BOTTOM_FIELD_FIRST;
-  } else if (GST_VIDEO_INFO_FIELD_ORDER (info) ==
-      GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST) {
-    surface_flags = VA_TOP_FIELD_FIRST;
-  } else {
-    g_assert_not_reached ();
-  }
-
+  surface_flags = gst_va_buffer_get_surface_flags (inbuf, info);
   if (surface_flags != VA_FRAME_PICTURE)
     _set_field (self, &surface_flags);
 
index 58a4b2f..e8b6312 100644 (file)
@@ -1695,3 +1695,43 @@ fail_end_pic:
     goto bail;
   }
 }
+
+/**
+ * gst_va_buffer_get_surface_flags:
+ * @buffer: the #GstBuffer to check.
+ * @info: the #GstVideoInfo with info.
+ *
+ * Gets the surface flags, related with interlace given @buffer and
+ * @info.
+ *
+ * Returns: VA surface flags.
+ */
+guint32
+gst_va_buffer_get_surface_flags (GstBuffer * buffer, GstVideoInfo * info)
+{
+  guint32 surface_flags = 0;
+
+  if (GST_VIDEO_INFO_INTERLACE_MODE (info) == GST_VIDEO_INTERLACE_MODE_MIXED
+      || (GST_VIDEO_INFO_INTERLACE_MODE (info) ==
+          GST_VIDEO_INTERLACE_MODE_INTERLEAVED
+          && GST_VIDEO_INFO_FIELD_ORDER (info) ==
+          GST_VIDEO_FIELD_ORDER_UNKNOWN)) {
+    if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_INTERLACED)) {
+      if (GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_FLAG_TFF)) {
+        surface_flags = VA_TOP_FIELD_FIRST;
+      } else {
+        surface_flags = VA_BOTTOM_FIELD_FIRST;
+      }
+    } else {
+      surface_flags = VA_FRAME_PICTURE;
+    }
+  } else if (GST_VIDEO_INFO_FIELD_ORDER (info) ==
+      GST_VIDEO_FIELD_ORDER_BOTTOM_FIELD_FIRST) {
+    surface_flags = VA_BOTTOM_FIELD_FIRST;
+  } else if (GST_VIDEO_INFO_FIELD_ORDER (info) ==
+      GST_VIDEO_FIELD_ORDER_TOP_FIELD_FIRST) {
+    surface_flags = VA_TOP_FIELD_FIRST;
+  }
+
+  return surface_flags;
+}
index 4330b9b..e7f720f 100644 (file)
@@ -110,4 +110,7 @@ gboolean              gst_va_filter_process               (GstVaFilter * self,
                                                            GstVaSample * src,
                                                            GstVaSample * dest);
 
+guint32               gst_va_buffer_get_surface_flags     (GstBuffer * buffer,
+                                                           GstVideoInfo * info);
+
 G_END_DECLS
index 596b9c7..50d749d 100644 (file)
@@ -651,10 +651,12 @@ gst_va_vpp_transform (GstBaseTransform * trans, GstBuffer * inbuf,
   /* *INDENT-OFF* */
   src = (GstVaSample) {
     .buffer = buf,
+    .flags = gst_va_buffer_get_surface_flags (buf, &btrans->in_info),
   };
 
   dst = (GstVaSample) {
     .buffer = outbuf,
+    .flags = gst_va_buffer_get_surface_flags (outbuf, &btrans->out_info),
   };
   /* *INDENT-ON* */