1 /* 2 * Copyright (c) 2022-2023, 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 //! \file ddi_decode_base_specific.h 24 //! \brief Defines base class for DDI media decode. 25 //! 26 27 #ifndef _DDI_DECODE_BASE_SPECIFIC_H_ 28 #define _DDI_DECODE_BASE_SPECIFIC_H_ 29 30 #include <stdint.h> 31 #include <va/va.h> 32 #include "ddi_codec_base_specific.h" 33 #include "decode_pipeline_adapter.h" 34 #include "ddi_libva_decoder_specific.h" 35 #include "media_capstable_specific.h" 36 37 namespace decode 38 { 39 40 //! 41 //! \class DdiDecodeBase 42 //! \brief Ddi decode base 43 //! 44 class DdiDecodeBase : public codec::DdiCodecBase 45 { 46 public: 47 //! 48 //! \brief Constructor 49 //! 50 DdiDecodeBase(); 51 52 //! 53 //! \brief Destructor 54 //! ~DdiDecodeBase()55 virtual ~DdiDecodeBase() 56 { 57 MOS_FreeMemory(m_ddiDecodeAttr); 58 m_ddiDecodeAttr = nullptr; 59 MOS_Delete(m_codechalSettings); 60 m_codechalSettings = nullptr; 61 #ifdef _DECODE_PROCESSING_SUPPORTED 62 MOS_FreeMemory(m_procBuf); 63 m_procBuf = nullptr; 64 #endif 65 } 66 67 //! \brief the type conversion to get the DDI_DECODE_CONTEXT 68 inline operator DDI_DECODE_CONTEXT *() 69 { 70 return m_decodeCtx; 71 } 72 73 //! 74 //! \brief Free the allocated resource related with the decode context 75 //! \details Free the private resource related with the decode context. 76 //! For example: DecodeParams, CodecHal and so on. 77 //! 78 //! \param [in] ctx 79 //! VADriverContextP 80 //! 81 virtual void DestroyContext(VADriverContextP ctx) = 0; 82 83 //! 84 //! \brief Get ready to decoding process for a target surface 85 //! \details It begins the decoding process for a specified target surface 86 //! 87 //! \param [in] ctx 88 //! VADriverContextP 89 //! \param [in] context 90 //! Already created context for the decoding process 91 //! \param [in] renderTarget 92 //! Specified target surface 93 //! 94 //! \return VAStatus 95 //! VA_STATUS_SUCCESS if success, else fail reason 96 //! 97 virtual VAStatus BeginPicture( 98 VADriverContextP ctx, 99 VAContextID context, 100 VASurfaceID renderTarget); 101 102 //! 103 //! \brief Send required buffers to decoding process 104 //! \details It sends needed buffers by the decoding to the driver 105 //! 106 //! \param [in] ctx 107 //! VADriverContextP 108 //! \param [in] context 109 //! Already created context for the decoding process 110 //! \param [in] buffers 111 //! Pointer to the buffer array 112 //! \param [in] numBuffers 113 //! Number of buffers in above array 114 //! 115 //! \return VAStatus 116 //! VA_STATUS_SUCCESS if success, else fail reason 117 //! 118 virtual VAStatus RenderPicture( 119 VADriverContextP ctx, 120 VAContextID context, 121 VABufferID *buffers, 122 int32_t numBuffers) = 0; 123 124 //! 125 //! \brief Init Params setting of EndPicture Function 126 //! \details The function is used to init EndPicture params 127 //! 128 //! \param [in] ctx 129 //! VADriverContextP 130 //! \param [in] context 131 //! Already created context for the process 132 //! 133 //! \return VAStatus 134 //! VA_STATUS_SUCCESS if success 135 //! 136 virtual VAStatus InitDecodeParams( 137 VADriverContextP ctx, 138 VAContextID context); 139 140 //! 141 //! \brief Get decode format 142 //! \details The function is used to get decode format 143 //! 144 //! \return MOS_FORMAT 145 //! VA_STATUS_SUCCESS if success 146 //! 147 virtual MOS_FORMAT GetFormat(); 148 149 //! 150 //! \brief Set common decode param setting for each codec 151 //! \details Set common decode param setting for each decode class 152 //! 153 //! \return VAStatus 154 //! VA_STATUS_SUCCESS if success 155 //! 156 virtual VAStatus SetDecodeParams(); 157 158 //! 159 //! \brief Make the end of rendering for a picture 160 //! \details The driver will flush/submit the decoding processing. 161 //! This call is non-blocking. The app can start another 162 //! Begin/Render/End sequence on a different render target 163 //! 164 //! \param [in] ctx 165 //! VADriverContextP 166 //! \param [in] context 167 //! Already created context for the process 168 //! 169 //! \return VAStatus 170 //! VA_STATUS_SUCCESS if success, else fail reason 171 //! 172 virtual VAStatus EndPicture( 173 VADriverContextP ctx, 174 VAContextID context); 175 176 //! 177 //! \brief the first step of Initializing internal structure of DdiDecodeBase 178 //! \details Initialize and allocate the internal structur of DdiDecodeBase. This 179 //! is the first step. 180 //! \param [in] linuxConfAttr 181 //! the config attr related with the linux caps 182 //! \return VAStatus 183 //! VA_STATUS_SUCCESS if success, else fail reason 184 185 VAStatus BasicInit(ConfigLinux *configItem); 186 //! 187 //! \brief the second step of Initializing internal structure of DdiDecodeBase 188 //! \details Initialize the internal structure of DdiDecodeBase base on 189 //! input width/height. It is step two 190 //! 191 //! \param [in] picWidth 192 //! int32_t 193 //! \param [in] picHeight 194 //! int32_t 195 //! 196 virtual void ContextInit( 197 int32_t picWidth, 198 int32_t picHeight) = 0; 199 200 //! 201 //! \brief Initialize the back-end CodecHal of DdiDecodeBase 202 //! \details Initialize the back-end CodecHal of DdiDecodeBase base on 203 //! the codec attribute. This is the third step of DdiMediDecode context 204 //! initialiazation. 205 //! 206 //! \param [in] mediaCtx 207 //! DDI_MEDIA_CONTEXT * type 208 //! \param [in] ptr 209 //! extra data 210 //! \return VAStatus 211 //! VA_STATUS_SUCCESS if success, else fail reason 212 virtual VAStatus CodecHalInit( 213 DDI_MEDIA_CONTEXT *mediaCtx, 214 void *ptr) = 0; 215 216 //! 217 //! \brief Get bit stream buffer index 218 //! \details Get bit stream buffer index 219 //! 220 //! \param [in] bufMgr 221 //! DDI_CODEC_COM_BUFFER_MGR *bufMgr 222 //! \param [in] buf 223 //! DDI_MEDIA_BUFFER *buf 224 //! \return i 225 //! buffer index 226 virtual int32_t GetBitstreamBufIndexFromBuffer( 227 DDI_CODEC_COM_BUFFER_MGR *bufMgr, 228 DDI_MEDIA_BUFFER *buf); 229 230 //! 231 //! \brief Allocate slice control buffer 232 //! \details Allocate slice control buffer 233 //! 234 //! \param [in] buf 235 //! DDI_MEDIA_BUFFER *buf 236 //! \return VAStatus 237 //! 238 virtual VAStatus AllocSliceControlBuffer( 239 DDI_MEDIA_BUFFER *buf) = 0; 240 241 //! 242 //! \brief Allocate Bs buffer 243 //! \details Allocate Bs buffer 244 //! 245 //! \param [in] bufMgr 246 //! DDI_CODEC_COM_BUFFER_MGR *bufMgr 247 //! \param [in] buf 248 //! DDI_MEDIA_BUFFER *buf 249 //! \return VAStatus 250 //! 251 virtual VAStatus AllocBsBuffer( 252 DDI_CODEC_COM_BUFFER_MGR *bufMgr, 253 DDI_MEDIA_BUFFER *buf); 254 255 //! 256 //! \brief Get Picture parameter size 257 //! \details Get Picture parameter size for each decoder 258 //! 259 //! \param [in] bufMgr 260 //! DDI_CODEC_COM_BUFFER_MGR *bufMgr 261 //! \return uint8_t* 262 //! GetPicParamBuf(DDI_CODEC_COM_BUFFER_MGR * bufMgr)263 virtual uint8_t* GetPicParamBuf( 264 DDI_CODEC_COM_BUFFER_MGR *bufMgr) 265 { 266 return (uint8_t*)bufMgr; 267 } 268 269 //! 270 //! \brief Create buffer in ddi decode context 271 //! \details Create related decode buffer in ddi decode base class 272 //! 273 //! \param [in] type 274 //! VABufferType type 275 //! \param [in] size 276 //! uint32_t size 277 //! \param [in] numElements 278 //! uint32_t numElements 279 //! \param [in] data 280 //! void data 281 //! \param [in] bufId 282 //! VABufferID bufId 283 //! 284 virtual VAStatus CreateBuffer( 285 VABufferType type, 286 uint32_t size, 287 uint32_t numElements, 288 void *data, 289 VABufferID *bufId); 290 291 //! 292 //! \brief if it is range extention 293 //! 294 //! \return true or false 295 //! IsRextProfile()296 virtual bool IsRextProfile() 297 { 298 return false; 299 } 300 301 //! \brief Combine the Bitstream Before decoding execution 302 //! \details Help to refine and combine the decoded input bitstream if 303 //! required. It is decided by the flag of IsSliceOverSize. 304 //! \param [in] mediaCtx 305 //! DDI_MEDIA_CONTEXT * type 306 //! 307 //! \return VAStatus 308 //! VA_STATUS_SUCCESS if success, else fail reason 309 //! 310 VAStatus DecodeCombineBitstream(DDI_MEDIA_CONTEXT *mediaCtx); 311 312 //! 313 //! \brief Check if the resolution is valid for a given decode config 314 //! 315 //! \param [in] configItem 316 //! Pointer to ConfigLinux 317 //! 318 //! \param [in] width 319 //! Specify the width for checking 320 //! 321 //! \param [in] height 322 //! Specify the height for checking 323 //! 324 //! \return VAStatus 325 //! VA_STATUS_SUCCESS if the resolution is supported 326 //! VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED if the resolution isn't valid 327 //! 328 VAStatus CheckDecodeResolution( 329 ConfigLinux *configItem, 330 uint32_t width, 331 uint32_t height); 332 333 //! 334 //! \brief Gets the decode standard 335 //! \return The decode standard \see m_standard 336 //! GetStandard()337 uint32_t GetStandard() { return m_codechalSettings ? m_codechalSettings->standard : CODECHAL_UNDEFINED; } 338 339 340 //! \brief the referred DDI_DECODE_CONTEXT object 341 //! \details This is allocated when creating one new instance. As it is 342 //! referred by other component, it should be free explicitly 343 //! outside of the instance. 344 DDI_DECODE_CONTEXT *m_decodeCtx = nullptr; 345 346 protected: 347 //! \brief the decode_config_attr related with Decode_CONTEXT 348 ConfigLinux *m_ddiDecodeAttr = nullptr; 349 350 //! \brief decoded picture buffer flag 351 bool m_withDpb = true; 352 353 //! 354 //! \brief return the Buffer offset for sliceGroup 355 //! \details return the Base offset for one given slice_data buffer. 356 //! It can be applied under the following two scenarios: 357 //! Multiple slice parameters are included in one slice_param_buf 358 //! Only one slice parameter is in one slice_param_buf. 359 //! 360 //! \param [in] sliceGroup 361 //! the index of slice_parameter group 362 //! 363 //! \return return the base offset 364 //! 365 uint32_t GetBsBufOffset(int32_t sliceGroup); 366 367 //! \brief Parse the processing buffer if needed. 368 //! \details Helps to parse the Video-post processing buffer for Decoding 369 //! 370 //! \param [in] mediaCtx 371 //! DDI_MEDIA_CONTEXT * type 372 //! \param [in] bufAddr 373 //! the address of passed buf 374 //! 375 //! \return VAStatus 376 //! VA_STATUS_SUCCESS if success, else fail reason 377 //! 378 VAStatus ParseProcessingBuffer( 379 DDI_MEDIA_CONTEXT *mediaCtx, 380 void *bufAddr); 381 382 //! 383 //! \brief Create the back-end CodecHal of DdiDecodeBase 384 //! \details Create the back-end CodecHal of DdiDecodeBase base on 385 //! the codec attribute. This is one common function, which is called by CreateCodecHal. 386 //! 387 //! \param [in] mediaCtx 388 //! DDI_MEDIA_CONTEXT * type 389 //! \param [in] ptr 390 //! extra data 391 //! \param [in] standardInfo 392 //! CODECHAL_STANDARD_INFO * 393 //! 394 //! \return VAStatus 395 //! VA_STATUS_SUCCESS if success, else fail reason 396 397 VAStatus CreateCodecHal( 398 DDI_MEDIA_CONTEXT *mediaCtx, 399 void *ptr, 400 _CODECHAL_STANDARD_INFO *standardInfo); 401 402 //! 403 //! \brief Get dummy reference from DPB 404 //! \details Get dummy reference from DPB for error concealment 405 //! 406 //! \param [in] decodeCtx 407 //! DDI_DECODE_CONTEXT * type 408 //! 409 //! \return void 410 void GetDummyReferenceFromDPB( 411 DDI_DECODE_CONTEXT *decodeCtx); 412 413 //! 414 //! \brief Report decode mode 415 //! \details Report decode mode to UFKEY_INTERNAL 416 //! 417 //! \param [in] wMode 418 //! CODECHAL_MODE 419 //! 420 //! \return void 421 void ReportDecodeMode( 422 uint16_t wMode); 423 424 //! \brief Use EU path to do the scaling 425 //! \details When VD+SFC are not supported, it will call into VPhal to do scaling 426 //! 427 //! \param [in] ctx 428 //! VADriverContextP * type 429 //! \param [in] context 430 //! Already created context for the process 431 //! 432 //! \return VAStatus 433 //! VA_STATUS_SUCCESS if success, else fail reason 434 VAStatus ExtraDownScaling( 435 VADriverContextP ctx, 436 VAContextID context); 437 438 //! \brief Init dummy reference 439 //! \details Init dummy reference for decode 440 //! 441 //! \param [in/out] decoder 442 //! Codechal decoder 443 //! 444 //! \return VAStatus 445 //! VA_STATUS_SUCCESS if success, else fail reason 446 VAStatus InitDummyReference(CodechalDecode& decoder); 447 448 //! \brief Init dummy reference 449 //! \details Init dummy reference for decode 450 //! 451 //! \param [in/out] decoder 452 //! DecodePipelineAdapter decoder 453 //! 454 //! \return VAStatus 455 //! VA_STATUS_SUCCESS if success, else fail reason 456 VAStatus InitDummyReference(DecodePipelineAdapter& decoder); 457 458 //! \brief the type of decode base class 459 MOS_SURFACE m_destSurface; //!<Destination Surface structure 460 uint32_t m_groupIndex; //!<global Group 461 uint16_t m_picWidthInMB; //!<Picture Width in MB width count 462 uint16_t m_picHeightInMB; //!<Picture Height in MB height count 463 uint32_t m_width; //!<Picture Width 464 uint32_t m_height; //!<Picture Height 465 bool m_streamOutEnabled; //!<Stream Out enable flag 466 uint32_t m_sliceParamBufNum; //!<Slice parameter Buffer Number 467 uint32_t m_sliceCtrlBufNum; //!<Slice control Buffer Number 468 uint32_t m_decProcessingType; //!<Decode Processing type 469 CodechalSetting *m_codechalSettings = nullptr; //!<Codechal Settings 470 static const uint32_t m_decDefaultMaxWidth = 4096; 471 static const uint32_t m_decDefaultMaxHeight = 4096; 472 473 #ifdef _DECODE_PROCESSING_SUPPORTED 474 bool m_requireInputRegion = false; 475 VAProcPipelineParameterBuffer *m_procBuf = nullptr; //!< Process parameters for vp sfc input 476 #endif 477 MEDIA_CLASS_DEFINE_END(decode__DdiDecodeBase) 478 }; 479 480 } // namespace decode 481 #endif /* _DDI_DECODE_BASE_SPECIFIC_H_ */ 482