1 /* 2 * Copyright (c) 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 ddi_encode_vp9_specific.h 25 //! \brief Defines class for DDI media vp9 encode 26 //! 27 28 29 #ifndef __DDI_ENCODER_VP9_SPECIFIC_H__ 30 #define __DDI_ENCODER_VP9_SPECIFIC_H__ 31 32 #include "ddi_encode_base_specific.h" 33 namespace encode 34 { 35 //! 36 //! \class DdiEncodeVp9 37 //! \brief Ddi encode VP9 38 //! 39 class DdiEncodeVp9 : public encode::DdiEncodeBase 40 { 41 public: 42 //! 43 //! \brief Constructor 44 //! DdiEncodeVp9()45 DdiEncodeVp9(){}; 46 47 //! 48 //! \brief Destructor 49 //! 50 ~DdiEncodeVp9(); 51 52 //! 53 //! \brief Initialize Encode Context and CodecHal Setting for Vp9 54 //! 55 //! \param [out] codecHalSettings 56 //! Pointer to CodechalSetting * 57 //! 58 //! \return VAStatus 59 //! VA_STATUS_SUCCESS if success, else fail reason 60 //! 61 VAStatus ContextInitialize( 62 CodechalSetting *codecHalSettings) override; 63 64 //! 65 //! \brief Parse buffer to the server. 66 //! 67 //! \param [in] ctx 68 //! Pointer to VADriverContextP 69 //! \param [in] context 70 //! VA context ID 71 //! \param [in] buffers 72 //! Pointer to VABufferID 73 //! \param [in] numBuffers 74 //! Number of buffers 75 //! 76 //! \return VAStatus 77 //! VA_STATUS_SUCCESS if success, else fail reason 78 //! 79 VAStatus RenderPicture( 80 VADriverContextP ctx, 81 VAContextID context, 82 VABufferID *buffers, 83 int32_t numBuffers) override; 84 85 protected: 86 //! 87 //! \brief Reset Encode Context At Frame Level 88 //! 89 //! \return VAStatus 90 //! VA_STATUS_SUCCESS if success, else fail reason 91 //! 92 VAStatus ResetAtFrameLevel() override; 93 94 //! 95 //! \brief Encode in CodecHal for Vp9 96 //! 97 //! \param [in] numSlices 98 //! Number of slice data structures 99 //! 100 //! \return VAStatus 101 //! VA_STATUS_SUCCESS if success, else fail reason 102 //! 103 VAStatus EncodeInCodecHal( 104 uint32_t numSlices) override; 105 106 //! 107 //! \brief Parse Picture Parameter buffer to Encode Context 108 //! 109 //! \param [in] mediaCtx 110 //! Pointer to DDI_MEDIA_CONTEXT 111 //! \param [in] ptr 112 //! Pointer to Picture Parameter buffer 113 //! 114 //! \return VAStatus 115 //! VA_STATUS_SUCCESS if success, else fail reason 116 //! 117 VAStatus ParsePicParams( 118 DDI_MEDIA_CONTEXT *mediaCtx, 119 void *ptr) override; 120 121 uint32_t getSequenceParameterBufferSize() override; 122 123 uint32_t getPictureParameterBufferSize() override; 124 125 uint32_t getQMatrixBufferSize() override; 126 127 //! 128 //! \brief Parse QMatrix buffer to Encode Context 129 //! 130 //! \param [in] ptr 131 //! Pointer to QMatrix buffer 132 //! 133 //! \return VAStatus 134 //! VA_STATUS_SUCCESS if success, else fail reason 135 //! 136 VAStatus Qmatrix( 137 void *ptr); 138 139 //! 140 //! \brief Parse Sequence Parameter buffer to Encode Context 141 //! 142 //! \param [in] ptr 143 //! Pointer to Sequence Parameter buffer 144 //! 145 //! \return VAStatus 146 //! VA_STATUS_SUCCESS if success, else fail reason 147 //! 148 VAStatus ParseSeqParams( 149 void *ptr); 150 151 //! 152 //! \brief Parse Packed Header Parameter buffer to Encode Context 153 //! 154 //! \param [in] ptr 155 //! Pointer to Packed Header Parameter buffer 156 //! 157 //! \return VAStatus 158 //! VA_STATUS_SUCCESS if success, else fail reason 159 //! 160 VAStatus ParsePackedHeaderParams( 161 void *ptr); 162 163 //! 164 //! \brief Parse Packed Header Data buffer to Encode Context 165 //! 166 //! \param [in] ptr 167 //! Pointer to Packed Header Data buffer 168 //! 169 //! \return VAStatus 170 //! VA_STATUS_SUCCESS if success, else fail reason 171 //! 172 VAStatus ParsePackedHeaderData( 173 void *ptr); 174 175 //! 176 //! \brief Parse Misc Parameter buffer to Encode Context 177 //! 178 //! \param [in] ptr 179 //! Pointer to Misc Parameter buffer 180 //! 181 //! \return VAStatus 182 //! VA_STATUS_SUCCESS if success, else fail reason 183 //! 184 VAStatus ParseMiscParams( 185 void *ptr); 186 187 //! 188 //! \brief Parse Segment Map Parameter buffer to Encode Context 189 //! 190 //! \param [in] buf 191 //! Pointer to Segment Map Parameter buffer 192 //! 193 //! \return VAStatus 194 //! VA_STATUS_SUCCESS if success, else fail reason 195 //! 196 VAStatus ParseSegMapParams( 197 DDI_MEDIA_BUFFER *buf); 198 199 //! 200 //! \brief Report extra encode status for completed coded buffer. 201 //! 202 //! \param [in] encodeStatusReportData 203 //! Pointer to encode status reported by Codechal 204 //! \param [out] codedBufferSegment 205 //! Pointer to coded buffer segment 206 //! 207 //! \return VAStatus 208 //! VA_STATUS_SUCCESS if success, else fail reason 209 //! 210 VAStatus ReportExtraStatus( 211 EncodeStatusReportData *encodeStatusReportData, 212 VACodedBufferSegment *codedBufferSegment) override; 213 214 private: 215 //! 216 //! \brief Setup Codec Picture for Vp9 217 //! 218 //! \param [in] mediaCtx 219 //! Pointer to DDI_MEDIA_CONTEXT 220 //! \param [in] rtTbl 221 //! Pointer to DDI_CODEC_RENDER_TARGET_TABLE 222 //! \param [in] surfaceID 223 //! VASurface index 224 //! \param [in] picReference 225 //! Reference picture flag 226 //! \param [out] codecHalPic 227 //! Pointer to CODEC_PICTURE 228 //! 229 //! \return void 230 //! 231 void SetupCodecPicture( 232 DDI_MEDIA_CONTEXT *mediaCtx, 233 DDI_CODEC_RENDER_TARGET_TABLE *rtTbl, 234 CODEC_PICTURE *codecHalPic, 235 VASurfaceID surfaceID, 236 bool picReference); 237 238 //! 239 //! \brief Parse Misc Param Buffer Quality Level to Encode Context 240 //! 241 //! \param [in] data 242 //! Pointer to Misc Param Buffer Quality Level 243 //! 244 //! \return VAStatus 245 //! VA_STATUS_SUCCESS if success, else fail reason 246 //! 247 VAStatus ParseMiscParamQualityLevel( 248 void *data); 249 250 //! 251 //! \brief Parse Misc Param VBV Data buffer to Encode Context 252 //! 253 //! \param [in] data 254 //! Pointer to Misc Param VBV Data buffer 255 //! 256 //! \return VAStatus 257 //! VA_STATUS_SUCCESS if success, else fail reason 258 //! 259 VAStatus ParseMiscParamVBV( 260 void *data); 261 262 //! 263 //! \brief Parse Misc Param FrameRate Data buffer to Encode Context 264 //! 265 //! \param [in] data 266 //! Pointer to Misc Param FR Data buffer 267 //! 268 //! \return VAStatus 269 //! VA_STATUS_SUCCESS if success, else fail reason 270 //! 271 VAStatus ParseMiscParamFR( 272 void *data); 273 274 //! 275 //! \brief Parse Misc Param RateControl Data buffer to Encode Context 276 //! 277 //! \param [in] data 278 //! Pointer to Misc Param RC Data buffer 279 //! 280 //! \return VAStatus 281 //! VA_STATUS_SUCCESS if success, else fail reason 282 //! 283 VAStatus ParseMiscParamRC( 284 void *data); 285 286 //! 287 //! \brief Parse Misc Param Enc Quality to Encode Context 288 //! 289 //! \param [in] data 290 //! Pointer to Misc Param Private Data buffer 291 //! 292 //! \return VAStatus 293 //! VA_STATUS_SUCCESS if success, else fail reason 294 //! 295 VAStatus ParseMiscParamEncQuality( 296 void *data); 297 298 //! 299 //! \brief Parse Misc Parameter Temporal Layer Params buffer to Encode Context 300 //! 301 //! \param [in] data 302 //! Pointer to Misc Parameter Temporal Layer Params buffer 303 //! 304 //! \return VAStatus 305 //! VA_STATUS_SUCCESS if success, else fail reason 306 //! 307 VAStatus ParseMiscParameterTemporalLayerParams( 308 void *data); 309 310 CODEC_VP9_ENCODE_SEGMENT_PARAMS *m_segParams = nullptr; //!< Segment parameters. 311 312 VACodedBufferVP9Status *m_codedBufStatus = nullptr; //!< .Coded buffer status 313 314 private: 315 316 //! 317 //! \brief Return the CODECHAL_FUNCTION type for give profile and entrypoint 318 //! 319 //! \param [in] profile 320 //! Specify the VAProfile 321 //! 322 //! \param [in] entrypoint 323 //! Specify the VAEntrypoint 324 //! 325 //! \return Codehal function 326 //! 327 CODECHAL_FUNCTION GetEncodeCodecFunction(VAProfile profile, VAEntrypoint entrypoint, bool bVDEnc) override; 328 //! 329 //! \brief Return internal encode mode for given profile and entrypoint 330 //! 331 //! \param [in] profile 332 //! Specify the VAProfile 333 //! 334 //! \param [in] entrypoint 335 //! Specify the VAEntrypoint 336 //! 337 //! \return Codehal mode 338 //! 339 CODECHAL_MODE GetEncodeCodecMode(VAProfile profile, VAEntrypoint entrypoint) override; 340 341 uint32_t savedTargetBit[CODECHAL_ENCODE_VP9_MAX_NUM_TEMPORAL_LAYERS] = { 0 }; 342 uint32_t savedMaxBitRate[CODECHAL_ENCODE_VP9_MAX_NUM_TEMPORAL_LAYERS] = { 0 }; 343 344 uint32_t savedFrameRate[CODECHAL_ENCODE_VP9_MAX_NUM_TEMPORAL_LAYERS] = { 0 }; 345 346 uint32_t savedGopSize = 0; 347 348 uint32_t savedHrdSize = 0; 349 350 uint32_t savedHrdBufFullness = 0; 351 352 bool headerInsertFlag = 0; 353 354 uint32_t lastPackedHeaderType = 0; 355 356 uint8_t vp9TargetUsage = 0; 357 358 bool isSegParamsChanged = false; 359 360 MEDIA_CLASS_DEFINE_END(encode__DdiEncodeVp9) 361 }; 362 363 } 364 365 #endif //__DDI_ENCODER_VP9_SPECIFIC_H__ 366