tests: va: fix vapostproc test for DMABuf
authorVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Wed, 9 Oct 2024 21:16:46 +0000 (17:16 -0400)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 17 Oct 2024 11:52:25 +0000 (11:52 +0000)
Now it picks the first format in the template srcpad list and do
the convertion. Also the format size is reduced because not all
drives support 4K as DMABuf (radeonsi).

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

subprojects/gst-plugins-bad/tests/check/elements/vapostproc.c

index daa9e007bb4bcee2170e872cfe77adc564486e06..959123c51ad8d3a53afc58b56c70cd2cb06f2e40 100644 (file)
@@ -62,18 +62,73 @@ GST_START_TEST (raw_copy)
 
 GST_END_TEST;
 
+static GstCaps *
+get_drmdma_format (void)
+{
+  GstElement *vpp;
+  GstCaps *templ, *allowed_caps, *drm_caps = NULL;
+  GstPad *srcpad;
+  guint i;
+
+  vpp = gst_element_factory_make ("vapostproc", NULL);
+  if (!vpp)
+    return NULL;
+  srcpad = gst_element_get_static_pad (vpp, "src");
+  fail_unless (srcpad != NULL);
+  templ = gst_pad_get_pad_template_caps (srcpad);
+  fail_unless (templ != NULL);
+
+  allowed_caps = gst_caps_normalize (templ);
+
+  for (i = 0; i < gst_caps_get_size (allowed_caps); ++i) {
+    GstStructure *new_structure;
+    GstStructure *structure;
+
+    /* non-dmabuf caps don't describe drm-format: skip them */
+    structure = gst_caps_get_structure (allowed_caps, i);
+    if (!gst_structure_has_field (structure, "drm-format"))
+      continue;
+
+    drm_caps = gst_caps_new_empty ();
+    new_structure = gst_structure_copy (structure);
+    gst_structure_set (new_structure, "framerate", GST_TYPE_FRACTION,
+        1, 1, NULL);
+    gst_structure_remove_field (new_structure, "width");
+    gst_structure_remove_field (new_structure, "height");
+    gst_caps_append_structure (drm_caps, new_structure);
+    gst_caps_set_features_simple (drm_caps,
+        gst_caps_features_new_single ("memory:DMABuf"));
+
+    GST_DEBUG ("have caps %" GST_PTR_FORMAT, drm_caps);
+    /* should be fixed without width/height */
+    fail_unless (gst_caps_is_fixed (drm_caps));
+    break;
+  }
+
+  gst_caps_unref (allowed_caps);
+  gst_object_unref (srcpad);
+  gst_object_unref (vpp);
+
+  return drm_caps;
+}
+
 GST_START_TEST (dmabuf_copy)
 {
   GstHarness *h;
   GstBuffer *buf, *buf_copy;
   gboolean ret;
+  GstCaps *drm_caps;
 
   h = gst_harness_new_parse ("videotestsrc num-buffers=1 ! "
       "video/x-raw, width=(int)1024, height=(int)768 ! vapostproc");
   ck_assert (h);
 
-  gst_harness_set_sink_caps_str (h,
-      "video/x-raw(memory:DMABuf), format=(string)NV12, width=(int)3840, height=(int)2160");
+  drm_caps = get_drmdma_format ();
+  ck_assert (drm_caps);
+  gst_caps_set_simple (drm_caps, "width", G_TYPE_INT, 1600, "height",
+      G_TYPE_INT, 1200, NULL);
+
+  gst_harness_set_sink_caps (h, drm_caps);
 
   gst_harness_add_propose_allocation_meta (h, GST_VIDEO_META_API_TYPE, NULL);
   gst_harness_play (h);