diff --git a/girs/GstVideo-1.0.gir b/girs/GstVideo-1.0.gir
index 64b8c395db..d20a9642d8 100644
--- a/girs/GstVideo-1.0.gir
+++ b/girs/GstVideo-1.0.gir
@@ -11411,6 +11411,29 @@ it before calling this function.
+
+ Fills @drm_info if @info's format has a valid drm format and @modifier is also
+valid
+
+
+ %TRUE if @drm_info is filled correctly.
+
+
+
+
+ #GstVideoInfoDmaDrm
+
+
+
+ a #GstVideoInfo
+
+
+
+ the associated modifier value.
+
+
+
+
Initialize @drm_info with default values.
@@ -18548,6 +18571,29 @@ it before calling this function.
+
+ Fills @drm_info if @info's format has a valid drm format and @modifier is also
+valid
+
+
+ %TRUE if @drm_info is filled correctly.
+
+
+
+
+ #GstVideoInfoDmaDrm
+
+
+
+ a #GstVideoInfo
+
+
+
+ the associated modifier value.
+
+
+
+
Initialize @drm_info with default values.
diff --git a/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.c b/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.c
index 9587004167..57e390fb6b 100644
--- a/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.c
+++ b/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.c
@@ -398,6 +398,50 @@ gst_video_info_dma_drm_new_from_caps (const GstCaps * caps)
}
}
+/**
+ * gst_video_info_dma_drm_from_video_info:
+ * @drm_info: (out caller-allocates): #GstVideoInfoDmaDrm
+ * @info: a #GstVideoInfo
+ * @modifier: the associated modifier value.
+ *
+ * Fills @drm_info if @info's format has a valid drm format and @modifier is also
+ * valid
+ *
+ * Returns: %TRUE if @drm_info is filled correctly.
+ *
+ * Since: 1.24
+ */
+gboolean
+gst_video_info_dma_drm_from_video_info (GstVideoInfoDmaDrm * drm_info,
+ const GstVideoInfo * info, guint64 modifier)
+{
+ GstVideoFormat format;
+ guint32 fourcc;
+
+ g_return_val_if_fail (drm_info != NULL, FALSE);
+ g_return_val_if_fail (info != NULL, FALSE);
+
+ if (modifier == DRM_FORMAT_MOD_INVALID)
+ return FALSE;
+ format = GST_VIDEO_INFO_FORMAT (info);
+ fourcc = gst_video_dma_drm_fourcc_from_format (format);
+ if (fourcc == DRM_FORMAT_INVALID)
+ return FALSE;
+
+ drm_info->vinfo = *info;
+ drm_info->drm_fourcc = fourcc;
+ drm_info->drm_modifier = modifier;
+
+ /* no need to change format to GST_VIDEO_INFO_ENCODED since its modifier is
+ * linear */
+ if (modifier == DRM_FORMAT_MOD_LINEAR)
+ return TRUE;
+
+ return gst_video_info_set_interlaced_format (&drm_info->vinfo,
+ GST_VIDEO_FORMAT_ENCODED, GST_VIDEO_INFO_INTERLACE_MODE (info),
+ GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info));
+}
+
/**
* gst_video_dma_drm_fourcc_from_string:
* @format_str: a drm format string
diff --git a/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.h b/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.h
index ef6c198ab3..61f8319eca 100644
--- a/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.h
+++ b/subprojects/gst-plugins-base/gst-libs/gst/video/video-info-dma.h
@@ -69,6 +69,12 @@ GstCaps * gst_video_info_dma_drm_to_caps (const GstVideoInfoDma
GST_VIDEO_API
gboolean gst_video_info_dma_drm_from_caps (GstVideoInfoDmaDrm * drm_info,
const GstCaps * caps);
+
+GST_VIDEO_API
+gboolean gst_video_info_dma_drm_from_video_info
+ (GstVideoInfoDmaDrm * drm_info,
+ const GstVideoInfo * info,
+ guint64 modifier);
GST_VIDEO_API
GstVideoInfoDmaDrm * gst_video_info_dma_drm_new_from_caps (const GstCaps * caps);
diff --git a/subprojects/gst-plugins-base/tests/check/libs/video.c b/subprojects/gst-plugins-base/tests/check/libs/video.c
index b2becebe2b..1c6049ed7b 100644
--- a/subprojects/gst-plugins-base/tests/check/libs/video.c
+++ b/subprojects/gst-plugins-base/tests/check/libs/video.c
@@ -4160,6 +4160,12 @@ GST_START_TEST (test_info_dma_drm)
gst_caps_unref (caps);
gst_caps_unref (ncaps);
+ fail_unless (gst_video_info_dma_drm_from_video_info (&info, &vinfo, 0));
+ fail_unless (GST_VIDEO_INFO_FORMAT (&info.vinfo) == GST_VIDEO_FORMAT_NV12);
+
+ fail_unless (gst_video_info_dma_drm_from_video_info (&info, &vinfo,
+ 0x100000000000002));
+ fail_unless (GST_VIDEO_INFO_FORMAT (&info.vinfo) == GST_VIDEO_FORMAT_ENCODED);
}
GST_END_TEST;