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