From 73695e392c00e239f1da1e207b0aa6079d5f7750 Mon Sep 17 00:00:00 2001 From: Hazim Razak Date: Tue, 6 May 2025 16:05:08 +0800 Subject: [PATCH] [Media Common] Add profile & entrypoint check Add a check for any invalid profile or entrypoints before QuerySuportedAttrib. Allows graceful returns for vp9 & mepg2 invalid entrypoints error. Signed-off-by: Hazim Razak --- .../common/ddi/media_capstable_specific.cpp | 13 +++++++++ .../common/ddi/media_capstable_specific.h | 28 +++++++++++++++++++ .../common/ddi/media_libva_caps_next.cpp | 9 ++++++ 3 files changed, 50 insertions(+) diff --git a/media_softlet/linux/common/ddi/media_capstable_specific.cpp b/media_softlet/linux/common/ddi/media_capstable_specific.cpp index 59ea4cafa45..60439ddbed2 100644 --- a/media_softlet/linux/common/ddi/media_capstable_specific.cpp +++ b/media_softlet/linux/common/ddi/media_capstable_specific.cpp @@ -246,6 +246,19 @@ VAStatus MediaCapsTableSpecific::CreateConfig( return ret; } +bool MediaCapsTableSpecific::IsProfileSupported( + VAProfile profile) +{ + return !(m_profileMap->find(profile) == m_profileMap->end()); +} + +bool MediaCapsTableSpecific::IsEntrypointSupported( + VAProfile profile, + VAEntrypoint entrypoint) +{ + return !(m_profileMap->at(profile)->find(entrypoint) == m_profileMap->at(profile)->end()); +} + bool MediaCapsTableSpecific::IsDecConfigId(VAConfigID configId) { VAConfigID curConfigId = REMOVE_CONFIG_ID_OFFSET(configId); diff --git a/media_softlet/linux/common/ddi/media_capstable_specific.h b/media_softlet/linux/common/ddi/media_capstable_specific.h index d3dd691c2e8..377a357f211 100644 --- a/media_softlet/linux/common/ddi/media_capstable_specific.h +++ b/media_softlet/linux/common/ddi/media_capstable_specific.h @@ -205,6 +205,34 @@ class MediaCapsTableSpecific : public MediaCapsTable //! //! \return True if the configID is a valid decode config, otherwise false //! + bool IsProfileSupported( + VAProfile profile); + + //! + //! \brief Check if profile is supported + //! + //! \param [in] profile + //! VA profile + //! + //! \return bool + //! true if supported + //! + bool IsEntrypointSupported( + VAProfile profile, + VAEntrypoint entrypoint); + + //! + //! \brief Check if entrypoint is supported + //! + //! \param [in] profile + //! VA profile + //! + //! \param [in] entrypoint + //! VA entrypoint + //! + //! \return bool + //! true if supported + //! bool IsDecConfigId(VAConfigID configId); //! diff --git a/media_softlet/linux/common/ddi/media_libva_caps_next.cpp b/media_softlet/linux/common/ddi/media_libva_caps_next.cpp index bf6c7cdc892..d70df697332 100644 --- a/media_softlet/linux/common/ddi/media_libva_caps_next.cpp +++ b/media_softlet/linux/common/ddi/media_libva_caps_next.cpp @@ -355,6 +355,15 @@ VAStatus MediaLibvaCapsNext::GetConfigAttributes( DDI_CHK_NULL(m_capsTable, "Caps table is null", VA_STATUS_ERROR_INVALID_PARAMETER); DDI_CHK_NULL(attribList, "Null pointer", VA_STATUS_ERROR_INVALID_PARAMETER); + if (!(m_capsTable->IsProfileSupported(profile))) + { + return VA_STATUS_ERROR_UNSUPPORTED_PROFILE; + } + else if (!(m_capsTable->IsEntrypointSupported(profile, entrypoint))) + { + return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT; + } + AttribList *supportedAttribList = nullptr; supportedAttribList = m_capsTable->QuerySupportedAttrib(profile, entrypoint); DDI_CHK_NULL(supportedAttribList, "AttribList in null, not supported attribute", VA_STATUS_ERROR_INVALID_PARAMETER);