| /* |
| * Copyright (c) 2017, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| //! |
| //! \file codechal_encode_avc_g10.cpp |
| //! \brief This file implements the C++ class/interface for Gen10 platform's AVC |
| //! DualPipe encoding to be used across CODECHAL components. |
| //! |
| #include "codechal_encode_avc_g10.h" |
| #ifndef _FULL_OPEN_SOURCE |
| #include "igcodeckrn_g10.h" |
| #endif |
| #if USE_CODECHAL_DEBUG_TOOL |
| #include "codechal_debug_encode_par_g10.h" |
| #include "mhw_vdbox_mfx_hwcmd_g10_X.h" |
| #endif |
| |
| enum MbEncIdOffset |
| { |
| mbEncOffsetI = 0, |
| mbEncOffsetP = 1, |
| mbEncOffsetB = 2, |
| mbEncTargetUsage = 3 |
| }; |
| |
| enum FrameBrcUpdateBindingTableOffset |
| { |
| frameBrcUpdateHistory = 0, |
| frameBrcUpdatePakStatisticsOutput = 1, |
| frameBrcUpdateImageStateRead = 2, |
| frameBrcUpdateImageStateWrite = 3, |
| frameBrcUpdateMbEncCurbeWrite = 4, |
| frameBrcUpdateDistortion = 5, |
| frameBrcUpdateConstantData = 6, |
| frameBrcUpdateMbStat = 7, |
| frameBrcUpdateMvStat = 8, |
| frameBrcUpdateNumSurfaces = 9 |
| }; |
| |
| enum MbBrcUpdateBindingTableOffset |
| { |
| mbBrcUpdateHistory = 0, |
| mbBrcUpdateMbQP = 1, |
| mbBrcUpdateROI = 2, |
| mbBrcUpdateMbStat = 3, |
| mbBrcUpdateNumSurfaces = 4 |
| }; |
| |
| enum WeightPreditionBindingTableOffset |
| { |
| wpInputRefSurface = 0, |
| wpOutputScaledSurface = 1, |
| wpNumSurfaces = 2 |
| }; |
| |
| enum MbEncBindingTableOffset |
| { |
| mbEncMfcAvcPakObj = 0, |
| mbEncIndirectMvData = 1, |
| mbEncBrcDistortion = 2, |
| mbEncCurrentY = 3, |
| mbEncCurrentUV = 4, |
| mbEncMbSpecificData = 5, |
| mbEncAuxVmeOutput = 6, |
| mbEncRefPicSeletcL0 = 7, |
| mbEncMvDataFromMe = 8, |
| mbEnc4xMeDistortion = 9, |
| mbEncSliceMapData = 10, |
| mbEncFwdMbData = 11, |
| mbEncFwdMvData = 12, |
| mbEncMbQP = 13, |
| mbEncMbBrcConstData = 14, |
| mbEncVmeInterPredCurrPic = 15, |
| mbEncVmeInterPredFwdRefPicIdx0L0 = 16, |
| mbEncVmeInterPredBwdRefPicIdx0L1 = 17, |
| mbEncVmeInterPredFwdRefPicIdx1L0 = 18, |
| mbEncVmeInterPredBwdRefPicIdx1L1 = 19, |
| mbEncVmeInterPredFwdRefPicIdx2L0 = 20, |
| mbEncReserved0 = 21, |
| mbEncVmeInterPredFwdRefPicIdx3L0 = 22, |
| mbEncReserved1 = 23, |
| mbEncVmeInterPredFwdRefPicIdx4L0 = 24, |
| mbEncReserved2 = 25, |
| mbEncVmeInterPredFwdRefPicIdx5L0 = 26, |
| mbEncReserved3 = 27, |
| mbEncVmeInterPredFwdRefPicIdx6L0 = 28, |
| mbEncReserved4 = 29, |
| mbEncVmeInterPredFwdRefPicIdx7L0 = 30, |
| mbEncReserved5 = 31, |
| mbEncVmeInterPredMultiRefCurrPic = 32, |
| mbEncVmeInterPredMultiRefBwdPicIdx0L1 = 33, |
| mbEncReserved6 = 34, |
| mbEncVmeInterPredMultiRefBwdPicIdx1L1 = 35, |
| mbEncReserved7 = 36, |
| mbEncMbStats = 37, |
| mbEncMadData = 38, |
| mbEncBrcCurbeData = 39, |
| mbEncForceNonSkipMbMap = 40, |
| mbEncAdv = 41, |
| mbEncSfdCostTable = 42, |
| mbEncNumSurfaces = 43 |
| }; |
| |
| const int32_t CodechalEncodeAvcEncG10::m_brcBindingTableCount[CODECHAL_ENCODE_BRC_IDX_NUM] = { |
| CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES, |
| frameBrcUpdateNumSurfaces, |
| CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES, |
| mbEncNumSurfaces, |
| CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_NUM_SURFACES, |
| mbBrcUpdateNumSurfaces |
| }; |
| |
| // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes |
| const uint8_t CodechalEncodeAvcEncG10::m_brcConstantDataTables[576] = |
| { |
| 0x01, 0x02, 0x03, 0x05, 0x06, 0x01, 0x01, 0x02, 0x03, 0x05, 0x00, 0x00, 0x01, 0x02, 0x03, 0xff, |
| 0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xfe, 0xff, 0x00, 0x01, 0xfd, 0xfd, |
| 0xff, 0xff, 0x00, 0xfb, 0xfd, 0xfe, 0xff, 0xff, 0xfa, 0xfb, 0xfd, 0xfe, 0xff, 0x00, 0x04, 0x1e, |
| 0x3c, 0x50, 0x78, 0x8c, 0xc8, 0xff, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x01, 0x02, 0x03, 0x05, 0x06, 0x01, 0x01, 0x02, 0x03, 0x05, 0x00, 0x01, 0x01, 0x02, 0x03, 0xff, |
| 0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0xff, |
| 0xff, 0xff, 0x00, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0xfb, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0x04, 0x1e, |
| 0x3c, 0x50, 0x78, 0x8c, 0xc8, 0xff, 0x04, 0x05, 0x06, 0x06, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x01, 0x01, 0x02, 0x04, 0x05, 0x01, 0x01, 0x01, 0x02, 0x04, 0x00, 0x00, 0x01, 0x01, 0x02, 0xff, |
| 0x00, 0x00, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0xff, |
| 0xff, 0xff, 0x00, 0xfd, 0xfe, 0xff, 0xff, 0x00, 0xfb, 0xfc, 0xfe, 0xff, 0xff, 0x00, 0x02, 0x14, |
| 0x28, 0x46, 0x82, 0xa0, 0xc8, 0xff, 0x04, 0x04, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, |
| 0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, |
| 0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff, |
| 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, |
| 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, |
| 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, |
| 0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, |
| 0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff, |
| 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, |
| 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, |
| 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, |
| 0x03, 0x04, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x03, 0xff, 0xff, 0x00, 0x00, 0x00, |
| 0x01, 0x02, 0x02, 0x02, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0xfe, 0xff, 0xff, |
| 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, |
| 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfe, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, |
| 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| }; |
| |
| const uint8_t CodechalEncodeAvcEncG10::m_ftq25[64] = //27 value 4 dummy |
| { |
| 0, //qp=0 |
| 0, 0, 0, 0, 0, 0, //qp=1,2;3,4;5,6; |
| 1, 1, 3, 3, 6, 6, 8, 8, 11, 11, //qp=7,8;9,10;11,12;13,14;15;16 |
| 13, 13, 16, 16, 19, 19, 22, 22, 26, 26, //qp=17,18;19,20;21,22;23,24;25,26 |
| 30, 30, 34, 34, 39, 39, 44, 44, 50, 50, //qp=27,28;29,30;31,32;33,34;35,36 |
| 56, 56, 62, 62, 69, 69, 77, 77, 85, 85, //qp=37,38;39,40;41,42;43,44;45,46 |
| 94, 94, 104, 104, 115, 115, //qp=47,48;49,50;51 |
| 0, 0, 0, 0, 0, 0, 0, 0 //dummy |
| }; |
| |
| const uint16_t CodechalEncodeAvcEncG10::m_lambdData[256] = { |
| 9, 7, 9, 6, 12, 8, 12, 8, 15, 10, 15, 9, 19, 13, 19, 12, 24, |
| 17, 24, 15, 30, 21, 30, 19, 38, 27, 38, 24, 48, 34, 48, 31, 60, 43, |
| 60, 39, 76, 54, 76, 49, 96, 68, 96, 62, 121, 85, 121, 78, 153, 108, 153, |
| 99, 193, 135, 193, 125, 243, 171, 243, 157, 306, 215, 307, 199, 385, 271, 387, 251, |
| 485, 342, 488, 317, 612, 431, 616, 400, 771, 543, 777, 505, 971, 684, 981, 638, 1224, |
| 862, 1237, 806, 1542, 1086, 1562, 1018, 1991, 1402, 1971, 1287, 2534, 1785, 2488, 1626, 3077, 2167, |
| 3141, 2054, 3982, 2805, 3966, 2596, 4887, 3442, 5007, 3281, 6154, 4335, 6322, 4148, 7783, 5482, 7984, |
| 5243, 9774, 6885, 10082, 6629, 12489, 8797, 12733, 8382, 15566, 10965, 16082, 10599, 19729, 13897, 20313, 13404, |
| 24797, 17467, 25660, 16954, 31313, 22057, 32415, 21445, 39458, 27795, 40953, 27129, 49594, 34935, 51742, 34323, 61440, |
| 43987, 61440, 43428, 61440, 55462, 61440, 54954, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, |
| 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, |
| 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, 61440, |
| 61440, 61440, 61440, 61440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 0, |
| }; |
| |
| // AVC MBEnc RefCost tables, index [CodingType][QP] |
| // QP is from 0 - 51, pad it to 64 since BRC needs each subarray size to be 128bytes |
| const uint16_t CodechalEncodeAvcEncG10::m_refCostMultiRefQp[NUM_PIC_TYPES][64] = |
| { |
| // I-frame |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| // P-slice |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| //B-slice |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000 |
| } |
| }; |
| |
| const uint32_t CODECHAL_ENCODE_AVC_TrellisQuantizationRounding[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| //mark 2 |
| const uint32_t CodechalEncodeAvcEncG10::m_multiPred[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 0, 0, 0, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::m_multiRefDisableQPCheck[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| const CODECHAL_ENCODE_AVC_IPCM_THRESHOLD CodechalEncodeAvcEncG10::m_IPCMThresholdTable[5] = |
| { |
| { 2, 3000 }, |
| { 4, 3600 }, |
| { 6, 5000 }, |
| { 10, 7500 }, |
| { 18, 9000 }, |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::m_intraModeCostForHighTextureMB[CODEC_AVC_NUM_QP] |
| { |
| 0x00000303, 0x00000304, 0x00000404, 0x00000405, 0x00000505, 0x00000506, 0x00000607, 0x00000708, |
| 0x00000809, 0x0000090a, 0x00000a0b, 0x00000b0c, 0x00000c0e, 0x00000e18, 0x00001819, 0x00001918, |
| 0x00001a19, 0x00001b19, 0x00001d19, 0x00001e18, 0x00002818, 0x00002918, 0x00002a18, 0x00002b19, |
| 0x00002d18, 0x00002e18, 0x00003818, 0x00003918, 0x00003a18, 0x00003b0f, 0x00003d0e, 0x00003e0e, |
| 0x0000480e, 0x0000490e, 0x00004a0e, 0x00004b0d, 0x00004d0d, 0x00004e0d, 0x0000580e, 0x0000590e, |
| 0x00005a0e, 0x00005b0d, 0x00005d0c, 0x00005e0b, 0x0000680a, 0x00006908, 0x00006a09, 0x00006b0a, |
| 0x00006d0b, 0x00006e0d, 0x0000780e, 0x00007918 |
| }; |
| |
| class CodechalEncodeAvcEncG10::BrcInitResetCurbe |
| { |
| public: |
| BrcInitResetCurbe() |
| { |
| m_dw0.Value = 0; |
| m_dw1.Value = 0; |
| m_dw2.Value = 0; |
| m_dw3.Value = 0; |
| m_dw4.Value = 0; |
| m_dw5.Value = 0; |
| m_dw6.Value = 0; |
| m_dw7.Value = 0; |
| m_dw8.Value = 0; |
| m_dw9.Value = 0; |
| m_dw10.Value = 0; |
| m_dw11.AVBRConvergence = 0; |
| m_dw11.MinQP = 1; |
| m_dw12.MaxQP = 51; |
| m_dw12.NoSlices = 0; |
| m_dw13.InstantRateThreshold0ForP = 40; |
| m_dw13.InstantRateThreshold1ForP = 60; |
| m_dw13.InstantRateThreshold2ForP = 80; |
| m_dw13.InstantRateThreshold3ForP = 120; |
| m_dw14.InstantRateThreshold0ForB = 35; |
| m_dw14.InstantRateThreshold1ForB = 60; |
| m_dw14.InstantRateThreshold2ForB = 80; |
| m_dw14.InstantRateThreshold3ForB = 120; |
| m_dw15.InstantRateThreshold0ForI = 40; |
| m_dw15.InstantRateThreshold1ForI = 60; |
| m_dw15.InstantRateThreshold2ForI = 90; |
| m_dw15.InstantRateThreshold3ForI = 115; |
| m_dw16.Value = 0; |
| m_dw17.Value = 0; |
| m_dw18.Value = 0; |
| m_dw19.Value = 0; |
| m_dw20.Value = 0; |
| m_dw21.Value = 0; |
| m_dw22.Value = 0; |
| m_dw23.Value = 0; |
| m_dw24.Value = 0; |
| m_dw25.Value = 0; |
| m_dw26.Value = 0; |
| m_dw27.Value = 0; |
| m_dw28.Value = 0; |
| m_dw29.Value = 0; |
| m_dw30.Value = 0; |
| m_dw31.Value = 0; |
| m_dw32.Value = 0; |
| m_dw33.Value = 0; |
| } |
| |
| union |
| { |
| struct |
| { |
| uint32_t ProfileLevelMaxFrame; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw0; |
| |
| union |
| { |
| struct |
| { |
| uint32_t InitBufFullInBits; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw1; |
| |
| union |
| { |
| struct |
| { |
| uint32_t BufSizeInBits; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw2; |
| |
| union |
| { |
| struct |
| { |
| uint32_t AverageBitRate; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw3; |
| |
| union |
| { |
| struct |
| { |
| uint32_t MaxBitRate; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw4; |
| |
| union |
| { |
| struct |
| { |
| uint32_t MinBitRate; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw5; |
| |
| union |
| { |
| struct |
| { |
| uint32_t FrameRateM; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw6; |
| |
| union |
| { |
| struct |
| { |
| uint32_t FrameRateD; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw7; |
| |
| union |
| { |
| struct |
| { |
| uint32_t BRCFlag : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t GopP : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw8; |
| |
| union |
| { |
| struct |
| { |
| uint32_t GopB : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t FrameWidthInBytes : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw9; |
| |
| union |
| { |
| struct |
| { |
| uint32_t FrameHeightInBytes : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t AVBRAccuracy : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw10; |
| |
| union |
| { |
| struct |
| { |
| uint32_t AVBRConvergence : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t MinQP : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw11; |
| |
| union |
| { |
| struct |
| { |
| uint32_t MaxQP : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t NoSlices : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw12; |
| |
| union |
| { |
| struct |
| { |
| uint32_t InstantRateThreshold0ForP : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t InstantRateThreshold1ForP : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t InstantRateThreshold2ForP : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t InstantRateThreshold3ForP : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw13; |
| |
| union |
| { |
| struct |
| { |
| uint32_t InstantRateThreshold0ForB : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t InstantRateThreshold1ForB : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t InstantRateThreshold2ForB : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t InstantRateThreshold3ForB : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw14; |
| |
| union |
| { |
| struct |
| { |
| uint32_t InstantRateThreshold0ForI : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t InstantRateThreshold1ForI : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t InstantRateThreshold2ForI : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t InstantRateThreshold3ForI : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw15; |
| |
| union |
| { |
| struct |
| { |
| uint32_t DeviationThreshold0ForPandB : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t DeviationThreshold1ForPandB : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t DeviationThreshold2ForPandB : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t DeviationThreshold3ForPandB : MOS_BITFIELD_RANGE(24, 31); // Signed byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw16; |
| |
| union |
| { |
| struct |
| { |
| uint32_t DeviationThreshold4ForPandB : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t DeviationThreshold5ForPandB : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t DeviationThreshold6ForPandB : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t DeviationThreshold7ForPandB : MOS_BITFIELD_RANGE(24, 31); // Signed byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw17; |
| |
| union |
| { |
| struct |
| { |
| uint32_t DeviationThreshold0ForVBR : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t DeviationThreshold1ForVBR : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t DeviationThreshold2ForVBR : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t DeviationThreshold3ForVBR : MOS_BITFIELD_RANGE(24, 31); // Signed byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw18; |
| |
| union |
| { |
| struct |
| { |
| uint32_t DeviationThreshold4ForVBR : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t DeviationThreshold5ForVBR : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t DeviationThreshold6ForVBR : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t DeviationThreshold7ForVBR : MOS_BITFIELD_RANGE(24, 31); // Signed byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw19; |
| |
| union |
| { |
| struct |
| { |
| uint32_t DeviationThreshold0ForI : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t DeviationThreshold1ForI : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t DeviationThreshold2ForI : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t DeviationThreshold3ForI : MOS_BITFIELD_RANGE(24, 31); // Signed byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw20; |
| |
| union |
| { |
| struct |
| { |
| uint32_t DeviationThreshold4ForI : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t DeviationThreshold5ForI : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t DeviationThreshold6ForI : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t DeviationThreshold7ForI : MOS_BITFIELD_RANGE(24, 31); // Signed byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw21; |
| |
| union |
| { |
| struct |
| { |
| uint32_t InitialQPForI : MOS_BITFIELD_RANGE(0, 7); // Signed byte |
| uint32_t InitialQPForP : MOS_BITFIELD_RANGE(8, 15); // Signed byte |
| uint32_t InitialQPForB : MOS_BITFIELD_RANGE(16, 23); // Signed byte |
| uint32_t SlidingWindowSize : MOS_BITFIELD_RANGE(24, 31); // unsigned byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw22; |
| |
| union |
| { |
| struct |
| { |
| uint32_t ACQP; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw23; |
| |
| union |
| { |
| struct |
| { |
| uint32_t LongTermInterval : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t Reserved : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw24; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw25; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw26; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw27; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw28; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw29; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw30; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw31; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexhistorybuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| |
| } m_dw32; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexdistortionbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw33; |
| }; |
| |
| class CodechalEncodeAvcEncG10::BrcFrameUpdateCurbe |
| { |
| public: |
| BrcFrameUpdateCurbe() |
| { |
| m_dw0.Value = 0; |
| m_dw1.Value = 0; |
| m_dw2.Value = 0; |
| m_dw3.startGAdjFrame0 = 10; |
| m_dw3.startGAdjFrame1 = 50; |
| m_dw4.startGAdjFrame2 = 100; |
| m_dw4.startGAdjFrame3 = 150; |
| m_dw5.Value = 0; |
| m_dw6.Value = 0; |
| m_dw7.Value = 0; |
| m_dw8.StartGlobalAdjustMult0 = 1; |
| m_dw8.StartGlobalAdjustMult1 = 1; |
| m_dw8.StartGlobalAdjustMult2 = 3; |
| m_dw8.StartGlobalAdjustMult3 = 2; |
| m_dw9.StartGlobalAdjustMult4 = 1; |
| m_dw9.StartGlobalAdjustDiv0 = 40; |
| m_dw9.StartGlobalAdjustDiv1 = 5; |
| m_dw9.StartGlobalAdjustDiv2 = 5; |
| m_dw10.StartGlobalAdjustDiv3 = 3; |
| m_dw10.StartGlobalAdjustDiv4 = 1; |
| m_dw10.QPThreshold0 = 7; |
| m_dw10.QPThreshold1 = 18; |
| m_dw11.QPThreshold2 = 25; |
| m_dw11.QPThreshold3 = 37; |
| m_dw11.gRateRatioThreshold0 = 40; |
| m_dw11.gRateRatioThreshold1 = 75; |
| m_dw12.gRateRatioThreshold2 = 97; |
| m_dw12.gRateRatioThreshold3 = 103; |
| m_dw12.gRateRatioThreshold4 = 125; |
| m_dw12.gRateRatioThreshold5 = 160; |
| m_dw13.gRateRatioThresholdQP0 = -3; |
| m_dw13.gRateRatioThresholdQP1 = -2; |
| m_dw13.gRateRatioThresholdQP2 = -1; |
| m_dw13.gRateRatioThresholdQP3 = 0; |
| m_dw14.gRateRatioThresholdQP4 = 1; |
| m_dw14.gRateRatioThresholdQP5 = 2; |
| m_dw14.gRateRatioThresholdQP6 = 3; |
| m_dw14.QPIndexOfCurPic = 0xFF; |
| m_dw15.Value = 0; |
| m_dw16.Value = 0; |
| m_dw17.Value = 0; |
| m_dw18.Value = 0; |
| m_dw19.Value = 0; |
| m_dw20.Value = 0; |
| m_dw21.Value = 0; |
| m_dw22.Value = 0; |
| m_dw23.Value = 0; |
| m_dw24.Value = 0; |
| m_dw25.Value = 0; |
| m_dw26.Value = 0; |
| m_dw27.Value = 0; |
| m_dw28.Value = 0; |
| m_dw29.Value = 0; |
| m_dw30.Value = 0; |
| m_dw31.Value = 0; |
| m_dw32.Value = 0; |
| } |
| |
| union |
| { |
| struct |
| { |
| uint32_t TargetSize; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw0; |
| |
| union |
| { |
| struct |
| { |
| uint32_t FrameNumber; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw1; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SizeofPicHeaders; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw2; |
| |
| union |
| { |
| struct |
| { |
| uint32_t startGAdjFrame0 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t startGAdjFrame1 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw3; |
| |
| union |
| { |
| struct |
| { |
| uint32_t startGAdjFrame2 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t startGAdjFrame3 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw4; |
| |
| union |
| { |
| struct |
| { |
| uint32_t TargetSizeFlag : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t BRCFlag : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t MaxNumPAKs : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t CurrFrameType : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw5; |
| |
| union |
| { |
| struct |
| { |
| uint32_t NumSkipFrames : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t MinimumQP : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t MaximumQP : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t EnableForceToSkip : MOS_BITFIELD_BIT(24); |
| uint32_t EnableSlidingWindow : MOS_BITFIELD_BIT(25); |
| uint32_t EnableExtremLowDelay : MOS_BITFIELD_BIT(26); |
| uint32_t DisableVarCompute : MOS_BITFIELD_BIT(27); |
| uint32_t Reserved : MOS_BITFIELD_RANGE(28, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw6; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SizeSkipFrames; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw7; |
| |
| union |
| { |
| struct |
| { |
| uint32_t StartGlobalAdjustMult0 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t StartGlobalAdjustMult1 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t StartGlobalAdjustMult2 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t StartGlobalAdjustMult3 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw8; |
| |
| union |
| { |
| struct |
| { |
| uint32_t StartGlobalAdjustMult4 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t StartGlobalAdjustDiv0 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t StartGlobalAdjustDiv1 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t StartGlobalAdjustDiv2 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw9; |
| |
| union |
| { |
| struct |
| { |
| uint32_t StartGlobalAdjustDiv3 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t StartGlobalAdjustDiv4 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t QPThreshold0 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t QPThreshold1 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw10; |
| |
| union |
| { |
| struct |
| { |
| uint32_t QPThreshold2 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t QPThreshold3 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t gRateRatioThreshold0 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t gRateRatioThreshold1 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw11; |
| |
| union |
| { |
| struct |
| { |
| uint32_t gRateRatioThreshold2 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t gRateRatioThreshold3 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t gRateRatioThreshold4 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t gRateRatioThreshold5 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw12; |
| |
| union |
| { |
| struct |
| { |
| uint32_t gRateRatioThresholdQP0 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t gRateRatioThresholdQP1 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t gRateRatioThresholdQP2 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t gRateRatioThresholdQP3 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw13; |
| |
| union |
| { |
| struct |
| { |
| uint32_t gRateRatioThresholdQP4 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t gRateRatioThresholdQP5 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t gRateRatioThresholdQP6 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t QPIndexOfCurPic : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw14; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t EnableROI : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t RoundingIntra : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t RoundingInter : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw15; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw16; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw17; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw18; |
| |
| union |
| { |
| struct |
| { |
| uint32_t UserMaxFrame; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw19; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw20; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw21; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw22; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw23; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexBRChistorybuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw24; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexPreciousPAKstatisticsoutputbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw25; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexAVCIMGstateinputbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw26; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexAVCIMGstateoutputbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw27; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexAVC_Encbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw28; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexAVCDISTORTIONbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw29; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexBRCconstdatabuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw30; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexMBStatsBuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw31; |
| |
| union |
| { |
| struct |
| { |
| uint32_t SurfaceIndexMotionvectorbuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw32; |
| }; |
| |
| class CodechalEncodeAvcEncG10::MbBrcUpdateCurbe |
| { |
| public: |
| MbBrcUpdateCurbe() |
| { |
| m_dw0.Value = 0; |
| m_dw1.Value = 0; |
| m_dw2.Value = 0; |
| m_dw3.Value = 0; |
| m_dw4.Value = 0; |
| m_dw5.Value = 0; |
| m_dw6.Value = 0; |
| m_dw7.Value = 0; |
| m_dw8.Value = 0; |
| m_dw9.Value = 0; |
| m_dw10.Value = 0; |
| m_dw11.Value = 0; |
| } |
| |
| union |
| { |
| struct |
| { |
| uint32_t CurrFrameType : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t EnableROI : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t ROIRatio : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t Reserved : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw0; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw1; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw2; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw3; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw4; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw5; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw6; |
| |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw7; |
| |
| union |
| { |
| struct |
| { |
| uint32_t HistorybufferIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw8; |
| |
| union |
| { |
| struct |
| { |
| uint32_t MBQPbufferIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw9; |
| |
| union |
| { |
| struct |
| { |
| uint32_t ROIbufferIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw10; |
| |
| union |
| { |
| struct |
| { |
| uint32_t MBstatisticalbufferIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } m_dw11; |
| } ; |
| |
| class CodechalEncodeAvcEncG10::MbEncCurbe |
| { |
| public: |
| enum MbEncCurbeType |
| { |
| typeIDist, |
| typeIFrame, |
| typeIField, |
| typePFrame, |
| typePField, |
| typeBFrame, |
| typeBField |
| }; |
| static const uint32_t m_mbEncCurbeNormalIFrame[88]; |
| static const uint32_t m_mbEncCurbeNormalIField[88]; |
| static const uint32_t m_mbEncCurbeNormalPFrame[88]; |
| static const uint32_t m_mbEncCurbeNormalPField[88]; |
| static const uint32_t m_mbEncCurbeNormalBFrame[88]; |
| static const uint32_t m_mbEncCurbeNormalBField[88]; |
| static const uint32_t m_mbEncCurbeIFrameDist[88]; |
| |
| MbEncCurbe(MbEncCurbeType curbeType) |
| { |
| switch (curbeType) |
| { |
| case typeIDist: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeIFrameDist), |
| m_mbEncCurbeIFrameDist, |
| sizeof(m_mbEncCurbeIFrameDist)); |
| break; |
| |
| case typeIFrame: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeNormalIFrame), |
| m_mbEncCurbeNormalIFrame, |
| sizeof(m_mbEncCurbeNormalIFrame)); |
| break; |
| |
| case typeIField: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeNormalIField), |
| m_mbEncCurbeNormalIField, |
| sizeof(m_mbEncCurbeNormalIField)); |
| break; |
| |
| case typePFrame: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeNormalPFrame), |
| m_mbEncCurbeNormalPFrame, |
| sizeof(m_mbEncCurbeNormalPFrame)); |
| break; |
| |
| case typePField: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeNormalPField), |
| m_mbEncCurbeNormalPField, |
| sizeof(m_mbEncCurbeNormalPField)); |
| break; |
| |
| case typeBFrame: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeNormalBFrame), |
| m_mbEncCurbeNormalBFrame, |
| sizeof(m_mbEncCurbeNormalBFrame)); |
| break; |
| |
| case typeBField: |
| MOS_SecureMemcpy( |
| (void *)&m_encCurbe, |
| sizeof(m_mbEncCurbeNormalBField), |
| m_mbEncCurbeNormalBField, |
| sizeof(m_mbEncCurbeNormalBField)); |
| break; |
| |
| default: |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid curbe type."); |
| break; |
| } |
| } |
| |
| struct |
| { |
| // DW0 |
| union |
| { |
| struct |
| { |
| uint32_t SkipModeEn : MOS_BITFIELD_BIT(0); |
| uint32_t AdaptiveEn : MOS_BITFIELD_BIT(1); |
| uint32_t BiMixDis : MOS_BITFIELD_BIT(2); |
| uint32_t : MOS_BITFIELD_RANGE(3, 4); |
| uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT(5); |
| uint32_t : MOS_BITFIELD_BIT(6); |
| uint32_t T8x8FlagForInterEn: MOS_BITFIELD_BIT(7); |
| uint32_t : MOS_BITFIELD_RANGE(8, 23); |
| uint32_t EarlyImeStop : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW0; |
| |
| // DW1 |
| union |
| { |
| struct |
| { |
| uint32_t MaxNumMVs : MOS_BITFIELD_RANGE(0, 5); |
| uint32_t ExtendedMvCostRange : MOS_BITFIELD_BIT(6); |
| uint32_t : MOS_BITFIELD_RANGE(7, 15); |
| uint32_t BiWeight : MOS_BITFIELD_RANGE(16, 21); |
| uint32_t : MOS_BITFIELD_RANGE(22, 27); |
| uint32_t UniMixDisable : MOS_BITFIELD_BIT(28); |
| uint32_t : MOS_BITFIELD_RANGE(29, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW1; |
| |
| // DW2 |
| union |
| { |
| struct |
| { |
| uint32_t LenSP : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t MaxNumSU : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t PicWidth : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW2; |
| |
| // DW3 |
| union |
| { |
| struct |
| { |
| uint32_t SrcSize : MOS_BITFIELD_RANGE(0, 1); |
| uint32_t : MOS_BITFIELD_RANGE(2, 3); |
| uint32_t MbTypeRemap : MOS_BITFIELD_RANGE(4, 5); |
| uint32_t SrcAccess : MOS_BITFIELD_BIT(6); |
| uint32_t RefAccess : MOS_BITFIELD_BIT(7); |
| uint32_t SearchCtrl : MOS_BITFIELD_RANGE(8, 10); |
| uint32_t DualSearchPathOption : MOS_BITFIELD_BIT(11); |
| uint32_t SubPelMode : MOS_BITFIELD_RANGE(12, 13); |
| uint32_t SkipType : MOS_BITFIELD_BIT(14); |
| uint32_t DisableFieldCacheAlloc : MOS_BITFIELD_BIT(15); |
| uint32_t InterChromaMode : MOS_BITFIELD_BIT(16); |
| uint32_t FTEnable : MOS_BITFIELD_BIT(17); |
| uint32_t BMEDisableFBR : MOS_BITFIELD_BIT(18); |
| uint32_t BlockBasedSkipEnable : MOS_BITFIELD_BIT(19); |
| uint32_t InterSAD : MOS_BITFIELD_RANGE(20, 21); |
| uint32_t IntraSAD : MOS_BITFIELD_RANGE(22, 23); |
| uint32_t SubMbPartMask : MOS_BITFIELD_RANGE(24, 30); |
| uint32_t : MOS_BITFIELD_BIT(31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW3; |
| |
| // DW4 |
| union |
| { |
| struct |
| { |
| uint32_t PicHeightMinus1 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t MvRestrictionInSliceEnable : MOS_BITFIELD_BIT(16); |
| uint32_t DeltaMvEnable : MOS_BITFIELD_BIT(17); |
| uint32_t TrueDistortionEnable : MOS_BITFIELD_BIT(18); |
| uint32_t EnableWavefrontOptimization : MOS_BITFIELD_BIT(19); |
| uint32_t EnableFBRBypass : MOS_BITFIELD_BIT(20); |
| uint32_t EnableIntraCostScalingForStaticFrame : MOS_BITFIELD_BIT(21); |
| uint32_t EnableIntraRefresh : MOS_BITFIELD_BIT(22); |
| uint32_t Reserved : MOS_BITFIELD_BIT(23); |
| uint32_t EnableDirtyRect : MOS_BITFIELD_BIT(24); |
| uint32_t bCurFldIDR : MOS_BITFIELD_BIT(25); |
| uint32_t ConstrainedIntraPredFlag : MOS_BITFIELD_BIT(26); |
| uint32_t FieldParityFlag : MOS_BITFIELD_BIT(27); |
| uint32_t HMEEnable : MOS_BITFIELD_BIT(28); |
| uint32_t PictureType : MOS_BITFIELD_RANGE(29, 30); |
| uint32_t UseActualRefQPValue : MOS_BITFIELD_BIT(31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW4; |
| |
| // DW5 |
| union |
| { |
| struct |
| { |
| uint32_t SliceMbHeight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t RefWidth : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t RefHeight : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW5; |
| |
| // DW6 |
| union |
| { |
| struct |
| { |
| uint32_t BatchBufferEnd : MOS_BITFIELD_RANGE(0, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW6; |
| |
| // DW7 |
| union |
| { |
| struct |
| { |
| uint32_t IntraPartMask : MOS_BITFIELD_RANGE(0, 4); |
| uint32_t NonSkipZMvAdded : MOS_BITFIELD_BIT(5); |
| uint32_t NonSkipModeAdded : MOS_BITFIELD_BIT(6); |
| uint32_t LumaIntraSrcCornerSwap : MOS_BITFIELD_BIT(7); |
| uint32_t : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t MVCostScaleFactor : MOS_BITFIELD_RANGE(16, 17); |
| uint32_t BilinearEnable : MOS_BITFIELD_BIT(18); |
| uint32_t SrcFieldPolarity : MOS_BITFIELD_BIT(19); |
| uint32_t WeightedSADHAAR : MOS_BITFIELD_BIT(20); |
| uint32_t AConlyHAAR : MOS_BITFIELD_BIT(21); |
| uint32_t RefIDCostMode : MOS_BITFIELD_BIT(22); |
| uint32_t : MOS_BITFIELD_BIT(23); |
| uint32_t SkipCenterMask : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW7; |
| |
| struct |
| { |
| // DW8 |
| union |
| { |
| struct |
| { |
| uint32_t Mode0Cost : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t Mode1Cost : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t Mode2Cost : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t Mode3Cost : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW8; |
| |
| // DW9 |
| union |
| { |
| struct |
| { |
| uint32_t Mode4Cost : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t Mode5Cost : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t Mode6Cost : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t Mode7Cost : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW9; |
| |
| // DW10 |
| union |
| { |
| struct |
| { |
| uint32_t Mode8Cost : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t Mode9Cost : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t RefIDCost : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t ChromaIntraModeCost : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW10; |
| |
| // DW11 |
| union |
| { |
| struct |
| { |
| uint32_t MV0Cost : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t MV1Cost : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t MV2Cost : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t MV3Cost : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW11; |
| |
| // DW12 |
| union |
| { |
| struct |
| { |
| uint32_t MV4Cost : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t MV5Cost : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t MV6Cost : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t MV7Cost : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW12; |
| |
| // DW13 |
| union |
| { |
| struct |
| { |
| uint32_t QpPrimeY : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t QpPrimeCb : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t QpPrimeCr : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t TargetSizeInWord : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW13; |
| |
| // DW14 |
| union |
| { |
| struct |
| { |
| uint32_t SICFwdTransCoeffThreshold_0 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t SICFwdTransCoeffThreshold_1 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t SICFwdTransCoeffThreshold_2 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW14; |
| |
| // DW15 |
| union |
| { |
| struct |
| { |
| uint32_t SICFwdTransCoeffThreshold_3 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t SICFwdTransCoeffThreshold_4 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t SICFwdTransCoeffThreshold_5 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t SICFwdTransCoeffThreshold_6 : MOS_BITFIELD_RANGE(24, 31); // Highest Freq |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW15; |
| } ModeMvCost; |
| |
| struct |
| { |
| // DW16 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_0; |
| SearchPathDelta SPDelta_1; |
| SearchPathDelta SPDelta_2; |
| SearchPathDelta SPDelta_3; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW16; |
| |
| // DW17 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_4; |
| SearchPathDelta SPDelta_5; |
| SearchPathDelta SPDelta_6; |
| SearchPathDelta SPDelta_7; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW17; |
| |
| // DW18 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_8; |
| SearchPathDelta SPDelta_9; |
| SearchPathDelta SPDelta_10; |
| SearchPathDelta SPDelta_11; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW18; |
| |
| // DW19 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_12; |
| SearchPathDelta SPDelta_13; |
| SearchPathDelta SPDelta_14; |
| SearchPathDelta SPDelta_15; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW19; |
| |
| // DW20 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_16; |
| SearchPathDelta SPDelta_17; |
| SearchPathDelta SPDelta_18; |
| SearchPathDelta SPDelta_19; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW20; |
| |
| // DW21 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_20; |
| SearchPathDelta SPDelta_21; |
| SearchPathDelta SPDelta_22; |
| SearchPathDelta SPDelta_23; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW21; |
| |
| // DW22 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_24; |
| SearchPathDelta SPDelta_25; |
| SearchPathDelta SPDelta_26; |
| SearchPathDelta SPDelta_27; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW22; |
| |
| // DW23 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_28; |
| SearchPathDelta SPDelta_29; |
| SearchPathDelta SPDelta_30; |
| SearchPathDelta SPDelta_31; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW23; |
| |
| // DW24 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_32; |
| SearchPathDelta SPDelta_33; |
| SearchPathDelta SPDelta_34; |
| SearchPathDelta SPDelta_35; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW24; |
| |
| // DW25 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_36; |
| SearchPathDelta SPDelta_37; |
| SearchPathDelta SPDelta_38; |
| SearchPathDelta SPDelta_39; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW25; |
| |
| // DW26 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_40; |
| SearchPathDelta SPDelta_41; |
| SearchPathDelta SPDelta_42; |
| SearchPathDelta SPDelta_43; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW26; |
| |
| // DW27 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_44; |
| SearchPathDelta SPDelta_45; |
| SearchPathDelta SPDelta_46; |
| SearchPathDelta SPDelta_47; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW27; |
| |
| // DW28 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_48; |
| SearchPathDelta SPDelta_49; |
| SearchPathDelta SPDelta_50; |
| SearchPathDelta SPDelta_51; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW28; |
| |
| // DW29 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_52; |
| SearchPathDelta SPDelta_53; |
| SearchPathDelta SPDelta_54; |
| SearchPathDelta SPDelta_55; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW29; |
| |
| // DW30 |
| union |
| { |
| struct |
| { |
| uint32_t Intra4x4ModeMask : MOS_BITFIELD_RANGE(0, 8); |
| uint32_t: MOS_BITFIELD_RANGE(9, 15); |
| uint32_t Intra8x8ModeMask : MOS_BITFIELD_RANGE(16, 24); |
| uint32_t: MOS_BITFIELD_RANGE(25, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW30; |
| |
| // DW31 |
| union |
| { |
| struct |
| { |
| uint32_t Intra16x16ModeMask : MOS_BITFIELD_RANGE(0, 3); |
| uint32_t IntraChromaModeMask : MOS_BITFIELD_RANGE(4, 7); |
| uint32_t IntraComputeType : MOS_BITFIELD_RANGE(8, 9); |
| uint32_t: MOS_BITFIELD_RANGE(10, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW31; |
| } SPDelta; |
| |
| // DW32 |
| union |
| { |
| struct |
| { |
| uint32_t SkipVal : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t MultiPredL0Disable : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t MultiPredL1Disable : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW32; |
| |
| // DW33 |
| union |
| { |
| struct |
| { |
| uint32_t Intra16x16NonDCPredPenalty : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t Intra8x8NonDCPredPenalty : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t Intra4x4NonDCPredPenalty : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW33; |
| |
| // DW34 |
| union |
| { |
| struct |
| { |
| uint32_t List0RefID0FieldParity : MOS_BITFIELD_BIT(0); |
| uint32_t List0RefID1FieldParity : MOS_BITFIELD_BIT(1); |
| uint32_t List0RefID2FieldParity : MOS_BITFIELD_BIT(2); |
| uint32_t List0RefID3FieldParity : MOS_BITFIELD_BIT(3); |
| uint32_t List0RefID4FieldParity : MOS_BITFIELD_BIT(4); |
| uint32_t List0RefID5FieldParity : MOS_BITFIELD_BIT(5); |
| uint32_t List0RefID6FieldParity : MOS_BITFIELD_BIT(6); |
| uint32_t List0RefID7FieldParity : MOS_BITFIELD_BIT(7); |
| uint32_t List1RefID0FrameFieldFlag : MOS_BITFIELD_BIT(8); |
| uint32_t List1RefID1FrameFieldFlag : MOS_BITFIELD_BIT(9); |
| uint32_t IntraRefreshEn : MOS_BITFIELD_RANGE(10, 11); |
| uint32_t ArbitraryNumMbsPerSlice : MOS_BITFIELD_BIT(12); |
| uint32_t TQEnable : MOS_BITFIELD_BIT(13); |
| uint32_t ForceNonSkipMbEnable : MOS_BITFIELD_BIT(14); |
| uint32_t DisableEncSkipCheck : MOS_BITFIELD_BIT(15); |
| uint32_t EnableDirectBiasAdjustment : MOS_BITFIELD_BIT(16); |
| uint32_t bForceToSkip : MOS_BITFIELD_BIT(17); |
| uint32_t EnableGlobalMotionBiasAdjustment : MOS_BITFIELD_BIT(18); |
| uint32_t EnableAdaptiveTxDecision : MOS_BITFIELD_BIT(19); |
| uint32_t EnablePerMBStaticCheck : MOS_BITFIELD_BIT(20); |
| uint32_t EnableAdaptiveSearchWindowSize : MOS_BITFIELD_BIT(21); |
| uint32_t RemoveIntraRefreshOverlap : MOS_BITFIELD_BIT(22); |
| uint32_t CQPFlag : MOS_BITFIELD_BIT(23); |
| uint32_t List1RefID0FieldParity : MOS_BITFIELD_BIT(24); |
| uint32_t List1RefID1FieldParity : MOS_BITFIELD_BIT(25); |
| uint32_t MADEnableFlag : MOS_BITFIELD_BIT(26); |
| uint32_t ROIEnableFlag : MOS_BITFIELD_BIT(27); |
| uint32_t EnableMBFlatnessChkOptimization : MOS_BITFIELD_BIT(28); |
| uint32_t bDirectMode : MOS_BITFIELD_BIT(29); |
| uint32_t MBBrcEnable : MOS_BITFIELD_BIT(30); |
| uint32_t bOriginalBff : MOS_BITFIELD_BIT(31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW34; |
| |
| // DW35 |
| union |
| { |
| struct |
| { |
| uint32_t PanicModeMBThreshold : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t SmallMbSizeInWord : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t LargeMbSizeInWord : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW35; |
| |
| // DW36 |
| union |
| { |
| struct |
| { |
| uint32_t NumRefIdxL0MinusOne : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t HMECombinedExtraSUs : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t NumRefIdxL1MinusOne : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t : MOS_BITFIELD_RANGE(24, 26); |
| uint32_t MBInputEnable : MOS_BITFIELD_BIT(27); |
| uint32_t IsFwdFrameShortTermRef : MOS_BITFIELD_BIT(28); |
| uint32_t CheckAllFractionalEnable : MOS_BITFIELD_BIT(29); |
| uint32_t HMECombineOverlap : MOS_BITFIELD_RANGE(30, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW36; |
| |
| // DW37 |
| union |
| { |
| struct |
| { |
| uint32_t SkipModeEn : MOS_BITFIELD_BIT(0); |
| uint32_t AdaptiveEn : MOS_BITFIELD_BIT(1); |
| uint32_t BiMixDis : MOS_BITFIELD_BIT(2); |
| uint32_t : MOS_BITFIELD_RANGE(3, 4); |
| uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT(5); |
| uint32_t : MOS_BITFIELD_BIT(6); |
| uint32_t T8x8FlagForInterEn : MOS_BITFIELD_BIT(7); |
| uint32_t : MOS_BITFIELD_RANGE(8, 23); |
| uint32_t EarlyImeStop : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW37; |
| |
| // DW38 |
| union |
| { |
| struct |
| { |
| uint32_t LenSP : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t MaxNumSU : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t RefThreshold : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW38; |
| |
| // DW39 |
| union |
| { |
| struct |
| { |
| uint32_t : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t HMERefWindowsCombThreshold : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t RefWidth : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t RefHeight : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW39; |
| |
| // DW40 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID0List0 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t DistScaleFactorRefID1List0 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW40; |
| |
| // DW41 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID2List0 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t DistScaleFactorRefID3List0 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW41; |
| |
| // DW42 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID4List0 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t DistScaleFactorRefID5List0 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW42; |
| |
| // DW43 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID6List0 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t DistScaleFactorRefID7List0 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW43; |
| |
| // DW44 |
| union |
| { |
| struct |
| { |
| uint32_t ActualQPValueForRefID0List0 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t ActualQPValueForRefID1List0 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t ActualQPValueForRefID2List0 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t ActualQPValueForRefID3List0 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW44; |
| |
| // DW45 |
| union |
| { |
| struct |
| { |
| uint32_t ActualQPValueForRefID4List0 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t ActualQPValueForRefID5List0 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t ActualQPValueForRefID6List0 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t ActualQPValueForRefID7List0 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW45; |
| |
| // DW46 |
| union |
| { |
| struct |
| { |
| uint32_t ActualQPValueForRefID0List1 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t ActualQPValueForRefID1List1 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t RefCost : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW46; |
| |
| // DW47 |
| union |
| { |
| struct |
| { |
| uint32_t MbQpReadFactor : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t IntraCostSF : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t MaxVmvR : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW47; |
| |
| //DW48 |
| union |
| { |
| struct |
| { |
| uint32_t IntraRefreshMBx : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t IntraRefreshUnitInMBMinus1 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t IntraRefreshQPDelta : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW48; |
| |
| // DW49 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI1_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW49; |
| |
| // DW50 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI1_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW50; |
| |
| // DW51 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI2_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW51; |
| |
| // DW52 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI2_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW52; |
| |
| // DW53 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI3_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW53; |
| |
| // DW54 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI3_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW54; |
| |
| // DW55 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI4_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW55; |
| |
| // DW56 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI4_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW56; |
| |
| // DW57 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_dQpPrimeY : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t ROI2_dQpPrimeY : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t ROI3_dQpPrimeY : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t ROI4_dQpPrimeY : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW57; |
| |
| // DW58 |
| union |
| { |
| struct |
| { |
| uint32_t Lambda_8x8Inter : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t Lambda_8x8Intra : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW58; |
| |
| // DW59 |
| union |
| { |
| struct |
| { |
| uint32_t Lambda_Inter : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t Lambda_Intra : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW59; |
| |
| // DW60 |
| union |
| { |
| struct |
| { |
| uint32_t MBTextureThreshold : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t TxDecisonThreshold : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW60; |
| |
| // DW61 |
| union |
| { |
| struct |
| { |
| uint32_t HMEMVCostScalingFactor : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t Reserved : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t IntraRefreshMBy : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW61; |
| |
| // DW62 |
| union |
| { |
| struct |
| { |
| uint32_t IPCM_QP0 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t IPCM_QP1 : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t IPCM_QP2 : MOS_BITFIELD_RANGE(16, 23); |
| uint32_t IPCM_QP3 : MOS_BITFIELD_RANGE(24, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW62; |
| |
| // DW63 |
| union |
| { |
| struct |
| { |
| uint32_t IPCM_QP4 : MOS_BITFIELD_RANGE(0, 7); |
| uint32_t Reserved : MOS_BITFIELD_RANGE(8, 15); |
| uint32_t IPCM_Thresh0 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW63; |
| |
| // DW64 |
| union |
| { |
| struct |
| { |
| uint32_t IPCM_Thresh1 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t IPCM_Thresh2 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW64; |
| |
| // DW65 |
| union |
| { |
| struct |
| { |
| uint32_t IPCM_Thresh3 : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t IPCM_Thresh4 : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW65; |
| |
| // DW66 |
| union |
| { |
| struct |
| { |
| uint32_t MBDataSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW66; |
| |
| // DW67 |
| union |
| { |
| struct |
| { |
| uint32_t MVDataSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW67; |
| |
| // DW68 |
| union |
| { |
| struct |
| { |
| uint32_t IDistSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW68; |
| |
| // DW69 |
| union |
| { |
| struct |
| { |
| uint32_t SrcYSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW69; |
| |
| // DW70 |
| union |
| { |
| struct |
| { |
| uint32_t MBSpecificDataSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW70; |
| |
| // DW71 |
| union |
| { |
| struct |
| { |
| uint32_t AuxVmeOutSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW71; |
| |
| // DW72 |
| union |
| { |
| struct |
| { |
| uint32_t CurrRefPicSelSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW72; |
| |
| // DW73 |
| union |
| { |
| struct |
| { |
| uint32_t HMEMVPredFwdBwdSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW73; |
| |
| // DW74 |
| union |
| { |
| struct |
| { |
| uint32_t HMEDistSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW74; |
| |
| // DW75 |
| union |
| { |
| struct |
| { |
| uint32_t SliceMapSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW75; |
| |
| // DW76 |
| union |
| { |
| struct |
| { |
| uint32_t FwdFrmMBDataSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW76; |
| |
| // DW77 |
| union |
| { |
| struct |
| { |
| uint32_t FwdFrmMVSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW77; |
| |
| // DW78 |
| union |
| { |
| struct |
| { |
| uint32_t MBQPBuffer; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW78; |
| |
| // DW79 |
| union |
| { |
| struct |
| { |
| uint32_t MBBRCLut; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW79; |
| |
| // DW80 |
| union |
| { |
| struct |
| { |
| uint32_t VMEInterPredictionSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW80; |
| |
| // DW81 |
| union |
| { |
| struct |
| { |
| uint32_t VMEInterPredictionMRSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW81; |
| |
| // DW82 |
| union |
| { |
| struct |
| { |
| uint32_t MBStatsSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW82; |
| |
| // DW83 |
| union |
| { |
| struct |
| { |
| uint32_t MADSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW83; |
| |
| // DW84 |
| union |
| { |
| struct |
| { |
| uint32_t BRCCurbeSurfIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW84; |
| |
| // DW85 |
| union |
| { |
| struct |
| { |
| uint32_t ForceNonSkipMBmapSurface; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW85; |
| |
| // DW86 |
| union |
| { |
| struct |
| { |
| uint32_t ReservedIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW86; |
| |
| // DW87 |
| union |
| { |
| struct |
| { |
| uint32_t StaticDetectionCostTableIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW87; |
| } m_encCurbe; |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeNormalIFrame[88] = |
| { |
| 0x00000082, 0x00000000, 0x00003910, 0x00a83000, 0x00000000, 0x28300000, 0x05000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80800000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x00000080, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeNormalIField[88] = |
| { |
| 0x00000082, 0x00000000, 0x00003910, 0x00a830c0, 0x02000000, 0x28300000, 0x05000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80800000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x00000080, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeNormalPFrame[88] = |
| { |
| 0x000000a3, 0x00000008, 0x00003910, 0x00ae3000, 0x30000000, 0x28300000, 0x05000000, 0x01400060, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x60000000, 0x000000a1, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeNormalPField[88] = |
| { |
| 0x000000a3, 0x00000008, 0x00003910, 0x00ae30c0, 0x30000000, 0x28300000, 0x05000000, 0x01400060, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x000000a1, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeNormalBFrame[88] = |
| { |
| 0x000000a3, 0x00200008, 0x00003910, 0x00aa7700, 0x50020000, 0x20200000, 0x05000000, 0xff400000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x01010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x60000000, 0x000000a1, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeNormalBField[88] = |
| { |
| 0x000000a3, 0x00200008, 0x00003919, 0x00aa77c0, 0x50020000, 0x20200000, 0x05000000, 0xff400000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x01010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x000000a1, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG10::MbEncCurbe::m_mbEncCurbeIFrameDist[88] = |
| { |
| 0x00000082, 0x00200008, 0x001e3910, 0x00a83000, 0x90000000, 0x28300000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, |
| 0x80800000, 0x00000000, 0x00000800, 0xffff00ff, 0x40000000, 0x00000080, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }; |
| |
| const int32_t CodechalEncodeAvcEncG10::m_brcCurbeSize[CODECHAL_ENCODE_BRC_IDX_NUM] = { |
| (sizeof(BrcInitResetCurbe)), |
| (sizeof(BrcFrameUpdateCurbe)), |
| (sizeof(BrcInitResetCurbe)), |
| (sizeof(MbEncCurbe)), |
| 0, |
| (sizeof(MbBrcUpdateCurbe)) |
| }; |
| |
| class CodechalEncodeAvcEncG10::WPCurbe |
| { |
| public: |
| WPCurbe() |
| { |
| memset((void *)&m_wpCurbeCmd, 0, sizeof(WPCurbe)); |
| } |
| struct |
| { |
| // DW0 |
| union |
| { |
| struct |
| { |
| uint32_t DefaultWeight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t DefaultOffset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW0; |
| |
| // DW1 |
| union |
| { |
| struct |
| { |
| uint32_t ROI0_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI0_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW1; |
| |
| // DW2 |
| union |
| { |
| struct |
| { |
| uint32_t ROI0_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI0_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW2; |
| |
| // DW3 |
| union |
| { |
| struct |
| { |
| uint32_t ROI0Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI0Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW3; |
| |
| // DW4 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI1_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW4; |
| |
| // DW5 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI1_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW5; |
| |
| // DW6 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI1Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW6; |
| |
| // DW7 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI2_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW7; |
| |
| // DW8 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI2_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW8; |
| |
| // DW9 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI2Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW9; |
| |
| // DW10 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI3_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW10; |
| |
| // DW11 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI3_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW11; |
| |
| // DW12 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI3Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW12; |
| |
| // DW13 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI4_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW13; |
| |
| // DW14 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI4_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW14; |
| |
| // DW15 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI4Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW15; |
| |
| // DW16 |
| union |
| { |
| struct |
| { |
| uint32_t ROI5_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI5_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW16; |
| |
| // DW17 |
| union |
| { |
| struct |
| { |
| uint32_t ROI5_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI5_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW17; |
| |
| // DW18 |
| union |
| { |
| struct |
| { |
| uint32_t ROI5Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI5Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW18; |
| |
| // DW19 |
| union |
| { |
| struct |
| { |
| uint32_t ROI6_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI6_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW19; |
| |
| // DW20 |
| union |
| { |
| struct |
| { |
| uint32_t ROI6_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI6_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW20; |
| |
| // DW21 |
| union |
| { |
| struct |
| { |
| uint32_t ROI6Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI6Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW21; |
| |
| // DW22 |
| union |
| { |
| struct |
| { |
| uint32_t ROI7_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI7_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW22; |
| |
| // DW23 |
| union |
| { |
| struct |
| { |
| uint32_t ROI7_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI7_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW23; |
| |
| // DW24 |
| union |
| { |
| struct |
| { |
| uint32_t ROI7Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI7Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW24; |
| |
| // DW25 |
| union |
| { |
| struct |
| { |
| uint32_t ROI8_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI8_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW25; |
| |
| // DW26 |
| union |
| { |
| struct |
| { |
| uint32_t ROI8_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI8_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW26; |
| |
| // DW27 |
| union |
| { |
| struct |
| { |
| uint32_t ROI8Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI8Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW27; |
| |
| // DW28 |
| union |
| { |
| struct |
| { |
| uint32_t ROI9_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI9_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW28; |
| |
| // DW29 |
| union |
| { |
| struct |
| { |
| uint32_t ROI9_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI9_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW29; |
| |
| // DW30 |
| union |
| { |
| struct |
| { |
| uint32_t ROI9Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI9Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW30; |
| |
| // DW31 |
| union |
| { |
| struct |
| { |
| uint32_t ROI10_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI10_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW31; |
| |
| // DW32 |
| union |
| { |
| struct |
| { |
| uint32_t ROI10_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI10_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW32; |
| |
| // DW33 |
| union |
| { |
| struct |
| { |
| uint32_t ROI10Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI10Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW33; |
| |
| // DW34 |
| union |
| { |
| struct |
| { |
| uint32_t ROI11_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI11_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW34; |
| |
| // DW35 |
| union |
| { |
| struct |
| { |
| uint32_t ROI11_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI11_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW35; |
| |
| // DW36 |
| union |
| { |
| struct |
| { |
| uint32_t ROI11Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI11Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW36; |
| |
| // DW37 |
| union |
| { |
| struct |
| { |
| uint32_t ROI12_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI12_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW37; |
| |
| // DW38 |
| union |
| { |
| struct |
| { |
| uint32_t ROI12_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI12_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW38; |
| |
| // DW39 |
| union |
| { |
| struct |
| { |
| uint32_t ROI12Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI12Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW39; |
| |
| // DW40 |
| union |
| { |
| struct |
| { |
| uint32_t ROI13_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI13_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW40; |
| |
| // DW41 |
| union |
| { |
| struct |
| { |
| uint32_t ROI13_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI13_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW41; |
| |
| // DW42 |
| union |
| { |
| struct |
| { |
| uint32_t ROI13Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI13Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW42; |
| |
| // DW43 |
| union |
| { |
| struct |
| { |
| uint32_t ROI14_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI14_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW43; |
| |
| // DW44 |
| union |
| { |
| struct |
| { |
| uint32_t ROI14_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI14_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW44; |
| |
| // DW45 |
| union |
| { |
| struct |
| { |
| uint32_t ROI14Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI14Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW45; |
| |
| // DW46 |
| union |
| { |
| struct |
| { |
| uint32_t ROI15_X_left : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI15_Y_top : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW46; |
| |
| // DW47 |
| union |
| { |
| struct |
| { |
| uint32_t ROI15_X_right : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI15_Y_bottom : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW47; |
| |
| // DW48 |
| union |
| { |
| struct |
| { |
| uint32_t ROI15Weight : MOS_BITFIELD_RANGE(0, 15); |
| uint32_t ROI15Offset : MOS_BITFIELD_RANGE(16, 31); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW48; |
| |
| // DW49 |
| union |
| { |
| struct |
| { |
| uint32_t InputSurface; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW49; |
| |
| // DW50 |
| union |
| { |
| struct |
| { |
| uint32_t OutputSurface; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW50; |
| } m_wpCurbeCmd; |
| }; |
| |
| class CodechalEncodeAvcEncG10::BrcBlockCopyCurbe |
| { |
| public: |
| BrcBlockCopyCurbe() |
| { |
| memset((void *)&m_brcBlockCopyCurbeCmd, 0, sizeof(BrcBlockCopyCurbe)); |
| } |
| |
| struct |
| { |
| // uint32_t 0 |
| union |
| { |
| struct |
| { |
| uint32_t BlockHeight : 16; |
| uint32_t BufferOffset : 16; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW0; |
| |
| // uint32_t 1 |
| union |
| { |
| struct |
| { |
| uint32_t SrcSurfaceIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW1; |
| |
| // uint32_t 2 |
| union |
| { |
| struct |
| { |
| uint32_t DstSurfaceIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW2; |
| |
| // QWORD PADDING |
| struct |
| { |
| uint32_t Reserved; |
| } PADDING; |
| } m_brcBlockCopyCurbeCmd; |
| }; |
| |
| struct _CodechalEncodeAvcKernelHeader |
| { |
| int m_kernelCount; |
| CODECHAL_KERNEL_HEADER m_mbEncQltyI; |
| CODECHAL_KERNEL_HEADER m_mbEncQltyP; |
| CODECHAL_KERNEL_HEADER m_mbEncQltyB; |
| CODECHAL_KERNEL_HEADER m_mbEncNormI; |
| CODECHAL_KERNEL_HEADER m_mbEncNormP; |
| CODECHAL_KERNEL_HEADER m_mbEncNormB; |
| CODECHAL_KERNEL_HEADER m_mbEncPerfI; |
| CODECHAL_KERNEL_HEADER m_mbEncPerfP; |
| CODECHAL_KERNEL_HEADER m_mbEncPerfB; |
| CODECHAL_KERNEL_HEADER m_mbEncAdvI; |
| CODECHAL_KERNEL_HEADER m_mbEncAdvP; |
| CODECHAL_KERNEL_HEADER m_mbEncAdvB; |
| CODECHAL_KERNEL_HEADER m_meP; |
| CODECHAL_KERNEL_HEADER m_meB; |
| CODECHAL_KERNEL_HEADER m_plyDScalePly; |
| CODECHAL_KERNEL_HEADER m_plyDScale2fPly2f; |
| CODECHAL_KERNEL_HEADER m_initFrameBrc; |
| CODECHAL_KERNEL_HEADER m_frameEncUpdate; |
| CODECHAL_KERNEL_HEADER m_brcResetFrame; |
| CODECHAL_KERNEL_HEADER m_brcIFrameDist; |
| CODECHAL_KERNEL_HEADER m_brcBlockCopy; |
| CODECHAL_KERNEL_HEADER m_mbBrcUpdate; |
| CODECHAL_KERNEL_HEADER m_ply2xDScalePly; |
| CODECHAL_KERNEL_HEADER m_ply2xDScale2fPly2f; |
| CODECHAL_KERNEL_HEADER m_meVdenc; |
| CODECHAL_KERNEL_HEADER m_weightedPrediction; |
| CODECHAL_KERNEL_HEADER m_staticFrameDetection; |
| }; |
| using CodechalEncodeAvcKernelHeader = struct _CodechalEncodeAvcKernelHeader; |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::GetKernelHeaderAndSize( |
| void *binary, |
| EncOperation operation, |
| uint32_t krnStateIdx, |
| void *krnHeader, |
| uint32_t *krnSize) |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(binary); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(krnHeader); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(krnSize); |
| |
| auto krnHeaderTable = (CodechalEncodeAvcKernelHeader*)binary; |
| auto invalidEntry = &(krnHeaderTable->m_staticFrameDetection) + 1; |
| |
| uint32_t nextKrnOffset = *krnSize; |
| PCODECHAL_KERNEL_HEADER currKrnHeader = nullptr; |
| |
| if (operation == ENC_SCALING4X) |
| { |
| currKrnHeader = &krnHeaderTable->m_plyDScalePly; |
| } |
| else if (operation == ENC_SCALING2X) |
| { |
| currKrnHeader = &krnHeaderTable->m_ply2xDScalePly; |
| } |
| else if (operation == ENC_ME) |
| { |
| currKrnHeader = &krnHeaderTable->m_meP; |
| } |
| else if (operation == VDENC_ME) |
| { |
| currKrnHeader = &krnHeaderTable->m_meVdenc; |
| } |
| else if (operation == ENC_BRC) |
| { |
| currKrnHeader = &krnHeaderTable->m_initFrameBrc; |
| } |
| else if (operation == ENC_MBENC) |
| { |
| currKrnHeader = &krnHeaderTable->m_mbEncQltyI; |
| } |
| else if (operation == ENC_MBENC_ADV) |
| { |
| currKrnHeader = &krnHeaderTable->m_mbEncAdvI; |
| } |
| else if (operation == ENC_WP) |
| { |
| currKrnHeader = &krnHeaderTable->m_weightedPrediction; |
| } |
| else if (operation == ENC_SFD) |
| { |
| currKrnHeader = &krnHeaderTable->m_staticFrameDetection; |
| } |
| else |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Unsupported ENC mode requested"); |
| return MOS_STATUS_INVALID_PARAMETER; |
| } |
| |
| currKrnHeader += krnStateIdx; |
| *((PCODECHAL_KERNEL_HEADER)krnHeader) = *currKrnHeader; |
| |
| auto pNextKrnHeader = (currKrnHeader + 1); |
| if (pNextKrnHeader < invalidEntry) |
| { |
| nextKrnOffset = pNextKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT; |
| } |
| *krnSize = nextKrnOffset - (currKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| CodechalEncodeAvcEncG10::CodechalEncodeAvcEncG10( |
| CodechalHwInterface * hwInterface, |
| CodechalDebugInterface *debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo) : CodechalEncodeAvcEnc(hwInterface, debugInterface, standardInfo) |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| bKernelTrellis = true; |
| bExtendedMvCostRange = true; |
| bBrcSplitEnable = true; |
| bBrcRoiSupported = true; |
| bDecoupleMbEncCurbeFromBRC = true; |
| bHighTextureModeCostEnable = true; |
| bMvDataNeededByBRC = false; |
| m_needCheckCpEnabled = true; |
| |
| m_cmKernelEnable = true; |
| m_mbStatsSupported = true; |
| pfnGetKernelHeaderAndSize = GetKernelHeaderAndSize; |
| #ifndef _FULL_OPEN_SOURCE |
| m_kernelBase = (uint8_t *)IGCODECKRN_G10; |
| #else |
| m_kernelBase = nullptr; |
| #endif |
| AddIshSize(m_kuid, m_kernelBase); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_NULL_NO_STATUS_RETURN(m_encodeParState = MOS_New(CodechalDebugEncodeParG10, this)); |
| CreateAvcPar(); |
| ) |
| } |
| |
| CodechalEncodeAvcEncG10::~CodechalEncodeAvcEncG10() |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_TOOL( |
| DestroyAvcPar(); |
| MOS_Delete(m_encodeParState); |
| ) |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::InitializeState() |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcEnc::InitializeState()); |
| |
| m_brcHistoryBufferSize = m_initBrcHistoryBufferSize; |
| m_mbencBrcBufferSize = m_mbEncrcHistoryBufferSize; |
| m_forceBrcMbStatsEnabled = true; |
| dwBrcConstantSurfaceWidth = m_brcConstSurfaceWidth; |
| dwBrcConstantSurfaceHeight = m_brcConstSurfaceHeight; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::InitBrcConstantBuffer( |
| PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pOsInterface); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pPicParams); |
| |
| uint8_t tableIdx = params->wPictureCodingType - 1; |
| |
| if (tableIdx >= 3) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid input parameter."); |
| return MOS_STATUS_INVALID_PARAMETER; |
| } |
| |
| MOS_LOCK_PARAMS lockFlags; |
| memset(&lockFlags, 0, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.WriteOnly = 1; |
| auto dataPtr = (uint8_t*)params->pOsInterface->pfnLockResource( |
| params->pOsInterface, |
| ¶ms->sBrcConstantDataBuffer.OsResource, |
| &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(dataPtr); |
| |
| memset(dataPtr, 0, params->sBrcConstantDataBuffer.dwWidth * params->sBrcConstantDataBuffer.dwHeight); |
| |
| // Fill surface with QP Adjustment table, Distortion threshold table, MaxFrame threshold table, Distortion QP Adjustment Table |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| sizeof(m_brcConstantDataTables), |
| (void*)m_brcConstantDataTables, |
| sizeof(m_brcConstantDataTables)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| dataPtr += sizeof(m_brcConstantDataTables); |
| |
| bool blockBasedSkipEn = params->dwMbEncBlockBasedSkipEn ? true : false; |
| bool transform_8x8_mode_flag = params->pPicParams->transform_8x8_mode_flag ? true : false; |
| |
| // Fill surface with Skip Threshold Table |
| switch (params->wPictureCodingType) |
| { |
| case P_TYPE: |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_P_Common[blockBasedSkipEn][transform_8x8_mode_flag][0], |
| m_brcConstSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| case B_TYPE: |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_B_Common[blockBasedSkipEn][transform_8x8_mode_flag][0], |
| m_brcConstSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| default: |
| // do nothing for I TYPE |
| break; |
| } |
| |
| if ((params->wPictureCodingType != I_TYPE) && (params->pAvcQCParams != nullptr) && (params->pAvcQCParams->NonFTQSkipThresholdLUTInput)) |
| { |
| for (uint8_t qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| *(dataPtr + 1 + (qp * 2)) = (uint8_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false), (params->pPicParams->transform_8x8_mode_flag ? true : false), params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]); |
| } |
| } |
| |
| dataPtr += m_brcConstSurfaceEarlySkipTableSize; |
| |
| // Initialize to -1 (0xff) |
| memset(dataPtr, 0xFF, m_brcConstSurfaceQpList0); |
| memset(dataPtr + m_brcConstSurfaceQpList0 + m_brcConstSurfaceQpList0Reserved, |
| 0xFF, m_brcConstSurfaceQpList1); |
| |
| switch (params->wPictureCodingType) |
| { |
| case B_TYPE: |
| dataPtr += (m_brcConstSurfaceQpList0 + m_brcConstSurfaceQpList0Reserved); |
| |
| for (uint8_t refIdx = 0; refIdx <= params->pAvcSlcParams->num_ref_idx_l1_active_minus1; refIdx++) |
| { |
| CODEC_PICTURE refPic = params->pAvcSlcParams->RefPicList[LIST_1][refIdx]; |
| if (!CodecHal_PictureIsInvalid(refPic) && params->pAvcPicIdx[refPic.FrameIdx].bValid) |
| { |
| *(dataPtr + refIdx) = params->pAvcPicIdx[refPic.FrameIdx].ucPicIdx; |
| } |
| } |
| dataPtr -= (m_brcConstSurfaceQpList0 + m_brcConstSurfaceQpList0Reserved); |
| // break statement omitted intentionally |
| case P_TYPE: |
| for (uint8_t refIdx = 0; refIdx <= params->pAvcSlcParams->num_ref_idx_l0_active_minus1; refIdx++) |
| { |
| CODEC_PICTURE refPic = params->pAvcSlcParams->RefPicList[LIST_0][refIdx]; |
| if (!CodecHal_PictureIsInvalid(refPic) && params->pAvcPicIdx[refPic.FrameIdx].bValid) |
| { |
| *(dataPtr + refIdx) = params->pAvcPicIdx[refPic.FrameIdx].ucPicIdx; |
| } |
| } |
| break; |
| default: |
| // do nothing for I type |
| break; |
| } |
| |
| dataPtr += (m_brcConstSurfaceQpList0 + m_brcConstSurfaceQpList0Reserved |
| + m_brcConstSurfaceQpList1 + m_brcConstSurfaceQpList1Reserved); |
| |
| // Fill surface with Mode cost and MV cost |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceModeMvCostSize, |
| (void*)ModeMvCost_Cm[tableIdx], |
| m_brcConstSurfaceModeMvCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| // If old mode cost is used the update the table |
| if (params->wPictureCodingType == I_TYPE && params->bOldModeCostEnable) |
| { |
| auto pdwDataTemp = (uint32_t *)dataPtr; |
| for (uint8_t qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| // Writing to DW0 in each sub-array of 16 DWs |
| *pdwDataTemp = (uint32_t)OldIntraModeCost_Cm_Common[qp]; |
| pdwDataTemp += 16; |
| } |
| } |
| |
| if (params->pAvcQCParams) |
| { |
| for (uint8_t qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| if (params->pAvcQCParams->FTQSkipThresholdLUTInput) |
| { |
| *(dataPtr + (qp * 32) + 24) = |
| *(dataPtr + (qp * 32) + 25) = |
| *(dataPtr + (qp * 32) + 27) = |
| *(dataPtr + (qp * 32) + 28) = |
| *(dataPtr + (qp * 32) + 29) = |
| *(dataPtr + (qp * 32) + 30) = |
| *(dataPtr + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp]; |
| } |
| } |
| } |
| |
| dataPtr += m_brcConstSurfaceModeMvCostSize; |
| |
| // Fill surface with Refcost |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceRefCostSize, |
| (void*)&m_refCostMultiRefQp[tableIdx][0], |
| m_brcConstSurfaceRefCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| dataPtr += m_brcConstSurfaceRefCostSize; |
| |
| //Fill surface with Intra cost scaling Factor |
| if (params->bAdaptiveIntraScalingEnable) |
| { |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceIntraCostScalingFactor, |
| (void*)&AdaptiveIntraScalingFactor_Cm_Common[0], |
| m_brcConstSurfaceIntraCostScalingFactor); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else |
| { |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceIntraCostScalingFactor, |
| (void*)&IntraScalingFactor_Cm_Common[0], |
| m_brcConstSurfaceIntraCostScalingFactor); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| |
| dataPtr += m_brcConstSurfaceIntraCostScalingFactor; |
| |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceLambdaSize, |
| (void*)&m_lambdData[0], |
| m_brcConstSurfaceLambdaSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| dataPtr += m_brcConstSurfaceLambdaSize; |
| |
| eStatus = MOS_SecureMemcpy( |
| dataPtr, |
| m_brcConstSurfaceFtq25Size, |
| (void*)&m_ftq25[0], |
| m_brcConstSurfaceFtq25Size); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| params->pOsInterface->pfnUnlockResource( |
| params->pOsInterface, |
| ¶ms->sBrcConstantDataBuffer.OsResource); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::InitKernelStateMbEnc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| dwNumMbEncEncKrnStates = mbEncTargetUsage * m_mbEncTargetUsageNum; |
| dwNumMbEncEncKrnStates += mbEncTargetUsage; |
| pMbEncKernelStates = |
| MOS_NewArray(MHW_KERNEL_STATE, dwNumMbEncEncKrnStates); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pMbEncKernelStates); |
| |
| PMHW_KERNEL_STATE kernelStatePtr = pMbEncKernelStates; |
| CODECHAL_KERNEL_HEADER currKrnHeader; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| MOS_STATUS status = CodecHalGetKernelBinaryAndSize(m_kernelBase, m_kuid, &kernelBinary, &kernelSize); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(status); |
| |
| for (uint32_t krnStateIdx = 0; krnStateIdx < dwNumMbEncEncKrnStates; krnStateIdx++) |
| { |
| bool kernelState = (krnStateIdx >= mbEncTargetUsage * m_mbEncTargetUsageNum); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetKernelHeaderAndSize( |
| kernelBinary, |
| (kernelState ? ENC_MBENC_ADV : ENC_MBENC), |
| (kernelState ? krnStateIdx - mbEncTargetUsage * m_mbEncTargetUsageNum : krnStateIdx), |
| (void*)&currKrnHeader, |
| &kernelSize)); |
| |
| kernelStatePtr->KernelParams.iBTCount = mbEncNumSurfaces; |
| kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| kernelStatePtr->KernelParams.iCurbeLength = sizeof(MbEncCurbe); |
| kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH; |
| kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT; |
| kernelStatePtr->KernelParams.iIdCount = 1; |
| |
| kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData(); |
| kernelStatePtr->KernelParams.pBinary = |
| kernelBinary + |
| (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| kernelStatePtr->KernelParams.iSize = kernelSize; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested( |
| m_stateHeapInterface, |
| kernelStatePtr->KernelParams.iBTCount, |
| &kernelStatePtr->dwSshSize, |
| &kernelStatePtr->dwBindingTableSize)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr)); |
| |
| kernelStatePtr++; |
| } |
| |
| // Until a better way can be found, maintain old binding table structures |
| auto bindingTable = &MbEncBindingTable; |
| |
| bindingTable->dwAvcMBEncMfcAvcPakObj = mbEncMfcAvcPakObj; |
| bindingTable->dwAvcMBEncIndMVData = mbEncIndirectMvData; |
| bindingTable->dwAvcMBEncBRCDist = mbEncBrcDistortion; |
| bindingTable->dwAvcMBEncCurrY = mbEncCurrentY; |
| bindingTable->dwAvcMBEncCurrUV = mbEncCurrentUV; |
| bindingTable->dwAvcMBEncMbSpecificData = mbEncMbSpecificData; |
| |
| bindingTable->dwAvcMBEncRefPicSelectL0 = mbEncRefPicSeletcL0; |
| bindingTable->dwAvcMBEncMVDataFromME = mbEncMvDataFromMe; |
| bindingTable->dwAvcMBEncMEDist = mbEnc4xMeDistortion; |
| bindingTable->dwAvcMBEncSliceMapData = mbEncSliceMapData; |
| bindingTable->dwAvcMBEncBwdRefMBData = mbEncFwdMbData; |
| bindingTable->dwAvcMBEncBwdRefMVData = mbEncFwdMvData; |
| bindingTable->dwAvcMBEncMbBrcConstData = mbEncMbBrcConstData; |
| bindingTable->dwAvcMBEncMBStats = mbEncMbStats; |
| bindingTable->dwAvcMBEncMADData = mbEncMadData; |
| bindingTable->dwAvcMBEncMbNonSkipMap = mbEncForceNonSkipMbMap; |
| bindingTable->dwAvcMBEncAdv = mbEncAdv; |
| bindingTable->dwAvcMbEncBRCCurbeData = mbEncBrcCurbeData; |
| bindingTable->dwAvcMBEncStaticDetectionCostTable = mbEncSfdCostTable; |
| |
| // Frame |
| bindingTable->dwAvcMBEncMbQpFrame = mbEncMbQP; |
| bindingTable->dwAvcMBEncCurrPicFrame[0] = mbEncVmeInterPredCurrPic; |
| bindingTable->dwAvcMBEncFwdPicFrame[0] = mbEncVmeInterPredFwdRefPicIdx0L0; |
| bindingTable->dwAvcMBEncBwdPicFrame[0] = mbEncVmeInterPredBwdRefPicIdx0L1; |
| bindingTable->dwAvcMBEncFwdPicFrame[1] = mbEncVmeInterPredFwdRefPicIdx1L0; |
| bindingTable->dwAvcMBEncBwdPicFrame[1] = mbEncVmeInterPredBwdRefPicIdx1L1; |
| bindingTable->dwAvcMBEncFwdPicFrame[2] = mbEncVmeInterPredFwdRefPicIdx2L0; |
| bindingTable->dwAvcMBEncFwdPicFrame[3] = mbEncVmeInterPredFwdRefPicIdx3L0; |
| bindingTable->dwAvcMBEncFwdPicFrame[4] = mbEncVmeInterPredFwdRefPicIdx4L0; |
| bindingTable->dwAvcMBEncFwdPicFrame[5] = mbEncVmeInterPredFwdRefPicIdx5L0; |
| bindingTable->dwAvcMBEncFwdPicFrame[6] = mbEncVmeInterPredFwdRefPicIdx6L0; |
| bindingTable->dwAvcMBEncFwdPicFrame[7] = mbEncVmeInterPredFwdRefPicIdx7L0; |
| bindingTable->dwAvcMBEncCurrPicFrame[1] = mbEncVmeInterPredMultiRefCurrPic; |
| bindingTable->dwAvcMBEncBwdPicFrame[2] = mbEncVmeInterPredMultiRefBwdPicIdx0L1; |
| bindingTable->dwAvcMBEncBwdPicFrame[3] = mbEncVmeInterPredMultiRefBwdPicIdx1L1; |
| |
| // Field |
| bindingTable->dwAvcMBEncMbQpField = mbEncMbQP; |
| bindingTable->dwAvcMBEncFieldCurrPic[0] = mbEncVmeInterPredCurrPic; |
| bindingTable->dwAvcMBEncFwdPicTopField[0] = mbEncVmeInterPredFwdRefPicIdx0L0; |
| bindingTable->dwAvcMBEncBwdPicTopField[0] = mbEncVmeInterPredBwdRefPicIdx0L1; |
| bindingTable->dwAvcMBEncFwdPicBotField[0] = mbEncVmeInterPredFwdRefPicIdx0L0; |
| bindingTable->dwAvcMBEncBwdPicBotField[0] = mbEncVmeInterPredBwdRefPicIdx0L1; |
| bindingTable->dwAvcMBEncFwdPicTopField[1] = mbEncVmeInterPredFwdRefPicIdx1L0; |
| bindingTable->dwAvcMBEncBwdPicTopField[1] = mbEncVmeInterPredBwdRefPicIdx1L1; |
| bindingTable->dwAvcMBEncFwdPicBotField[1] = mbEncVmeInterPredFwdRefPicIdx1L0; |
| bindingTable->dwAvcMBEncBwdPicBotField[1] = mbEncVmeInterPredBwdRefPicIdx1L1; |
| bindingTable->dwAvcMBEncFwdPicTopField[2] = mbEncVmeInterPredFwdRefPicIdx2L0; |
| bindingTable->dwAvcMBEncFwdPicBotField[2] = mbEncVmeInterPredFwdRefPicIdx2L0; |
| bindingTable->dwAvcMBEncFwdPicTopField[3] = mbEncVmeInterPredFwdRefPicIdx3L0; |
| bindingTable->dwAvcMBEncFwdPicBotField[3] = mbEncVmeInterPredFwdRefPicIdx3L0; |
| bindingTable->dwAvcMBEncFwdPicTopField[4] = mbEncVmeInterPredFwdRefPicIdx4L0; |
| bindingTable->dwAvcMBEncFwdPicBotField[4] = mbEncVmeInterPredFwdRefPicIdx4L0; |
| bindingTable->dwAvcMBEncFwdPicTopField[5] = mbEncVmeInterPredFwdRefPicIdx5L0; |
| bindingTable->dwAvcMBEncFwdPicBotField[5] = mbEncVmeInterPredFwdRefPicIdx5L0; |
| bindingTable->dwAvcMBEncFwdPicTopField[6] = mbEncVmeInterPredFwdRefPicIdx6L0; |
| bindingTable->dwAvcMBEncFwdPicBotField[6] = mbEncVmeInterPredFwdRefPicIdx6L0; |
| bindingTable->dwAvcMBEncFwdPicTopField[7] = mbEncVmeInterPredFwdRefPicIdx7L0; |
| bindingTable->dwAvcMBEncFwdPicBotField[7] = mbEncVmeInterPredFwdRefPicIdx7L0; |
| bindingTable->dwAvcMBEncFieldCurrPic[1] = mbEncVmeInterPredMultiRefCurrPic; |
| bindingTable->dwAvcMBEncBwdPicTopField[2] = mbEncVmeInterPredMultiRefBwdPicIdx0L1; |
| bindingTable->dwAvcMBEncBwdPicBotField[2] = mbEncVmeInterPredMultiRefBwdPicIdx0L1; |
| bindingTable->dwAvcMBEncBwdPicTopField[3] = mbEncVmeInterPredMultiRefBwdPicIdx1L1; |
| bindingTable->dwAvcMBEncBwdPicBotField[3] = mbEncVmeInterPredMultiRefBwdPicIdx1L1; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::InitKernelStateBrc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| MOS_STATUS status = CodecHalGetKernelBinaryAndSize(m_kernelBase, m_kuid, &kernelBinary, &kernelSize); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(status); |
| |
| CODECHAL_KERNEL_HEADER currKrnHeader; |
| for (uint32_t krnStateIdx = 0; krnStateIdx < CODECHAL_ENCODE_BRC_IDX_NUM; krnStateIdx++) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetKernelHeaderAndSize( |
| kernelBinary, |
| ENC_BRC, |
| krnStateIdx, |
| (void*)&currKrnHeader, |
| &kernelSize)); |
| |
| auto kernelStatePtr = &BrcKernelStates[krnStateIdx]; |
| kernelStatePtr->KernelParams.iBTCount = m_brcBindingTableCount[krnStateIdx]; |
| kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| kernelStatePtr->KernelParams.iCurbeLength = m_brcCurbeSize[krnStateIdx]; |
| kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH; |
| kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT; |
| kernelStatePtr->KernelParams.iIdCount = 1; |
| kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData(); |
| kernelStatePtr->KernelParams.pBinary = |
| kernelBinary + |
| (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| kernelStatePtr->KernelParams.iSize = kernelSize; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested( |
| m_stateHeapInterface, |
| kernelStatePtr->KernelParams.iBTCount, |
| &kernelStatePtr->dwSshSize, |
| &kernelStatePtr->dwBindingTableSize)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr)); |
| } |
| |
| // Until a better way can be found, maintain old binding table structures |
| auto bindingTable = &BrcUpdateBindingTable; |
| bindingTable->dwFrameBrcHistoryBuffer = frameBrcUpdateHistory; |
| bindingTable->dwFrameBrcPakStatisticsOutputBuffer = frameBrcUpdatePakStatisticsOutput; |
| bindingTable->dwFrameBrcImageStateReadBuffer = frameBrcUpdateImageStateRead; |
| bindingTable->dwFrameBrcImageStateWriteBuffer = frameBrcUpdateImageStateWrite; |
| |
| bindingTable->dwFrameBrcMbEncCurbeWriteData = frameBrcUpdateMbEncCurbeWrite; |
| bindingTable->dwFrameBrcDistortionBuffer = frameBrcUpdateDistortion; |
| bindingTable->dwFrameBrcConstantData = frameBrcUpdateConstantData; |
| bindingTable->dwFrameBrcMbStatBuffer = frameBrcUpdateMbStat; |
| bindingTable->dwFrameBrcMvDataBuffer = frameBrcUpdateMvStat; |
| bindingTable->dwMbBrcHistoryBuffer = mbBrcUpdateHistory; |
| bindingTable->dwMbBrcMbQpBuffer = mbBrcUpdateMbQP; |
| bindingTable->dwMbBrcROISurface = mbBrcUpdateROI; |
| bindingTable->dwMbBrcMbStatBuffer = mbBrcUpdateMbStat; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::InitKernelStateWP() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| MOS_STATUS status = CodecHalGetKernelBinaryAndSize(m_kernelBase, m_kuid, &kernelBinary, &kernelSize); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(status); |
| |
| EncOperation encOperation = ENC_WP; |
| CODECHAL_KERNEL_HEADER currKrnHeader; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(pfnGetKernelHeaderAndSize( |
| kernelBinary, |
| encOperation, |
| 0, |
| &currKrnHeader, |
| &kernelSize)); |
| |
| pWPKernelState = MOS_New(MHW_KERNEL_STATE); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pWPKernelState); |
| auto kernelStatePtr = pWPKernelState; |
| kernelStatePtr->KernelParams.iBTCount = wpNumSurfaces; |
| kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| kernelStatePtr->KernelParams.iCurbeLength = sizeof(WPCurbe); |
| kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH; |
| kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT; |
| kernelStatePtr->KernelParams.iIdCount = 1; |
| kernelStatePtr->KernelParams.iInlineDataLength = 0; |
| |
| kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData(); |
| kernelStatePtr->KernelParams.pBinary = |
| kernelBinary + |
| (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| kernelStatePtr->KernelParams.iSize = kernelSize; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested( |
| m_stateHeapInterface, |
| kernelStatePtr->KernelParams.iBTCount, |
| &kernelStatePtr->dwSshSize, |
| &kernelStatePtr->dwBindingTableSize)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::InitMbBrcConstantDataBuffer(PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pOsInterface); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->presBrcConstantDataBuffer); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcEnc::InitMbBrcConstantDataBuffer(params)); |
| |
| if (params->wPictureCodingType == I_TYPE) |
| { |
| MOS_LOCK_PARAMS lockFlags; |
| memset(&lockFlags, 0, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.WriteOnly = 1; |
| |
| uint32_t* dataPtr = (uint32_t*)params->pOsInterface->pfnLockResource( |
| params->pOsInterface, |
| params->presBrcConstantDataBuffer, |
| &lockFlags); |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(dataPtr); |
| |
| // Update MbBrcConstantDataBuffer with high texture cost |
| for (uint8_t qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| // Writing to DW13 in each sub-array of 16 DWs |
| *(dataPtr + 13) = (uint32_t)m_intraModeCostForHighTextureMB[qp]; |
| // 16 DWs per QP value |
| dataPtr += 16; |
| } |
| |
| params->pOsInterface->pfnUnlockResource( |
| params->pOsInterface, |
| params->presBrcConstantDataBuffer); |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::GetTrellisQuantization( |
| PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params, |
| PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(trellisQuantParams); |
| |
| trellisQuantParams->dwTqEnabled = TrellisQuantizationEnable[params->ucTargetUsage]; |
| trellisQuantParams->dwTqRounding = |
| trellisQuantParams->dwTqEnabled ? CODECHAL_ENCODE_AVC_TrellisQuantizationRounding[params->ucTargetUsage] : 0; |
| |
| // If AdaptiveTrellisQuantization is enabled then disable trellis quantization for |
| // B-frames with QP > 26 only in CQP mode |
| if (trellisQuantParams->dwTqEnabled |
| && EnableAdaptiveTrellisQuantization[params->ucTargetUsage] |
| && params->wPictureCodingType == B_TYPE |
| && !params->bBrcEnabled && params->ucQP > 26) |
| { |
| trellisQuantParams->dwTqEnabled = 0; |
| trellisQuantParams->dwTqRounding = 0; |
| } |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::GetMbEncKernelStateIdx(CodechalEncodeIdOffsetParams* params, uint32_t *kernelOffset) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(kernelOffset); |
| |
| *kernelOffset = mbEncOffsetI; |
| |
| if (params->EncFunctionType == CODECHAL_MEDIA_STATE_ENC_ADV) |
| { |
| *kernelOffset += |
| mbEncTargetUsage * m_mbEncTargetUsageNum; |
| } |
| else |
| { |
| if (params->EncFunctionType == CODECHAL_MEDIA_STATE_ENC_NORMAL) |
| { |
| *kernelOffset += mbEncTargetUsage; |
| } |
| else if (params->EncFunctionType == CODECHAL_MEDIA_STATE_ENC_PERFORMANCE) |
| { |
| *kernelOffset += mbEncTargetUsage * 2; |
| } |
| } |
| |
| if (params->wPictureCodingType == P_TYPE) |
| { |
| *kernelOffset += mbEncOffsetP; |
| } |
| else if (params->wPictureCodingType == B_TYPE) |
| { |
| *kernelOffset += mbEncOffsetB; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetCurbeAvcMbEnc( |
| PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params) |
| { |
| |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_hwInterface->GetRenderInterface()); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pPicParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pSeqParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pSlcParams); |
| |
| auto picParams = params->pPicParams; |
| auto seqParams = params->pSeqParams; |
| auto slcParams = params->pSlcParams; |
| |
| CODECHAL_ENCODE_ASSERT(seqParams->TargetUsage < NUM_TARGET_USAGE_MODES); |
| |
| uint8_t meMethod = |
| (m_pictureCodingType == B_TYPE) ? m_bMeMethodGeneric[seqParams->TargetUsage] : m_meMethodGeneric[seqParams->TargetUsage]; |
| // set sliceQP to MAX_SLICE_QP for MbEnc Adv kernel, we can use it to verify whether QP is changed or not |
| uint8_t sliceQP = (params->bUseMbEncAdvKernel && params->bBrcEnabled) ? CODECHAL_ENCODE_AVC_MAX_SLICE_QP : picParams->pic_init_qp_minus26 + 26 + slcParams->slice_qp_delta; |
| bool framePicture = CodecHal_PictureIsFrame(picParams->CurrOriginalPic); |
| bool topField = CodecHal_PictureIsTopField(picParams->CurrOriginalPic); |
| bool bottomField = CodecHal_PictureIsBottomField(picParams->CurrOriginalPic); |
| |
| MbEncCurbe::MbEncCurbeType curbeType; |
| if (params->bMbEncIFrameDistEnabled) |
| { |
| curbeType = MbEncCurbe::typeIDist; |
| } |
| else |
| { |
| switch (m_pictureCodingType) |
| { |
| case I_TYPE: |
| if (framePicture) |
| { |
| curbeType = MbEncCurbe::typeIFrame; |
| } |
| else |
| { |
| curbeType = MbEncCurbe::typeIField; |
| } |
| break; |
| |
| case P_TYPE: |
| if (framePicture) |
| { |
| curbeType = MbEncCurbe::typePFrame; |
| } |
| else |
| { |
| curbeType = MbEncCurbe::typePField; |
| } |
| break; |
| |
| case B_TYPE: |
| if (framePicture) |
| { |
| curbeType = MbEncCurbe::typeBFrame; |
| } |
| else |
| { |
| curbeType = MbEncCurbe::typeBField; |
| } |
| break; |
| |
| default: |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid picture coding type."); |
| return MOS_STATUS_UNKNOWN; |
| } |
| } |
| |
| MbEncCurbe cmd(curbeType); |
| // r1 |
| cmd.m_encCurbe.DW0.AdaptiveEn = |
| cmd.m_encCurbe.DW37.AdaptiveEn = EnableAdaptiveSearch[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW0.T8x8FlagForInterEn = |
| cmd.m_encCurbe.DW37.T8x8FlagForInterEn = picParams->transform_8x8_mode_flag; |
| cmd.m_encCurbe.DW2.LenSP = MaxLenSP[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW1.ExtendedMvCostRange = bExtendedMvCostRange; |
| cmd.m_encCurbe.DW36.MBInputEnable = bMbSpecificDataEnabled; |
| cmd.m_encCurbe.DW38.LenSP = 0; // MBZ |
| cmd.m_encCurbe.DW3.SrcAccess = |
| cmd.m_encCurbe.DW3.RefAccess = framePicture ? 0 : 1; |
| if (m_pictureCodingType != I_TYPE && bFTQEnable) |
| { |
| if (m_pictureCodingType == P_TYPE) |
| { |
| cmd.m_encCurbe.DW3.FTEnable = FTQBasedSkip[seqParams->TargetUsage] & 0x01; |
| } |
| else // B_TYPE |
| { |
| cmd.m_encCurbe.DW3.FTEnable = (FTQBasedSkip[seqParams->TargetUsage] >> 1) & 0x01; |
| } |
| } |
| else |
| { |
| cmd.m_encCurbe.DW3.FTEnable = 0; |
| } |
| if (picParams->UserFlags.bDisableSubMBPartition) |
| { |
| cmd.m_encCurbe.DW3.SubMbPartMask = CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION | CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION | CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION; |
| } |
| cmd.m_encCurbe.DW2.PicWidth = params->wPicWidthInMb; |
| cmd.m_encCurbe.DW4.PicHeightMinus1 = params->wFieldFrameHeightInMb - 1; |
| cmd.m_encCurbe.DW4.FieldParityFlag = cmd.m_encCurbe.DW7.SrcFieldPolarity = bottomField ? 1 : 0; |
| cmd.m_encCurbe.DW4.EnableFBRBypass = bFBRBypassEnable; |
| cmd.m_encCurbe.DW4.EnableIntraCostScalingForStaticFrame = params->bStaticFrameDetectionEnabled; |
| cmd.m_encCurbe.DW4.bCurFldIDR = framePicture ? 0 : (picParams->bIdrPic || m_firstFieldIdrPic); |
| cmd.m_encCurbe.DW4.ConstrainedIntraPredFlag = picParams->constrained_intra_pred_flag; |
| cmd.m_encCurbe.DW4.HMEEnable = m_hmeEnabled; |
| cmd.m_encCurbe.DW4.PictureType = m_pictureCodingType - 1; |
| cmd.m_encCurbe.DW4.UseActualRefQPValue = m_hmeEnabled ? (m_multiRefDisableQPCheck[seqParams->TargetUsage] == 0) : false; |
| cmd.m_encCurbe.DW5.SliceMbHeight = params->usSliceHeight; |
| cmd.m_encCurbe.DW7.IntraPartMask = picParams->transform_8x8_mode_flag ? 0 : 0x2; // Disable 8x8 if flag is not set |
| // r2 |
| if (params->bMbEncIFrameDistEnabled) |
| { |
| cmd.m_encCurbe.DW6.BatchBufferEnd = 0; |
| } |
| else |
| { |
| uint8_t tableIdx = m_pictureCodingType - 1; |
| eStatus = MOS_SecureMemcpy(&(cmd.m_encCurbe.ModeMvCost), 8 * sizeof(uint32_t), ModeMvCost_Cm[tableIdx][sliceQP], 8 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| if (m_pictureCodingType == I_TYPE && bOldModeCostEnable) |
| { |
| // Old intra mode cost needs to be used if bOldModeCostEnable is 1 |
| cmd.m_encCurbe.ModeMvCost.DW8.Value = OldIntraModeCost_Cm_Common[sliceQP]; |
| } |
| else if (m_skipBiasAdjustmentEnable) |
| { |
| // Load different MvCost for P picture when SkipBiasAdjustment is enabled |
| // No need to check for P picture as the flag is only enabled for P picture |
| cmd.m_encCurbe.ModeMvCost.DW11.Value = MvCost_PSkipAdjustment_Cm_Common[sliceQP]; |
| } |
| } |
| |
| // r3 & r4 |
| if (params->bMbEncIFrameDistEnabled) |
| { |
| cmd.m_encCurbe.SPDelta.DW31.IntraComputeType = 1; |
| } |
| else |
| { |
| uint8_t tableIdx = (m_pictureCodingType == B_TYPE) ? 1 : 0; |
| eStatus = MOS_SecureMemcpy(&(cmd.m_encCurbe.SPDelta), 16 * sizeof(uint32_t), m_encodeSearchPath[tableIdx][meMethod], 16 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| |
| // r5 |
| if (m_pictureCodingType == P_TYPE) |
| { |
| cmd.m_encCurbe.DW32.SkipVal = SkipVal_P_Common[cmd.m_encCurbe.DW3.BlockBasedSkipEnable][picParams->transform_8x8_mode_flag][sliceQP]; |
| } |
| else if (m_pictureCodingType == B_TYPE) |
| { |
| cmd.m_encCurbe.DW32.SkipVal = SkipVal_B_Common[cmd.m_encCurbe.DW3.BlockBasedSkipEnable][picParams->transform_8x8_mode_flag][sliceQP]; |
| } |
| |
| cmd.m_encCurbe.ModeMvCost.DW13.QpPrimeY = sliceQP; |
| // QpPrimeCb and QpPrimeCr are not used by Kernel. Following settings are for CModel matching. |
| cmd.m_encCurbe.ModeMvCost.DW13.QpPrimeCb = sliceQP; |
| cmd.m_encCurbe.ModeMvCost.DW13.QpPrimeCr = sliceQP; |
| cmd.m_encCurbe.ModeMvCost.DW13.TargetSizeInWord = 0xff; // hardcoded for BRC disabled |
| |
| if (bMultiPredEnable && (m_pictureCodingType != I_TYPE)) |
| { |
| switch (m_multiPred[seqParams->TargetUsage]) |
| { |
| case 0: // Disable multipred for both P & B picture types |
| cmd.m_encCurbe.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| cmd.m_encCurbe.DW32.MultiPredL1Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| |
| case 1: // Enable multipred for P pictures only |
| cmd.m_encCurbe.DW32.MultiPredL0Disable = (m_pictureCodingType == P_TYPE) ? CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| cmd.m_encCurbe.DW32.MultiPredL1Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| |
| case 2: // Enable multipred for B pictures only |
| cmd.m_encCurbe.DW32.MultiPredL0Disable = (m_pictureCodingType == B_TYPE) ? CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| cmd.m_encCurbe.DW32.MultiPredL1Disable = (m_pictureCodingType == B_TYPE) ? CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| |
| case 3: // Enable multipred for both P & B picture types |
| cmd.m_encCurbe.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE; |
| cmd.m_encCurbe.DW32.MultiPredL1Disable = (m_pictureCodingType == B_TYPE) ? CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| } |
| } |
| else |
| { |
| cmd.m_encCurbe.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| cmd.m_encCurbe.DW32.MultiPredL1Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| } |
| |
| if (!framePicture) |
| { |
| if (m_pictureCodingType != I_TYPE) |
| { |
| cmd.m_encCurbe.DW34.List0RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_0); |
| cmd.m_encCurbe.DW34.List0RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_1); |
| cmd.m_encCurbe.DW34.List0RefID2FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_2); |
| cmd.m_encCurbe.DW34.List0RefID3FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_3); |
| cmd.m_encCurbe.DW34.List0RefID4FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_4); |
| cmd.m_encCurbe.DW34.List0RefID5FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_5); |
| cmd.m_encCurbe.DW34.List0RefID6FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_6); |
| cmd.m_encCurbe.DW34.List0RefID7FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_7); |
| } |
| if (m_pictureCodingType == B_TYPE) |
| { |
| cmd.m_encCurbe.DW34.List1RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| cmd.m_encCurbe.DW34.List1RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| } |
| } |
| |
| if (m_adaptiveTransformDecisionEnabled) |
| { |
| if (m_pictureCodingType != I_TYPE) |
| { |
| cmd.m_encCurbe.DW34.EnableAdaptiveTxDecision = true; |
| } |
| cmd.m_encCurbe.DW60.TxDecisonThreshold = m_adaptiveTxDecisionThreshold; |
| } |
| if (m_adaptiveTransformDecisionEnabled || m_flatnessCheckEnabled) |
| { |
| cmd.m_encCurbe.DW60.MBTextureThreshold = m_mbTextureThreshold; |
| } |
| if (m_pictureCodingType == B_TYPE) |
| { |
| cmd.m_encCurbe.DW34.List1RefID0FrameFieldFlag = GetRefPicFieldFlag(params, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| cmd.m_encCurbe.DW34.List1RefID1FrameFieldFlag = GetRefPicFieldFlag(params, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| cmd.m_encCurbe.DW34.bDirectMode = slcParams->direct_spatial_mv_pred_flag; |
| } |
| |
| cmd.m_encCurbe.DW34.EnablePerMBStaticCheck = params->bStaticFrameDetectionEnabled; |
| cmd.m_encCurbe.DW34.EnableAdaptiveSearchWindowSize = params->bApdatvieSearchWindowSizeEnabled; |
| cmd.m_encCurbe.DW34.RemoveIntraRefreshOverlap = picParams->bDisableRollingIntraRefreshOverlap; |
| cmd.m_encCurbe.DW34.bOriginalBff = framePicture ? 0 : ((m_firstField && (bottomField)) || (!m_firstField && (!bottomField))); |
| cmd.m_encCurbe.DW34.EnableMBFlatnessChkOptimization = m_flatnessCheckEnabled; |
| cmd.m_encCurbe.DW34.ROIEnableFlag = params->bRoiEnabled; |
| cmd.m_encCurbe.DW34.MADEnableFlag = m_madEnabled; |
| cmd.m_encCurbe.DW34.MBBrcEnable = bMbBrcEnabled || bMbQpDataEnabled; |
| cmd.m_encCurbe.DW34.ArbitraryNumMbsPerSlice = m_arbitraryNumMbsInSlice; |
| cmd.m_encCurbe.DW34.ForceNonSkipMbEnable = params->bMbDisableSkipMapEnabled; |
| if (params->pAvcQCParams && !cmd.m_encCurbe.DW34.ForceNonSkipMbEnable) // ignore DisableEncSkipCheck if Mb Disable Skip Map is available |
| { |
| cmd.m_encCurbe.DW34.DisableEncSkipCheck = params->pAvcQCParams->skipCheckDisable; |
| } |
| cmd.m_encCurbe.DW34.TQEnable = m_trellisQuantParams.dwTqEnabled; |
| cmd.m_encCurbe.DW34.CQPFlag = !bBrcEnabled; // 1 - Rate Control is CQP, 0 - Rate Control is BRC |
| cmd.m_encCurbe.DW36.CheckAllFractionalEnable = bCAFEnable; |
| cmd.m_encCurbe.DW38.RefThreshold = m_refTreshold; |
| cmd.m_encCurbe.DW39.HMERefWindowsCombThreshold = (m_pictureCodingType == B_TYPE) ? HMEBCombineLen[seqParams->TargetUsage] : HMECombineLen[seqParams->TargetUsage]; |
| |
| // Default:2 used for MBBRC (MB QP Surface width and height are 4x downscaled picture in MB unit * 4 bytes) |
| // 0 used for MBQP data surface (MB QP Surface width and height are same as the input picture size in MB unit * 1bytes) |
| // BRC use split kernel, MB QP surface is same size as input picture |
| cmd.m_encCurbe.DW47.MbQpReadFactor = (bMbBrcEnabled || bMbQpDataEnabled) ? 0 : 2; |
| |
| // Those fields are not really used for I_dist kernel, |
| // but set them to 0 to get bit-exact match with kernel prototype |
| if (params->bMbEncIFrameDistEnabled) |
| { |
| cmd.m_encCurbe.ModeMvCost.DW13.QpPrimeY = 0; |
| cmd.m_encCurbe.ModeMvCost.DW13.QpPrimeCb = 0; |
| cmd.m_encCurbe.ModeMvCost.DW13.QpPrimeCr = 0; |
| cmd.m_encCurbe.DW33.Intra16x16NonDCPredPenalty = 0; |
| cmd.m_encCurbe.DW33.Intra4x4NonDCPredPenalty = 0; |
| cmd.m_encCurbe.DW33.Intra8x8NonDCPredPenalty = 0; |
| } |
| |
| //r6 |
| if (cmd.m_encCurbe.DW4.UseActualRefQPValue) |
| { |
| cmd.m_encCurbe.DW44.ActualQPValueForRefID0List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_0); |
| cmd.m_encCurbe.DW44.ActualQPValueForRefID1List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_1); |
| cmd.m_encCurbe.DW44.ActualQPValueForRefID2List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_2); |
| cmd.m_encCurbe.DW44.ActualQPValueForRefID3List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_3); |
| cmd.m_encCurbe.DW45.ActualQPValueForRefID4List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_4); |
| cmd.m_encCurbe.DW45.ActualQPValueForRefID5List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_5); |
| cmd.m_encCurbe.DW45.ActualQPValueForRefID6List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_6); |
| cmd.m_encCurbe.DW45.ActualQPValueForRefID7List0 = AVCGetQPValueFromRefList(params, LIST_0, CODECHAL_ENCODE_REF_ID_7); |
| cmd.m_encCurbe.DW46.ActualQPValueForRefID0List1 = AVCGetQPValueFromRefList(params, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| cmd.m_encCurbe.DW46.ActualQPValueForRefID1List1 = AVCGetQPValueFromRefList(params, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| } |
| |
| uint8_t tableIdx = m_pictureCodingType - 1; |
| cmd.m_encCurbe.DW46.RefCost = m_refCostMultiRefQp[tableIdx][sliceQP]; |
| |
| // Picture Coding Type dependent parameters |
| if (m_pictureCodingType == I_TYPE) |
| { |
| cmd.m_encCurbe.DW0.SkipModeEn = 0; |
| cmd.m_encCurbe.DW37.SkipModeEn = 0; |
| cmd.m_encCurbe.DW36.HMECombineOverlap = 0; |
| cmd.m_encCurbe.DW47.IntraCostSF = 16; // This is not used but recommended to set this to 16 by Kernel team |
| cmd.m_encCurbe.DW34.EnableDirectBiasAdjustment = 0; |
| } |
| else if (m_pictureCodingType == P_TYPE) |
| { |
| cmd.m_encCurbe.DW1.MaxNumMVs = GetMaxMvsPer2Mb(seqParams->Level) / 2; |
| cmd.m_encCurbe.DW3.BMEDisableFBR = 1; |
| cmd.m_encCurbe.DW5.RefWidth = SearchX[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW5.RefHeight = SearchY[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW7.NonSkipZMvAdded = 1; |
| cmd.m_encCurbe.DW7.NonSkipModeAdded = 1; |
| cmd.m_encCurbe.DW7.SkipCenterMask = 1; |
| cmd.m_encCurbe.DW47.IntraCostSF = |
| bAdaptiveIntraScalingEnable ? AdaptiveIntraScalingFactor_Cm_Common[sliceQP] : IntraScalingFactor_Cm_Common[sliceQP]; |
| cmd.m_encCurbe.DW47.MaxVmvR = (framePicture) ? CodecHalAvcEncode_GetMaxMvLen(seqParams->Level) * 4 : (CodecHalAvcEncode_GetMaxMvLen(seqParams->Level) >> 1) * 4; |
| cmd.m_encCurbe.DW36.HMECombineOverlap = 1; |
| cmd.m_encCurbe.DW36.NumRefIdxL0MinusOne = bMultiPredEnable ? slcParams->num_ref_idx_l0_active_minus1 : 0; |
| cmd.m_encCurbe.DW39.RefWidth = SearchX[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW39.RefHeight = SearchY[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW34.EnableDirectBiasAdjustment = 0; |
| if (params->pAvcQCParams) |
| { |
| cmd.m_encCurbe.DW34.EnableGlobalMotionBiasAdjustment = params->pAvcQCParams->globalMotionBiasAdjustmentEnable; |
| } |
| } |
| else |
| { |
| // B_TYPE |
| cmd.m_encCurbe.DW1.MaxNumMVs = GetMaxMvsPer2Mb(seqParams->Level) / 2; |
| cmd.m_encCurbe.DW1.BiWeight = m_biWeight; |
| cmd.m_encCurbe.DW3.SearchCtrl = 7; |
| cmd.m_encCurbe.DW3.SkipType = 1; |
| cmd.m_encCurbe.DW5.RefWidth = BSearchX[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW5.RefHeight = BSearchY[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW7.SkipCenterMask = 0xFF; |
| cmd.m_encCurbe.DW47.IntraCostSF = |
| bAdaptiveIntraScalingEnable ? AdaptiveIntraScalingFactor_Cm_Common[sliceQP] : IntraScalingFactor_Cm_Common[sliceQP]; |
| cmd.m_encCurbe.DW47.MaxVmvR = (framePicture) ? CodecHalAvcEncode_GetMaxMvLen(seqParams->Level) * 4 : (CodecHalAvcEncode_GetMaxMvLen(seqParams->Level) >> 1) * 4; |
| cmd.m_encCurbe.DW36.HMECombineOverlap = 1; |
| // Checking if the forward frame (List 1 index 0) is a short term reference |
| { |
| CODEC_PICTURE codecHalPic = params->pSlcParams->RefPicList[LIST_1][0]; |
| if (codecHalPic.PicFlags != PICTURE_INVALID && |
| codecHalPic.FrameIdx != CODECHAL_ENCODE_AVC_INVALID_PIC_ID && |
| params->pPicIdx[codecHalPic.FrameIdx].bValid) |
| { |
| // Although its name is FWD, it actually means the future frame or the backward reference frame |
| cmd.m_encCurbe.DW36.IsFwdFrameShortTermRef = CodecHal_PictureIsShortTermRef(params->pPicParams->RefFrameList[codecHalPic.FrameIdx]); |
| } |
| else |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid backward reference frame."); |
| return MOS_STATUS_INVALID_PARAMETER; |
| } |
| } |
| cmd.m_encCurbe.DW36.NumRefIdxL0MinusOne = bMultiPredEnable ? slcParams->num_ref_idx_l0_active_minus1 : 0; |
| cmd.m_encCurbe.DW36.NumRefIdxL1MinusOne = bMultiPredEnable ? slcParams->num_ref_idx_l1_active_minus1 : 0; |
| cmd.m_encCurbe.DW39.RefWidth = BSearchX[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW39.RefHeight = BSearchY[seqParams->TargetUsage]; |
| cmd.m_encCurbe.DW40.DistScaleFactorRefID0List0 = m_distScaleFactorList0[0]; |
| cmd.m_encCurbe.DW40.DistScaleFactorRefID1List0 = m_distScaleFactorList0[1]; |
| cmd.m_encCurbe.DW41.DistScaleFactorRefID2List0 = m_distScaleFactorList0[2]; |
| cmd.m_encCurbe.DW41.DistScaleFactorRefID3List0 = m_distScaleFactorList0[3]; |
| cmd.m_encCurbe.DW42.DistScaleFactorRefID4List0 = m_distScaleFactorList0[4]; |
| cmd.m_encCurbe.DW42.DistScaleFactorRefID5List0 = m_distScaleFactorList0[5]; |
| cmd.m_encCurbe.DW43.DistScaleFactorRefID6List0 = m_distScaleFactorList0[6]; |
| cmd.m_encCurbe.DW43.DistScaleFactorRefID7List0 = m_distScaleFactorList0[7]; |
| if (params->pAvcQCParams) |
| { |
| cmd.m_encCurbe.DW34.EnableDirectBiasAdjustment = params->pAvcQCParams->directBiasAdjustmentEnable; |
| if (cmd.m_encCurbe.DW34.EnableDirectBiasAdjustment) |
| { |
| cmd.m_encCurbe.DW7.NonSkipModeAdded = 1; |
| cmd.m_encCurbe.DW7.NonSkipZMvAdded = 1; |
| } |
| |
| cmd.m_encCurbe.DW34.EnableGlobalMotionBiasAdjustment = params->pAvcQCParams->globalMotionBiasAdjustmentEnable; |
| } |
| } |
| |
| *params->pdwBlockBasedSkipEn = cmd.m_encCurbe.DW3.BlockBasedSkipEnable; |
| |
| if (picParams->EnableRollingIntraRefresh) |
| { |
| cmd.m_encCurbe.DW34.IntraRefreshEn = picParams->EnableRollingIntraRefresh; |
| |
| /* Multiple predictor should be completely disabled for the RollingI feature. This does not lead to much quality drop for P frames especially for TU as 1 */ |
| cmd.m_encCurbe.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| |
| /* Pass the same IntraRefreshUnit to the kernel w/o the adjustment by -1, so as to have an overlap of one MB row or column of Intra macroblocks |
| across one P frame to another P frame, as needed by the RollingI algo */ |
| if (ROLLING_I_SQUARE == picParams->EnableRollingIntraRefresh && RATECONTROL_CQP != seqParams->RateControlMethod) |
| { |
| /*BRC update kernel updates these CURBE to MBEnc*/ |
| cmd.m_encCurbe.DW4.EnableIntraRefresh = false; |
| cmd.m_encCurbe.DW34.IntraRefreshEn = ROLLING_I_DISABLED; |
| cmd.m_encCurbe.DW48.IntraRefreshMBx = 0; /* MB column number */ |
| cmd.m_encCurbe.DW61.IntraRefreshMBy = 0; /* MB row number */ |
| } |
| else |
| { |
| cmd.m_encCurbe.DW4.EnableIntraRefresh = true; |
| cmd.m_encCurbe.DW34.IntraRefreshEn = picParams->EnableRollingIntraRefresh; |
| cmd.m_encCurbe.DW48.IntraRefreshMBx = picParams->IntraRefreshMBx; /* MB column number */ |
| cmd.m_encCurbe.DW61.IntraRefreshMBy = picParams->IntraRefreshMBy; /* MB row number */ |
| } |
| cmd.m_encCurbe.DW48.IntraRefreshUnitInMBMinus1 = picParams->IntraRefreshUnitinMB; |
| cmd.m_encCurbe.DW48.IntraRefreshQPDelta = picParams->IntraRefreshQPDelta; |
| } |
| else |
| { |
| cmd.m_encCurbe.DW34.IntraRefreshEn = 0; |
| } |
| |
| if (params->bRoiEnabled) |
| { |
| cmd.m_encCurbe.DW49.ROI1_X_left = picParams->ROI[0].Left; |
| cmd.m_encCurbe.DW49.ROI1_Y_top = picParams->ROI[0].Top; |
| cmd.m_encCurbe.DW50.ROI1_X_right = picParams->ROI[0].Right; |
| cmd.m_encCurbe.DW50.ROI1_Y_bottom = picParams->ROI[0].Bottom; |
| |
| cmd.m_encCurbe.DW51.ROI2_X_left = picParams->ROI[1].Left; |
| cmd.m_encCurbe.DW51.ROI2_Y_top = picParams->ROI[1].Top; |
| cmd.m_encCurbe.DW52.ROI2_X_right = picParams->ROI[1].Right; |
| cmd.m_encCurbe.DW52.ROI2_Y_bottom = picParams->ROI[1].Bottom; |
| |
| cmd.m_encCurbe.DW53.ROI3_X_left = picParams->ROI[2].Left; |
| cmd.m_encCurbe.DW53.ROI3_Y_top = picParams->ROI[2].Top; |
| cmd.m_encCurbe.DW54.ROI3_X_right = picParams->ROI[2].Right; |
| cmd.m_encCurbe.DW54.ROI3_Y_bottom = picParams->ROI[2].Bottom; |
| |
| cmd.m_encCurbe.DW55.ROI4_X_left = picParams->ROI[3].Left; |
| cmd.m_encCurbe.DW55.ROI4_Y_top = picParams->ROI[3].Top; |
| cmd.m_encCurbe.DW56.ROI4_X_right = picParams->ROI[3].Right; |
| cmd.m_encCurbe.DW56.ROI4_Y_bottom = picParams->ROI[3].Bottom; |
| |
| if (bBrcEnabled == false) |
| { |
| uint8_t numROI = picParams->NumROI; |
| int8_t priorityLevelOrDQp[CODECHAL_ENCODE_AVC_MAX_ROI_NUMBER] = { 0 }; |
| |
| // cqp case |
| for (unsigned int i = 0; i < numROI; i += 1) |
| { |
| int8_t qpRoi = picParams->ROI[i].PriorityLevelOrDQp; |
| |
| // clip qp roi in order to have (qp + qpY) in range [0, 51] |
| priorityLevelOrDQp[i] = (int8_t)CodecHal_Clip3(-sliceQP, CODECHAL_ENCODE_AVC_MAX_SLICE_QP - sliceQP, qpRoi); |
| } |
| |
| cmd.m_encCurbe.DW57.ROI1_dQpPrimeY = priorityLevelOrDQp[0]; |
| cmd.m_encCurbe.DW57.ROI2_dQpPrimeY = priorityLevelOrDQp[1]; |
| cmd.m_encCurbe.DW57.ROI3_dQpPrimeY = priorityLevelOrDQp[2]; |
| cmd.m_encCurbe.DW57.ROI4_dQpPrimeY = priorityLevelOrDQp[3]; |
| } |
| else |
| { |
| // kernel does not support BRC case |
| cmd.m_encCurbe.DW34.ROIEnableFlag = 0; |
| } |
| } |
| else if (params->bDirtyRoiEnabled) |
| { |
| // enable Dirty Rect flag |
| cmd.m_encCurbe.DW4.EnableDirtyRect = true; |
| |
| cmd.m_encCurbe.DW49.ROI1_X_left = params->pPicParams->DirtyROI[0].Left; |
| cmd.m_encCurbe.DW49.ROI1_Y_top = params->pPicParams->DirtyROI[0].Top; |
| cmd.m_encCurbe.DW50.ROI1_X_right = params->pPicParams->DirtyROI[0].Right; |
| cmd.m_encCurbe.DW50.ROI1_Y_bottom = params->pPicParams->DirtyROI[0].Bottom; |
| |
| cmd.m_encCurbe.DW51.ROI2_X_left = params->pPicParams->DirtyROI[1].Left; |
| cmd.m_encCurbe.DW51.ROI2_Y_top = params->pPicParams->DirtyROI[1].Top; |
| cmd.m_encCurbe.DW52.ROI2_X_right = params->pPicParams->DirtyROI[1].Right; |
| cmd.m_encCurbe.DW52.ROI2_Y_bottom = params->pPicParams->DirtyROI[1].Bottom; |
| |
| cmd.m_encCurbe.DW53.ROI3_X_left = params->pPicParams->DirtyROI[2].Left; |
| cmd.m_encCurbe.DW53.ROI3_Y_top = params->pPicParams->DirtyROI[2].Top; |
| cmd.m_encCurbe.DW54.ROI3_X_right = params->pPicParams->DirtyROI[2].Right; |
| cmd.m_encCurbe.DW54.ROI3_Y_bottom = params->pPicParams->DirtyROI[2].Bottom; |
| |
| cmd.m_encCurbe.DW55.ROI4_X_left = params->pPicParams->DirtyROI[3].Left; |
| cmd.m_encCurbe.DW55.ROI4_Y_top = params->pPicParams->DirtyROI[3].Top; |
| cmd.m_encCurbe.DW56.ROI4_X_right = params->pPicParams->DirtyROI[3].Right; |
| cmd.m_encCurbe.DW56.ROI4_Y_bottom = params->pPicParams->DirtyROI[3].Bottom; |
| } |
| |
| if (m_trellisQuantParams.dwTqEnabled) |
| { |
| // Lambda values for TQ |
| if (m_pictureCodingType == I_TYPE) |
| { |
| cmd.m_encCurbe.DW58.Value = TQ_LAMBDA_I_FRAME[sliceQP][0]; |
| cmd.m_encCurbe.DW59.Value = TQ_LAMBDA_I_FRAME[sliceQP][1]; |
| } |
| else if (m_pictureCodingType == P_TYPE) |
| { |
| cmd.m_encCurbe.DW58.Value = TQ_LAMBDA_P_FRAME[sliceQP][0]; |
| cmd.m_encCurbe.DW59.Value = TQ_LAMBDA_P_FRAME[sliceQP][1]; |
| } |
| else |
| { |
| cmd.m_encCurbe.DW58.Value = TQ_LAMBDA_B_FRAME[sliceQP][0]; |
| cmd.m_encCurbe.DW59.Value = TQ_LAMBDA_B_FRAME[sliceQP][1]; |
| } |
| |
| MHW_VDBOX_AVC_SLICE_STATE sliceState; |
| memset((void *)&sliceState, 0, sizeof(MHW_VDBOX_AVC_SLICE_STATE)); |
| sliceState.pEncodeAvcSeqParams = seqParams; |
| sliceState.pEncodeAvcPicParams = picParams; |
| sliceState.pEncodeAvcSliceParams = slcParams; |
| |
| // check if Lambda is greater than max value |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetInterRounding(&sliceState)); |
| |
| if (cmd.m_encCurbe.DW58.Lambda_8x8Inter > CODECHAL_ENCODE_AVC_MAX_LAMBDA) |
| { |
| cmd.m_encCurbe.DW58.Lambda_8x8Inter = 0xf000 + sliceState.dwRoundingValue; |
| } |
| |
| if (cmd.m_encCurbe.DW58.Lambda_8x8Intra > CODECHAL_ENCODE_AVC_MAX_LAMBDA) |
| { |
| cmd.m_encCurbe.DW58.Lambda_8x8Intra = 0xf000 + m_defaultTrellisQuantIntraRounding; |
| } |
| |
| // check if Lambda is greater than max value |
| if (cmd.m_encCurbe.DW59.Lambda_Inter > CODECHAL_ENCODE_AVC_MAX_LAMBDA) |
| { |
| cmd.m_encCurbe.DW59.Lambda_Inter = 0xf000 + sliceState.dwRoundingValue; |
| } |
| |
| if (cmd.m_encCurbe.DW59.Lambda_Intra > CODECHAL_ENCODE_AVC_MAX_LAMBDA) |
| { |
| cmd.m_encCurbe.DW59.Lambda_Intra = 0xf000 + m_defaultTrellisQuantIntraRounding; |
| } |
| } |
| |
| //IPCM QP and threshold |
| cmd.m_encCurbe.DW62.IPCM_QP0 = m_IPCMThresholdTable[0].QP; |
| cmd.m_encCurbe.DW62.IPCM_QP1 = m_IPCMThresholdTable[1].QP; |
| cmd.m_encCurbe.DW62.IPCM_QP2 = m_IPCMThresholdTable[2].QP; |
| cmd.m_encCurbe.DW62.IPCM_QP3 = m_IPCMThresholdTable[3].QP; |
| cmd.m_encCurbe.DW63.IPCM_QP4 = m_IPCMThresholdTable[4].QP; |
| |
| cmd.m_encCurbe.DW63.IPCM_Thresh0 = m_IPCMThresholdTable[0].Threshold; |
| cmd.m_encCurbe.DW64.IPCM_Thresh1 = m_IPCMThresholdTable[1].Threshold; |
| cmd.m_encCurbe.DW64.IPCM_Thresh2 = m_IPCMThresholdTable[2].Threshold; |
| cmd.m_encCurbe.DW65.IPCM_Thresh3 = m_IPCMThresholdTable[3].Threshold; |
| cmd.m_encCurbe.DW65.IPCM_Thresh4 = m_IPCMThresholdTable[4].Threshold; |
| |
| cmd.m_encCurbe.DW66.MBDataSurfIndex = mbEncMfcAvcPakObj; |
| cmd.m_encCurbe.DW67.MVDataSurfIndex = mbEncIndirectMvData; |
| cmd.m_encCurbe.DW68.IDistSurfIndex = mbEncBrcDistortion; |
| cmd.m_encCurbe.DW69.SrcYSurfIndex = mbEncCurrentY; |
| cmd.m_encCurbe.DW70.MBSpecificDataSurfIndex = mbEncMbSpecificData; |
| cmd.m_encCurbe.DW71.AuxVmeOutSurfIndex = mbEncAuxVmeOutput; |
| cmd.m_encCurbe.DW72.CurrRefPicSelSurfIndex = mbEncRefPicSeletcL0; |
| cmd.m_encCurbe.DW73.HMEMVPredFwdBwdSurfIndex = mbEncMvDataFromMe; |
| cmd.m_encCurbe.DW74.HMEDistSurfIndex = mbEnc4xMeDistortion; |
| cmd.m_encCurbe.DW75.SliceMapSurfIndex = mbEncSliceMapData; |
| cmd.m_encCurbe.DW76.FwdFrmMBDataSurfIndex = mbEncFwdMbData; |
| cmd.m_encCurbe.DW77.FwdFrmMVSurfIndex = mbEncFwdMvData; |
| cmd.m_encCurbe.DW78.MBQPBuffer = mbEncMbQP; |
| cmd.m_encCurbe.DW79.MBBRCLut = mbEncMbBrcConstData; |
| cmd.m_encCurbe.DW80.VMEInterPredictionSurfIndex = mbEncVmeInterPredCurrPic; |
| cmd.m_encCurbe.DW81.VMEInterPredictionMRSurfIndex = mbEncVmeInterPredMultiRefCurrPic; |
| cmd.m_encCurbe.DW82.MBStatsSurfIndex = mbEncMbStats; |
| cmd.m_encCurbe.DW83.MADSurfIndex = mbEncMadData; |
| cmd.m_encCurbe.DW84.BRCCurbeSurfIndex = mbEncBrcCurbeData; |
| cmd.m_encCurbe.DW85.ForceNonSkipMBmapSurface = mbEncForceNonSkipMbMap; |
| cmd.m_encCurbe.DW86.ReservedIndex = mbEncAdv; |
| cmd.m_encCurbe.DW87.StaticDetectionCostTableIndex = mbEncSfdCostTable; |
| auto pStateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pStateHeapInterface); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &cmd, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(cmd))); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateEncParam( |
| meMethod, |
| &cmd)); |
| ) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetCurbeAvcBrcInitReset(PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| |
| auto picParams = m_avcPicParam; |
| auto seqParams = m_avcSeqParam; |
| auto vuiParams = m_avcVuiParams; |
| |
| uint32_t profileLevelMaxFrame; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_GetProfileLevelMaxFrameSize( |
| seqParams, |
| this, |
| (uint32_t*)&profileLevelMaxFrame)); |
| |
| BrcInitResetCurbe cmd; |
| cmd.m_dw0.ProfileLevelMaxFrame = profileLevelMaxFrame; |
| cmd.m_dw1.InitBufFullInBits = seqParams->InitVBVBufferFullnessInBit; |
| cmd.m_dw2.BufSizeInBits = seqParams->VBVBufferSizeInBit; |
| cmd.m_dw3.AverageBitRate = seqParams->TargetBitRate; |
| cmd.m_dw4.MaxBitRate = seqParams->MaxBitRate; |
| cmd.m_dw8.GopP = (seqParams->GopRefDist) ? ((seqParams->GopPicSize - 1) / seqParams->GopRefDist) : 0; |
| cmd.m_dw9.GopB = seqParams->GopPicSize - 1 - cmd.m_dw8.GopP; |
| cmd.m_dw9.FrameWidthInBytes = m_frameWidth; |
| cmd.m_dw10.FrameHeightInBytes = m_frameHeight; |
| cmd.m_dw12.NoSlices = m_numSlices; |
| |
| cmd.m_dw32.SurfaceIndexhistorybuffer = CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY; |
| cmd.m_dw33.SurfaceIndexdistortionbuffer = CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION; |
| |
| // if VUI present, VUI data has high priority |
| if (seqParams->vui_parameters_present_flag && seqParams->RateControlMethod != RATECONTROL_AVBR) |
| { |
| cmd.m_dw4.MaxBitRate = ((vuiParams->bit_rate_value_minus1[0] + 1) << (6 + vuiParams->bit_rate_scale)); |
| |
| if (seqParams->RateControlMethod == RATECONTROL_CBR) |
| { |
| cmd.m_dw3.AverageBitRate = cmd.m_dw4.MaxBitRate; |
| } |
| } |
| |
| cmd.m_dw6.FrameRateM = seqParams->FramesPer100Sec; |
| cmd.m_dw7.FrameRateD = 100; |
| cmd.m_dw8.BRCFlag = (CodecHal_PictureIsFrame(m_currOriginalPic)) ? 0 : CODECHAL_ENCODE_BRCINIT_FIELD_PIC; |
| // MBBRC should be skipped when BRC ROI is on |
| cmd.m_dw8.BRCFlag |= (bMbBrcEnabled && !bBrcRoiEnabled) ? 0 : CODECHAL_ENCODE_BRCINIT_DISABLE_MBBRC; |
| |
| if (seqParams->RateControlMethod == RATECONTROL_CBR) |
| { |
| cmd.m_dw4.MaxBitRate = cmd.m_dw3.AverageBitRate; |
| cmd.m_dw8.BRCFlag = cmd.m_dw8.BRCFlag | CODECHAL_ENCODE_BRCINIT_ISCBR; |
| } |
| else if (seqParams->RateControlMethod == RATECONTROL_VBR) |
| { |
| if (cmd.m_dw4.MaxBitRate < cmd.m_dw3.AverageBitRate) |
| { |
| cmd.m_dw3.AverageBitRate = cmd.m_dw4.MaxBitRate; // Use max bit rate for HRD compliance |
| } |
| cmd.m_dw8.BRCFlag = cmd.m_dw8.BRCFlag | CODECHAL_ENCODE_BRCINIT_ISVBR; |
| } |
| else if (seqParams->RateControlMethod == RATECONTROL_AVBR) |
| { |
| cmd.m_dw8.BRCFlag = cmd.m_dw8.BRCFlag | CODECHAL_ENCODE_BRCINIT_ISAVBR; |
| // For AVBR, max bitrate = target bitrate, |
| cmd.m_dw4.MaxBitRate = cmd.m_dw3.AverageBitRate; |
| } |
| else if (seqParams->RateControlMethod == RATECONTROL_ICQ) |
| { |
| cmd.m_dw8.BRCFlag = cmd.m_dw8.BRCFlag | CODECHAL_ENCODE_BRCINIT_ISICQ; |
| cmd.m_dw23.ACQP = seqParams->ICQQualityFactor; |
| } |
| else if (seqParams->RateControlMethod == RATECONTROL_VCM) |
| { |
| cmd.m_dw8.BRCFlag = cmd.m_dw8.BRCFlag | CODECHAL_ENCODE_BRCINIT_ISVCM; |
| } |
| else if (seqParams->RateControlMethod == RATECONTROL_QVBR) |
| { |
| if (cmd.m_dw4.MaxBitRate < cmd.m_dw3.AverageBitRate) |
| { |
| cmd.m_dw3.AverageBitRate = cmd.m_dw4.MaxBitRate; // Use max bit rate for HRD compliance |
| } |
| cmd.m_dw8.BRCFlag = cmd.m_dw8.BRCFlag | CODECHAL_ENCODE_BRCINIT_ISQVBR; |
| // use ICQQualityFactor to determine the larger Qp for each MB |
| cmd.m_dw23.ACQP = seqParams->ICQQualityFactor; |
| } |
| |
| cmd.m_dw10.AVBRAccuracy = usAVBRAccuracy; |
| cmd.m_dw11.AVBRConvergence = usAVBRConvergence; |
| |
| // Set dynamic thresholds |
| double inputBitsPerFrame = |
| ((double)(cmd.m_dw4.MaxBitRate) * (double)(cmd.m_dw7.FrameRateD) / |
| (double)(cmd.m_dw6.FrameRateM)); |
| if (CodecHal_PictureIsField(m_currOriginalPic)) |
| { |
| inputBitsPerFrame *= 0.5; |
| } |
| |
| if (cmd.m_dw2.BufSizeInBits == 0) |
| { |
| cmd.m_dw2.BufSizeInBits = (uint32_t)inputBitsPerFrame * 4; |
| } |
| |
| if (cmd.m_dw1.InitBufFullInBits == 0) |
| { |
| cmd.m_dw1.InitBufFullInBits = 7 * cmd.m_dw2.BufSizeInBits / 8; |
| } |
| if (cmd.m_dw1.InitBufFullInBits < (uint32_t)(inputBitsPerFrame * 2)) |
| { |
| cmd.m_dw1.InitBufFullInBits = (uint32_t)(inputBitsPerFrame * 2); |
| } |
| if (cmd.m_dw1.InitBufFullInBits > cmd.m_dw2.BufSizeInBits) |
| { |
| cmd.m_dw1.InitBufFullInBits = cmd.m_dw2.BufSizeInBits; |
| } |
| |
| if (seqParams->RateControlMethod == RATECONTROL_AVBR) |
| { |
| // For AVBR, Buffer size = 2*Bitrate, InitVBV = 0.75 * BufferSize |
| cmd.m_dw2.BufSizeInBits = 2 * seqParams->TargetBitRate; |
| cmd.m_dw1.InitBufFullInBits = (uint32_t)(0.75 * cmd.m_dw2.BufSizeInBits); |
| } |
| |
| double bpsRatio = inputBitsPerFrame / ((double)(cmd.m_dw2.BufSizeInBits) / 30); |
| bpsRatio = (bpsRatio < 0.1) ? 0.1 : (bpsRatio > 3.5) ? 3.5 : bpsRatio; |
| |
| cmd.m_dw16.DeviationThreshold0ForPandB = (uint32_t)(-50 * pow(0.90, bpsRatio)); |
| cmd.m_dw16.DeviationThreshold1ForPandB = (uint32_t)(-50 * pow(0.66, bpsRatio)); |
| cmd.m_dw16.DeviationThreshold2ForPandB = (uint32_t)(-50 * pow(0.46, bpsRatio)); |
| cmd.m_dw16.DeviationThreshold3ForPandB = (uint32_t)(-50 * pow(0.3, bpsRatio)); |
| cmd.m_dw17.DeviationThreshold4ForPandB = (uint32_t)(50 * pow(0.3, bpsRatio)); |
| cmd.m_dw17.DeviationThreshold5ForPandB = (uint32_t)(50 * pow(0.46, bpsRatio)); |
| cmd.m_dw17.DeviationThreshold6ForPandB = (uint32_t)(50 * pow(0.7, bpsRatio)); |
| cmd.m_dw17.DeviationThreshold7ForPandB = (uint32_t)(50 * pow(0.9, bpsRatio)); |
| cmd.m_dw18.DeviationThreshold0ForVBR = (uint32_t)(-50 * pow(0.9, bpsRatio)); |
| cmd.m_dw18.DeviationThreshold1ForVBR = (uint32_t)(-50 * pow(0.7, bpsRatio)); |
| cmd.m_dw18.DeviationThreshold2ForVBR = (uint32_t)(-50 * pow(0.5, bpsRatio)); |
| cmd.m_dw18.DeviationThreshold3ForVBR = (uint32_t)(-50 * pow(0.3, bpsRatio)); |
| cmd.m_dw19.DeviationThreshold4ForVBR = (uint32_t)(100 * pow(0.4, bpsRatio)); |
| cmd.m_dw19.DeviationThreshold5ForVBR = (uint32_t)(100 * pow(0.5, bpsRatio)); |
| cmd.m_dw19.DeviationThreshold6ForVBR = (uint32_t)(100 * pow(0.75, bpsRatio)); |
| cmd.m_dw19.DeviationThreshold7ForVBR = (uint32_t)(100 * pow(0.9, bpsRatio)); |
| cmd.m_dw20.DeviationThreshold0ForI = (uint32_t)(-50 * pow(0.8, bpsRatio)); |
| cmd.m_dw20.DeviationThreshold1ForI = (uint32_t)(-50 * pow(0.6, bpsRatio)); |
| cmd.m_dw20.DeviationThreshold2ForI = (uint32_t)(-50 * pow(0.34, bpsRatio)); |
| cmd.m_dw20.DeviationThreshold3ForI = (uint32_t)(-50 * pow(0.2, bpsRatio)); |
| cmd.m_dw21.DeviationThreshold4ForI = (uint32_t)(50 * pow(0.2, bpsRatio)); |
| cmd.m_dw21.DeviationThreshold5ForI = (uint32_t)(50 * pow(0.4, bpsRatio)); |
| cmd.m_dw21.DeviationThreshold6ForI = (uint32_t)(50 * pow(0.66, bpsRatio)); |
| cmd.m_dw21.DeviationThreshold7ForI = (uint32_t)(50 * pow(0.9, bpsRatio)); |
| |
| cmd.m_dw22.SlidingWindowSize = dwSlidingWindowSize; |
| |
| if (bBrcInit) |
| { |
| *params->pdBrcInitCurrentTargetBufFullInBits = cmd.m_dw1.InitBufFullInBits; |
| } |
| |
| *params->pdwBrcInitResetBufSizeInBits = cmd.m_dw2.BufSizeInBits; |
| *params->pdBrcInitResetInputBitsPerFrame = inputBitsPerFrame; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &cmd, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(cmd))); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateBrcInitParam( |
| &cmd)); |
| ) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetCurbeAvcBrcBlockCopy(PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState); |
| |
| BrcBlockCopyCurbe cmd; |
| cmd.m_brcBlockCopyCurbeCmd.DW0.BufferOffset = params->dwBufferOffset; |
| cmd.m_brcBlockCopyCurbeCmd.DW0.BlockHeight = params->dwBlockHeight; |
| cmd.m_brcBlockCopyCurbeCmd.DW1.SrcSurfaceIndex = 0x00; |
| cmd.m_brcBlockCopyCurbeCmd.DW2.DstSurfaceIndex = 0x01; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &cmd, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(cmd))); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetCurbeAvcFrameBrcUpdate(PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState); |
| |
| auto seqParams = m_avcSeqParam; |
| auto picParams = m_avcPicParam; |
| auto slcParams = m_avcSliceParams; |
| |
| BrcFrameUpdateCurbe cmd; |
| |
| cmd.m_dw5.TargetSizeFlag = 0; |
| if (*params->pdBrcInitCurrentTargetBufFullInBits > (double)dwBrcInitResetBufSizeInBits) |
| { |
| *params->pdBrcInitCurrentTargetBufFullInBits -= (double)dwBrcInitResetBufSizeInBits; |
| cmd.m_dw5.TargetSizeFlag = 1; |
| } |
| |
| // skipped frame handling |
| if (params->dwNumSkipFrames) |
| { |
| // pass num/size of skipped frames to update BRC |
| cmd.m_dw6.NumSkipFrames = params->dwNumSkipFrames; |
| cmd.m_dw7.SizeSkipFrames = params->dwSizeSkipFrames; |
| |
| // account for skipped frame in calculating CurrentTargetBufFullInBits |
| *params->pdBrcInitCurrentTargetBufFullInBits += dBrcInitResetInputBitsPerFrame * params->dwNumSkipFrames; |
| } |
| |
| cmd.m_dw0.TargetSize = (uint32_t)(*params->pdBrcInitCurrentTargetBufFullInBits); |
| cmd.m_dw1.FrameNumber = m_storeData - 1; |
| cmd.m_dw2.SizeofPicHeaders = m_headerBytesInserted << 3; // kernel uses how many bits instead of bytes |
| cmd.m_dw5.CurrFrameType = |
| ((m_pictureCodingType - 2) < 0) ? 2 : (m_pictureCodingType - 2); |
| cmd.m_dw5.BRCFlag = |
| (CodecHal_PictureIsTopField(m_currOriginalPic)) ? brcUpdateIsField : ((CodecHal_PictureIsBottomField(m_currOriginalPic)) ? (brcUpdateIsField | brcUpdateIsBottomField) : 0); |
| cmd.m_dw5.BRCFlag |= (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef) ? brcUpdateIsReference : 0; |
| |
| if (bMultiRefQpEnabled) |
| { |
| cmd.m_dw5.BRCFlag |= brcUpdateIsActualQp; |
| cmd.m_dw14.QPIndexOfCurPic = m_currOriginalPic.FrameIdx; |
| } |
| |
| cmd.m_dw5.BRCFlag |= seqParams->bAutoMaxPBFrameSizeForSceneChange ? brcUpdateAutoPbFrameSize : 0; |
| |
| cmd.m_dw5.MaxNumPAKs = m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses(); |
| |
| cmd.m_dw6.MinimumQP = params->ucMinQP; |
| cmd.m_dw6.MaximumQP = params->ucMaxQP; |
| cmd.m_dw6.EnableForceToSkip = bForceToSkipEnable; |
| cmd.m_dw6.EnableSlidingWindow = (seqParams->FrameSizeTolerance == EFRAMESIZETOL_LOW); |
| cmd.m_dw6.EnableExtremLowDelay = (seqParams->FrameSizeTolerance == EFRAMESIZETOL_EXTREMELY_LOW); |
| cmd.m_dw6.DisableVarCompute = bBRCVarCompuBypass; |
| |
| *params->pdBrcInitCurrentTargetBufFullInBits += dBrcInitResetInputBitsPerFrame; |
| |
| if (seqParams->RateControlMethod == RATECONTROL_AVBR) |
| { |
| cmd.m_dw3.startGAdjFrame0 = (uint32_t)((10 * usAVBRConvergence) / (double)150); |
| cmd.m_dw3.startGAdjFrame1 = (uint32_t)((50 * usAVBRConvergence) / (double)150); |
| cmd.m_dw4.startGAdjFrame2 = (uint32_t)((100 * usAVBRConvergence) / (double)150); |
| cmd.m_dw4.startGAdjFrame3 = (uint32_t)((150 * usAVBRConvergence) / (double)150); |
| cmd.m_dw11.gRateRatioThreshold0 = |
| (uint32_t)((100 - (usAVBRAccuracy / (double)30) * (100 - 40))); |
| cmd.m_dw11.gRateRatioThreshold1 = |
| (uint32_t)((100 - (usAVBRAccuracy / (double)30) * (100 - 75))); |
| cmd.m_dw12.gRateRatioThreshold2 = (uint32_t)((100 - (usAVBRAccuracy / (double)30) * (100 - 97))); |
| cmd.m_dw12.gRateRatioThreshold3 = (uint32_t)((100 + (usAVBRAccuracy / (double)30) * (103 - 100))); |
| cmd.m_dw12.gRateRatioThreshold4 = (uint32_t)((100 + (usAVBRAccuracy / (double)30) * (125 - 100))); |
| cmd.m_dw12.gRateRatioThreshold5 = (uint32_t)((100 + (usAVBRAccuracy / (double)30) * (160 - 100))); |
| } |
| |
| cmd.m_dw15.EnableROI = params->ucEnableROI; |
| |
| MHW_VDBOX_AVC_SLICE_STATE sliceState; |
| memset((void *)&sliceState, 0, sizeof(MHW_VDBOX_AVC_SLICE_STATE)); |
| sliceState.pEncodeAvcSeqParams = seqParams; |
| sliceState.pEncodeAvcPicParams = picParams; |
| sliceState.pEncodeAvcSliceParams = slcParams; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetInterRounding(&sliceState)); |
| |
| cmd.m_dw15.RoundingIntra = 5; |
| cmd.m_dw15.RoundingInter = sliceState.dwRoundingValue; |
| |
| uint32_t profileLevelMaxFrame; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_GetProfileLevelMaxFrameSize( |
| seqParams, |
| this, |
| (uint32_t*)&profileLevelMaxFrame)); |
| |
| cmd.m_dw19.UserMaxFrame = profileLevelMaxFrame; |
| cmd.m_dw24.SurfaceIndexBRChistorybuffer = frameBrcUpdateHistory; |
| cmd.m_dw25.SurfaceIndexPreciousPAKstatisticsoutputbuffer = frameBrcUpdatePakStatisticsOutput; |
| cmd.m_dw26.SurfaceIndexAVCIMGstateinputbuffer = frameBrcUpdateImageStateRead; |
| cmd.m_dw27.SurfaceIndexAVCIMGstateoutputbuffer = frameBrcUpdateImageStateWrite; |
| cmd.m_dw28.SurfaceIndexAVC_Encbuffer = frameBrcUpdateMbEncCurbeWrite; |
| cmd.m_dw29.SurfaceIndexAVCDISTORTIONbuffer = frameBrcUpdateDistortion; |
| cmd.m_dw30.SurfaceIndexBRCconstdatabuffer = frameBrcUpdateConstantData; |
| cmd.m_dw31.SurfaceIndexMBStatsBuffer = frameBrcUpdateMbStat; |
| cmd.m_dw32.SurfaceIndexMotionvectorbuffer = frameBrcUpdateMvStat; |
| auto pStateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pStateHeapInterface); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &cmd, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(cmd))); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateBrcUpdateParam( |
| &cmd)); |
| ) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetCurbeAvcWP(PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| int16_t weight; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| |
| auto slcParams = m_avcSliceParams; |
| auto seqParams = m_avcSeqParam; |
| CODECHAL_ENCODE_ASSERT(seqParams->TargetUsage < NUM_TARGET_USAGE_MODES); |
| |
| WPCurbe cmd; |
| /* Weights[i][j][k][m] is interpreted as: |
| |
| i refers to reference picture list 0 or 1; |
| j refers to reference list entry 0-31; |
| k refers to data for the luma (Y) component when it is 0, the Cb chroma component when it is 1 and the Cr chroma component when it is 2; |
| m refers to weight when it is 0 and offset when it is 1 |
| */ |
| weight = slcParams->Weights[params->RefPicListIdx][params->WPIdx][0][0]; |
| cmd.m_wpCurbeCmd.DW0.DefaultWeight = (weight << 6) >> (slcParams->luma_log2_weight_denom); |
| cmd.m_wpCurbeCmd.DW0.DefaultOffset = slcParams->Weights[params->RefPicListIdx][0][0][1]; |
| |
| cmd.m_wpCurbeCmd.DW49.InputSurface = wpInputRefSurface; |
| cmd.m_wpCurbeCmd.DW50.OutputSurface = wpOutputScaledSurface; |
| |
| auto kernelState = pWPKernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(kernelState->m_dshRegion.AddData( |
| &cmd, |
| kernelState->dwCurbeOffset, |
| sizeof(cmd))); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetCurbeAvcMbBrcUpdate(PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState); |
| |
| MbBrcUpdateCurbe curbe; |
| |
| // BRC curbe requires: 2 for I-frame, 0 for P-frame, 1 for B-frame |
| curbe.m_dw0.CurrFrameType = (m_pictureCodingType + 1) % 3; |
| if (params->ucEnableROI) |
| { |
| if (bROIValueInDeltaQP) |
| { |
| curbe.m_dw0.EnableROI = 2; // 1-Enabled ROI priority, 2-Enable ROI QP Delta, 0- disabled |
| curbe.m_dw0.ROIRatio = 0; |
| } |
| else |
| { |
| curbe.m_dw0.EnableROI = 1; // 1-Enabled ROI priority, 2-Enable ROI QP Delta, 0- disabled |
| |
| uint32_t roiSize = 0; |
| uint32_t roiRatio = 0; |
| |
| for (uint32_t i = 0; i < m_avcPicParam->NumROI; ++i) |
| { |
| CODECHAL_ENCODE_VERBOSEMESSAGE("ROI[%d] = {%d, %d, %d, %d} {%d}, size = %d", i, |
| m_avcPicParam->ROI[i].Left, m_avcPicParam->ROI[i].Top, |
| m_avcPicParam->ROI[i].Bottom, m_avcPicParam->ROI[i].Right, |
| m_avcPicParam->ROI[i].PriorityLevelOrDQp, |
| (CODECHAL_MACROBLOCK_HEIGHT * MOS_ABS(m_avcPicParam->ROI[i].Top - m_avcPicParam->ROI[i].Bottom)) * |
| (CODECHAL_MACROBLOCK_WIDTH * MOS_ABS(m_avcPicParam->ROI[i].Right - m_avcPicParam->ROI[i].Left))); |
| roiSize += (CODECHAL_MACROBLOCK_HEIGHT * MOS_ABS(m_avcPicParam->ROI[i].Top - m_avcPicParam->ROI[i].Bottom)) * |
| (CODECHAL_MACROBLOCK_WIDTH * MOS_ABS(m_avcPicParam->ROI[i].Right - m_avcPicParam->ROI[i].Left)); |
| } |
| |
| if (roiSize) |
| { |
| uint32_t numMBs = m_picWidthInMb * m_picHeightInMb; |
| roiRatio = 2 * (numMBs * 256 / roiSize - 1); |
| roiRatio = MOS_MIN(51, roiRatio); // clip QP from 0-51 |
| } |
| CODECHAL_ENCODE_VERBOSEMESSAGE("ROIRatio = %d", roiRatio); |
| curbe.m_dw0.ROIRatio = roiRatio; |
| } |
| } |
| else |
| { |
| curbe.m_dw0.ROIRatio = 0; |
| } |
| |
| curbe.m_dw8.HistorybufferIndex = mbBrcUpdateHistory; |
| curbe.m_dw9.MBQPbufferIndex = mbBrcUpdateMbQP; |
| curbe.m_dw10.ROIbufferIndex = mbBrcUpdateROI; |
| curbe.m_dw11.MBstatisticalbufferIndex = mbBrcUpdateMbStat; |
| auto pStateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pStateHeapInterface); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &curbe, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(curbe))); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SendAvcMbEncSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pAvcSlcParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->ppRefList); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pCurrOriginalPic); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pCurrReconstructedPic); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psCurrPicSurface); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pAvcPicIdx); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pMbEncBindingTable); |
| |
| bool currFieldPicture = CodecHal_PictureIsField(*(params->pCurrOriginalPic)) ? 1 : 0; |
| bool currBottomField = CodecHal_PictureIsBottomField(*(params->pCurrOriginalPic)) ? 1 : 0; |
| auto currPicRefListEntry = params->ppRefList[params->pCurrReconstructedPic->FrameIdx]; |
| auto mbCodeBuffer = &currPicRefListEntry->resRefMbCodeBuffer; |
| auto mvDataBuffer = &currPicRefListEntry->resRefMvDataBuffer; |
| uint32_t refMbCodeBottomFieldOffset = params->dwFrameFieldHeightInMb * params->dwFrameWidthInMb * 64; |
| uint32_t refMvBottomFieldOffset = MOS_ALIGN_CEIL(params->dwFrameFieldHeightInMb * params->dwFrameWidthInMb * (32 * 4), 0x1000); |
| |
| uint8_t vDirection, refVDirection; |
| if (params->bMbEncIFrameDistInUse) |
| { |
| vDirection = CODECHAL_VDIRECTION_FRAME; |
| } |
| else |
| { |
| vDirection = (CodecHal_PictureIsFrame(*(params->pCurrOriginalPic))) ? CODECHAL_VDIRECTION_FRAME : |
| (currBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD; |
| } |
| |
| auto kernelState = params->pKernelState; |
| auto bindingTable = params->pMbEncBindingTable; |
| // PAK Obj command buffer |
| uint32_t size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 16 * 4; // 11DW + 5DW padding |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams; |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = mbCodeBuffer; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwOffset = params->dwMbCodeBottomFieldOffset; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMfcAvcPakObj; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_PAK_OBJECT_ENCODE].Value; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // MV data buffer |
| size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 32 * 4; |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = mvDataBuffer; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwOffset = params->dwMvBottomFieldOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncIndMVData; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // Current Picture Y |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; // Use media block RW for DP 2D surface access |
| surfaceCodecParams.bUseUVPlane = true; |
| surfaceCodecParams.psSurface = params->psCurrPicSurface; |
| surfaceCodecParams.dwOffset = params->dwCurrPicSurfaceOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncCurrY; |
| surfaceCodecParams.dwUVBindingTableOffset = bindingTable->dwAvcMBEncCurrUV; |
| surfaceCodecParams.dwVerticalLineStride = params->dwVerticalLineStride; |
| surfaceCodecParams.dwVerticalLineStrideOffset = params->dwVerticalLineStrideOffset; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // AVC_ME MV data buffer |
| if (params->bHmeEnabled) |
| { |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps4xMeMvDataBuffer); |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->ps4xMeMvDataBuffer; |
| surfaceCodecParams.dwOffset = params->dwMeMvBottomFieldOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMVDataFromME; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps4xMeDistortionBuffer); |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->ps4xMeDistortionBuffer; |
| surfaceCodecParams.dwOffset = params->dwMeDistortionBottomFieldOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMEDist; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->bMbConstDataBufferInUse) |
| { |
| // 16 DWs per QP value |
| size = 16 * 52 * sizeof(uint32_t); |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presMbBrcConstDataBuffer; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMbBrcConstData; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->bMbQpBufferInUse) |
| { |
| // AVC MB BRC QP buffer |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psMbQpBuffer; |
| surfaceCodecParams.dwOffset = params->dwMbQpBottomFieldOffset; |
| surfaceCodecParams.dwBindingTableOffset = currFieldPicture ? bindingTable->dwAvcMBEncMbQpField : |
| bindingTable->dwAvcMBEncMbQpFrame; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->bMbSpecificDataEnabled) |
| { |
| size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS); |
| CODECHAL_ENCODE_VERBOSEMESSAGE("Send MB specific surface, size = %d", size); |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.presBuffer = params->presMbSpecificDataBuffer; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMbSpecificData; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| // Current Picture Y - VME |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bUseAdvState = true; |
| surfaceCodecParams.psSurface = params->psCurrPicSurface; |
| surfaceCodecParams.dwOffset = params->dwCurrPicSurfaceOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = currFieldPicture ? |
| bindingTable->dwAvcMBEncFieldCurrPic[0] : bindingTable->dwAvcMBEncCurrPicFrame[0]; |
| surfaceCodecParams.ucVDirection = vDirection; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| surfaceCodecParams.dwBindingTableOffset = currFieldPicture ? |
| bindingTable->dwAvcMBEncFieldCurrPic[1] : bindingTable->dwAvcMBEncCurrPicFrame[1]; |
| surfaceCodecParams.ucVDirection = vDirection; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // Setup references 1...n |
| // LIST 0 references |
| uint8_t refIdx; |
| for (refIdx = 0; refIdx <= params->pAvcSlcParams->num_ref_idx_l0_active_minus1; refIdx++) |
| { |
| auto refPic = params->pAvcSlcParams->RefPicList[LIST_0][refIdx]; |
| if (!CodecHal_PictureIsInvalid(refPic) && params->pAvcPicIdx[refPic.FrameIdx].bValid) |
| { |
| uint8_t refPicIdx = params->pAvcPicIdx[refPic.FrameIdx].ucPicIdx; |
| bool refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0; |
| uint32_t refBindingTableOffset; |
| // Program the surface based on current picture's field/frame mode |
| if (currFieldPicture) // if current picture is field |
| { |
| if (refBottomField) |
| { |
| refVDirection = CODECHAL_VDIRECTION_BOT_FIELD; |
| refBindingTableOffset = bindingTable->dwAvcMBEncFwdPicBotField[refIdx]; |
| } |
| else |
| { |
| refVDirection = CODECHAL_VDIRECTION_TOP_FIELD; |
| refBindingTableOffset = bindingTable->dwAvcMBEncFwdPicTopField[refIdx]; |
| } |
| } |
| else // if current picture is frame |
| { |
| refVDirection = CODECHAL_VDIRECTION_FRAME; |
| refBindingTableOffset = bindingTable->dwAvcMBEncFwdPicFrame[refIdx]; |
| } |
| |
| // Picture Y VME |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bUseAdvState = true; |
| if ((params->bUseWeightedSurfaceForL0) && |
| (params->pAvcSlcParams->luma_weight_flag[LIST_0] & (1 << refIdx)) && |
| (refIdx < CODEC_AVC_MAX_FORWARD_WP_FRAME)) |
| { |
| surfaceCodecParams.psSurface = ¶ms->pWeightedPredOutputPicSelectList[CODEC_AVC_WP_OUTPUT_L0_START + refIdx].sBuffer; |
| } |
| else |
| { |
| surfaceCodecParams.psSurface = ¶ms->ppRefList[refPicIdx]->sRefBuffer; |
| } |
| surfaceCodecParams.dwWidthInUse = params->dwFrameWidthInMb * 16; |
| surfaceCodecParams.dwHeightInUse = params->dwFrameHeightInMb * 16; |
| |
| surfaceCodecParams.dwBindingTableOffset = refBindingTableOffset; |
| surfaceCodecParams.ucVDirection = refVDirection; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_REF_ENCODE].Value; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| } |
| |
| // Setup references 1...n |
| // LIST 1 references |
| for (refIdx = 0; refIdx <= params->pAvcSlcParams->num_ref_idx_l1_active_minus1; refIdx++) |
| { |
| if (!currFieldPicture && refIdx > 0) |
| { |
| // Only 1 LIST 1 reference required here since only single ref is supported in frame case |
| break; |
| } |
| |
| auto refPic = params->pAvcSlcParams->RefPicList[LIST_1][refIdx]; |
| uint32_t refMbCodeBottomFieldOffsetUsed; |
| uint32_t refMvBottomFieldOffsetUsed; |
| uint32_t refBindingTableOffset; |
| if (!CodecHal_PictureIsInvalid(refPic) && params->pAvcPicIdx[refPic.FrameIdx].bValid) |
| { |
| uint8_t refPicIdx = params->pAvcPicIdx[refPic.FrameIdx].ucPicIdx; |
| bool refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0; |
| // Program the surface based on current picture's field/frame mode |
| if (currFieldPicture) // if current picture is field |
| { |
| if (refBottomField) |
| { |
| refVDirection = CODECHAL_VDIRECTION_BOT_FIELD; |
| refMbCodeBottomFieldOffsetUsed = refMbCodeBottomFieldOffset; |
| refMvBottomFieldOffsetUsed = refMvBottomFieldOffset; |
| refBindingTableOffset = bindingTable->dwAvcMBEncBwdPicBotField[refIdx]; |
| } |
| else |
| { |
| refVDirection = CODECHAL_VDIRECTION_TOP_FIELD; |
| refMbCodeBottomFieldOffsetUsed = 0; |
| refMvBottomFieldOffsetUsed = 0; |
| refBindingTableOffset = bindingTable->dwAvcMBEncBwdPicTopField[refIdx]; |
| } |
| } |
| else // if current picture is frame |
| { |
| refVDirection = CODECHAL_VDIRECTION_FRAME; |
| refMbCodeBottomFieldOffsetUsed = 0; |
| refMvBottomFieldOffsetUsed = 0; |
| refBindingTableOffset = bindingTable->dwAvcMBEncBwdPicFrame[refIdx]; |
| } |
| |
| // Picture Y VME |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bUseAdvState = true; |
| if ((params->bUseWeightedSurfaceForL1) && |
| (params->pAvcSlcParams->luma_weight_flag[LIST_1] & (1 << refIdx)) && |
| (refIdx < CODEC_AVC_MAX_BACKWARD_WP_FRAME)) |
| { |
| surfaceCodecParams.psSurface = ¶ms->pWeightedPredOutputPicSelectList[CODEC_AVC_WP_OUTPUT_L1_START + refIdx].sBuffer; |
| } |
| else |
| { |
| surfaceCodecParams.psSurface = ¶ms->ppRefList[refPicIdx]->sRefBuffer; |
| } |
| |
| surfaceCodecParams.dwWidthInUse = params->dwFrameWidthInMb * 16; |
| surfaceCodecParams.dwHeightInUse = params->dwFrameHeightInMb * 16; |
| surfaceCodecParams.dwBindingTableOffset = refBindingTableOffset; |
| surfaceCodecParams.ucVDirection = refVDirection; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_REF_ENCODE].Value; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| if (refIdx == 0) |
| { |
| if (currFieldPicture && (params->ppRefList[refPicIdx]->ucAvcPictureCodingType == CODEC_AVC_PIC_CODING_TYPE_FRAME || params->ppRefList[refPicIdx]->ucAvcPictureCodingType == CODEC_AVC_PIC_CODING_TYPE_INVALID)) |
| { |
| refMbCodeBottomFieldOffsetUsed = 0; |
| refMvBottomFieldOffsetUsed = 0; |
| } |
| // MB data buffer |
| size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 16 * 4; |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.presBuffer = ¶ms->ppRefList[refPicIdx]->resRefMbCodeBuffer; |
| surfaceCodecParams.dwOffset = refMbCodeBottomFieldOffsetUsed; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_PAK_OBJECT_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncBwdRefMBData; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // MV data buffer |
| size = params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 32 * 4; |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.presBuffer = ¶ms->ppRefList[refPicIdx]->resRefMvDataBuffer; |
| surfaceCodecParams.dwOffset = refMvBottomFieldOffsetUsed; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncBwdRefMVData; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (refIdx < CODECHAL_ENCODE_NUM_MAX_VME_L1_REF) |
| { |
| if (currFieldPicture) |
| { |
| // The binding table contains multiple entries for IDX0 backwards references |
| if (refBottomField) |
| { |
| refBindingTableOffset = bindingTable->dwAvcMBEncBwdPicBotField[refIdx + CODECHAL_ENCODE_NUM_MAX_VME_L1_REF]; |
| } |
| else |
| { |
| refBindingTableOffset = bindingTable->dwAvcMBEncBwdPicTopField[refIdx + CODECHAL_ENCODE_NUM_MAX_VME_L1_REF]; |
| } |
| } |
| else |
| { |
| refBindingTableOffset = bindingTable->dwAvcMBEncBwdPicFrame[refIdx + CODECHAL_ENCODE_NUM_MAX_VME_L1_REF]; |
| } |
| |
| // Picture Y VME |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bUseAdvState = true; |
| surfaceCodecParams.dwWidthInUse = params->dwFrameWidthInMb * 16; |
| surfaceCodecParams.dwHeightInUse = params->dwFrameHeightInMb * 16; |
| surfaceCodecParams.psSurface = ¶ms->ppRefList[refPicIdx]->sRefBuffer; |
| surfaceCodecParams.dwBindingTableOffset = refBindingTableOffset; |
| surfaceCodecParams.ucVDirection = refVDirection; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_REF_ENCODE].Value; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| } |
| } |
| |
| // BRC distortion data buffer for I frame |
| if (params->bMbEncIFrameDistInUse) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psMeBrcDistortionBuffer; |
| surfaceCodecParams.dwOffset = params->dwMeBrcDistortionBottomFieldOffset; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncBRCDist; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| // RefPicSelect of Current Picture |
| if (params->bUsedAsRef) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = &currPicRefListEntry->pRefPicSelectListEntry->sBuffer; |
| surfaceCodecParams.psSurface->dwHeight = MOS_ALIGN_CEIL(surfaceCodecParams.psSurface->dwHeight, 8); |
| surfaceCodecParams.dwOffset = params->dwRefPicSelectBottomFieldOffset; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncRefPicSelectL0; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_REF_ENCODE].Value; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->bMBVProcStatsEnabled) |
| { |
| size = (currFieldPicture ? 1 : 2) * params->dwFrameWidthInMb * params->dwFrameFieldHeightInMb * 16 * sizeof(uint32_t); |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.presBuffer = params->presMBVProcStatsBuffer; |
| surfaceCodecParams.dwOffset = currBottomField ? params->dwMBVProcStatsBottomFieldOffset : 0; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMBStats; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| else if (params->bFlatnessCheckEnabled) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psFlatnessCheckSurface; |
| surfaceCodecParams.dwOffset = currBottomField ? params->dwFlatnessCheckBottomFieldOffset : 0; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncFlatnessChk; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_FLATNESS_CHECK_ENCODE].Value; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->bMADEnabled) |
| { |
| size = CODECHAL_MAD_BUFFER_SIZE; |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bRawSurface = true; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.presBuffer = params->presMADDataBuffer; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMADData; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->dwMbEncBRCBufferSize > 0) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presMbEncBRCBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(params->dwMbEncBRCBufferSize); |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMbEncBRCCurbeData; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MBENC_CURBE_ENCODE].Value; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| else |
| { |
| uint32_t curbeSize; |
| if (params->bUseMbEncAdvKernel) |
| { |
| // For BRC the new BRC surface is used |
| if (params->bUseAdvancedDsh) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presMbEncCurbeBuffer; |
| curbeSize = MOS_ALIGN_CEIL( |
| params->pKernelState->KernelParams.iCurbeLength, |
| m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetCurbeAlignment()); |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(curbeSize); |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMbEncBRCCurbeData; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MBENC_CURBE_ENCODE].Value; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| else // For CQP the DSH CURBE is used |
| { |
| MOS_RESOURCE *dsh = nullptr; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = params->pKernelState->m_dshRegion.GetResource()); |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = dsh; |
| surfaceCodecParams.dwOffset = |
| params->pKernelState->m_dshRegion.GetOffset() + |
| params->pKernelState->dwCurbeOffset; |
| curbeSize = MOS_ALIGN_CEIL( |
| params->pKernelState->KernelParams.iCurbeLength, |
| m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetCurbeAlignment()); |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(curbeSize); |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMbEncBRCCurbeData; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MBENC_CURBE_ENCODE].Value; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| } |
| } |
| |
| if (params->bArbitraryNumMbsInSlice) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psSliceMapSurface; |
| surfaceCodecParams.bRenderTarget = false; |
| surfaceCodecParams.bIsWritable = false; |
| surfaceCodecParams.dwOffset = currBottomField ? params->dwSliceMapBottomFieldOffset : 0; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncSliceMapData; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (!params->bMbEncIFrameDistInUse) |
| { |
| if (params->bMbDisableSkipMapEnabled) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psMbDisableSkipMapSurface; |
| surfaceCodecParams.dwOffset = 0; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncMbNonSkipMap; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_MBDISABLE_SKIPMAP_CODEC].Value; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| if (params->bStaticFrameDetectionEnabled) |
| { |
| // static frame cost table surface |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presSFDCostTableBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(m_sfdCostTableBufferSize); |
| surfaceCodecParams.dwOffset = 0; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwAvcMBEncStaticDetectionCostTable; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SendAvcBrcFrameUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pBrcBuffers); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState); |
| |
| // BRC history buffer |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams; |
| auto kernelState = params->pKernelState; |
| auto brcUpdateBindingTable = params->pBrcUpdateBindingTable; |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = ¶ms->pBrcBuffers->resBrcHistoryBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(params->dwBrcHistoryBufferSize); |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcHistoryBuffer; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // PAK Statistics buffer |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = ¶ms->pBrcBuffers->resBrcPakStatisticBuffer[0]; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(params->dwBrcPakStatisticsSize); |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcPakStatisticsOutputBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // PAK IMG_STATEs buffer - read only |
| uint32_t size = MOS_BYTES_TO_DWORDS(BRC_IMG_STATE_SIZE_PER_PASS * m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses()); |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = |
| ¶ms->pBrcBuffers->resBrcImageStatesReadBuffer[params->ucCurrRecycledBufIdx]; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcImageStateReadBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // PAK IMG_STATEs buffer - write only |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = ¶ms->pBrcBuffers->resBrcImageStatesWriteBuffer; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcImageStateWriteBuffer; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| if (params->dwMbEncBRCBufferSize > 0) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = ¶ms->pBrcBuffers->resMbEncBrcBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(params->dwMbEncBRCBufferSize); |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcMbEncCurbeWriteData; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| else |
| { |
| PMHW_KERNEL_STATE mbEncKernelState; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(mbEncKernelState = params->pBrcBuffers->pMbEncKernelStateInUse); |
| |
| MOS_RESOURCE *dsh = nullptr; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = mbEncKernelState->m_dshRegion.GetResource()); |
| // BRC ENC CURBE Buffer - read only |
| size = MOS_ALIGN_CEIL( |
| mbEncKernelState->KernelParams.iCurbeLength, |
| m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetCurbeAlignment()); |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = dsh; |
| surfaceCodecParams.dwOffset = |
| mbEncKernelState->m_dshRegion.GetOffset() + |
| mbEncKernelState->dwCurbeOffset; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(size); |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcMbEncCurbeReadBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // BRC ENC CURBE Buffer - write only |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| if (params->bUseAdvancedDsh) |
| { |
| surfaceCodecParams.presBuffer = params->presMbEncCurbeBuffer; |
| } |
| else |
| { |
| surfaceCodecParams.presBuffer = dsh; |
| surfaceCodecParams.dwOffset = |
| mbEncKernelState->m_dshRegion.GetOffset() + |
| mbEncKernelState->dwCurbeOffset; |
| } |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(size); |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcMbEncCurbeWriteData; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| // AVC_ME BRC Distortion data buffer - input/output |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = ¶ms->pBrcBuffers->sMeBrcDistortionBuffer; |
| surfaceCodecParams.dwOffset = params->pBrcBuffers->dwMeBrcDistortionBottomFieldOffset; |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcDistortionBuffer; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // BRC Constant Data Surface |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = |
| ¶ms->pBrcBuffers->sBrcConstantDataBuffer[params->ucCurrRecycledBufIdx]; |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcConstantData; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // MBStat buffer - input |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presMbStatBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(m_hwInterface->m_avcMbStatBufferSize); |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcMbStatBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| if (params->psMvDataBuffer) |
| { |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psMvDataBuffer; |
| surfaceCodecParams.dwOffset = params->dwMvBottomFieldOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = brcUpdateBindingTable->dwFrameBrcMvDataBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SendAvcBrcMbUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pBrcBuffers); |
| |
| // BRC history buffer |
| auto kernelState = params->pKernelState; |
| auto bindingTable = params->pBrcUpdateBindingTable; |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams; |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = ¶ms->pBrcBuffers->resBrcHistoryBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(params->dwBrcHistoryBufferSize); |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwMbBrcHistoryBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // AVC MB QP data buffer |
| if (params->bMbBrcEnabled) |
| { |
| params->pBrcBuffers->sBrcMbQpBuffer.dwHeight = MOS_ALIGN_CEIL((params->dwDownscaledFrameFieldHeightInMb4x << 2), 8); |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.psSurface = ¶ms->pBrcBuffers->sBrcMbQpBuffer; |
| surfaceCodecParams.dwOffset = params->pBrcBuffers->dwBrcMbQpBottomFieldOffset; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwMbBrcMbQpBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| // BRC ROI feature |
| if (params->bBrcRoiEnabled) |
| { |
| params->psRoiSurface->dwHeight = MOS_ALIGN_CEIL((params->dwDownscaledFrameFieldHeightInMb4x << 2), 8); |
| |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.bIsWritable = false; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.psSurface = params->psRoiSurface; |
| surfaceCodecParams.dwOffset = 0; |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwMbBrcROISurface; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| } |
| |
| // MBStat buffer |
| memset((void *)&surfaceCodecParams, 0, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presMbStatBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(m_hwInterface->m_avcMbStatBufferSize); |
| surfaceCodecParams.dwBindingTableOffset = bindingTable->dwMbBrcMbStatBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SendAvcWPSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psInputRefBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psOutputScaledBuffer); |
| |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceParams; |
| memset((void *)&surfaceParams, 0, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = params->psInputRefBuffer;// Input surface |
| surfaceParams.bIsWritable = false; |
| surfaceParams.bRenderTarget = false; |
| surfaceParams.dwBindingTableOffset = wpInputRefSurface; |
| surfaceParams.dwVerticalLineStride = params->dwVerticalLineStride; |
| surfaceParams.dwVerticalLineStrideOffset = params->dwVerticalLineStrideOffset; |
| surfaceParams.ucVDirection = params->ucVDirection; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| |
| memset((void *)&surfaceParams, 0, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = params->psOutputScaledBuffer;// output surface |
| surfaceParams.bIsWritable = true; |
| surfaceParams.bRenderTarget = true; |
| surfaceParams.dwBindingTableOffset = wpOutputScaledSurface; |
| surfaceParams.dwVerticalLineStride = params->dwVerticalLineStride; |
| surfaceParams.dwVerticalLineStrideOffset = params->dwVerticalLineStrideOffset; |
| surfaceParams.ucVDirection = params->ucVDirection; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SetupROISurface() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| MOS_LOCK_PARAMS readOnly; |
| memset(&readOnly, 0, sizeof(readOnly)); |
| readOnly.ReadOnly = 1; |
| uint32_t* dataPtr = (uint32_t*)m_osInterface->pfnLockResource(m_osInterface, &BrcBuffers.sBrcRoiSurface.OsResource, &readOnly); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(dataPtr); |
| |
| uint32_t bufferWidthInByte = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 4), 64);//(m_picWidthInMb * 4 + 63) & ~63; |
| uint32_t bufferHeightInByte = MOS_ALIGN_CEIL((m_downscaledHeightInMb4x << 2), 8);//(m_picHeightInMb + 7) & ~7; |
| uint32_t numMBs = m_picWidthInMb * m_picHeightInMb; |
| for (uint32_t mb = 0; mb <= numMBs; mb++) |
| { |
| int32_t curMbY = mb / m_picWidthInMb; |
| int32_t curMbX = mb - curMbY * m_picWidthInMb; |
| |
| uint32_t outData = 0; |
| for (int32_t roi = (m_avcPicParam->NumROI - 1); roi >= 0; roi--) |
| { |
| int32_t qpLevel; |
| if (bROIValueInDeltaQP) |
| { |
| qpLevel = -m_avcPicParam->ROI[roi].PriorityLevelOrDQp; |
| } |
| else |
| { |
| // QP Level sent to ROI surface is (priority * 6) |
| qpLevel = m_avcPicParam->ROI[roi].PriorityLevelOrDQp * 6; |
| } |
| |
| if (qpLevel == 0) |
| { |
| continue; |
| } |
| |
| if ((curMbX >= (int32_t)m_avcPicParam->ROI[roi].Left) && (curMbX < (int32_t)m_avcPicParam->ROI[roi].Right) && |
| (curMbY >= (int32_t)m_avcPicParam->ROI[roi].Top) && (curMbY < (int32_t)m_avcPicParam->ROI[roi].Bottom)) |
| { |
| outData = 15 | ((qpLevel & 0xFF) << 8); |
| } |
| else if (bROISmoothEnabled) |
| { |
| if ((curMbX >= (int32_t)m_avcPicParam->ROI[roi].Left - 1) && (curMbX < (int32_t)m_avcPicParam->ROI[roi].Right + 1) && |
| (curMbY >= (int32_t)m_avcPicParam->ROI[roi].Top - 1) && (curMbY < (int32_t)m_avcPicParam->ROI[roi].Bottom + 1)) |
| { |
| outData = 14 | ((qpLevel & 0xFF) << 8); |
| } |
| else if ((curMbX >= (int32_t)m_avcPicParam->ROI[roi].Left - 2) && (curMbX < (int32_t)m_avcPicParam->ROI[roi].Right + 2) && |
| (curMbY >= (int32_t)m_avcPicParam->ROI[roi].Top - 2) && (curMbY < (int32_t)m_avcPicParam->ROI[roi].Bottom + 2)) |
| { |
| outData = 13 | ((qpLevel & 0xFF) << 8); |
| } |
| else if ((curMbX >= (int32_t)m_avcPicParam->ROI[roi].Left - 3) && (curMbX < (int32_t)m_avcPicParam->ROI[roi].Right + 3) && |
| (curMbY >= (int32_t)m_avcPicParam->ROI[roi].Top - 3) && (curMbY < (int32_t)m_avcPicParam->ROI[roi].Bottom + 3)) |
| { |
| outData = 12 | ((qpLevel & 0xFF) << 8); |
| } |
| } |
| } |
| dataPtr[(curMbY * (bufferWidthInByte >> 2)) + curMbX] = outData; |
| } |
| |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.sBrcRoiSurface.OsResource); |
| |
| uint32_t bufferSize = bufferWidthInByte * bufferHeightInByte; |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.sBrcRoiSurface.OsResource, |
| CodechalDbgAttr::attrInput, |
| "ROI", |
| bufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_MB_BRC_UPDATE))); |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::ExecuteKernelFunctions() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| m_rawSurfaceToEnc, |
| CodechalDbgAttr::attrEncodeRawInputSurface, |
| "SrcSurf")); |
| ); |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_cscDsState); |
| |
| // Scaling, BRC Init/Reset and HME are included in the same task phase |
| m_lastEncPhase = false; |
| m_firstTaskInPhase = true; |
| |
| // BRC init/reset needs to be called before HME since it will reset the Brc Distortion surface |
| if (bBrcEnabled && (bBrcInit || bBrcReset)) |
| { |
| bool cscEnabled = m_cscDsState->RequireCsc() && m_firstField; |
| m_lastTaskInPhase = !(cscEnabled || m_scalingEnabled || m_16xMeSupported || m_hmeEnabled); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcInitResetKernel()); |
| } |
| |
| UpdateSSDSliceCount(); |
| |
| if (m_firstField) |
| { |
| // Csc, Downscaling, and/or 10-bit to 8-bit conversion |
| CodechalEncodeCscDs::KernelParams cscScalingKernelParams; |
| memset((void *)&cscScalingKernelParams, 0, sizeof(cscScalingKernelParams)); |
| cscScalingKernelParams.bLastTaskInPhaseCSC = |
| cscScalingKernelParams.bLastTaskInPhase4xDS = !(m_16xMeSupported || m_hmeEnabled); |
| cscScalingKernelParams.bLastTaskInPhase16xDS = !(m_32xMeSupported || m_hmeEnabled); |
| cscScalingKernelParams.bLastTaskInPhase32xDS = !m_hmeEnabled; |
| cscScalingKernelParams.inputColorSpace = m_avcSeqParam->InputColorSpace; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_cscDsState->KernelFunctions(&cscScalingKernelParams)); |
| } |
| |
| // SFD should be called only when HME enabled |
| auto staticFrameDetectionInUse = bStaticFrameDetectionEnable && m_hmeEnabled; |
| |
| staticFrameDetectionInUse = !bPerMbSFD && staticFrameDetectionInUse; |
| |
| if (m_hmeEnabled) |
| { |
| if (m_16xMeEnabled) |
| { |
| m_lastTaskInPhase = false; |
| if (m_32xMeEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodeMeKernel(&BrcBuffers, HME_LEVEL_32x)); |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodeMeKernel(&BrcBuffers, HME_LEVEL_16x)); |
| } |
| m_lastTaskInPhase = !staticFrameDetectionInUse; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodeMeKernel(&BrcBuffers, HME_LEVEL_4x)); |
| } |
| |
| // Scaling and HME are not dependent on the output from PAK |
| if (m_waitForPak && m_semaphoreObjCount && !Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse)) |
| { |
| // Wait on PAK |
| auto syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_renderContext; |
| syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse; |
| syncParams.uiSemaphoreCount = m_semaphoreObjCount; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams)); |
| m_semaphoreObjCount = 0; //reset |
| } |
| |
| // BRC and MbEnc are included in the same task phase |
| m_lastEncPhase = true; |
| m_firstTaskInPhase = true; |
| |
| if (bBrcEnabled) |
| { |
| if (bMbEncIFrameDistEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(true)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcFrameUpdateKernel()); |
| if (bBrcSplitEnable && bMbBrcEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcMbUpdateKernel()); |
| } |
| |
| // Reset buffer ID used for BRC kernel performance reports |
| m_osInterface->pfnResetPerfBufferID(m_osInterface); |
| } |
| |
| bUseWeightedSurfaceForL0 = false; |
| bUseWeightedSurfaceForL1 = false; |
| auto slcParams = m_avcSliceParams; |
| auto sliceType = Slice_Type[slcParams->slice_type]; |
| |
| if (bWeightedPredictionSupported && |
| ((((sliceType == SLICE_P) || (sliceType == SLICE_SP)) && (m_avcPicParam->weighted_pred_flag)) || |
| (((sliceType == SLICE_B)) && (m_avcPicParam->weighted_bipred_idc == EXPLICIT_WEIGHTED_INTER_PRED_MODE))) |
| ) |
| { |
| uint8_t i; |
| // Weighted Prediction to be applied for L0 |
| for (i = 0; i < (m_avcPicParam->num_ref_idx_l0_active_minus1 + 1); i++) |
| { |
| if ((slcParams->luma_weight_flag[LIST_0] & (1 << i)) && (i < CODEC_AVC_MAX_FORWARD_WP_FRAME)) |
| { |
| //Weighted Prediction for ith forward reference frame |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(WPKernel(false, i)); |
| } |
| } |
| |
| if (((sliceType == SLICE_B)) && |
| (m_avcPicParam->weighted_bipred_idc == EXPLICIT_WEIGHTED_INTER_PRED_MODE)) |
| { |
| for (i = 0; i < (m_avcPicParam->num_ref_idx_l1_active_minus1 + 1); i++) |
| { |
| // Weighted Pred to be applied for L1 |
| if ((slcParams->luma_weight_flag[LIST_1] & 1 << i) && (i < CODEC_AVC_MAX_BACKWARD_WP_FRAME)) |
| { |
| //Weighted Prediction for ith backward reference frame |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(WPKernel(false, i)); |
| } |
| } |
| } |
| } |
| |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| |
| MOS_USER_FEATURE_VALUE_WRITE_DATA userFeatureWriteData; |
| |
| // Weighted prediction for L0 Reporting |
| userFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__; |
| userFeatureWriteData.Value.i32Data = bUseWeightedSurfaceForL0; |
| userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_WEIGHTED_PREDICTION_L0_IN_USE_ID; |
| MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1); |
| |
| // Weighted prediction for L1 Reporting |
| userFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__; |
| userFeatureWriteData.Value.i32Data = bUseWeightedSurfaceForL1; |
| userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_WEIGHTED_PREDICTION_L1_IN_USE_ID; |
| MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1); |
| |
| #endif // _DEBUG || _RELEASE_INTERNAL |
| |
| m_lastTaskInPhase = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MbEncKernel(false)); |
| |
| // Reset buffer ID used for MbEnc kernel performance reports |
| m_osInterface->pfnResetPerfBufferID(m_osInterface); |
| |
| if (!Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse)) |
| { |
| auto syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_renderContext; |
| syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams)); |
| } |
| |
| if (m_madEnabled) |
| { |
| m_currMadBufferIdx = (m_currMadBufferIdx + 1) % CODECHAL_ENCODE_MAX_NUM_MAD_BUFFERS; |
| } |
| |
| // Reset after BRC Init has been processed |
| bBrcInit = false; |
| |
| m_setRequestedEUSlices = false; |
| |
| //CODECHAL_DEBUG_TOOL( |
| // KernelDebugDumps(); |
| //); |
| |
| if (bBrcEnabled) |
| { |
| bMbEncCurbeSetInBrcUpdate = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::SceneChangeReport(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params) |
| { |
| |
| MHW_MI_COPY_MEM_MEM_PARAMS copyMemMemParams; |
| uint32_t offset = (m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) |
| + (sizeof(uint32_t) * 2) + m_encodeStatusBuf.dwSceneChangedOffset; |
| |
| MOS_ZeroMemory(©MemMemParams, sizeof(copyMemMemParams)); |
| copyMemMemParams.presSrc = params->presBrcHistoryBuffer; |
| copyMemMemParams.dwSrcOffset = m_brcHistoryBufferOffsetSceneChanged; |
| copyMemMemParams.presDst = &m_encodeStatusBuf.resStatusBuffer; |
| copyMemMemParams.dwDstOffset = offset; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiCopyMemMemCmd( |
| cmdBuffer, |
| ©MemMemParams)); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| MOS_STATUS CodechalEncodeAvcEncG10::KernelDebugDumps() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| CODECHAL_DEBUG_TOOL( |
| if (m_hmeEnabled) |
| { |
| CODECHAL_ME_OUTPUT_PARAMS meOutputParams; |
| memset((void *)&meOutputParams, 0, sizeof(meOutputParams)); |
| meOutputParams.psMeMvBuffer = &m_4xMeMvDataBuffer; |
| meOutputParams.psMeBrcDistortionBuffer = |
| bBrcDistortionBufferSupported ? &BrcBuffers.sMeBrcDistortionBuffer : nullptr; |
| meOutputParams.psMeDistortionBuffer = |
| m_4xMeDistortionBufferSupported ? &m_4xMeDistortionBuffer : nullptr; |
| meOutputParams.b16xMeInUse = false; |
| meOutputParams.b32xMeInUse = false; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeMvBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MvData", |
| meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch, |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 32), 64) * (m_downscaledFrameFieldHeightInMb4x * 4) : 0, |
| CODECHAL_MEDIA_STATE_4X_ME)); |
| if (meOutputParams.psMeBrcDistortionBuffer) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeBrcDistortionBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "BrcDist", |
| meOutputParams.psMeBrcDistortionBuffer->dwHeight *meOutputParams.psMeBrcDistortionBuffer->dwPitch, |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 8), 64) * MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4), 8) : 0, |
| CODECHAL_MEDIA_STATE_4X_ME)); |
| if (meOutputParams.psMeDistortionBuffer) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeDistortionBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MeDist", |
| meOutputParams.psMeDistortionBuffer->dwHeight *meOutputParams.psMeDistortionBuffer->dwPitch, |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 8), 64) * MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4 * 10), 8) : 0, |
| CODECHAL_MEDIA_STATE_4X_ME)); |
| } |
| } |
| |
| if (m_16xMeEnabled) |
| { |
| meOutputParams.psMeMvBuffer = &m_16xMeMvDataBuffer; |
| meOutputParams.psMeBrcDistortionBuffer = nullptr; |
| meOutputParams.psMeDistortionBuffer = nullptr; |
| meOutputParams.b16xMeInUse = true; |
| meOutputParams.b32xMeInUse = false; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN( |
| m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeMvBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MvData", |
| meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch, |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb16x * 32), 64) * (m_downscaledFrameFieldHeightInMb16x * 4) : 0, |
| CODECHAL_MEDIA_STATE_16X_ME)); |
| |
| if (m_32xMeEnabled) |
| { |
| meOutputParams.psMeMvBuffer = &m_32xMeMvDataBuffer; |
| meOutputParams.psMeBrcDistortionBuffer = nullptr; |
| meOutputParams.psMeDistortionBuffer = nullptr; |
| meOutputParams.b16xMeInUse = false; |
| meOutputParams.b32xMeInUse = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN( |
| m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeMvBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MvData", |
| meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch, |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? MOS_ALIGN_CEIL((m_downscaledWidthInMb32x * 32), 64) * (m_downscaledFrameFieldHeightInMb32x * 4) : 0, |
| CODECHAL_MEDIA_STATE_32X_ME)); |
| } |
| } |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx], |
| CodechalDbgAttr::attrOutput, |
| "ImgStateWrite", |
| BRC_IMG_STATE_SIZE_PER_PASS * m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses(), |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcHistoryBuffer, |
| CodechalDbgAttr::attrOutput, |
| "HistoryWrite", |
| m_brcHistoryBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| if (!Mos_ResourceIsNull(&BrcBuffers.sBrcMbQpBuffer.OsResource)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcPakStatisticBuffer[m_brcPakStatisticsSize], |
| CodechalDbgAttr::attrOutput, |
| "MbQp", |
| BrcBuffers.dwBrcMbQpBottomFieldOffset, |
| BrcBuffers.sBrcMbQpBuffer.dwPitch*BrcBuffers.sBrcMbQpBuffer.dwHeight, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| } |
| if (BrcBuffers.pMbEncKernelStateInUse) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| CODECHAL_MEDIA_STATE_BRC_UPDATE, |
| BrcBuffers.pMbEncKernelStateInUse)); |
| } |
| if (m_mbencBrcBufferSize>0) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resMbEncBrcBuffer, |
| CodechalDbgAttr::attrOutput, |
| "MbEncBRCWrite", |
| m_mbencBrcBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| } |
| |
| if (m_mbStatsSupported) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_resMbStatsBuffer, |
| CodechalDbgAttr::attrOutput, |
| "MBStatsSurf", |
| m_picWidthInMb * (((CodecHal_PictureIsField(m_currOriginalPic)) ? 2 : 4) * m_downscaledFrameFieldHeightInMb4x) * 16 * sizeof(uint32_t), |
| CodecHal_PictureIsBottomField(m_currOriginalPic)?(m_picWidthInMb * 16 * sizeof(uint32_t) * (2 * m_downscaledFrameFieldHeightInMb4x)):0, |
| CODECHAL_MEDIA_STATE_4X_SCALING)); |
| } |
| else if (m_flatnessCheckEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_flatnessCheckSurface.OsResource, |
| CodechalDbgAttr::attrOutput, |
| "FlatnessChkSurf", |
| ((CodecHal_PictureIsField(m_currOriginalPic)) ? m_flatnessCheckSurface.dwHeight / 2 : m_flatnessCheckSurface.dwHeight) * m_flatnessCheckSurface.dwPitch, |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? (m_flatnessCheckSurface.dwPitch * m_flatnessCheckSurface.dwHeight >> 1) : 0, |
| CODECHAL_MEDIA_STATE_4X_SCALING)); |
| } |
| |
| if (bMbQpDataEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &resMbSpecificDataBuffer[m_currRecycledBufIdx], |
| CodechalDbgAttr::attrInput, |
| "MbSpecificData", |
| m_picWidthInMb*m_frameFieldHeightInMb * 16, |
| 0, |
| CODECHAL_MEDIA_STATE_ENC_QUALITY)); |
| } |
| |
| if (bMbSpecificDataEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &resMbSpecificDataBuffer[m_currRecycledBufIdx], |
| CodechalDbgAttr::attrInput, |
| "MbSpecificData", |
| m_picWidthInMb*m_frameFieldHeightInMb*16, |
| 0, |
| CODECHAL_MEDIA_STATE_ENC_QUALITY)); |
| } |
| |
| uint8_t index; |
| CODEC_PICTURE refPic; |
| if (bUseWeightedSurfaceForL0) |
| { |
| refPic = m_avcSliceParams->RefPicList[LIST_0][0]; |
| index = m_picIdx[refPic.FrameIdx].ucPicIdx; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| &m_refList[index]->sRefBuffer, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| "WP_In_L0")); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| &WeightedPredOutputPicSelectList[LIST_0].sBuffer, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| "WP_Out_L0")); |
| } |
| if (bUseWeightedSurfaceForL1) |
| { |
| |
| refPic = m_avcSliceParams->RefPicList[LIST_1][0]; |
| index = m_picIdx[refPic.FrameIdx].ucPicIdx; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| &m_refList[index]->sRefBuffer, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| "WP_In_L1")); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| &WeightedPredOutputPicSelectList[LIST_1].sBuffer, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| "WP_Out_L1")); |
| |
| } |
| if (m_avcFeiPicParams->MVPredictorEnable){ |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_avcFeiPicParams->resMVPredictor, |
| CodechalDbgAttr::attrInput, |
| "MvPredictor", |
| m_picWidthInMb * m_frameFieldHeightInMb *40, |
| 0, |
| CODECHAL_MEDIA_STATE_ENC_QUALITY)); |
| } |
| |
| if (m_arbitraryNumMbsInSlice) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_sliceMapSurface[m_currRecycledBufIdx].OsResource, |
| CodechalDbgAttr::attrInput, |
| "SliceMapSurf", |
| m_sliceMapSurface[m_currRecycledBufIdx].dwPitch * m_frameFieldHeightInMb, |
| 0, |
| CODECHAL_MEDIA_STATE_ENC_QUALITY)); |
| } |
| ) |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::PopulateBrcInitParam( |
| void *cmd) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| BrcInitResetCurbe *curbe = (BrcInitResetCurbe *)cmd; |
| |
| if (m_pictureCodingType == I_TYPE) |
| { |
| m_avcPar->MBBRCEnable = bMbBrcEnabled; |
| m_avcPar->MBRC = bMbBrcEnabled; |
| m_avcPar->BitRate = curbe->m_dw3.AverageBitRate; |
| m_avcPar->InitVbvFullnessInBit = curbe->m_dw1.InitBufFullInBits; |
| m_avcPar->MaxBitRate = curbe->m_dw4.MaxBitRate; |
| m_avcPar->VbvSzInBit = curbe->m_dw2.BufSizeInBits; |
| m_avcPar->AvbrAccuracy = curbe->m_dw10.AVBRAccuracy; |
| m_avcPar->AvbrConvergence = curbe->m_dw11.AVBRConvergence; |
| m_avcPar->SlidingWindowSize = curbe->m_dw22.SlidingWindowSize; |
| m_avcPar->LongTermInterval = curbe->m_dw24.LongTermInterval; |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::PopulateBrcUpdateParam( |
| void *cmd) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| BrcFrameUpdateCurbe *curbe = (BrcFrameUpdateCurbe *)cmd; |
| |
| if (m_pictureCodingType == I_TYPE) |
| { |
| m_avcPar->EnableMultipass = (curbe->m_dw5.MaxNumPAKs > 0) ? 1 : 0; |
| m_avcPar->MaxNumPakPasses = curbe->m_dw5.MaxNumPAKs; |
| m_avcPar->SlidingWindowEnable = curbe->m_dw6.EnableSlidingWindow; |
| m_avcPar->FrameSkipEnable = curbe->m_dw6.EnableForceToSkip; |
| m_avcPar->UserMaxFrame = curbe->m_dw19.UserMaxFrame; |
| } |
| else |
| { |
| m_avcPar->UserMaxFrameP = curbe->m_dw19.UserMaxFrame; |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::PopulateEncParam( |
| uint8_t meMethod, |
| void *cmd) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MbEncCurbe *curbe = (MbEncCurbe *)cmd; |
| |
| if (m_pictureCodingType == I_TYPE) |
| { |
| m_avcPar->MRDisableQPCheck = MRDisableQPCheck[m_targetUsage]; |
| m_avcPar->AllFractional = |
| CODECHAL_ENCODE_AVC_AllFractional_Common[m_targetUsage & 0x7]; |
| m_avcPar->DisableAllFractionalCheckForHighRes = |
| CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[m_targetUsage & 0x7]; |
| m_avcPar->EnableAdaptiveSearch = curbe->m_encCurbe.DW37.AdaptiveEn; |
| m_avcPar->EnableFBRBypass = curbe->m_encCurbe.DW4.EnableFBRBypass; |
| m_avcPar->BlockBasedSkip = curbe->m_encCurbe.DW3.BlockBasedSkipEnable; |
| m_avcPar->MADEnableFlag = curbe->m_encCurbe.DW34.MADEnableFlag; |
| m_avcPar->MBTextureThreshold = curbe->m_encCurbe.DW60.MBTextureThreshold; |
| m_avcPar->EnableMBFlatnessCheckOptimization = curbe->m_encCurbe.DW34.EnableMBFlatnessChkOptimization; |
| m_avcPar->EnableArbitrarySliceSize = curbe->m_encCurbe.DW34.ArbitraryNumMbsPerSlice; |
| m_avcPar->RefThresh = curbe->m_encCurbe.DW38.RefThreshold; |
| m_avcPar->EnableWavefrontOptimization = curbe->m_encCurbe.DW4.EnableWavefrontOptimization; |
| m_avcPar->MaxLenSP = curbe->m_encCurbe.DW2.LenSP; |
| m_avcPar->DisableExtendedMvCostRange = !curbe->m_encCurbe.DW1.ExtendedMvCostRange; |
| } |
| else if (m_pictureCodingType == P_TYPE) |
| { |
| m_avcPar->MEMethod = meMethod; |
| m_avcPar->HMECombineLen = HMECombineLen[m_targetUsage]; |
| m_avcPar->FTQBasedSkip = FTQBasedSkip[m_targetUsage]; |
| m_avcPar->MultiplePred = MultiPred[m_targetUsage]; |
| m_avcPar->EnableAdaptiveIntraScaling = bAdaptiveIntraScalingEnable; |
| m_avcPar->StaticFrameIntraCostScalingRatioP = 240; |
| m_avcPar->SubPelMode = curbe->m_encCurbe.DW3.SubPelMode; |
| m_avcPar->HMECombineOverlap = curbe->m_encCurbe.DW36.HMECombineOverlap; |
| m_avcPar->SearchX = curbe->m_encCurbe.DW5.RefWidth; |
| m_avcPar->SearchY = curbe->m_encCurbe.DW5.RefHeight; |
| m_avcPar->SearchControl = curbe->m_encCurbe.DW3.SearchCtrl; |
| m_avcPar->EnableAdaptiveTxDecision = curbe->m_encCurbe.DW34.EnableAdaptiveTxDecision; |
| m_avcPar->TxDecisionThr = curbe->m_encCurbe.DW60.TxDecisonThreshold; |
| m_avcPar->EnablePerMBStaticCheck = curbe->m_encCurbe.DW34.EnablePerMBStaticCheck; |
| m_avcPar->EnableAdaptiveSearchWindowSize = curbe->m_encCurbe.DW34.EnableAdaptiveSearchWindowSize; |
| m_avcPar->EnableIntraCostScalingForStaticFrame = curbe->m_encCurbe.DW4.EnableIntraCostScalingForStaticFrame; |
| m_avcPar->BiMixDisable = curbe->m_encCurbe.DW0.BiMixDis; |
| m_avcPar->SurvivedSkipCost = (curbe->m_encCurbe.DW7.NonSkipZMvAdded << 1) + curbe->m_encCurbe.DW7.NonSkipModeAdded; |
| m_avcPar->UniMixDisable = curbe->m_encCurbe.DW1.UniMixDisable; |
| } |
| else if (m_pictureCodingType == B_TYPE) |
| { |
| m_avcPar->BMEMethod = meMethod; |
| m_avcPar->HMEBCombineLen = HMEBCombineLen[m_targetUsage]; |
| m_avcPar->StaticFrameIntraCostScalingRatioB = 200; |
| m_avcPar->BSearchX = curbe->m_encCurbe.DW5.RefWidth; |
| m_avcPar->BSearchY = curbe->m_encCurbe.DW5.RefHeight; |
| m_avcPar->BSearchControl = curbe->m_encCurbe.DW3.SearchCtrl; |
| m_avcPar->BSkipType = curbe->m_encCurbe.DW3.SkipType; |
| m_avcPar->DirectMode = curbe->m_encCurbe.DW34.bDirectMode; |
| m_avcPar->BiWeight = curbe->m_encCurbe.DW1.BiWeight; |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG10::PopulatePakParam( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| PMHW_BATCH_BUFFER secondLevelBatchBuffer) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| uint8_t *data = nullptr; |
| MOS_LOCK_PARAMS lockFlags; |
| MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.ReadOnly = 1; |
| |
| if (cmdBuffer != nullptr) |
| { |
| data = (uint8_t*)(cmdBuffer->pCmdPtr - (mhw_vdbox_mfx_g10_X::MFX_AVC_IMG_STATE_CMD::byteSize / sizeof(uint32_t))); |
| } |
| else if (secondLevelBatchBuffer != nullptr) |
| { |
| data = secondLevelBatchBuffer->pData; |
| } |
| else |
| { |
| data = (uint8_t*)m_osInterface->pfnLockResource(m_osInterface, &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx], &lockFlags); |
| } |
| |
| CODECHAL_DEBUG_CHK_NULL(data); |
| |
| mhw_vdbox_mfx_g10_X::MFX_AVC_IMG_STATE_CMD mfxCmd; |
| mfxCmd = *(mhw_vdbox_mfx_g10_X::MFX_AVC_IMG_STATE_CMD *)(data); |
| |
| if (m_pictureCodingType == I_TYPE) |
| { |
| m_avcPar->TrellisQuantizationEnable = mfxCmd.DW5.TrellisQuantizationEnabledTqenb; |
| m_avcPar->EnableAdaptiveTrellisQuantization = mfxCmd.DW5.TrellisQuantizationEnabledTqenb; |
| m_avcPar->TrellisQuantizationRounding = mfxCmd.DW5.TrellisQuantizationRoundingTqr; |
| m_avcPar->TrellisQuantizationChromaDisable = mfxCmd.DW5.TrellisQuantizationChromaDisableTqchromadisable; |
| m_avcPar->ExtendedRhoDomainEn = mfxCmd.DW17.ExtendedRhodomainStatisticsEnable; |
| } |
| |
| if (data && (cmdBuffer == nullptr) && (secondLevelBatchBuffer == nullptr)) |
| { |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx]); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| #endif |