From e4729e57847b5473cdb33a53af6b900d8a24af91 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Tue, 21 Nov 2023 21:58:35 +0900 Subject: [PATCH] qsvh265dec: Add support for HEVC RExt profiles Adding 4:2:0 high bitdepth and 4:2:2/4:4:4 decoding support Part-of: --- .../gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp index d11980e707..f75e436de9 100644 --- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp +++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvh265dec.cpp @@ -514,8 +514,7 @@ gst_qsv_h265_dec_register (GstPlugin * plugin, guint rank, guint impl_index, supported_profiles.push_back ("main"); supported_formats.push_back ("NV12"); - /* Check other profile/formats */ - /* TODO: check other profiles too */ + /* main-10 */ gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_P010_10LE); mfx->CodecProfile = MFX_PROFILE_HEVC_MAIN10; mfx->FrameInfo.Width = GST_ROUND_UP_16 (gst_qsv_resolutions[0].width); @@ -527,6 +526,56 @@ gst_qsv_h265_dec_register (GstPlugin * plugin, guint rank, guint impl_index, supported_formats.push_back ("P010_10LE"); } + /* main-12 */ + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_P012_LE); + mfx->CodecProfile = MFX_PROFILE_HEVC_REXT; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-12"); + supported_formats.push_back ("P012_LE"); + } + + /* main-422-{10,12} */ + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_YUY2); + mfx->CodecProfile = MFX_PROFILE_HEVC_REXT; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_Y210); + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-422-10"); + supported_formats.push_back ("YUY2"); + supported_formats.push_back ("Y210"); + + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_Y212_LE); + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-422-12"); + supported_formats.push_back ("Y212_LE"); + } + } + } + + /* main-444 */ + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_VUYA); + mfx->CodecProfile = MFX_PROFILE_HEVC_REXT; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-444"); + supported_formats.push_back ("VUYA"); + } + + /* main-444-10 */ + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_Y410); + mfx->CodecProfile = MFX_PROFILE_HEVC_REXT; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-444-10"); + supported_formats.push_back ("Y410"); + } + + /* main-444-12 */ + gst_qsv_frame_info_set_format (&mfx->FrameInfo, GST_VIDEO_FORMAT_Y412_LE); + mfx->CodecProfile = MFX_PROFILE_HEVC_REXT; + if (MFXVideoDECODE_Query (session, ¶m, ¶m) == MFX_ERR_NONE) { + supported_profiles.push_back ("main-444-12"); + supported_formats.push_back ("Y412_LE"); + } + /* To cover both landscape and portrait, * select max value (width in this case) */ guint resolution = MAX (max_resolution.width, max_resolution.height);