1 /* 2 * Copyright (c) 2017-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 //! \file mhw_vdbox_vdenc_generic.h 24 //! \brief MHW interface for constructing Vdenc commands for the Vdbox engine 25 //! \details Defines the interfaces for constructing MHW Vdbox Vdenc commands across all platforms 26 //! 27 28 #ifndef _MHW_VDBOX_VDENC_GENERIC_H_ 29 #define _MHW_VDBOX_VDENC_GENERIC_H_ 30 31 #include "mhw_vdbox_vdenc_interface.h" 32 33 //! MHW Vdbox Vdenc generic interface 34 /*! 35 This class defines the shared Vdenc command construction functions across all platforms as templates 36 */ 37 template <class TVdencCmds> 38 class MhwVdboxVdencInterfaceGeneric : public MhwVdboxVdencInterface 39 { 40 protected: 41 //! 42 //! \brief Constructor 43 //! MhwVdboxVdencInterfaceGeneric(PMOS_INTERFACE osInterface)44 MhwVdboxVdencInterfaceGeneric(PMOS_INTERFACE osInterface) : MhwVdboxVdencInterface(osInterface) 45 { 46 MHW_FUNCTION_ENTER; 47 } 48 49 //! 50 //! \brief Destructor 51 //! ~MhwVdboxVdencInterfaceGeneric()52 virtual ~MhwVdboxVdencInterfaceGeneric() {} 53 AddVdPipelineFlushCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_VD_PIPE_FLUSH_PARAMS params)54 MOS_STATUS AddVdPipelineFlushCmd( 55 PMOS_COMMAND_BUFFER cmdBuffer, 56 PMHW_VDBOX_VD_PIPE_FLUSH_PARAMS params) 57 { 58 MHW_FUNCTION_ENTER; 59 60 MHW_MI_CHK_NULL(m_osInterface); 61 MHW_MI_CHK_NULL(cmdBuffer); 62 MHW_MI_CHK_NULL(params); 63 64 typename TVdencCmds::VD_PIPELINE_FLUSH_CMD cmd; 65 66 cmd.DW1.HevcPipelineDone = params->Flags.bWaitDoneHEVC; 67 cmd.DW1.VdencPipelineDone = params->Flags.bWaitDoneVDENC; 68 cmd.DW1.MflPipelineDone = params->Flags.bWaitDoneMFL; 69 cmd.DW1.MfxPipelineDone = params->Flags.bWaitDoneMFX; 70 cmd.DW1.VdCommandMessageParserDone = params->Flags.bWaitDoneVDCmdMsgParser; 71 cmd.DW1.HevcPipelineCommandFlush = params->Flags.bFlushHEVC; 72 cmd.DW1.VdencPipelineCommandFlush = params->Flags.bFlushVDENC; 73 cmd.DW1.MflPipelineCommandFlush = params->Flags.bFlushMFL; 74 cmd.DW1.MfxPipelineCommandFlush = params->Flags.bFlushMFX; 75 76 MHW_MI_CHK_STATUS(m_osInterface->pfnAddCommand(cmdBuffer, &cmd, sizeof(cmd))); 77 78 return MOS_STATUS_SUCCESS; 79 } 80 AddVdencConstQPStateCmd(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VDBOX_VDENC_CQPT_STATE_PARAMS params)81 MOS_STATUS AddVdencConstQPStateCmd( 82 PMOS_COMMAND_BUFFER cmdBuffer, 83 PMHW_VDBOX_VDENC_CQPT_STATE_PARAMS params) 84 { 85 MHW_FUNCTION_ENTER; 86 87 MHW_MI_CHK_NULL(m_osInterface); 88 MHW_MI_CHK_NULL(cmdBuffer); 89 MHW_MI_CHK_NULL(params); 90 91 typename TVdencCmds::VDENC_CONST_QPT_STATE_CMD cmd; 92 93 cmd.DW1_10.QpLambdaArrayIndex[0] = 1; 94 cmd.DW1_10.QpLambdaArrayIndex[1] = 1; 95 cmd.DW1_10.QpLambdaArrayIndex[2] = 1; 96 cmd.DW1_10.QpLambdaArrayIndex[3] = 1; 97 cmd.DW1_10.QpLambdaArrayIndex[4] = 1; 98 cmd.DW1_10.QpLambdaArrayIndex[5] = 1; 99 cmd.DW1_10.QpLambdaArrayIndex[6] = 1; 100 cmd.DW1_10.QpLambdaArrayIndex[7] = 2; 101 cmd.DW1_10.QpLambdaArrayIndex[8] = 2; 102 cmd.DW1_10.QpLambdaArrayIndex[9] = 2; 103 cmd.DW1_10.QpLambdaArrayIndex[10] = 2; 104 cmd.DW1_10.QpLambdaArrayIndex[11] = 3; 105 cmd.DW1_10.QpLambdaArrayIndex[12] = 3; 106 cmd.DW1_10.QpLambdaArrayIndex[13] = 3; 107 cmd.DW1_10.QpLambdaArrayIndex[14] = 4; 108 cmd.DW1_10.QpLambdaArrayIndex[15] = 4; 109 cmd.DW1_10.QpLambdaArrayIndex[16] = 5; 110 cmd.DW1_10.QpLambdaArrayIndex[17] = 5; 111 cmd.DW1_10.QpLambdaArrayIndex[18] = 6; 112 cmd.DW1_10.QpLambdaArrayIndex[19] = 7; 113 cmd.DW1_10.QpLambdaArrayIndex[20] = 7; 114 cmd.DW1_10.QpLambdaArrayIndex[21] = 8; 115 cmd.DW1_10.QpLambdaArrayIndex[22] = 9; 116 cmd.DW1_10.QpLambdaArrayIndex[23] = 10; 117 cmd.DW1_10.QpLambdaArrayIndex[24] = 12; 118 cmd.DW1_10.QpLambdaArrayIndex[25] = 13; 119 cmd.DW1_10.QpLambdaArrayIndex[26] = 15; 120 cmd.DW1_10.QpLambdaArrayIndex[27] = 17; 121 cmd.DW1_10.QpLambdaArrayIndex[28] = 19; 122 cmd.DW1_10.QpLambdaArrayIndex[29] = 21; 123 cmd.DW1_10.QpLambdaArrayIndex[30] = 23; 124 cmd.DW1_10.QpLambdaArrayIndex[31] = 26; 125 cmd.DW1_10.QpLambdaArrayIndex[32] = 30; 126 cmd.DW1_10.QpLambdaArrayIndex[33] = 33; 127 cmd.DW1_10.QpLambdaArrayIndex[34] = 37; 128 cmd.DW1_10.QpLambdaArrayIndex[35] = 42; 129 cmd.DW1_10.QpLambdaArrayIndex[36] = 47; 130 cmd.DW1_10.QpLambdaArrayIndex[37] = 53; 131 cmd.DW1_10.QpLambdaArrayIndex[38] = 59; 132 cmd.DW1_10.QpLambdaArrayIndex[39] = 66; 133 cmd.DW11.QpLambdaArrayIndex40 = 74; 134 cmd.DW11.QpLambdaArrayIndex41 = 83; 135 136 if (params->wPictureCodingType == P_TYPE) 137 { 138 cmd.DW12_24.SkipThresholdArrayIndex[0] = 0; 139 cmd.DW12_24.SkipThresholdArrayIndex[1] = 0; 140 cmd.DW12_24.SkipThresholdArrayIndex[2] = 0; 141 cmd.DW12_24.SkipThresholdArrayIndex[3] = 0; 142 cmd.DW12_24.SkipThresholdArrayIndex[4] = 2; 143 cmd.DW12_24.SkipThresholdArrayIndex[5] = 4; 144 cmd.DW12_24.SkipThresholdArrayIndex[6] = 7; 145 cmd.DW12_24.SkipThresholdArrayIndex[7] = 11; 146 cmd.DW12_24.SkipThresholdArrayIndex[8] = 17; 147 cmd.DW12_24.SkipThresholdArrayIndex[9] = 25; 148 cmd.DW12_24.SkipThresholdArrayIndex[10] = 35; 149 cmd.DW12_24.SkipThresholdArrayIndex[11] = 50; 150 cmd.DW12_24.SkipThresholdArrayIndex[12] = 68; 151 cmd.DW12_24.SkipThresholdArrayIndex[13] = 91; 152 cmd.DW12_24.SkipThresholdArrayIndex[14] = 119; 153 cmd.DW12_24.SkipThresholdArrayIndex[15] = 153; 154 cmd.DW12_24.SkipThresholdArrayIndex[16] = 194; 155 cmd.DW12_24.SkipThresholdArrayIndex[17] = 241; 156 cmd.DW12_24.SkipThresholdArrayIndex[18] = 296; 157 cmd.DW12_24.SkipThresholdArrayIndex[19] = 360; 158 cmd.DW12_24.SkipThresholdArrayIndex[20] = 432; 159 cmd.DW12_24.SkipThresholdArrayIndex[21] = 513; 160 cmd.DW12_24.SkipThresholdArrayIndex[22] = 604; 161 cmd.DW12_24.SkipThresholdArrayIndex[23] = 706; 162 cmd.DW12_24.SkipThresholdArrayIndex[24] = 819; 163 cmd.DW12_24.SkipThresholdArrayIndex[25] = 944; 164 165 if (!params->bBlockBasedSkip) 166 { 167 for (uint8_t i = 0; i < 26; i++) 168 { 169 cmd.DW12_24.SkipThresholdArrayIndex[i] *= 3; 170 } 171 } 172 else if (!params->bTransform8x8Flag) 173 { 174 for (uint8_t i = 0; i < 26; i++) 175 { 176 cmd.DW12_24.SkipThresholdArrayIndex[i] /= 2; 177 } 178 } 179 180 if (params->bFTQEnabled) 181 { 182 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[0] = 0x02; 183 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[1] = 0x02; 184 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[2] = 0x03; 185 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[3] = 0x04; 186 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[4] = 0x04; 187 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[5] = 0x05; 188 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[6] = 0x07; 189 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[7] = 0x09; 190 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[8] = 0x0b; 191 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[9] = 0x0e; 192 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[10] = 0x12; 193 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[11] = 0x14; 194 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[12] = 0x18; 195 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[13] = 0x1d; 196 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[14] = 0x20; 197 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[15] = 0x25; 198 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[16] = 0x2a; 199 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[17] = 0x34; 200 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[18] = 0x39; 201 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[19] = 0x3f; 202 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[20] = 0x4e; 203 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[21] = 0x51; 204 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[22] = 0x5b; 205 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[23] = 0x63; 206 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[24] = 0x6f; 207 cmd.DW26_38.SicForwardTransformCoeffThresholdMatrix0ArrayIndex[25] = 0x7f; 208 209 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[0] = 0x03; 210 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[1] = 0x04; 211 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[2] = 0x05; 212 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[3] = 0x05; 213 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[4] = 0x07; 214 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[5] = 0x09; 215 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[6] = 0x0b; 216 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[7] = 0x0e; 217 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[8] = 0x12; 218 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[9] = 0x17; 219 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[10] = 0x1c; 220 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[11] = 0x21; 221 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[12] = 0x27; 222 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[13] = 0x2c; 223 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[14] = 0x33; 224 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[15] = 0x3b; 225 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[16] = 0x41; 226 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[17] = 0x51; 227 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[18] = 0x5c; 228 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[19] = 0x1a; 229 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[20] = 0x1e; 230 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[21] = 0x21; 231 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[22] = 0x22; 232 cmd.DW40_45.SicForwardTransformCoeffThresholdMatrix135ArrayIndexN[23] = 0x26; 233 cmd.DW46.SicForwardTransformCoeffThresholdMatrix135ArrayIndex24 = 0x2c; 234 cmd.DW46.SicForwardTransformCoeffThresholdMatrix135ArrayIndex25 = 0x30; 235 236 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[0] = 0x02; 237 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[1] = 0x02; 238 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[2] = 0x03; 239 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[3] = 0x04; 240 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[4] = 0x04; 241 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[5] = 0x05; 242 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[6] = 0x07; 243 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[7] = 0x09; 244 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[8] = 0x0b; 245 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[9] = 0x0e; 246 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[10] = 0x12; 247 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[11] = 0x14; 248 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[12] = 0x18; 249 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[13] = 0x1d; 250 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[14] = 0x20; 251 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[15] = 0x25; 252 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[16] = 0x2a; 253 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[17] = 0x34; 254 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[18] = 0x39; 255 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[19] = 0x0f; 256 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[20] = 0x13; 257 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[21] = 0x14; 258 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[22] = 0x16; 259 cmd.DW47_52.SicForwardTransformCoeffThresholdMatrix2ArrayIndex[23] = 0x18; 260 cmd.DW53.SicForwardTransformCoeffThresholdMatrix2ArrayIndex24 = 0x1b; 261 cmd.DW53.SicForwardTransformCoeffThresholdMatrix2ArrayIndex25 = 0x1f; 262 263 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[0] = 0x04; 264 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[1] = 0x05; 265 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[2] = 0x06; 266 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[3] = 0x09; 267 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[4] = 0x0b; 268 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[5] = 0x0d; 269 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[6] = 0x12; 270 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[7] = 0x16; 271 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[8] = 0x1b; 272 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[9] = 0x23; 273 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[10] = 0x2c; 274 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[11] = 0x33; 275 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[12] = 0x3d; 276 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[13] = 0x45; 277 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[14] = 0x4f; 278 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[15] = 0x5b; 279 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[16] = 0x66; 280 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[17] = 0x7f; 281 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[18] = 0x8e; 282 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[19] = 0x2a; 283 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[20] = 0x2f; 284 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[21] = 0x32; 285 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[22] = 0x37; 286 cmd.DW54_59.SicForwardTransformCoeffThresholdMatrix46ArrayIndexN[23] = 0x3c; 287 cmd.DW60.SicForwardTransformCoeffThresholdMatrix46ArrayIndex24 = 0x45; 288 cmd.DW60.SicForwardTransformCoeffThresholdMatrix46ArrayIndex25 = 0x4c; 289 } 290 } 291 292 MHW_MI_CHK_STATUS(m_osInterface->pfnAddCommand(cmdBuffer, &cmd, sizeof(cmd))); 293 294 return MOS_STATUS_SUCCESS; 295 } 296 297 public: GetVdencAvcImgStateSize()298 inline uint32_t GetVdencAvcImgStateSize() 299 { 300 return TVdencCmds::VDENC_IMG_STATE_CMD::byteSize; 301 } 302 GetVdencCmd3Size()303 inline uint32_t GetVdencCmd3Size() 304 { 305 return 0; 306 } 307 GetVdencAvcCostStateSize()308 inline uint32_t GetVdencAvcCostStateSize() 309 { 310 return 0; 311 } 312 GetVdencAvcSlcStateSize()313 inline uint32_t GetVdencAvcSlcStateSize() 314 { 315 return 0; 316 } 317 }; 318 319 #endif