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;