1 /* 2 * Copyright (c) 2021-2022, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 23 //! 24 //! \file media_libva_caps_mtl_base.h 25 //! \brief This file defines the C++ class/interface for MTL media capbilities. 26 //! 27 28 #ifndef __MEDIA_LIBVA_CAPS_MTL_BASE_H__ 29 #define __MEDIA_LIBVA_CAPS_MTL_BASE_H__ 30 31 #include "media_libva_caps.h" 32 #include "media_libva_util.h" 33 34 //! 35 //! \class MediaLibvaCapsMtlBase 36 //! \brief Media libva caps mtl 37 //! 38 class MediaLibvaCapsMtlBase : public MediaLibvaCaps 39 { 40 public: 41 //! 42 //! \brief Constructor 43 //! MediaLibvaCapsMtlBase(DDI_MEDIA_CONTEXT * mediaCtx)44 MediaLibvaCapsMtlBase(DDI_MEDIA_CONTEXT *mediaCtx) : MediaLibvaCaps(mediaCtx) 45 { 46 // MTL supported Encode format 47 static struct EncodeFormatTable encodeFormatTableMTL[] = 48 { 49 {AVC, Vdenc, VA_RT_FORMAT_YUV420 | VA_RT_FORMAT_YUV422 | VA_RT_FORMAT_YUV444 | VA_RT_FORMAT_RGB32}, 50 {HEVC, Vdenc, VA_RT_FORMAT_YUV420 | VA_RT_FORMAT_YUV420_10BPP | 51 VA_RT_FORMAT_YUV444 | VA_RT_FORMAT_YUV444_10 | VA_RT_FORMAT_RGB32 | 52 VA_RT_FORMAT_RGB32_10BPP}, 53 {VP9, Vdenc, VA_RT_FORMAT_YUV420 | VA_RT_FORMAT_YUV420_10BPP | 54 VA_RT_FORMAT_YUV444 | VA_RT_FORMAT_YUV444_10 | VA_RT_FORMAT_RGB32 | 55 VA_RT_FORMAT_RGB32_10BPP} 56 }; 57 m_encodeFormatTable = (struct EncodeFormatTable*)(&encodeFormatTableMTL[0]); 58 m_encodeFormatCount = sizeof(encodeFormatTableMTL)/sizeof(struct EncodeFormatTable); 59 60 return; 61 } 62 63 //! 64 //! \brief Destructor 65 //! ~MediaLibvaCapsMtlBase()66 virtual ~MediaLibvaCapsMtlBase() {}; 67 68 // Init()69 virtual VAStatus Init() override 70 { 71 return LoadProfileEntrypoints(); 72 } 73 74 //! 75 //! \brief Initialize AVC Low-power encode profiles, entrypoints and attributes 76 //! 77 virtual VAStatus LoadAvcEncLpProfileEntrypoints() override; 78 79 //! 80 //! \brief Initialize HEVC encode profiles, entrypoints and attributes 81 //! 82 //! \return VAStatus 83 //! if call succeeds 84 //! 85 virtual VAStatus LoadHevcEncProfileEntrypoints() override; 86 87 //! 88 //! \brief Initialize AVC encode profiles, entrypoints and attributes 89 //! 90 //! \return VAStatus 91 //! if call succeeds 92 //! 93 virtual VAStatus LoadAvcEncProfileEntrypoints() override; 94 95 //! 96 //! \brief Initialize AV1 encode profiles, entrypoints and attributes 97 //! 98 //! \return VAStatus 99 //! if call succeeds 100 //! 101 virtual VAStatus LoadAv1EncProfileEntrypoints(); 102 103 virtual CODECHAL_MODE GetDecodeCodecMode(VAProfile profile) override; 104 105 //! 106 //! \brief Return the decode codec key for given profile 107 //! 108 //! \param [in] profile 109 //! Specify the VAProfile 110 //! 111 //! \return Std::string decode codec key 112 //! 113 virtual std::string GetDecodeCodecKey(VAProfile profile) override; 114 115 //! 116 //! \brief Return the encode codec key for given profile and entrypoint 117 //! 118 //! \param [in] profile 119 //! Specify the VAProfile 120 //! 121 //! \param [in] entrypoint 122 //! Specify the entrypoint 123 //! 124 //! \param [in] feiFunction 125 //! Specify the feiFunction 126 //! 127 //! \return Std::string encode codec key 128 //! 129 virtual std::string GetEncodeCodecKey( 130 VAProfile profile, 131 VAEntrypoint entrypoint, 132 uint32_t feiFunction) override; 133 134 //! 135 //! \brief Return internal encode mode for given profile and entrypoint 136 //! 137 //! \param [in] profile 138 //! Specify the VAProfile 139 //! 140 //! \param [in] entrypoint 141 //! Specify the VAEntrypoint 142 //! 143 //! \return Codehal mode 144 //! 145 virtual CODECHAL_MODE GetEncodeCodecMode( 146 VAProfile profile, 147 VAEntrypoint entrypoint) override; 148 149 //! 150 //! \brief Check if the resolution is valid for a encode profile 151 //! 152 //! \param [in] profile 153 //! Specify the VAProfile 154 //! 155 //! \param [in] width 156 //! Specify the width for checking 157 //! 158 //! \param [in] height 159 //! Specify the height for checking 160 //! 161 //! \return VAStatus 162 //! VA_STATUS_SUCCESS if the resolution is supported 163 //! VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED if the resolution isn't valid 164 //! 165 virtual VAStatus CheckEncodeResolution( 166 VAProfile profile, 167 uint32_t width, 168 uint32_t height) override; 169 170 //! 171 //! \brief Check the encode RT format according to platform and encode format 172 //! 173 //! \param [in] profile 174 //! VAProfile 175 //! 176 //! \param [in] entrypoint 177 //! VAEntrypoint 178 //! 179 //! \param [in,out] attrib 180 //! Pointer to a pointer of VAConfigAttrib that will be created 181 //! 182 //! \return VAStatus 183 //! VA_STATUS_SUCCESS if success 184 //! 185 virtual VAStatus CheckEncRTFormat( 186 VAProfile profile, 187 VAEntrypoint entrypoint, 188 VAConfigAttrib* attrib) override; 189 190 // Implementation is the same as g12. 191 virtual VAStatus QueryImageFormats(VAImageFormat *formatList, int32_t *num_formats) override; 192 193 // Implementation is the same as g12. 194 virtual uint32_t GetImageFormatsMaxNum() override; 195 196 //! 197 //! \brief Populate the color masks info 198 //! 199 //! \param [in,out] Image format 200 //! Pointer to a VAImageFormat array. Color masks information will be populated to this 201 //! structure. 202 //! 203 //! \return VAStatus 204 //! VA_STATUS_SUCCESS if succeed 205 //! Implementation is the same as g12. 206 virtual VAStatus PopulateColorMaskInfo(VAImageFormat *vaImgFmt) override; 207 208 virtual bool IsImageSupported(uint32_t fourcc) override; 209 210 //! 211 //! \brief Query AVC ROI maximum number 212 //! 213 //! \param [in] rcMode 214 //! RC mode 215 //! \param [in] isVdenc 216 //! vdenc 217 //! \param [in] maxNum 218 //! Maximum number 219 //! \param [in] isRoiInDeltaQP 220 //! Is ROI in delta QP 221 //! 222 //! \return VAStatus 223 //! if call succeeds 224 //! 225 VAStatus QueryAVCROIMaxNum(uint32_t rcMode, bool isVdenc, uint32_t *maxNum, bool *isRoiInDeltaQP) override; 226 227 virtual VAStatus LoadProfileEntrypoints() override; 228 229 virtual VAStatus GetPlatformSpecificAttrib(VAProfile profile, 230 VAEntrypoint entrypoint, 231 VAConfigAttribType type, 232 unsigned int *value) override; 233 234 //! 235 //! \brief Initialize AV1 decode profiles, entrypoints and attributes 236 //! 237 VAStatus LoadAv1DecProfileEntrypoints(); 238 239 //! 240 //! \brief Initialize HEVC low-power encode profiles, entrypoints and attributes 241 //! 242 //! \return VAStatus 243 //! if call succeeds 244 //! 245 virtual VAStatus LoadHevcEncLpProfileEntrypoints(); 246 247 static const VAConfigAttribValEncRateControlExt m_encVp9RateControlExt; //!< External enc rate control caps for VP9 encode 248 249 //! 250 //! \brief Initialize VP9 encode profiles, entrypoints and attributes 251 //! 252 virtual VAStatus LoadVp9EncProfileEntrypoints() override; 253 254 //! 255 //! \brief Initialize HEVC decode profiles, entrypoints and attributes 256 //! 257 virtual VAStatus LoadHevcDecProfileEntrypoints() override; 258 259 virtual GMM_RESOURCE_FORMAT ConvertMediaFmtToGmmFmt(DDI_MEDIA_FORMAT format) override; 260 261 //! 262 //! \brief Add surface attributes for Encoding 263 //! 264 //! \param [in] profile 265 //! VAProfile of the configuration 266 //! 267 //! \param [in] entrypoint 268 //! VAEntrypoint of the configuration 269 //! 270 //! \param [in,out] attribList 271 //! Pointer to VASurfaceAttrib array. It returns 272 //! the supported surface attributes 273 //! 274 //! \param [in,out] numAttribs 275 //! The number of elements allocated on input 276 //! Return the number of elements actually filled in output 277 //! 278 //! \return VAStatus 279 //! VA_STATUS_SUCCESS if success 280 //! 281 virtual VAStatus AddEncSurfaceAttributes( 282 VAProfile profile, 283 VAEntrypoint entrypoint, 284 VASurfaceAttrib *attribList, 285 uint32_t & numAttribs); 286 287 //! 288 //! \brief Get surface attributes for a given config ID 289 //! 290 //! \param [in] configId 291 //! VA configuration 292 //! 293 //! \param [in,out] attribList 294 //! Pointer to VASurfaceAttrib array. It returns 295 //! the supported surface attributes 296 //! 297 //! \param [in,out] numAttribs 298 //! The number of elements allocated on input 299 //! Return the number of elements actually filled in output 300 //! 301 //! \return VAStatus 302 //! VA_STATUS_SUCCESS if success 303 //! VA_STATUS_ERROR_MAX_NUM_EXCEEDED if size of attribList is too small 304 //! 305 VAStatus QuerySurfaceAttributes( 306 VAConfigID configId, 307 VASurfaceAttrib *attribList, 308 uint32_t * numAttribs) override; 309 310 //! 311 //! \brief Check if the give profile is HEVC 312 //! 313 //! \param [in] profile 314 //! Specify the VAProfile 315 //! 316 //! \return True if the profile is a HEVC profile 317 //! False if the profile isn't a HEVC profile 318 //! 319 virtual bool IsHevcProfile(VAProfile profile) override; 320 321 //! \brief To check if target resolution support on this platform 322 //! 323 virtual VAStatus CheckDecodeResolution( 324 int32_t codecMode, 325 VAProfile profile, 326 uint32_t width, 327 uint32_t height) override; 328 329 VAStatus CreateDecAttributes(VAProfile profile, VAEntrypoint entrypoint, AttribMap **attributeList) override; 330 331 virtual VAStatus CreateEncAttributes( 332 VAProfile profile, 333 VAEntrypoint entrypoint, 334 AttribMap **attributeList) override; 335 336 //! \brief Get surface drm modifier 337 //! 338 //! \param [in] mediaSurface 339 //! Pointer to the media surface 340 //! \param [out] modifier 341 //! reference of the modifier 342 //! 343 //! \return VAStatus 344 //! VA_STATUS_SUCCESS if success 345 //! 346 virtual VAStatus GetSurfaceModifier(DDI_MEDIA_SURFACE* mediaSurface, uint64_t &modifier) override; 347 348 //! \brief Set tile format according to external surface's modifier 349 //! 350 //! \param [in] mediaSurface 351 //! Pointer to the media surface 352 //! \param [out] tileformat 353 //! Reference to the tileformat 354 //! \param [out] bMemCompEnable 355 //! Reference to the memory compress flag 356 //! \param [out] bMemCompRC 357 //! Reference to the memory compress rate control 358 //! 359 //! \return VAStatus 360 //! VA_STATUS_SUCCESS if success 361 //! 362 virtual VAStatus SetExternalSurfaceTileFormat(DDI_MEDIA_SURFACE* mediaSurface, 363 uint32_t &tileformat, 364 bool &bMemCompEnable, 365 bool &bMemCompRC) override; 366 367 //! 368 //! \brief Check if the give profile is AV1 369 //! 370 //! \param [in] profile 371 //! Specify the VAProfile 372 //! 373 //! \return True if the profile is a AV1 profile 374 //! False if the profile isn't a AV1 profile 375 //! 376 static bool IsAV1Profile(VAProfile profile); 377 378 protected: 379 static const uint32_t m_maxHevcEncWidth = 380 CODEC_16K_MAX_PIC_WIDTH; //!< maxinum width for HEVC encode 381 static const uint32_t m_maxHevcEncHeight = 382 CODEC_12K_MAX_PIC_HEIGHT; //!< maxinum height for HEVC encode 383 static const uint32_t m_decAvcMaxWidth = 384 CODEC_4K_MAX_PIC_WIDTH; //!< Maximum width for AVC decode 385 static const uint32_t m_decAvcMaxHeight = 386 CODEC_4K_MAX_PIC_HEIGHT; //!< Maximum height for AVC decode 387 static const uint32_t m_decHevcMax16kWidth = 388 CODEC_16K_MAX_PIC_WIDTH; //!< Maximum width for HEVC decode 389 static const uint32_t m_decHevcMax16kHeight = 390 CODEC_16K_MAX_PIC_HEIGHT; //!< Maximum height for HEVC decode 391 static const uint32_t m_decVp9Max16kWidth = 392 CODEC_16K_MAX_PIC_WIDTH; //!< Maximum width for VP9 decode 393 static const uint32_t m_decVp9Max16kHeight = 394 CODEC_16K_MAX_PIC_HEIGHT; //!< Maximum height for VP9 decode 395 static const uint32_t m_decAv1Max16kWidth = 396 CODEC_16K_MAX_PIC_WIDTH; //!< Maximum width for AV1 decode 397 static const uint32_t m_decAv1Max16kHeight = 398 CODEC_16K_MAX_PIC_HEIGHT; //!< Maximum height for AV1 decode 399 static const uint32_t m_maxVp9EncWidth = 400 CODEC_8K_MAX_PIC_WIDTH; //!< maximum width for VP9 encode 401 static const uint32_t m_maxVp9EncHeight = 402 CODEC_8K_MAX_PIC_HEIGHT; //!< maximum height for VP9 encode 403 static const uint32_t m_minVp9EncWidth = 404 CODEC_128_MIN_PIC_WIDTH; //!< minimum width for VP9 encode 405 static const uint32_t m_minVp9EncHeight = 406 CODEC_96_MIN_PIC_HEIGHT; //!< minimum height for VP9 encode 407 static const uint32_t m_minAv1EncWidth = 408 CODEC_128_MIN_PIC_WIDTH; //!< minimum width for AV1 encode 409 static const uint32_t m_minAv1EncHeight = 410 CODEC_96_MIN_PIC_HEIGHT; //!< minimum height for AV1 encode 411 MEDIA_CLASS_DEFINE_END(MediaLibvaCapsMtlBase) 412 }; 413 #endif