| /* |
| * Copyright (c) 2011-2020, 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.cpp |
| //! \brief This file implements the base C++ class/interface for AVC DualPipe encoding |
| //! to be used across CODECHAL components. |
| //! |
| |
| #include "codechal_encode_avc.h" |
| #include "codechal_encode_wp.h" |
| #include "codeckrnheader.h" |
| #include "hal_oca_interface.h" |
| |
| #define CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE 128 |
| #define CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE 128 |
| #define CODECHAL_ENCODE_AVC_CQP_NUM_OF_PASSES 2 // 1 additional pass for IPCM |
| #define CODECHAL_ENCODE_AVC_ICQ_NUM_OF_PASSES 2 // 1 additional pass for IPCM |
| #define CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_ROUNDING 6 |
| #define CODECHAL_ENCODE_AVC_SEI_BUFFER_SIZE 10240 // 10K is just estimation |
| #define CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON 52 |
| #define CODECHAL_ENCODE_AVC_SKIP_BIAS_ADJUSTMENT_QP_THRESHOLD 22 |
| #define CODECHAL_ENCODE_AVC_HME_FIRST_STEP 0 |
| #define CODECHAL_ENCODE_AVC_HME_FOLLOWING_STEP 1 |
| #define CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_32x 1 |
| #define CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_16x 2 |
| #define CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_4x 2 |
| #define CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_16x 1 |
| #define CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_4x 0 |
| #define CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_INTRA_ROUNDING 5 |
| |
| const uint32_t CodechalEncodeAvcEnc::MaxLenSP[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 57, 57, 25, 25, 25, 16, 9 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::FTQBasedSkip[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 3, 3, 3, 3, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::HMEBCombineLen[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 8, 8, 8, 8, 8, 8, 8 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::HMECombineLen[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 8, 8, 8, 8, 8, 16, 8 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::SearchX[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 48, 48, 48, 48, 48, 48, 28 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::SearchY[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 40, 40, 40, 40, 40, 40, 28 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::BSearchX[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 32, 32, 32, 32, 32, 32, 24 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::BSearchY[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 32, 32, 32, 32, 32, 32, 24 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::EnableAdaptiveSearch[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 1, 1, 1, 1, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc:: InterRoundingP_TQ[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 3, 3, 3, 3, 3 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc:: InterRoundingBRef_TQ[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 2, 2, 2, 2, 2, 2, 2 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc:: InterRoundingB_TQ[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 0, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc:: TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc:: EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| // Lambda values for Trellis Quantization |
| const uint32_t CodechalEncodeAvcEnc::TQ_LAMBDA_I_FRAME[CODEC_AVC_NUM_QP][2] = |
| { |
| {0x00070000, 0x00060000}, |
| {0x00080000, 0x00080000}, |
| {0x000a0000, 0x00090000}, |
| {0x000d0000, 0x000c0000}, |
| {0x00110000, 0x000f0000}, |
| {0x00150000, 0x00130000}, |
| {0x001b0000, 0x00180000}, |
| {0x00220000, 0x001f0000}, |
| {0x002b0000, 0x00270000}, |
| {0x00360000, 0x00310000}, |
| {0x00440000, 0x003e0000}, |
| {0x00550000, 0x004e0000}, |
| {0x006c0000, 0x00630000}, |
| {0x00870000, 0x007d0000}, |
| {0x00ab0000, 0x009d0000}, |
| {0x00d70000, 0x00c70000}, |
| {0x010f0000, 0x00fb0000}, |
| {0x01560000, 0x013d0000}, |
| {0x01af0000, 0x01900000}, |
| {0x021f0000, 0x01f90000}, |
| {0x02ac0000, 0x027e0000}, |
| {0x035e0000, 0x03260000}, |
| {0x043e0000, 0x03fa0000}, |
| {0x057a0000, 0x05070000}, |
| {0x06f90000, 0x065a0000}, |
| {0x08770000, 0x08060000}, |
| {0x0af50000, 0x0a240000}, |
| {0x0d720000, 0x0cd10000}, |
| {0x10ef0000, 0x10340000}, |
| {0x156a0000, 0x147b0000}, |
| {0x1ae50000, 0x19e50000}, |
| {0x225d0000, 0x20be0000}, |
| {0x2ad50000, 0x29670000}, |
| {0x36490000, 0x345c0000}, |
| {0x443b0000, 0x423a0000}, |
| {0x56290000, 0x53c50000}, |
| {0x6c930000, 0x69f90000}, |
| {0x88770000, 0x86130000}, |
| {0xabd30000, 0xa9a40000}, |
| {0xd8a60000, 0xd6aa0000}, |
| |
| // Rounding offsets |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000}, |
| {0xfffa0000, 0xfffa0000} |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::TQ_LAMBDA_P_FRAME[CODEC_AVC_NUM_QP][2] = |
| { |
| {0x00070009, 0x00060009}, |
| {0x0008000c, 0x0008000c}, |
| {0x000a000f, 0x0009000f}, |
| {0x000d0013, 0x000c0013}, |
| {0x00110018, 0x000f0018}, |
| {0x0015001e, 0x0013001e}, |
| {0x001b0026, 0x00180026}, |
| {0x00220030, 0x001f0030}, |
| {0x002b003c, 0x0027003c}, |
| {0x0036004c, 0x0031004c}, |
| {0x00440060, 0x003e0060}, |
| {0x00550079, 0x004e0079}, |
| {0x006c0099, 0x00630099}, |
| {0x008700c1, 0x007d00c1}, |
| {0x00ab00f3, 0x009d00f3}, |
| {0x00d70132, 0x00c70133}, |
| {0x010f0181, 0x00fb0183}, |
| {0x015601e5, 0x013d01e8}, |
| {0x01af0264, 0x01900268}, |
| {0x021f0303, 0x01f90309}, |
| {0x02ac03cb, 0x027e03d5}, |
| {0x035e04c8, 0x032604d5}, |
| {0x043e0606, 0x03fa061a}, |
| {0x057a07c7, 0x050707b3}, |
| {0x06f909e6, 0x065a09b8}, |
| {0x08770c05, 0x08060c45}, |
| {0x0af50f8e, 0x0a240f7e}, |
| {0x0d721317, 0x0cd1138f}, |
| {0x10ef180a, 0x103418b2}, |
| {0x156a1e67, 0x147b1f30}, |
| {0x1ae5262e, 0x19e52762}, |
| {0x225d30c9, 0x20be31bd}, |
| {0x2ad53cce, 0x29673ed2}, |
| {0x36494d11, 0x345c4f59}, |
| {0x443b60dd, 0x423a643c}, |
| {0x56297a51, 0x53c57e9f}, |
| {0x6c939a22, 0x69f99ff9}, |
| {0x8877c1ba, 0x8613ca1e}, |
| {0xabd3ffef, 0xa9a4ffef}, |
| {0xd8a6ffef, 0xd6aaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef} |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::TQ_LAMBDA_B_FRAME[CODEC_AVC_NUM_QP][2] = |
| { |
| {0x00070009, 0x00060009}, |
| {0x0008000c, 0x0008000c}, |
| {0x000a000f, 0x0009000f}, |
| {0x000d0013, 0x000c0013}, |
| {0x00110018, 0x000f0018}, |
| {0x0015001e, 0x0013001e}, |
| {0x001b0026, 0x00180026}, |
| {0x00220030, 0x001f0030}, |
| {0x002b003c, 0x0027003c}, |
| {0x0036004c, 0x0031004c}, |
| {0x00440060, 0x003e0060}, |
| {0x00550079, 0x004e0079}, |
| {0x006c0099, 0x00630099}, |
| {0x008700c1, 0x007d00c1}, |
| {0x00ab00f3, 0x009d00f3}, |
| {0x00d70132, 0x00c70133}, |
| {0x010f0181, 0x00fb0183}, |
| {0x015601e5, 0x013d01e8}, |
| {0x01af0264, 0x01900268}, |
| {0x021f0303, 0x01f90309}, |
| {0x02ac03cb, 0x027e03d5}, |
| {0x035e04c8, 0x032604d5}, |
| {0x043e0606, 0x03fa061a}, |
| {0x057a07c7, 0x050707b3}, |
| {0x06f909e6, 0x065a09b8}, |
| {0x08770c05, 0x08060c45}, |
| {0x0af50f8e, 0x0a240f7e}, |
| {0x0d721317, 0x0cd1138f}, |
| {0x10ef180a, 0x103418b2}, |
| {0x156a1e67, 0x147b1f30}, |
| {0x1ae5262e, 0x19e52762}, |
| {0x225d30c9, 0x20be31bd}, |
| {0x2ad53cce, 0x29673ed2}, |
| {0x36494d11, 0x345c4f59}, |
| {0x443b60dd, 0x423a643c}, |
| {0x56297a51, 0x53c57e9f}, |
| {0x6c939a22, 0x69f99ff9}, |
| {0x8877c1ba, 0x8613ca1e}, |
| {0xabd3ffef, 0xa9a4ffef}, |
| {0xd8a6ffef, 0xd6aaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef}, |
| {0xfffaffef, 0xfffaffef} |
| }; |
| |
| typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_ME_CM |
| { |
| CODECHAL_ENCODE_AVC_ME_MV_DATA_SURFACE_CM = 0, |
| CODECHAL_ENCODE_AVC_16xME_MV_DATA_SURFACE_CM = 1, |
| CODECHAL_ENCODE_AVC_32xME_MV_DATA_SURFACE_CM = 1, |
| CODECHAL_ENCODE_AVC_ME_DISTORTION_SURFACE_CM = 2, |
| CODECHAL_ENCODE_AVC_ME_BRC_DISTORTION_CM = 3, |
| CODECHAL_ENCODE_AVC_ME_RESERVED0_CM = 4, |
| CODECHAL_ENCODE_AVC_ME_CURR_FOR_FWD_REF_CM = 5, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX0_CM = 6, |
| CODECHAL_ENCODE_AVC_ME_RESERVED1_CM = 7, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX1_CM = 8, |
| CODECHAL_ENCODE_AVC_ME_RESERVED2_CM = 9, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX2_CM = 10, |
| CODECHAL_ENCODE_AVC_ME_RESERVED3_CM = 11, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX3_CM = 12, |
| CODECHAL_ENCODE_AVC_ME_RESERVED4_CM = 13, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX4_CM = 14, |
| CODECHAL_ENCODE_AVC_ME_RESERVED5_CM = 15, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX5_CM = 16, |
| CODECHAL_ENCODE_AVC_ME_RESERVED6_CM = 17, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX6_CM = 18, |
| CODECHAL_ENCODE_AVC_ME_RESERVED7_CM = 19, |
| CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX7_CM = 20, |
| CODECHAL_ENCODE_AVC_ME_RESERVED8_CM = 21, |
| CODECHAL_ENCODE_AVC_ME_CURR_FOR_BWD_REF_CM = 22, |
| CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX0_CM = 23, |
| CODECHAL_ENCODE_AVC_ME_RESERVED9_CM = 24, |
| CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX1_CM = 25, |
| CODECHAL_ENCODE_AVC_ME_VDENC_STREAMIN_CM = 26, |
| CODECHAL_ENCODE_AVC_ME_NUM_SURFACES_CM = 27 |
| } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_ME_CM; |
| |
| // binding table for State Content Detection |
| typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_SFD_COMMON |
| { |
| CODECHAL_ENCODE_AVC_SFD_VDENC_INPUT_IMAGE_STATE_COMMON = 0, |
| CODECHAL_ENCODE_AVC_SFD_MV_DATA_SURFACE_COMMON = 1, |
| CODECHAL_ENCODE_AVC_SFD_INTER_DISTORTION_SURFACE_COMMON = 2, |
| CODECHAL_ENCODE_AVC_SFD_OUTPUT_DATA_SURFACE_COMMON = 3, |
| CODECHAL_ENCODE_AVC_SFD_VDENC_OUTPUT_IMAGE_STATE_COMMON = 4, |
| CODECHAL_ENCODE_AVC_SFD_NUM_SURFACES = 5 |
| } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_SFD_COMMON; |
| |
| // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes |
| const uint8_t CodechalEncodeAvcEnc::IntraScalingFactor_Cm_Common[64] = |
| { |
| 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, |
| 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, |
| 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| }; |
| |
| // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes |
| const uint8_t CodechalEncodeAvcEnc::AdaptiveIntraScalingFactor_Cm_Common[64] = |
| { |
| 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, |
| 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, |
| 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, |
| 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, |
| 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::OldIntraModeCost_Cm_Common[CODEC_AVC_NUM_QP] = |
| { |
| 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, |
| 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, 0x1e03000a, |
| 0x2e06001a, 0x2e06001a, 0x2e06001a, 0x2e06001a, 0x3b09001f, 0x3b09001f, 0x3b09001f, 0x3e0c002a, |
| 0x3e0c002a, 0x3e0c002a, 0x490f002d, 0x4b19002f, 0x4b19002f, 0x4c1b0039, 0x4e1c003a, 0x581e003b, |
| 0x591f003d, 0x5a28003e, 0x5b2a0048, 0x5c2b0049, 0x5e2c004a, 0x682e004b, 0x692f004d, 0x6a39004e, |
| 0x6b390058, 0x6d3b0059, 0x6e3c005a, 0x783e005b, 0x793f005d, 0x7a48005e, 0x7b4a0068, 0x7c4b0069, |
| 0x7e4c006a, 0x884e006b, 0x894f006d, 0x8a59006e |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::MvCost_PSkipAdjustment_Cm_Common[CODEC_AVC_NUM_QP] = |
| { |
| 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, |
| 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, 0x09060500, |
| 0x190c0a00, 0x190c0a00, 0x190c0a00, 0x190c0a00, 0x1e190f00, 0x1e190f00, 0x1e190f00, 0x291c1a00, |
| 0x291c1a00, 0x291c1a00, 0x2b1f1d00, 0x2e291f00, 0x2e291f00, 0x382b2900, 0x392c2a00, 0x3a2e2b00, |
| 0x3b2f2d00, 0x3c382e00, 0x3f3a3800, 0x483b3900, 0x493c3a00, 0x4a3e3b00, 0x4b3f3d00, 0x4d493e00, |
| 0x4e494800, 0x584b4900, 0x594c4a00, 0x5a4e4b00, 0x5b4f4d00, 0x5d584e00, 0x5e5a5800, 0x685b5900, |
| 0x695c5a00, 0x6a5e5b00, 0x6b5f5d00, 0x6d695e00 |
| }; |
| |
| const uint16_t CodechalEncodeAvcEnc::SkipVal_B_Common[2][2][64] = |
| { |
| { |
| // Block Based Skip = 0 and Transform Flag = 0 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, |
| 0x0024, 0x0060, 0x0060, 0x0099, 0x0099, 0x00cf, 0x00cf, 0x0105, |
| 0x0105, 0x0141, 0x0141, 0x0183, 0x0183, 0x01ce, 0x01ce, 0x0228, |
| 0x0228, 0x0291, 0x0291, 0x030c, 0x030c, 0x039f, 0x039f, 0x0447, |
| 0x0447, 0x050d, 0x050d, 0x05f1, 0x05f1, 0x06f6, 0x06f6, 0x0822, |
| 0x0822, 0x0972, 0x0972, 0x0aef, 0x0aef, 0x0c96, 0x0c96, 0x0e70, |
| 0x0e70, 0x107a, 0x107a, 0x1284, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| // Block Based Skip = 0 and Transform Flag = 1 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0024, |
| 0x0024, 0x0060, 0x0060, 0x0099, 0x0099, 0x00cf, 0x00cf, 0x0105, |
| 0x0105, 0x0141, 0x0141, 0x0183, 0x0183, 0x01ce, 0x01ce, 0x0228, |
| 0x0228, 0x0291, 0x0291, 0x030c, 0x030c, 0x039f, 0x039f, 0x0447, |
| 0x0447, 0x050d, 0x050d, 0x05f1, 0x05f1, 0x06f6, 0x06f6, 0x0822, |
| 0x0822, 0x0972, 0x0972, 0x0aef, 0x0aef, 0x0c96, 0x0c96, 0x0e70, |
| 0x0e70, 0x107a, 0x107a, 0x1284, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| } |
| }, |
| { |
| // Block Based Skip = 1 and Transform Flag = 0 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, |
| 0x0006, 0x0010, 0x0010, 0x0019, 0x0019, 0x0022, 0x0022, 0x002b, |
| 0x002b, 0x0035, 0x0035, 0x0040, 0x0040, 0x004d, 0x004d, 0x005c, |
| 0x005c, 0x006d, 0x006d, 0x0082, 0x0082, 0x009a, 0x009a, 0x00b6, |
| 0x00b6, 0x00d7, 0x00d7, 0x00fd, 0x00fd, 0x0129, 0x0129, 0x015b, |
| 0x015b, 0x0193, 0x0193, 0x01d2, 0x01d2, 0x0219, 0x0219, 0x0268, |
| 0x0268, 0x02bf, 0x02bf, 0x0316, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| // Block Based Skip = 1 and Transform Flag = 1 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, |
| 0x000c, 0x0020, 0x0020, 0x0033, 0x0033, 0x0045, 0x0045, 0x0057, |
| 0x0057, 0x006b, 0x006b, 0x0081, 0x0081, 0x009a, 0x009a, 0x00b8, |
| 0x00b8, 0x00db, 0x00db, 0x0104, 0x0104, 0x0135, 0x0135, 0x016d, |
| 0x016d, 0x01af, 0x01af, 0x01fb, 0x01fb, 0x0252, 0x0252, 0x02b6, |
| 0x02b6, 0x0326, 0x0326, 0x03a5, 0x03a5, 0x0432, 0x0432, 0x04d0, |
| 0x04d0, 0x057e, 0x057e, 0x062c, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| } |
| } |
| }; |
| |
| // AVC MBEnc SkipVal Table, index [BlockBasedSkip][TransformFlag][SliceQP] |
| // QP is from 0 - 51, pad it to 64 since BRC needs each subarray size to be 128bytes. |
| const uint16_t CodechalEncodeAvcEnc::SkipVal_P_Common[2][2][64] = |
| { |
| { |
| // Block Based Skip = 0 and Transform Flag = 0 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, |
| 0x0006, 0x000c, 0x000c, 0x0015, 0x0015, 0x0021, 0x0021, 0x0033, |
| 0x0033, 0x004b, 0x004b, 0x0069, 0x0069, 0x0096, 0x0096, 0x00cc, |
| 0x00cc, 0x0111, 0x0111, 0x0165, 0x0165, 0x01cb, 0x01cb, 0x0246, |
| 0x0246, 0x02d3, 0x02d3, 0x0378, 0x0378, 0x0438, 0x0438, 0x0510, |
| 0x0510, 0x0603, 0x0603, 0x0714, 0x0714, 0x0846, 0x0846, 0x0999, |
| 0x0999, 0x0b10, 0x0b10, 0x0c3c, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| |
| // Block Based Skip = 0 and Transform Flag = 1 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, |
| 0x0006, 0x000c, 0x000c, 0x0015, 0x0015, 0x0021, 0x0021, 0x0033, |
| 0x0033, 0x004b, 0x004b, 0x0069, 0x0069, 0x0096, 0x0096, 0x00cc, |
| 0x00cc, 0x0111, 0x0111, 0x0165, 0x0165, 0x01cb, 0x01cb, 0x0246, |
| 0x0246, 0x02d3, 0x02d3, 0x0378, 0x0378, 0x0438, 0x0438, 0x0510, |
| 0x0510, 0x0603, 0x0603, 0x0714, 0x0714, 0x0846, 0x0846, 0x0999, |
| 0x0999, 0x0b10, 0x0b10, 0x0c3c, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| } |
| }, |
| { |
| // Block Based Skip = 1 and Transform Flag = 0 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, |
| 0x0001, 0x0002, 0x0002, 0x0003, 0x0003, 0x0005, 0x0005, 0x0008, |
| 0x0008, 0x000c, 0x000c, 0x0011, 0x0011, 0x0019, 0x0019, 0x0022, |
| 0x0022, 0x002d, 0x002d, 0x003b, 0x003b, 0x004c, 0x004c, 0x0061, |
| 0x0061, 0x0078, 0x0078, 0x0094, 0x0094, 0x00b4, 0x00b4, 0x00d8, |
| 0x00d8, 0x0100, 0x0100, 0x012e, 0x012e, 0x0161, 0x0161, 0x0199, |
| 0x0199, 0x01d8, 0x01d8, 0x020a, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| |
| // Block Based Skip = 1 and Transform Flag = 1 |
| { |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, |
| 0x0002, 0x0004, 0x0004, 0x0007, 0x0007, 0x000b, 0x000b, 0x0011, |
| 0x0011, 0x0019, 0x0019, 0x0023, 0x0023, 0x0032, 0x0032, 0x0044, |
| 0x0044, 0x005b, 0x005b, 0x0077, 0x0077, 0x0099, 0x0099, 0x00c2, |
| 0x00c2, 0x00f1, 0x00f1, 0x0128, 0x0128, 0x0168, 0x0168, 0x01b0, |
| 0x01b0, 0x0201, 0x0201, 0x025c, 0x025c, 0x02c2, 0x02c2, 0x0333, |
| 0x0333, 0x03b0, 0x03b0, 0x0414, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 |
| } |
| } |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::PreProcFtqLut_Cm_Common[CODEC_AVC_NUM_QP][16] = |
| { |
| //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3), MVCOST(4), QP(5), FTQ Thds(6), FTQ Thds(7), RefCost(8), SkipVal(9), IntraSF(10) ,Zero(11), Zero(12), Zero(13), Zero(14) , Zero(15) |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } |
| }; |
| |
| // SkipVal (DW offset 9) in the following table needs to be changed by Driver based on the BlockbasedSkip and Transform Flag. |
| // Kernel indexes this table based on the MB QP. it's different with g75, but mainline did not support g75 anymore |
| const uint32_t CodechalEncodeAvcEnc::MBBrcConstantData_Cm_Common[3][CODEC_AVC_NUM_QP][16] = |
| { |
| //I-slice |
| { |
| //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3), MVCOST(4), QP(5), FTQ Thds(6), FTQ Thds(7), RefCost(8), SkipVal(9), IntraSF(10) ,Zero(11), Zero(12), Zero(13), Zero(14) , Zero(15) |
| { 0x0d000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x0f000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x19000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x1a000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x1b000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x1c000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x1e000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x28000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x29000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x2a00000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x2b00000b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x2c00000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x2e00000e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x38000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x39000019, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a00001b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3b00001c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3c00001d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3e00001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x48020028, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x49020029, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4a03002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4b03002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4c04002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4e04002c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5805002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5905002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5a06002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5b07002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5c080039, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5e09003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6828003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6929003b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6a2a003c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6b2c003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6c3a003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6e3b0048, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x783c0049, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x793e004a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7a3e004b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7b48004c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7c49004e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7e4a0058, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x884d0059, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x894f005a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8a58005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8b59005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8c5c005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8e5d005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f5f005d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f68005f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f690068, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } |
| }, |
| //P-slice |
| { |
| //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3), MVCOST(4), QP(5), FTQ Thds(6), FTQ Thds(7), RefCost(8), SkipVal(9), IntraSF(10) ,Zero(11), Zero(12), Zero(13), Zero(14) , Zero(15) |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5b493d29, 0x281c0d2b, 0x001a001e, 0x2b1d1a05, 0x39392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5f4c492c, 0x2c28192f, 0x001e002a, 0x38291e07, 0x3d3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x694e4a2e, 0x2d291b39, 0x0028002b, 0x392a2808, 0x3f3e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6a584b38, 0x2f2a1c3a, 0x0029002c, 0x3a2b2909, 0x48483e3b, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6b594d39, 0x382c1d3b, 0x002a002e, 0x3b2d2a0a, 0x49493f3d, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6c5a4e3a, 0x392d1f3c, 0x002b002f, 0x3c2e2b0b, 0x4a4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6e5b583b, 0x3b2f293e, 0x002d0039, 0x3f382d0d, 0x4c4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6f5c593c, 0x3c38293f, 0x002e003a, 0x48392e0e, 0x4d4c4b49, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x795e5a3e, 0x3d392b49, 0x0038003b, 0x493a3818, 0x4f4e4c4a, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7a685b48, 0x3f3a2c4a, 0x0039003c, 0x4a3b3919, 0x58584e4b, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7b695d49, 0x483c2d4b, 0x003a003e, 0x4b3d3a1a, 0x59594f4d, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7d6a5e4a, 0x4a3d2f4c, 0x003c0048, 0x4d3e3c1c, 0x5b5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7e6b684b, 0x4a3e384d, 0x003d0049, 0x4e483d1d, 0x5c5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x886d694d, 0x4c483a4f, 0x003f004a, 0x58493f1f, 0x5e5d5b59, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x896e6a4e, 0x4d493b59, 0x0048004b, 0x594a4828, 0x5f5e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8a786b58, 0x4f4a3c5a, 0x0049004c, 0x5a4b4929, 0x68685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8b796d59, 0x584c3d5b, 0x004a004e, 0x5b4d4a2a, 0x69695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8c7a6e5a, 0x594d3f5c, 0x004b004f, 0x5d4e4b2b, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8e7b785b, 0x5b4f485e, 0x004d0059, 0x5e584d2d, 0x6c6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f7c795c, 0x5c58495f, 0x004e005a, 0x68594e2e, 0x6d6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f7e7a5e, 0x5d594b69, 0x0058005b, 0x695a5838, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f887b68, 0x5f5a4c6a, 0x0059005c, 0x6a5b5939, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f897d69, 0x685c4d6b, 0x005a005e, 0x6b5d5a3a, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f8a7e6a, 0x695d4f6c, 0x005b0068, 0x6d5e5b3b, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } |
| }, |
| //B-slice |
| { |
| //ModeCOST(0), ModeCOST(1), ModeCOST(2), MVCOST(3), MVCOST(4), QP(5), FTQ Thds(6), FTQ Thds(7), RefCost(8), SkipVal(9), IntraSF(10) ,Zero(11), Zero(12), Zero(13), Zero(14) , Zero(15) |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff020202, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff040404, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff050505, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff060606, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff070707, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff080808, 0x01010001, 0x01010101, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff090909, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff131313, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff141414, 0x10100010, 0x10101010, 0x00000000, 0x00000000, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff151515, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff161616, 0x13130013, 0x13131313, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff171717, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff181818, 0x16160016, 0x16161616, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5d4d4b29, 0x2d2b282f, 0x001a0a1f, 0x1f0a0a00, 0x3a392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x69594f2c, 0x392f2b3b, 0x001e0e2b, 0x2b0e0e00, 0x3e3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6a5a592e, 0x3b392d3c, 0x0028182c, 0x2c181800, 0x483e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6b5b5a38, 0x3c3a2f3e, 0x0029192e, 0x2e191900, 0x49483e3b, 0xff1f1f1f, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6d5d5b39, 0x3d3b383f, 0x002a1a2f, 0x2f1a1a00, 0x4a493f3d, 0xff202020, 0x27270027, 0x27272727, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x6e5e5c3a, 0x3e3c3948, 0x002b1b38, 0x381b1b00, 0x4b4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x78685e3b, 0x493e3b4a, 0x002d1d3a, 0x3a1d1d00, 0x4d4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x79695f3c, 0x493f3b4b, 0x002e1e3b, 0x3b1e1e00, 0x4e4c4b49, 0xff232323, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7a6a693e, 0x4b493d4c, 0x0038283c, 0x3c282800, 0x584e4c4a, 0xff242424, 0x32320032, 0x32323232, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7b6b6a48, 0x4c4a3f4e, 0x0039293e, 0x3e292900, 0x59584e4b, 0xff252525, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7d6d6b49, 0x4d4b484f, 0x003a2a3f, 0x3f2a2a00, 0x5a594f4d, 0xff262626, 0x38380038, 0x38383838, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x7e6e6c4a, 0x4f4c4959, 0x003c2c49, 0x492c2c00, 0x5c5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x88786d4b, 0x584d4a59, 0x003d2d49, 0x492d2d00, 0x5d5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x89796f4d, 0x5a4f4c5b, 0x003f2f4b, 0x4b2f2f00, 0x5f5d5b59, 0xff292929, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8a7a794e, 0x5b594d5c, 0x0048384c, 0x4c383800, 0x685e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8b7b7a58, 0x5c5a4f5e, 0x0049394e, 0x4e393900, 0x69685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8d7d7b59, 0x5d5b585f, 0x004a3a4f, 0x4f3a3a00, 0x6a695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8e7e7c5a, 0x5f5c5968, 0x004b3b58, 0x583b3b00, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f887e5b, 0x685e5a6a, 0x004d3d5a, 0x5a3d3d00, 0x6d6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f897f5c, 0x695f5c6b, 0x004e3e5b, 0x5b3e3e00, 0x6e6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f8a895e, 0x6b695d6c, 0x0058485c, 0x5c484800, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f8b8a68, 0x6c6a5f6e, 0x0059495e, 0x5e494900, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f8d8b69, 0x6d6b686f, 0x005a4a5f, 0x5f4a4a00, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
| { 0x8f8e8c6a, 0x6f6c6979, 0x005b4b69, 0x694b4b00, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373, 0x00000000, 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } |
| } |
| }; |
| |
| // AVC MBEnc ModeCost and MVCost tables, index [CodingType][QP] and |
| const uint32_t CodechalEncodeAvcEnc::ModeMvCost_Common[3][CODEC_AVC_NUM_QP][8] = |
| { |
| // I-Frame |
| { |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808 }, |
| { 0x1e03000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x2e06001a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010 }, |
| { 0x3b09001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010 }, |
| { 0x3b09001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313 }, |
| { 0x3b09001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313 }, |
| { 0x3e0c002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616 }, |
| { 0x3e0c002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616 }, |
| { 0x3e0c002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x490f002d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x4b19002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x4b19002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x4c1b0039, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222 }, |
| { 0x4e1c003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222 }, |
| { 0x581e003b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727 }, |
| { 0x591f003d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727 }, |
| { 0x5a28003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x5b2a0048, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x5c2b0049, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232 }, |
| { 0x5e2c004a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232 }, |
| { 0x682e004b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838 }, |
| { 0x692f004d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838 }, |
| { 0x6a39004e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x6b390058, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x6d3b0059, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545 }, |
| { 0x6e3c005a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545 }, |
| { 0x783e005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x793f005d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x7a48005e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555 }, |
| { 0x7b4a0068, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555 }, |
| { 0x7c4b0069, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x7e4c006a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x884e006b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868 }, |
| { 0x894f006d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868 }, |
| { 0x8a59006e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373 }, |
| }, |
| // P-Frame |
| { |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff010101, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff020202, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff030303, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff040404, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff050505, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff060606, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff070707, 0x01010001, 0x01010101 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff080808, 0x01010001, 0x01010101 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff090909, 0x03030003, 0x03030303 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff131313, 0x10100010, 0x10101010 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff141414, 0x10100010, 0x10101010 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff151515, 0x13130013, 0x13131313 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff161616, 0x13130013, 0x13131313 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff171717, 0x16160016, 0x16161616 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff181818, 0x16160016, 0x16161616 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5b493d29, 0x281c0d2b, 0x001a001e, 0x2b1d1a05, 0x39392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5f4c492c, 0x2c28192f, 0x001e002a, 0x38291e07, 0x3d3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 }, |
| { 0x694e4a2e, 0x2d291b39, 0x0028002b, 0x392a2808, 0x3f3e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 }, |
| { 0x6a584b38, 0x2f2a1c3a, 0x0029002c, 0x3a2b2909, 0x48483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 }, |
| { 0x6b594d39, 0x382c1d3b, 0x002a002e, 0x3b2d2a0a, 0x49493f3d, 0xff202020, 0x27270027, 0x27272727 }, |
| { 0x6c5a4e3a, 0x392d1f3c, 0x002b002f, 0x3c2e2b0b, 0x4a4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x6e5b583b, 0x3b2f293e, 0x002d0039, 0x3f382d0d, 0x4c4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x6f5c593c, 0x3c38293f, 0x002e003a, 0x48392e0e, 0x4d4c4b49, 0xff232323, 0x32320032, 0x32323232 }, |
| { 0x795e5a3e, 0x3d392b49, 0x0038003b, 0x493a3818, 0x4f4e4c4a, 0xff242424, 0x32320032, 0x32323232 }, |
| { 0x7a685b48, 0x3f3a2c4a, 0x0039003c, 0x4a3b3919, 0x58584e4b, 0xff252525, 0x38380038, 0x38383838 }, |
| { 0x7b695d49, 0x483c2d4b, 0x003a003e, 0x4b3d3a1a, 0x59594f4d, 0xff262626, 0x38380038, 0x38383838 }, |
| { 0x7d6a5e4a, 0x4a3d2f4c, 0x003c0048, 0x4d3e3c1c, 0x5b5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x7e6b684b, 0x4a3e384d, 0x003d0049, 0x4e483d1d, 0x5c5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x886d694d, 0x4c483a4f, 0x003f004a, 0x58493f1f, 0x5e5d5b59, 0xff292929, 0x45450045, 0x45454545 }, |
| { 0x896e6a4e, 0x4d493b59, 0x0048004b, 0x594a4828, 0x5f5e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 }, |
| { 0x8a786b58, 0x4f4a3c5a, 0x0049004c, 0x5a4b4929, 0x68685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8b796d59, 0x584c3d5b, 0x004a004e, 0x5b4d4a2a, 0x69695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8c7a6e5a, 0x594d3f5c, 0x004b004f, 0x5d4e4b2b, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 }, |
| { 0x8e7b785b, 0x5b4f485e, 0x004d0059, 0x5e584d2d, 0x6c6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 }, |
| { 0x8f7c795c, 0x5c58495f, 0x004e005a, 0x68594e2e, 0x6d6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f7e7a5e, 0x5d594b69, 0x0058005b, 0x695a5838, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f887b68, 0x5f5a4c6a, 0x0059005c, 0x6a5b5939, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 }, |
| { 0x8f897d69, 0x685c4d6b, 0x005a005e, 0x6b5d5a3a, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 }, |
| { 0x8f8a7e6a, 0x695d4f6c, 0x005b0068, 0x6d5e5b3b, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 }, |
| }, |
| // B-Frame |
| { |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff010101, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff020202, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff030303, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff040404, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff050505, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff060606, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff070707, 0x01010001, 0x01010101 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff080808, 0x01010001, 0x01010101 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff090909, 0x03030003, 0x03030303 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff131313, 0x10100010, 0x10101010 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff141414, 0x10100010, 0x10101010 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff151515, 0x13130013, 0x13131313 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff161616, 0x13130013, 0x13131313 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff171717, 0x16160016, 0x16161616 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff181818, 0x16160016, 0x16161616 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5d4d4b29, 0x2d2b282f, 0x001a0a1f, 0x1f0a0a00, 0x3a392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x69594f2c, 0x392f2b3b, 0x001e0e2b, 0x2b0e0e00, 0x3e3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 }, |
| { 0x6a5a592e, 0x3b392d3c, 0x0028182c, 0x2c181800, 0x483e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 }, |
| { 0x6b5b5a38, 0x3c3a2f3e, 0x0029192e, 0x2e191900, 0x49483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 }, |
| { 0x6d5d5b39, 0x3d3b383f, 0x002a1a2f, 0x2f1a1a00, 0x4a493f3d, 0xff202020, 0x27270027, 0x27272727 }, |
| { 0x6e5e5c3a, 0x3e3c3948, 0x002b1b38, 0x381b1b00, 0x4b4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x78685e3b, 0x493e3b4a, 0x002d1d3a, 0x3a1d1d00, 0x4d4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x79695f3c, 0x493f3b4b, 0x002e1e3b, 0x3b1e1e00, 0x4e4c4b49, 0xff232323, 0x32320032, 0x32323232 }, |
| { 0x7a6a693e, 0x4b493d4c, 0x0038283c, 0x3c282800, 0x584e4c4a, 0xff242424, 0x32320032, 0x32323232 }, |
| { 0x7b6b6a48, 0x4c4a3f4e, 0x0039293e, 0x3e292900, 0x59584e4b, 0xff252525, 0x38380038, 0x38383838 }, |
| { 0x7d6d6b49, 0x4d4b484f, 0x003a2a3f, 0x3f2a2a00, 0x5a594f4d, 0xff262626, 0x38380038, 0x38383838 }, |
| { 0x7e6e6c4a, 0x4f4c4959, 0x003c2c49, 0x492c2c00, 0x5c5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x88786d4b, 0x584d4a59, 0x003d2d49, 0x492d2d00, 0x5d5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x89796f4d, 0x5a4f4c5b, 0x003f2f4b, 0x4b2f2f00, 0x5f5d5b59, 0xff292929, 0x45450045, 0x45454545 }, |
| { 0x8a7a794e, 0x5b594d5c, 0x0048384c, 0x4c383800, 0x685e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 }, |
| { 0x8b7b7a58, 0x5c5a4f5e, 0x0049394e, 0x4e393900, 0x69685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8d7d7b59, 0x5d5b585f, 0x004a3a4f, 0x4f3a3a00, 0x6a695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8e7e7c5a, 0x5f5c5968, 0x004b3b58, 0x583b3b00, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 }, |
| { 0x8f887e5b, 0x685e5a6a, 0x004d3d5a, 0x5a3d3d00, 0x6d6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 }, |
| { 0x8f897f5c, 0x695f5c6b, 0x004e3e5b, 0x5b3e3e00, 0x6e6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f8a895e, 0x6b695d6c, 0x0058485c, 0x5c484800, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f8b8a68, 0x6c6a5f6e, 0x0059495e, 0x5e494900, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 }, |
| { 0x8f8d8b69, 0x6d6b686f, 0x005a4a5f, 0x5f4a4a00, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 }, |
| { 0x8f8e8c6a, 0x6f6c6979, 0x005b4b69, 0x694b4b00, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 }, |
| } |
| }; |
| |
| // 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 CodechalEncodeAvcEnc::RefCost_Common[3][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 |
| { |
| 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, |
| 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0008, 0x0008, 0x0008, 0x0008, |
| 0x000C, 0x000C, 0x000C, 0x0010, 0x0010, 0x0010, 0x0014, 0x0018, 0x0018, 0x001C, |
| 0x0020, 0x0024, 0x0028, 0x002C, 0x0034, 0x0038, 0x0040, 0x0048, 0x0050, 0x005C, |
| 0x0064, 0x0074, 0x0080, 0x0090, 0x00A0, 0x00B4, 0x00CC, 0x00E4, 0x0100, 0x0120, |
| 0x0144, 0x016C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000 |
| }, |
| //B-slice |
| { |
| 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, |
| 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0008, 0x0008, 0x0008, 0x0008, |
| 0x000C, 0x000C, 0x000C, 0x0010, 0x0010, 0x0010, 0x0014, 0x0018, 0x0018, 0x001C, |
| 0x0020, 0x0024, 0x0028, 0x002C, 0x0034, 0x0038, 0x0040, 0x0048, 0x0050, 0x005C, |
| 0x0064, 0x0074, 0x0080, 0x0090, 0x00A0, 0x00B4, 0x00CC, 0x00E4, 0x0100, 0x0120, |
| 0x0144, 0x016C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, |
| 0x0000, 0x0000, 0x0000, 0x0000 |
| } |
| }; |
| |
| const uint8_t CodechalEncodeAvcEnc::MaxRefIdx0_Progressive_4K[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 2, 2, 2, 0, 0 |
| }; |
| |
| const uint8_t CodechalEncodeAvcEnc::MaxRefIdx0[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 7, 5, 2, 2, 2, 0, 0 |
| }; |
| |
| const uint8_t CodechalEncodeAvcEnc::MaxBRefIdx0[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 1, 1, 1, 0, 0 |
| }; |
| |
| const uint8_t CodechalEncodeAvcEnc::MaxRefIdx1[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 1, 1, 1, 1, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::SuperHME[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 1, 1, 1, 1, 1, 1 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::UltraHME[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 1, 1, 1, 1, 1, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEnc::ModeMvCost_Cm[3][52][8] = |
| { |
| // I-Frame |
| { |
| { 0x0d000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000 }, |
| { 0x0f000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff010101, 0x00000000, 0x00000000 }, |
| { 0x19000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff020202, 0x00000000, 0x00000000 }, |
| { 0x1a000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff030303, 0x00000000, 0x00000000 }, |
| { 0x1b000005, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff040404, 0x00000000, 0x00000000 }, |
| { 0x1c000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff050505, 0x00000000, 0x00000000 }, |
| { 0x1e000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff060606, 0x00000000, 0x00000000 }, |
| { 0x28000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff070707, 0x01010001, 0x01010101 }, |
| { 0x29000009, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff080808, 0x01010001, 0x01010101 }, |
| { 0x2a00000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff090909, 0x03030003, 0x03030303 }, |
| { 0x2b00000b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0a0a0a, 0x03030003, 0x03030303 }, |
| { 0x2c00000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0b0b0b, 0x06060006, 0x06060606 }, |
| { 0x2e00000e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0c0c0c, 0x06060006, 0x06060606 }, |
| { 0x38000018, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0d0d0d, 0x08080008, 0x08080808 }, |
| { 0x39000019, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0e0e0e, 0x08080008, 0x08080808 }, |
| { 0x3a00001b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x3b00001c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff101010, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x3c00001d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff111111, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x3e00001f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff121212, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x48020028, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff131313, 0x10100010, 0x10101010 }, |
| { 0x49020029, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff141414, 0x10100010, 0x10101010 }, |
| { 0x4a03002a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff151515, 0x13130013, 0x13131313 }, |
| { 0x4b03002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff161616, 0x13130013, 0x13131313 }, |
| { 0x4c04002b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff171717, 0x16160016, 0x16161616 }, |
| { 0x4e04002c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff181818, 0x16160016, 0x16161616 }, |
| { 0x5805002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff191919, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5905002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5a06002e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5b07002f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5c080039, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1d1d1d, 0x22220022, 0x22222222 }, |
| { 0x5e09003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1e1e1e, 0x22220022, 0x22222222 }, |
| { 0x6828003a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff1f1f1f, 0x27270027, 0x27272727 }, |
| { 0x6929003b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff202020, 0x27270027, 0x27272727 }, |
| { 0x6a2a003c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff212121, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x6b2c003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff222222, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x6c3a003e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff232323, 0x32320032, 0x32323232 }, |
| { 0x6e3b0048, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff242424, 0x32320032, 0x32323232 }, |
| { 0x783c0049, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff252525, 0x38380038, 0x38383838 }, |
| { 0x793e004a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff262626, 0x38380038, 0x38383838 }, |
| { 0x7a3e004b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff272727, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x7b48004c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff282828, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x7c49004e, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff292929, 0x45450045, 0x45454545 }, |
| { 0x7e4a0058, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2a2a2a, 0x45450045, 0x45454545 }, |
| { 0x884d0059, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x894f005a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8a58005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2d2d2d, 0x55550055, 0x55555555 }, |
| { 0x8b59005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2e2e2e, 0x55550055, 0x55555555 }, |
| { 0x8c5c005b, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8e5d005c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff303030, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f5f005d, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff313131, 0x68680068, 0x68686868 }, |
| { 0x8f68005f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff323232, 0x68680068, 0x68686868 }, |
| { 0x8f690068, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff333333, 0x73730073, 0x73737373 } |
| }, |
| // P-Frame |
| { |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff000000, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff010101, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff020202, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff030303, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff040404, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff050505, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff060606, 0x00000000, 0x00000000 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff070707, 0x01010001, 0x01010101 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff080808, 0x01010001, 0x01010101 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff090909, 0x03030003, 0x03030303 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 }, |
| { 0x391e1a07, 0x06040208, 0x00040005, 0x09050401, 0x0f0e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x492e2a0e, 0x0d090519, 0x0008000b, 0x190a0802, 0x1f1e1c1a, 0xff131313, 0x10100010, 0x10101010 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff141414, 0x10100010, 0x10101010 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff151515, 0x13130013, 0x13131313 }, |
| { 0x4d3b2f1b, 0x1a0d071d, 0x000c0018, 0x1e0f0c03, 0x2b2b291f, 0xff161616, 0x13130013, 0x13131313 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff171717, 0x16160016, 0x16161616 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff181818, 0x16160016, 0x16161616 }, |
| { 0x593e3a1e, 0x1d190a29, 0x0018001b, 0x291a1804, 0x2f2e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5b493d29, 0x281c0d2b, 0x001a001e, 0x2b1d1a05, 0x39392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5d4b3f2b, 0x2a1e0f2d, 0x001c0028, 0x2e1f1c06, 0x3b3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5f4c492c, 0x2c28192f, 0x001e002a, 0x38291e07, 0x3d3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 }, |
| { 0x694e4a2e, 0x2d291b39, 0x0028002b, 0x392a2808, 0x3f3e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 }, |
| { 0x6a584b38, 0x2f2a1c3a, 0x0029002c, 0x3a2b2909, 0x48483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 }, |
| { 0x6b594d39, 0x382c1d3b, 0x002a002e, 0x3b2d2a0a, 0x49493f3d, 0xff202020, 0x27270027, 0x27272727 }, |
| { 0x6c5a4e3a, 0x392d1f3c, 0x002b002f, 0x3c2e2b0b, 0x4a4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x6e5b583b, 0x3b2f293e, 0x002d0039, 0x3f382d0d, 0x4c4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x6f5c593c, 0x3c38293f, 0x002e003a, 0x48392e0e, 0x4d4c4b49, 0xff232323, 0x32320032, 0x32323232 }, |
| { 0x795e5a3e, 0x3d392b49, 0x0038003b, 0x493a3818, 0x4f4e4c4a, 0xff242424, 0x32320032, 0x32323232 }, |
| { 0x7a685b48, 0x3f3a2c4a, 0x0039003c, 0x4a3b3919, 0x58584e4b, 0xff252525, 0x38380038, 0x38383838 }, |
| { 0x7b695d49, 0x483c2d4b, 0x003a003e, 0x4b3d3a1a, 0x59594f4d, 0xff262626, 0x38380038, 0x38383838 }, |
| { 0x7d6a5e4a, 0x4a3d2f4c, 0x003c0048, 0x4d3e3c1c, 0x5b5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x7e6b684b, 0x4a3e384d, 0x003d0049, 0x4e483d1d, 0x5c5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x886d694d, 0x4c483a4f, 0x003f004a, 0x58493f1f, 0x5e5d5b59, 0xff292929, 0x45450045, 0x45454545 }, |
| { 0x896e6a4e, 0x4d493b59, 0x0048004b, 0x594a4828, 0x5f5e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 }, |
| { 0x8a786b58, 0x4f4a3c5a, 0x0049004c, 0x5a4b4929, 0x68685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8b796d59, 0x584c3d5b, 0x004a004e, 0x5b4d4a2a, 0x69695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8c7a6e5a, 0x594d3f5c, 0x004b004f, 0x5d4e4b2b, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 }, |
| { 0x8e7b785b, 0x5b4f485e, 0x004d0059, 0x5e584d2d, 0x6c6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 }, |
| { 0x8f7c795c, 0x5c58495f, 0x004e005a, 0x68594e2e, 0x6d6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f7e7a5e, 0x5d594b69, 0x0058005b, 0x695a5838, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f887b68, 0x5f5a4c6a, 0x0059005c, 0x6a5b5939, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 }, |
| { 0x8f897d69, 0x685c4d6b, 0x005a005e, 0x6b5d5a3a, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 }, |
| { 0x8f8a7e6a, 0x695d4f6c, 0x005b0068, 0x6d5e5b3b, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 } |
| }, |
| // B-Frame |
| { |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff000000, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff010101, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff020202, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff030303, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff040404, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff050505, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff060606, 0x00000000, 0x00000000 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff070707, 0x01010001, 0x01010101 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff080808, 0x01010001, 0x01010101 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff090909, 0x03030003, 0x03030303 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0a0a0a, 0x03030003, 0x03030303 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0b0b0b, 0x06060006, 0x06060606 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0c0c0c, 0x06060006, 0x06060606 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0d0d0d, 0x08080008, 0x08080808 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0e0e0e, 0x08080008, 0x08080808 }, |
| { 0x3a2a2907, 0x0a08060c, 0x00040206, 0x06020200, 0x180e0c0a, 0xff0f0f0f, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff101010, 0x0b0b000b, 0x0b0b0b0b }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff111111, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff121212, 0x0d0d000d, 0x0d0d0d0d }, |
| { 0x4a3a390e, 0x1b190d1c, 0x0008040c, 0x0c040400, 0x281e1c1a, 0xff131313, 0x10100010, 0x10101010 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff141414, 0x10100010, 0x10101010 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff151515, 0x13130013, 0x13131313 }, |
| { 0x4f3f3d1b, 0x281d1a29, 0x000c0619, 0x19060600, 0x2c2b291f, 0xff161616, 0x13130013, 0x13131313 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff171717, 0x16160016, 0x16161616 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff181818, 0x16160016, 0x16161616 }, |
| { 0x5a4a491e, 0x2b291d2c, 0x0018081c, 0x1c080800, 0x382e2c2a, 0xff191919, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5d4d4b29, 0x2d2b282f, 0x001a0a1f, 0x1f0a0a00, 0x3a392f2d, 0xff1a1a1a, 0x1a1a001a, 0x1a1a1a1a }, |
| { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1b1b1b, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x5f4f4d2b, 0x382d2a39, 0x001c0c29, 0x290c0c00, 0x3c3b392f, 0xff1c1c1c, 0x1e1e001e, 0x1e1e1e1e }, |
| { 0x69594f2c, 0x392f2b3b, 0x001e0e2b, 0x2b0e0e00, 0x3e3c3b39, 0xff1d1d1d, 0x22220022, 0x22222222 }, |
| { 0x6a5a592e, 0x3b392d3c, 0x0028182c, 0x2c181800, 0x483e3c3a, 0xff1e1e1e, 0x22220022, 0x22222222 }, |
| { 0x6b5b5a38, 0x3c3a2f3e, 0x0029192e, 0x2e191900, 0x49483e3b, 0xff1f1f1f, 0x27270027, 0x27272727 }, |
| { 0x6d5d5b39, 0x3d3b383f, 0x002a1a2f, 0x2f1a1a00, 0x4a493f3d, 0xff202020, 0x27270027, 0x27272727 }, |
| { 0x6e5e5c3a, 0x3e3c3948, 0x002b1b38, 0x381b1b00, 0x4b4a483e, 0xff212121, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x78685e3b, 0x493e3b4a, 0x002d1d3a, 0x3a1d1d00, 0x4d4b4a48, 0xff222222, 0x2c2c002c, 0x2c2c2c2c }, |
| { 0x79695f3c, 0x493f3b4b, 0x002e1e3b, 0x3b1e1e00, 0x4e4c4b49, 0xff232323, 0x32320032, 0x32323232 }, |
| { 0x7a6a693e, 0x4b493d4c, 0x0038283c, 0x3c282800, 0x584e4c4a, 0xff242424, 0x32320032, 0x32323232 }, |
| { 0x7b6b6a48, 0x4c4a3f4e, 0x0039293e, 0x3e292900, 0x59584e4b, 0xff252525, 0x38380038, 0x38383838 }, |
| { 0x7d6d6b49, 0x4d4b484f, 0x003a2a3f, 0x3f2a2a00, 0x5a594f4d, 0xff262626, 0x38380038, 0x38383838 }, |
| { 0x7e6e6c4a, 0x4f4c4959, 0x003c2c49, 0x492c2c00, 0x5c5a594e, 0xff272727, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x88786d4b, 0x584d4a59, 0x003d2d49, 0x492d2d00, 0x5d5b5958, 0xff282828, 0x3e3e003e, 0x3e3e3e3e }, |
| { 0x89796f4d, 0x5a4f4c5b, 0x003f2f4b, 0x4b2f2f00, 0x5f5d5b59, 0xff292929, 0x45450045, 0x45454545 }, |
| { 0x8a7a794e, 0x5b594d5c, 0x0048384c, 0x4c383800, 0x685e5c5a, 0xff2a2a2a, 0x45450045, 0x45454545 }, |
| { 0x8b7b7a58, 0x5c5a4f5e, 0x0049394e, 0x4e393900, 0x69685e5b, 0xff2b2b2b, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8d7d7b59, 0x5d5b585f, 0x004a3a4f, 0x4f3a3a00, 0x6a695f5d, 0xff2c2c2c, 0x4d4d004d, 0x4d4d4d4d }, |
| { 0x8e7e7c5a, 0x5f5c5968, 0x004b3b58, 0x583b3b00, 0x6b6a685e, 0xff2d2d2d, 0x55550055, 0x55555555 }, |
| { 0x8f887e5b, 0x685e5a6a, 0x004d3d5a, 0x5a3d3d00, 0x6d6b6a68, 0xff2e2e2e, 0x55550055, 0x55555555 }, |
| { 0x8f897f5c, 0x695f5c6b, 0x004e3e5b, 0x5b3e3e00, 0x6e6c6b69, 0xff2f2f2f, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f8a895e, 0x6b695d6c, 0x0058485c, 0x5c484800, 0x6f6e6c6a, 0xff303030, 0x5e5e005e, 0x5e5e5e5e }, |
| { 0x8f8b8a68, 0x6c6a5f6e, 0x0059495e, 0x5e494900, 0x6f6f6e6b, 0xff313131, 0x68680068, 0x68686868 }, |
| { 0x8f8d8b69, 0x6d6b686f, 0x005a4a5f, 0x5f4a4a00, 0x6f6f6f6d, 0xff323232, 0x68680068, 0x68686868 }, |
| { 0x8f8e8c6a, 0x6f6c6979, 0x005b4b69, 0x694b4b00, 0x6f6f6f6e, 0xff333333, 0x73730073, 0x73737373 } |
| } |
| }; |
| |
| // QP is from 0 - 51, pad it to 64 since BRC needs array size to be 64 bytes |
| const uint8_t CodechalEncodeAvcEnc::m_qpDistMaxFrameAdjustmentCm[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 uint32_t CodechalEncodeAvcEnc::MultiPred[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 0, 0, 0, 0, 0 |
| }; |
| const uint32_t CodechalEncodeAvcEnc::MRDisableQPCheck[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 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 CodechalEncodeAvcEnc::RefCost_MultiRefQp[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 |
| } |
| }; |
| |
| // 1 for P, 3 for P & B |
| const uint32_t CodechalEncodeAvcEnc::CODECHAL_ENCODE_AVC_AllFractional_Common[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 3, 3, 3, 3, 0 |
| }; |
| |
| uint16_t CodechalEncodeAvcEnc::CalcSkipVal(bool encBlockBasedSkipEn, bool transform8x8Flag, uint16_t skipVal) |
| { |
| if(!encBlockBasedSkipEn) |
| { |
| skipVal *= 3; |
| } |
| else if(!transform8x8Flag) |
| { |
| skipVal /= 2; |
| } |
| |
| return skipVal; |
| } |
| |
| uint32_t CodechalEncodeAvcEnc::GetMaxMvsPer2Mb(uint8_t levelIdc) |
| { |
| uint32_t maxMvsPer2Mb = 32; |
| |
| // See JVT Spec Annex A Table A-1 Level limits for below mapping |
| switch (levelIdc) |
| { |
| case CODEC_AVC_LEVEL_3: |
| maxMvsPer2Mb = 32; |
| break; |
| case CODEC_AVC_LEVEL_31: |
| case CODEC_AVC_LEVEL_32: |
| case CODEC_AVC_LEVEL_4: |
| case CODEC_AVC_LEVEL_41: |
| case CODEC_AVC_LEVEL_42: |
| case CODEC_AVC_LEVEL_5: |
| case CODEC_AVC_LEVEL_51: |
| case CODEC_AVC_LEVEL_52: |
| maxMvsPer2Mb = 16; |
| break; |
| default: |
| break; |
| } |
| |
| return maxMvsPer2Mb; |
| } |
| |
| // Indicates if reference picture is a FIELD picture, if check ppRefList, the flags is always the second field flag; |
| // because the first field flag will be overwrited by the second one. |
| // if check the reference flag is top or bottom, using pParams->pSlcParams->RefPicList[list][index].PicFlags is better |
| uint32_t CodechalEncodeAvcEnc::GetRefPicFieldFlag( |
| PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params, |
| uint32_t list, |
| uint32_t index) |
| { |
| CODEC_PICTURE refPic; |
| uint32_t refPicFieldFlag; |
| |
| refPicFieldFlag = 0; |
| |
| if(params == nullptr){ |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid (NULL) Pointer."); |
| return refPicFieldFlag; |
| } |
| |
| CODECHAL_ENCODE_ASSERT(list == LIST_0 || list == LIST_1); |
| CODECHAL_ENCODE_ASSERT(index < 32); |
| |
| refPic = params->pSlcParams->RefPicList[list][index]; |
| if (!CodecHal_PictureIsInvalid(refPic)) |
| { |
| refPic = params->pPicParams->RefFrameList[refPic.FrameIdx]; |
| if (!CodecHal_PictureIsInvalid(refPic)) |
| { |
| refPicFieldFlag = CodecHal_PictureIsField(params->ppRefList[refPic.FrameIdx]->RefPic); |
| } |
| } |
| |
| return refPicFieldFlag; |
| } |
| |
| uint8_t CodechalEncodeAvcEnc::AVCGetQPValueFromRefList( |
| PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params, |
| uint32_t list, |
| uint32_t index) |
| { |
| uint8_t picIdx; |
| CODEC_PICTURE picture; |
| |
| if(params == nullptr){ |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid (NULL) Pointer."); |
| return 0; |
| } |
| |
| CODECHAL_ENCODE_ASSERT(list == LIST_0 || list == LIST_1); |
| CODECHAL_ENCODE_ASSERT(index < CODEC_AVC_MAX_NUM_REF_FRAME * 2); |
| |
| picture = params->pSlcParams->RefPicList[list][index]; |
| |
| if (!CodecHal_PictureIsInvalid(picture) && params->pPicIdx[picture.FrameIdx].bValid) |
| { |
| picIdx = params->pPicIdx[picture.FrameIdx].ucPicIdx; |
| if (CodecHal_PictureIsBottomField(picture)) |
| { |
| return params->ppRefList[picIdx]->ucQPValue[1]; |
| } |
| else |
| { |
| return params->ppRefList[picIdx]->ucQPValue[0]; |
| } |
| } |
| else |
| { |
| return 0; |
| } |
| |
| return 0; |
| } |
| |
| //------------------------------------------------------------------------------------ |
| // Send surfaces for the AVC BRC Block Copy kernel |
| //------------------------------------------------------------------------------------ |
| MOS_STATUS CodechalEncodeAvcEnc::SendBrcBlockCopySurfaces( |
| CodechalHwInterface *hwInterface, |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| PMHW_KERNEL_STATE mbEncKernelState, |
| PMHW_KERNEL_STATE kernelState, |
| PMOS_RESOURCE advancedDsh) |
| { |
| MOS_SURFACE dshBuffer; |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams; |
| MOS_RESOURCE *dsh = nullptr; |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(hwInterface); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(mbEncKernelState); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(kernelState); |
| |
| // Set up artificial MOS_SURFACE for DSH buffers |
| MOS_ZeroMemory(&dshBuffer, sizeof(dshBuffer)); |
| dshBuffer.TileType = MOS_TILE_LINEAR; |
| dshBuffer.bArraySpacing = true; |
| dshBuffer.Format = Format_Buffer_2D; |
| dshBuffer.dwWidth = CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH; |
| dshBuffer.dwHeight = |
| mbEncKernelState->m_dshRegion.GetSize() / CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH; |
| dshBuffer.dwPitch = CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH; |
| |
| // Input |
| dshBuffer.dwOffset = mbEncKernelState->m_dshRegion.GetOffset(); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(dsh = mbEncKernelState->m_dshRegion.GetResource()); |
| dshBuffer.OsResource = *dsh; |
| |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = &dshBuffer; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_INPUT; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // Output |
| dshBuffer.dwOffset = 0; |
| dshBuffer.OsResource = *advancedDsh; |
| |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = &dshBuffer; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_OUTPUT; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| return eStatus; |
| } |
| |
| CodechalEncodeAvcEnc::CodechalEncodeAvcEnc( |
| CodechalHwInterface * hwInterface, |
| CodechalDebugInterface *debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo) : CodechalEncodeAvcBase(hwInterface, debugInterface, standardInfo) |
| |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| InitializeDataMember(); |
| |
| // Setup initial data |
| bBrcInit = true; |
| // enable codec specific user feature key reporting for AVC |
| m_userFeatureKeyReport = true; |
| |
| m_kuid = IDR_CODEC_AllAVCEnc; |
| |
| m_swBrcMode = nullptr; |
| |
| m_cmKernelEnable = true; |
| bBrcSplitEnable = true; |
| bBrcRoiSupported = true; |
| bHighTextureModeCostEnable = true; |
| |
| for (uint8_t i = 0; i < CODECHAL_ENCODE_BRC_IDX_NUM; i++) |
| { |
| BrcKernelStates[i] = MHW_KERNEL_STATE(); |
| } |
| |
| if (m_cmKernelEnable) |
| { |
| m_useCmScalingKernel = 1; |
| } |
| CODECHAL_DEBUG_TOOL( |
| m_mmcUserFeatureUpdated = false; |
| ) |
| } |
| |
| CodechalEncodeAvcEnc::~CodechalEncodeAvcEnc() |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| if (SeiData.pSEIBuffer) |
| { |
| MOS_FreeMemory(SeiData.pSEIBuffer); |
| SeiData.pSEIBuffer = nullptr; |
| } |
| |
| if (pWPKernelState) |
| { |
| MOS_Delete(pWPKernelState); |
| pWPKernelState = nullptr; |
| } |
| |
| MOS_Delete(pSFDKernelState); |
| pSFDKernelState = nullptr; |
| |
| if (m_pakEnabled) |
| { |
| // release skip frame copy buffer |
| m_osInterface->pfnFreeResource(m_osInterface, &resSkipFrameBuffer); |
| } |
| |
| if (m_encEnabled) |
| { |
| ReleaseResourcesBrc(); |
| ReleaseResourcesMbBrc(); |
| m_osInterface->pfnFreeResource(m_osInterface, &resVMEScratchBuffer); |
| |
| if (bVMEKernelDump) |
| { |
| m_osInterface->pfnFreeResource(m_osInterface, &resVmeKernelDumpBuffer); |
| } |
| |
| // RefPicSelectList |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; i++) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &RefPicSelectList[i].sBuffer.OsResource); |
| } |
| |
| MOS_DeleteArray(pMbEncKernelStates); |
| } |
| |
| //WP output surface |
| for (uint32_t i = 0; i < CODEC_AVC_NUM_WP_FRAME; i++) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &WeightedPredOutputPicSelectList[i].sBuffer.OsResource); |
| } |
| |
| // SFD surfaces |
| { |
| // SFD output buffer |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &resSFDOutputBuffer[i]); |
| } |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &resSFDCostTablePFrameBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &resSFDCostTableBFrameBuffer); |
| } |
| |
| if (m_swBrcMode != nullptr) |
| { |
| m_osInterface->pfnFreeLibrary(m_swBrcMode); |
| m_swBrcMode = nullptr; |
| } |
| |
| // MB specific data buffer |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &resMbSpecificDataBuffer[i]); |
| } |
| |
| return; |
| |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::Initialize(CodechalSetting * settings) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(settings); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::Initialize(settings)); |
| |
| // for AVC: the Ds+Copy kernel is by default used to do CSC and copy non-aligned surface |
| m_cscDsState->EnableCopy(); |
| m_cscDsState->EnableColor(); |
| |
| MOS_USER_FEATURE_VALUE_DATA userFeatureData; |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| /*MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_BRC_SOFTWARE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| |
| if (userFeatureData.i32Data) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnLoadLibrary(m_osInterface, CODECHAL_DBG_STRING_SWAVCBRCLIBRARY, &m_swBrcMode)); |
| }*/ |
| |
| // SW BRC DLL Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_BRC_SOFTWARE_IN_USE_ID, (m_swBrcMode == nullptr) ? false : true, m_osInterface->pOsContext); |
| #endif // (_DEBUG || _RELEASE_INTERNAL) |
| |
| if (!(m_codecFunction == CODECHAL_FUNCTION_PAK || m_codecFunction == CODECHAL_FUNCTION_FEI_PAK)) |
| { |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_ME_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_hmeSupported = (userFeatureData.u32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_16xME_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| |
| if (userFeatureData.i32Data == 0 || userFeatureData.i32Data == 1) |
| { |
| m_16xMeUserfeatureControl = true; |
| m_16xMeSupported = (userFeatureData.i32Data) ? true : false; |
| } |
| else |
| { |
| m_16xMeUserfeatureControl = false; |
| m_16xMeSupported = true; |
| } |
| |
| // Flatness check enable |
| m_flatnessCheckSupported = 1; // Enabled by default for AVC when supported |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_FLATNESS_CHECK_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_flatnessCheckSupported = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_STATIC_FRAME_DETECTION_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bStaticFrameDetectionEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_SEARCH_WINDOW_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bApdatvieSearchWindowEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_FORCE_TO_SKIP_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bForceToSkipEnable = (userFeatureData.u32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_SLIDING_WINDOW_SIZE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| dwSlidingWindowSize = userFeatureData.u32Data; |
| |
| // Colorbit support (encoding multiple slices in parallel) |
| m_colorbitSupported = 1; // Enable by default for AVC |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_COLOR_BIT_SUPPORT_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_colorbitSupported = (userFeatureData.i32Data) ? true : false; |
| #endif |
| |
| m_groupIdSelectSupported = 0; // Disabled by default for AVC for now |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_GROUP_ID_SELECT_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_groupIdSelectSupported = (userFeatureData.i32Data) ? true : false; |
| #endif |
| |
| m_groupId = 0; // default value for group ID = 0 |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_GROUP_ID_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_groupId = (uint8_t)userFeatureData.i32Data; |
| #endif |
| } |
| |
| // disable BRC and HME for FEI encoder |
| if ((m_feiEnable) && (m_codecFunction != CODECHAL_FUNCTION_FEI_PRE_ENC)) |
| { |
| m_hmeSupported = false; |
| m_16xMeSupported = false; |
| m_32xMeSupported = false; |
| } |
| |
| // Initialize hardware resources for the current Os/Platform |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitializeState()); |
| { |
| MotionEstimationDisableCheck(); |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(Initialize()); |
| |
| // common function for all codecs needed |
| if (CodecHalUsesRenderEngine(m_codecFunction, m_standard)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelState()); |
| } |
| |
| // Picture Level Commands |
| m_hwInterface->GetMfxStateCommandsDataSize( |
| CODECHAL_ENCODE_MODE_AVC, |
| &m_pictureStatesSize, |
| &m_picturePatchListSize, |
| false); |
| |
| // Slice Level Commands |
| m_hwInterface->GetMfxPrimitiveCommandsDataSize( |
| CODECHAL_ENCODE_MODE_AVC, |
| &m_sliceStatesSize, |
| &m_slicePatchListSize, |
| m_singleTaskPhaseSupported); |
| |
| return eStatus; |
| } |
| |
| void CodechalEncodeAvcEnc::InitializeDataMember() |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| // SEI |
| MOS_ZeroMemory(&SeiData, sizeof(CodechalEncodeSeiData)); |
| dwSEIDataOffset = false; |
| pSeiParamBuffer = nullptr; |
| |
| bMbEncCurbeSetInBrcUpdate = false; |
| bMbEncIFrameDistEnabled = false; |
| bBrcInit = false; |
| bBrcReset = false; |
| bBrcEnabled = false; |
| bMbBrcEnabled = false; |
| bBrcRoiEnabled = false; // BRC ROI feature |
| bROIValueInDeltaQP = false; |
| bROISmoothEnabled = false; |
| bMbBrcUserFeatureKeyControl = false; |
| dBrcTargetSize = 0.0f; |
| dwTrellis = false; |
| bAcceleratorHeaderPackingCaps = false; //flag set by driver from driver caps |
| dwIntraRefreshQpThreshold = false; |
| bSquareRollingIEnabled = false; |
| |
| // VME Scratch Buffers |
| MOS_ZeroMemory(&resVMEScratchBuffer, sizeof(MOS_RESOURCE)); // HSW+ |
| bVMEScratchBuffer = false; |
| MOS_ZeroMemory(&resVmeKernelDumpBuffer, sizeof(MOS_RESOURCE)); |
| bVMEKernelDump = false; |
| ulVMEKernelDumpBottomFieldOffset = 0; |
| |
| // MbEnc |
| pMbEncKernelStates = nullptr; |
| MOS_ZeroMemory(&MbEncBindingTable, sizeof(CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC)); |
| dwNumMbEncEncKrnStates = false; |
| MOS_ZeroMemory(RefPicSelectList, CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES * sizeof(CODEC_AVC_REF_PIC_SELECT_LIST)); |
| ucCurrRefPicSelectIndex = 0; |
| ulRefPicSelectBottomFieldOffset = 0; |
| dwMbEncBlockBasedSkipEn = false; |
| bKernelTrellis = false; // Kernel controlled Trellis Quantization |
| bExtendedMvCostRange = false; // Extended MV Cost Range for Gen10+ |
| |
| // WP |
| pWPKernelState = nullptr; |
| MOS_ZeroMemory(WeightedPredOutputPicSelectList, CODEC_AVC_NUM_WP_FRAME * sizeof(CODEC_AVC_REF_PIC_SELECT_LIST)); |
| |
| // BRC Params |
| MOS_ZeroMemory(&BrcUpdateBindingTable, sizeof(CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE)); |
| |
| // PreProc |
| MOS_ZeroMemory(&PreProcBindingTable, sizeof(CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC)); |
| |
| MOS_ZeroMemory(&BrcBuffers, sizeof(EncodeBrcBuffers)); |
| usAVBRAccuracy = 0; |
| usAVBRConvergence = 0; |
| dBrcInitCurrentTargetBufFullInBits = 0; |
| dBrcInitResetInputBitsPerFrame = 0; |
| dwBrcInitResetBufSizeInBits = false; |
| dwBrcInitPreviousTargetBufFullInBits = false; |
| // Below values will be set if qp control params are sent by app |
| bMinMaxQPControlEnabled = false; // Flag to indicate if min/max QP feature is enabled or not. |
| ucIMinQP = 0; |
| ucIMaxQP = 0; |
| ucPMinQP = 0; |
| ucPMaxQP = 0; |
| ucBMinQP = 0; |
| ucBMaxQP = 0; |
| bPFrameMinMaxQPControl = false; // Indicates min/max QP values for P-frames are set separately or not. |
| bBFrameMinMaxQPControl = false; // Indicates min/max QP values for B-frames are set separately or not. |
| |
| dwSkipFrameBufferSize = false; // size of skip frame packed data |
| MOS_ZeroMemory(&resSkipFrameBuffer, sizeof(MOS_RESOURCE)); // copy skip frame packed data from DDI |
| // Mb Disable Skip Map |
| bMbDisableSkipMapEnabled = false; |
| psMbDisableSkipMapSurface = nullptr; |
| |
| // Mb Qp Data |
| bMbQpDataEnabled = false; |
| MOS_ZeroMemory(&sMbQpDataSurface, sizeof(MOS_SURFACE)); |
| |
| // Mb Specific Data |
| bMbSpecificDataEnabled = false; |
| MOS_ZeroMemory(&resMbSpecificDataBuffer, sizeof(MOS_RESOURCE) * CODECHAL_ENCODE_RECYCLED_BUFFER_NUM); |
| |
| // Static frame detection |
| bStaticFrameDetectionEnable = false; // Static frame detection enable |
| bApdatvieSearchWindowEnable = false; // allow search window size change when SFD enabled |
| bPerMbSFD = false; |
| MOS_ZeroMemory(&resSFDOutputBuffer, sizeof(MOS_RESOURCE)* CODECHAL_ENCODE_RECYCLED_BUFFER_NUM); |
| |
| MOS_ZeroMemory(&resSFDCostTablePFrameBuffer, sizeof(MOS_RESOURCE)); |
| MOS_ZeroMemory(&resSFDCostTableBFrameBuffer, sizeof(MOS_RESOURCE)); |
| pSFDKernelState = nullptr; |
| |
| // Generation Specific Support Flags & User Feature Key Reads |
| bBrcDistortionBufferSupported = false; |
| bRefPicSelectListSupported = false; |
| ucMbBrcSupportCaps = 0; |
| bMultiPredEnable = false; // MultiPredictor enable, 6 predictors |
| bFTQEnable = false; // FTQEnable |
| bCAFSupported = false; // CAFSupported |
| bCAFEnable = false; // CAFEnable |
| bCAFDisableHD = false; // Disable CAF for HD |
| bSkipBiasAdjustmentSupported = false; // SkipBiasAdjustment support for P frame |
| bAdaptiveIntraScalingEnable = false; // Enable AdaptiveIntraScaling |
| bOldModeCostEnable = false; // Enable Old Mode Cost (HSW cost table for BDW) |
| bMultiRefQpEnabled = false; // BDW Mutiref Qp |
| bAdvancedDshInUse = false; // Use MbEnc Adv kernel |
| bUseMbEncAdvKernel = false; // Use MbEnc Adv kernel |
| bUseWeightedSurfaceForL0 = false; //Use WP Surface for L0 |
| bUseWeightedSurfaceForL1 = false; //Use WP Surface for L1 |
| bWeightedPredictionSupported = false; //Weighted prediction support |
| bBrcSplitEnable = false; // starting GEN9 BRC kernel has split into frame-level and MB-level update. |
| bDecoupleMbEncCurbeFromBRC = false; // starting GEN95 BRC kernel write to extra surface instread of MBEnc curbe. |
| bSliceLevelReportSupported = false; // Slice Level Report support |
| bFBRBypassEnable = false; // FBRBypassEnable |
| bBrcRoiSupported = false; |
| bMvDataNeededByBRC = false; // starting from G95, |
| bHighTextureModeCostEnable = false; |
| |
| bRoundingInterEnable = false; |
| bAdaptiveRoundingInterEnable = false; |
| dwRoundingInterP = false; |
| dwRoundingInterB = false; |
| dwRoundingInterBRef = false; |
| dwBrcConstantSurfaceWidth = false; |
| dwBrcConstantSurfaceHeight = false; |
| |
| dwSlidingWindowSize = false; |
| bForceToSkipEnable = false; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::Initialize() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::Initialize()); |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::InitializeState() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| MOS_USER_FEATURE_VALUE_DATA userFeatureData; |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_SINGLE_TASK_PHASE_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_singleTaskPhaseSupported = (userFeatureData.i32Data) ? true : false; |
| |
| // Set interleaved scaling output to support PAFF. |
| m_fieldScalingOutputInterleaved = true; |
| |
| if (m_encEnabled) |
| { |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_MULTIPRED_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bMultiPredEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_FTQ_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bFTQEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_CAF_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bCAFSupported = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_CAF_DISABLE_HD_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bCAFDisableHD = (userFeatureData.i32Data) ? true : false; |
| |
| ucMbBrcSupportCaps = 1; |
| if (ucMbBrcSupportCaps) |
| { |
| // If the MBBRC user feature key does not exist, MBBRC will be set in SPS parsing |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_MB_BRC_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| if (userFeatureData.i32Data == 0 || userFeatureData.i32Data == 1) |
| { |
| bMbBrcUserFeatureKeyControl = true; |
| bMbBrcEnabled = userFeatureData.i32Data ? true : false; |
| } |
| } |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_MULTIREF_QP_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bMultiRefQpEnabled = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ENCODE_32xME_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| |
| if (userFeatureData.i32Data == 0 || userFeatureData.i32Data == 1) |
| { |
| m_32xMeUserfeatureControl = true; |
| m_32xMeSupported = (userFeatureData.i32Data) ? true : false; |
| } |
| else |
| { |
| m_32xMeUserfeatureControl = false; |
| m_32xMeSupported = true; |
| } |
| } |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bRoundingInterEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| userFeatureData.i32Data = CODECHAL_ENCODE_AVC_INVALID_ROUNDING; |
| userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE; |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_P_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| dwRoundingInterP = userFeatureData.i32Data; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| userFeatureData.i32Data = CODECHAL_ENCODE_AVC_INVALID_ROUNDING; |
| userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE; |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_B_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| dwRoundingInterB = userFeatureData.i32Data; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| userFeatureData.i32Data = CODECHAL_ENCODE_AVC_INVALID_ROUNDING; |
| userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE; |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ROUNDING_INTER_BREF_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| dwRoundingInterBRef = userFeatureData.i32Data; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| userFeatureData.i32Data = 1; |
| userFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE; |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_ROUNDING_INTER_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bAdaptiveRoundingInterEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_SKIP_BIAS_ADJUSTMENT_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bSkipBiasAdjustmentSupported = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_INTRA_SCALING_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bAdaptiveIntraScalingEnable = (userFeatureData.i32Data) ? true : false; |
| |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_OLD_MODE_COST_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bOldModeCostEnable = (userFeatureData.i32Data) ? true : false; |
| |
| //Check if ATD has been disabled by user feature key. The TU check happens in CodecHalAvcEncode_SetPictureStructs() |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| userFeatureData.i32Data = 1; |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_ADAPTIVE_TRANSFORM_DECISION_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| m_adaptiveTransformDecisionEnabled = (userFeatureData.i32Data) ? true : false; |
| |
| // add user feature key to test FBR Bypass on SKL |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_FBR_BYPASS_ENABLE_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bFBRBypassEnable = (userFeatureData.i32Data) ? true : false; |
| |
| // add user feature key to enable/disable variance computation in BRC kernel |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_AVC_BRC_VAR_COMPU_BYPASS_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| bBRCVarCompuBypass = (userFeatureData.i32Data) ? true : false; |
| |
| // add user feature key to switch on/off ARB WA of CNL AVC MBEnc hang |
| MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_ENABLE_CNL_AVC_ENCODE_ARB_WA_ID, |
| &userFeatureData, |
| m_osInterface->pOsContext); |
| if ((userFeatureData.i32Data) == 0) |
| { |
| MEDIA_WR_WA(m_waTable, WaArbitraryNumMbsInSlice, 0); |
| } |
| |
| m_4xMeDistortionBufferSupported = true; |
| bBrcDistortionBufferSupported = true; |
| bRefPicSelectListSupported = true; |
| |
| bPerMbSFD = true; |
| |
| bWeightedPredictionSupported = true; |
| |
| m_forceBrcMbStatsEnabled = true; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ValidateNumReferences(PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pSeqParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pAvcSliceParams); |
| |
| uint8_t numRefIdx0MinusOne = params->pAvcSliceParams->num_ref_idx_l0_active_minus1; |
| uint8_t numRefIdx1MinusOne = params->pAvcSliceParams->num_ref_idx_l1_active_minus1; |
| |
| // Nothing to do here if numRefIdx = 0 and frame encoded |
| if (numRefIdx0MinusOne == 0 && !CodecHal_PictureIsField(params->pPicParams->CurrOriginalPic)) |
| { |
| if (params->wPictureCodingType == P_TYPE || |
| (params->wPictureCodingType == B_TYPE && numRefIdx1MinusOne == 0)) |
| { |
| return eStatus; |
| } |
| } |
| |
| uint8_t maxPNumRefIdx0MinusOne; |
| if (params->wPictureCodingType == P_TYPE || params->wPictureCodingType == B_TYPE) |
| { |
| if (params->wPictureCodingType == P_TYPE) |
| { |
| if ((((params->wPicHeightInMB * CODECHAL_MACROBLOCK_HEIGHT) * (params->wFrameFieldHeightInMB * CODECHAL_MACROBLOCK_WIDTH)) >= 3840 * 2160) |
| && CodecHal_PictureIsFrame(params->pPicParams->CurrOriginalPic)) |
| { |
| maxPNumRefIdx0MinusOne = MaxRefIdx0_Progressive_4K[params->pSeqParams->TargetUsage]; |
| } |
| else |
| { |
| maxPNumRefIdx0MinusOne = MaxRefIdx0[params->pSeqParams->TargetUsage]; |
| } |
| |
| if (numRefIdx0MinusOne > maxPNumRefIdx0MinusOne) |
| { |
| CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size."); |
| numRefIdx0MinusOne = maxPNumRefIdx0MinusOne; |
| } |
| |
| numRefIdx1MinusOne = 0; |
| } |
| else // B_TYPE |
| { |
| if (numRefIdx0MinusOne > MaxBRefIdx0[params->pSeqParams->TargetUsage]) |
| { |
| CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size."); |
| numRefIdx0MinusOne = MaxBRefIdx0[params->pSeqParams->TargetUsage]; |
| } |
| |
| if (numRefIdx1MinusOne > MaxRefIdx1[params->pSeqParams->TargetUsage]) |
| { |
| CODECHAL_ENCODE_NORMALMESSAGE("Invalid active reference list size."); |
| numRefIdx1MinusOne = MaxRefIdx1[params->pSeqParams->TargetUsage]; |
| } |
| |
| // supports at most 1 L1 ref for frame picture |
| if (CodecHal_PictureIsFrame(params->pPicParams->CurrOriginalPic) && numRefIdx1MinusOne > 0) |
| { |
| numRefIdx1MinusOne = 0; |
| } |
| } |
| } |
| // Override number of references used by VME. PAK uses value from DDI (num_ref_idx_l*_active_minus1_from_DDI) |
| params->pAvcSliceParams->num_ref_idx_l0_active_minus1 = numRefIdx0MinusOne; |
| params->pAvcSliceParams->num_ref_idx_l1_active_minus1 = numRefIdx1MinusOne; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::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); |
| |
| MOS_LOCK_PARAMS lockFlags; |
| MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.WriteOnly = 1; |
| uint8_t* pbData = (uint8_t*)params->pOsInterface->pfnLockResource( |
| params->pOsInterface, |
| ¶ms->sBrcConstantDataBuffer.OsResource, |
| &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pbData); |
| |
| MOS_ZeroMemory(pbData, params->sBrcConstantDataBuffer.dwWidth * params->sBrcConstantDataBuffer.dwHeight); |
| |
| // Fill surface with qp Adjustment table, Distortion threshold table, MaxFrame threshold table, Distortion qp Adjustment Table for I frame |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| sizeof(m_qpDistMaxFrameAdjustmentCm), |
| (void*)m_qpDistMaxFrameAdjustmentCm, |
| sizeof(m_qpDistMaxFrameAdjustmentCm)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| pbData += sizeof(m_qpDistMaxFrameAdjustmentCm); |
| |
| uint8_t qp = 0; |
| if (params->wPictureCodingType == I_TYPE) |
| { |
| // skip early skip table for I frame |
| pbData += m_brcConstantSurfaceEarlySkipTableSize; |
| |
| // POCs not used for now, set to zeroes |
| pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE; |
| pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE; |
| |
| // Mode cost and MV cost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfacModeMvCostSize, |
| (void*)&ModeMvCost_Common[0][0][0], |
| m_brcConstantSurfacModeMvCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| if (params->pAvcQCParams) |
| { |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| if (params->pAvcQCParams->FTQSkipThresholdLUT[qp]) |
| { |
| *(pbData + (qp * 32) + 24) = |
| *(pbData + (qp * 32) + 25) = |
| *(pbData + (qp * 32) + 27) = |
| *(pbData + (qp * 32) + 28) = |
| *(pbData + (qp * 32) + 29) = |
| *(pbData + (qp * 32) + 30) = |
| *(pbData + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp]; |
| } |
| } |
| } |
| |
| pbData += m_brcConstantSurfacModeMvCostSize; |
| |
| // Refcost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceRefCostSize, |
| (void*)&RefCost_Common[0][0], |
| m_brcConstantSurfaceRefCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else if (params->wPictureCodingType == P_TYPE) |
| { |
| if (!params->dwMbEncBlockBasedSkipEn) |
| { |
| if (params->pPicParams->transform_8x8_mode_flag) |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_P_Common[0][1][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_P_Common[0][0][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| } |
| else |
| { |
| if (params->pPicParams->transform_8x8_mode_flag) |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_P_Common[1][1][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_P_Common[1][0][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| } |
| |
| if ((params->pAvcQCParams != nullptr) && (params->pAvcQCParams->NonFTQSkipThresholdLUTInput)) |
| { |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| *(pbData + 1 + (qp * 2)) = (uint8_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false), (params->pPicParams->transform_8x8_mode_flag ? true : false), params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]); |
| } |
| } |
| |
| pbData += m_brcConstantSurfaceEarlySkipTableSize; |
| |
| // POCs not used for now, set to zeroes |
| pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE; |
| pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE; |
| |
| // Mode cost and MV cost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfacModeMvCostSize, |
| (void*)&ModeMvCost_Common[1][0][0], |
| m_brcConstantSurfacModeMvCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| if (params->pAvcQCParams) |
| { |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| if (params->pAvcQCParams->FTQSkipThresholdLUTInput) |
| { |
| *(pbData + (qp * 32) + 24) = |
| *(pbData + (qp * 32) + 25) = |
| *(pbData + (qp * 32) + 27) = |
| *(pbData + (qp * 32) + 28) = |
| *(pbData + (qp * 32) + 29) = |
| *(pbData + (qp * 32) + 30) = |
| *(pbData + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp]; |
| } |
| } |
| } |
| |
| pbData += m_brcConstantSurfacModeMvCostSize; |
| |
| // Refcost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceRefCostSize, |
| (void*)&RefCost_Common[1][0], |
| m_brcConstantSurfaceRefCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else // B picture |
| { |
| if (!params->dwMbEncBlockBasedSkipEn) |
| { |
| if (params->pPicParams->transform_8x8_mode_flag) |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_B_Common[0][1][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_B_Common[0][0][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| } |
| else |
| { |
| if (params->pPicParams->transform_8x8_mode_flag) |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_B_Common[1][1][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_B_Common[1][0][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| } |
| |
| if (params->pAvcQCParams != nullptr && params->pAvcQCParams->NonFTQSkipThresholdLUTInput) |
| { |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| *(pbData + 1 + (qp * 2)) = (uint8_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false), (params->pPicParams->transform_8x8_mode_flag ? true : false), params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]); |
| } |
| } |
| |
| pbData += m_brcConstantSurfaceEarlySkipTableSize; |
| |
| // POCs not used for now, set to zeroes |
| pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_DPB_LIST_SIZE; |
| pbData += CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_POCS_IN_FINAL_LIST_SIZE; |
| |
| // Mode cost and MV cost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfacModeMvCostSize, |
| (void*)&ModeMvCost_Common[2][0][0], |
| m_brcConstantSurfacModeMvCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| if (params->pAvcQCParams) |
| { |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| if (params->pAvcQCParams->FTQSkipThresholdLUTInput) |
| { |
| *(pbData + (qp * 32) + 24) = |
| *(pbData + (qp * 32) + 25) = |
| *(pbData + (qp * 32) + 27) = |
| *(pbData + (qp * 32) + 28) = |
| *(pbData + (qp * 32) + 29) = |
| *(pbData + (qp * 32) + 30) = |
| *(pbData + (qp * 32) + 31) = params->pAvcQCParams->FTQSkipThresholdLUT[qp]; |
| } |
| } |
| } |
| |
| pbData += m_brcConstantSurfacModeMvCostSize; |
| |
| // Refcost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceRefCostSize, |
| (void*)&RefCost_Common[2][0], |
| m_brcConstantSurfaceRefCostSize); |
| 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 CodechalEncodeAvcEnc::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->presBrcConstantDataBuffer); |
| |
| // 16 DWs per QP value |
| uint32_t size = 16 * CODEC_AVC_NUM_QP; |
| |
| MOS_LOCK_PARAMS lockFlags; |
| MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.WriteOnly = 1; |
| // using an async lock because the wait has already occured for recycled buffers |
| lockFlags.NoOverWrite = 1; |
| lockFlags.Uncached = 1; |
| uint32_t* pData = (uint32_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| params->presBrcConstantDataBuffer, |
| &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pData); |
| |
| if (params->bPreProcEnable) |
| { |
| eStatus = MOS_SecureMemcpy(pData, size * sizeof(uint32_t), (void*)PreProcFtqLut_Cm_Common, size * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| params->presBrcConstantDataBuffer); |
| return eStatus; |
| } |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pPicParams); |
| |
| uint8_t tableIdx = params->wPictureCodingType - 1; |
| bool blockBasedSkipEn = params->dwMbEncBlockBasedSkipEn ? true : false; |
| bool transform_8x8_mode_flag = params->pPicParams->transform_8x8_mode_flag ? true : false; |
| |
| if (tableIdx >= 3) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid input parameter."); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| params->presBrcConstantDataBuffer); |
| return eStatus; |
| } |
| |
| eStatus = MOS_SecureMemcpy(pData, size * sizeof(uint32_t), (void*)MBBrcConstantData_Cm_Common[tableIdx], size * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| params->presBrcConstantDataBuffer); |
| return eStatus; |
| } |
| |
| uint32_t* databk = pData; |
| uint8_t qp = 0; |
| switch (params->wPictureCodingType) |
| { |
| case I_TYPE: |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| // Writing to DW0 in each sub-array of 16 DWs |
| if (params->bOldModeCostEnable) |
| { |
| *pData = (uint32_t)OldIntraModeCost_Cm_Common[qp]; |
| } |
| pData += 16; |
| } |
| break; |
| case P_TYPE: |
| case B_TYPE: |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| if (params->wPictureCodingType == P_TYPE) |
| { |
| // Writing to DW3 in each sub-array of 16 DWs |
| if (params->bSkipBiasAdjustmentEnable) |
| { |
| *(pData + 3) = (uint32_t)MvCost_PSkipAdjustment_Cm_Common[qp]; |
| } |
| } |
| |
| // Writing to DW9 in each sub-array of 16 DWs |
| if (params->pAvcQCParams && params->pAvcQCParams->NonFTQSkipThresholdLUTInput) |
| { |
| *(pData + 9) = (uint32_t)CalcSkipVal((params->dwMbEncBlockBasedSkipEn ? true : false), |
| (transform_8x8_mode_flag ? true : false), |
| params->pAvcQCParams->NonFTQSkipThresholdLUT[qp]); |
| } |
| else if (params->wPictureCodingType == P_TYPE) |
| { |
| *(pData + 9) = (uint32_t)SkipVal_P_Common[blockBasedSkipEn][transform_8x8_mode_flag][qp]; |
| } |
| else |
| { |
| *(pData + 9) = (uint32_t)SkipVal_B_Common[blockBasedSkipEn][transform_8x8_mode_flag][qp]; |
| } |
| |
| // Writing to DW10 in each sub-array of 16 DWs |
| if (params->bAdaptiveIntraScalingEnable) |
| { |
| *(pData + 10) = (uint32_t)AdaptiveIntraScalingFactor_Cm_Common[qp]; |
| } |
| else |
| { |
| *(pData + 10) = (uint32_t)IntraScalingFactor_Cm_Common[qp]; |
| } |
| pData += 16; |
| } |
| break; |
| default: |
| break; |
| } |
| |
| pData = databk; |
| for (qp = 0; qp < CODEC_AVC_NUM_QP; qp++) |
| { |
| if (params->pAvcQCParams && params->pAvcQCParams->FTQSkipThresholdLUTInput) |
| { |
| *(pData + 6) = ((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) |
| | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 16) |
| | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 24); |
| *(pData + 7) = ((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) |
| | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 8) |
| | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 16) |
| | (((uint32_t)params->pAvcQCParams->FTQSkipThresholdLUT[qp]) << 24); |
| } |
| |
| if (params->bEnableKernelTrellis) |
| { |
| // Writing uint32_t 11 and uint32_t 12 with Lambda values |
| *(pData + 11) = (uint32_t)params->Lambda[qp][0]; |
| *(pData + 12) = (uint32_t)params->Lambda[qp][1]; |
| } |
| pData += 16; |
| } |
| } |
| |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| params->presBrcConstantDataBuffer); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::CalcLambdaTable( |
| uint16_t slice_type, |
| uint32_t* lambda) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN( m_avcSeqParam); |
| CODECHAL_ENCODE_CHK_NULL_RETURN( m_refList); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(lambda); |
| |
| // Initialize Lambda Table |
| switch (slice_type) |
| { |
| case I_TYPE: |
| eStatus = MOS_SecureMemcpy((void*)lambda, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t), (void*)TQ_LAMBDA_I_FRAME, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| |
| case B_TYPE: |
| eStatus = MOS_SecureMemcpy((void*)lambda, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t), (void*)TQ_LAMBDA_B_FRAME, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| |
| case P_TYPE: |
| eStatus = MOS_SecureMemcpy((void*)lambda, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t), (void*)TQ_LAMBDA_P_FRAME, CODEC_AVC_NUM_QP * 2 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| |
| default: |
| eStatus = MOS_STATUS_UNKNOWN; |
| break; |
| } |
| |
| uint32_t roundingValue = 0; |
| for (uint8_t sliceQP = 0; sliceQP < CODEC_AVC_NUM_QP; sliceQP++) |
| { |
| for (uint8_t col = 0; col < 2; col++) |
| { |
| uint32_t value = *(lambda + sliceQP * 2 + col); |
| uint32_t intra = value >> 16; |
| |
| if (intra > CODECHAL_ENCODE_AVC_MAX_LAMBDA) |
| { |
| if (intra == 0xfffa) |
| { |
| intra = 0xf000 + CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_INTRA_ROUNDING; |
| } |
| } |
| |
| intra = intra << 16; |
| uint32_t inter = value & 0xffff; |
| if (inter > CODECHAL_ENCODE_AVC_MAX_LAMBDA) |
| { |
| if (inter == 0xffef) |
| { |
| |
| switch (slice_type) |
| { |
| case P_TYPE: |
| if ( dwRoundingInterP == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) |
| { |
| roundingValue = InterRoundingP_TQ[m_avcSeqParam->TargetUsage]; |
| } |
| else |
| { |
| roundingValue = dwRoundingInterP; |
| } |
| break; |
| case B_TYPE: |
| if (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef) |
| { |
| roundingValue = ( dwRoundingInterBRef == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) ? |
| InterRoundingBRef_TQ[m_avcSeqParam->TargetUsage] : dwRoundingInterBRef; |
| } |
| else |
| { |
| if ( dwRoundingInterB == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) |
| { |
| roundingValue = InterRoundingB_TQ[m_avcSeqParam->TargetUsage]; |
| } |
| else |
| { |
| roundingValue = dwRoundingInterB; |
| } |
| } |
| break; |
| default: |
| // do nothing |
| break; |
| } |
| |
| inter = 0xf000 + roundingValue; |
| } |
| } |
| |
| *(lambda + sliceQP * 2 + col) = intra + inter; |
| } |
| } |
| return eStatus; |
| } |
| |
| static uint8_t CODECHAL_ENCODE_AVC_AdaptiveInterRoundingPWithoutB[CODEC_AVC_NUM_QP] = |
| { |
| //QP = 0 1 2 3 4 5 6 7 8 9 10 11 12 |
| 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, //QP=[0~12] |
| 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 0, 0, 0, //QP=[13~25] |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //QP=[26~38] |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 //QP=[39~51] |
| }; |
| |
| static uint8_t CODECHAL_ENCODE_AVC_AdaptiveInterRoundingP[CODEC_AVC_NUM_QP] = |
| { |
| //QP = 0 1 2 3 4 5 6 7 8 9 10 11 12 |
| 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, //QP=[0~12] |
| 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, //QP=[13~25] |
| 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, //QP=[26~38] |
| 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 //QP=[39~51] |
| }; |
| |
| static const uint32_t CODECHAL_ENCODE_AVC_InterRoundingP[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 3, 3, 3, 3, 3, 3, 3 |
| }; |
| |
| static const uint32_t CODECHAL_ENCODE_AVC_InterRoundingBRef[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 2, 2, 2, 2, 2, 2, 2 |
| }; |
| |
| static uint8_t CODECHAL_ENCODE_AVC_AdaptiveInterRoundingB[CODEC_AVC_NUM_QP] = |
| { |
| //QP = 0 1 2 3 4 5 6 7 8 9 10 11 12 |
| 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, //QP=[0~12] |
| 4, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, //QP=[13~25] |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //QP=[26~38] |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 //QP=[39~51] |
| }; |
| |
| static const uint32_t CODECHAL_ENCODE_AVC_InterRoundingB[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 0, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GetInterRounding(PMHW_VDBOX_AVC_SLICE_STATE sliceState) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcSeqParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcPicParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState->pEncodeAvcSliceParams); |
| |
| auto avcSeqParams = sliceState->pEncodeAvcSeqParams; |
| auto avcPicParams = sliceState->pEncodeAvcPicParams; |
| auto avcSliceParams = sliceState->pEncodeAvcSliceParams; |
| uint8_t sliceQP = avcPicParams->pic_init_qp_minus26 + 26 + avcSliceParams->slice_qp_delta; |
| |
| switch (Slice_Type[avcSliceParams->slice_type]) |
| { |
| case SLICE_P: |
| if (dwRoundingInterP == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) |
| { |
| // Adaptive Rounding is only used in CQP case |
| if (bAdaptiveRoundingInterEnable && !bBrcEnabled) |
| { |
| // If IPPP scenario |
| if (avcSeqParams->GopRefDist == 1) |
| { |
| sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_AdaptiveInterRoundingPWithoutB[sliceQP]; |
| } |
| else |
| { |
| sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_AdaptiveInterRoundingP[sliceQP]; |
| } |
| } |
| else |
| { |
| sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_InterRoundingP[avcSeqParams->TargetUsage]; |
| } |
| } |
| else |
| { |
| sliceState->dwRoundingValue = dwRoundingInterP; |
| } |
| break; |
| case SLICE_B: |
| if (m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef) |
| { |
| sliceState->dwRoundingValue = (dwRoundingInterBRef == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) ? |
| CODECHAL_ENCODE_AVC_InterRoundingBRef[avcSeqParams->TargetUsage] : dwRoundingInterBRef; |
| } |
| else |
| { |
| if (dwRoundingInterB == CODECHAL_ENCODE_AVC_INVALID_ROUNDING) |
| { |
| if (bAdaptiveRoundingInterEnable && !bBrcEnabled) |
| { |
| sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_AdaptiveInterRoundingB[sliceQP]; |
| } |
| else |
| { |
| sliceState->dwRoundingValue = CODECHAL_ENCODE_AVC_InterRoundingB[avcSeqParams->TargetUsage]; |
| } |
| } |
| else |
| { |
| sliceState->dwRoundingValue = dwRoundingInterB; |
| } |
| } |
| break; |
| default: |
| // do nothing |
| break; |
| } |
| |
| return eStatus; |
| } |
| |
| // This applies only for progressive pictures. For interlaced, CAF is currently not disabled. |
| const uint32_t CodechalEncodeAvcEnc::CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 0, 0, 1, 1, 1, 1, 1 |
| }; |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GetSkipBiasAdjustment(uint8_t sliceQP, uint16_t gopRefDist, bool* skipBiasAdjustmentEnable) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(skipBiasAdjustmentEnable); |
| |
| // Determine if SkipBiasAdjustment should be enabled for P picture |
| // 1. No B frame 2. Qp >= 22 3. CQP mode |
| *skipBiasAdjustmentEnable = bSkipBiasAdjustmentSupported && (m_pictureCodingType == P_TYPE) |
| && (gopRefDist == 1) && (sliceQP >= CODECHAL_ENCODE_AVC_SKIP_BIAS_ADJUSTMENT_QP_THRESHOLD) && !bBrcEnabled; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GetHmeSupportedBasedOnTU(HmeLevel hmeLevel, bool *supported) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(supported); |
| |
| switch (hmeLevel) |
| { |
| case HME_LEVEL_4x: |
| //HME always supported |
| *supported = true; |
| break; |
| case HME_LEVEL_16x: |
| *supported = SuperHME[m_targetUsage & 0x7] ? true : false; |
| break; |
| case HME_LEVEL_32x: |
| *supported = UltraHME[m_targetUsage & 0x7] ? true : false; |
| break; |
| default: |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid hme Level"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| break; |
| } |
| |
| return eStatus; |
| } |
| |
| static const bool CODECHAL_ENCODE_AVC_MBBRCEnabled_Common[NUM_TARGET_USAGE_MODES] = |
| { |
| false, true, true, false, false, false, false, false |
| }; |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GetMbBrcEnabled(uint32_t targetUsage, bool *mbBrcEnabled) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(mbBrcEnabled); |
| |
| *mbBrcEnabled = CODECHAL_ENCODE_AVC_MBBRCEnabled_Common[targetUsage & 0x7]; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GetCAFEnabled(bool *cafenable) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cafenable); |
| |
| auto picParams = m_avcPicParam; |
| auto targetUsage = m_targetUsage & 0x7; |
| auto framePicture = CodecHal_PictureIsFrame(picParams->CurrOriginalPic); |
| |
| if (bCAFSupported) |
| { |
| switch (m_pictureCodingType) |
| { |
| case I_TYPE: |
| *cafenable = false; |
| break; |
| case P_TYPE: |
| *cafenable = (CODECHAL_ENCODE_AVC_AllFractional_Common[targetUsage] & 0x01) ? true : false; |
| break; |
| case B_TYPE: |
| *cafenable = ((CODECHAL_ENCODE_AVC_AllFractional_Common[targetUsage] >> 1) & 0x01) ? true : false; |
| break; |
| default: |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid picture coding type"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| break; |
| } |
| |
| // For performance reason, disable CAF for picture resolution >= 720P |
| // a. Based on Target Usage. |
| // b. For progressive pictures only. |
| if (*cafenable) |
| { |
| if ((bCAFDisableHD && CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[targetUsage] && framePicture) |
| && (m_picWidthInMb * CODECHAL_MACROBLOCK_WIDTH >= 1280) && (m_frameFieldHeightInMb * CODECHAL_MACROBLOCK_HEIGHT >= 720)) |
| { |
| *cafenable = false; |
| } |
| } |
| } |
| else |
| { |
| *cafenable = false; |
| } |
| |
| return eStatus; |
| } |
| |
| static const uint8_t CODECHAL_ENCODE_AVC_EnableAdaptiveTxDecision_Common[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 1, 1, 1, 1, 1, 0 |
| }; |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GetATDEnabled() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| // If ATD has been disabled by user feature key, don't turn it on because it is supported by the TU. |
| if (CODECHAL_ENCODE_AVC_EnableAdaptiveTxDecision_Common[m_targetUsage & 0x7] == 0) |
| m_adaptiveTransformDecisionEnabled = false; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::BrcInitResetKernel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| uint32_t kernelIdx = |
| (bBrcInit) ? CODECHAL_ENCODE_BRC_IDX_INIT : CODECHAL_ENCODE_BRC_IDX_RESET; |
| auto kernelState = &BrcKernelStates[kernelIdx]; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL : |
| CODECHAL_ENCODE_PERFTAG_CALL_BRC_INIT_RESET; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_BRC_INIT_RESET; |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| // Setup AVC Curbe |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS brcInitResetCurbeParams; |
| brcInitResetCurbeParams.pdBrcInitCurrentTargetBufFullInBits = |
| &dBrcInitCurrentTargetBufFullInBits; |
| brcInitResetCurbeParams.pdwBrcInitResetBufSizeInBits = |
| &dwBrcInitResetBufSizeInBits; |
| brcInitResetCurbeParams.pdBrcInitResetInputBitsPerFrame = |
| &dBrcInitResetInputBitsPerFrame; |
| brcInitResetCurbeParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcBrcInitReset( |
| &brcInitResetCurbeParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| //#if (_DEBUG || _RELEASE_INTERNAL) |
| // if (m_swBrcMode != nullptr) |
| // { |
| // CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHal_DbgCallAvcSwBrcImpl( |
| // m_debugInterface, |
| // encFunctionType, |
| // this, |
| // &BrcBuffers, |
| // bBrcReset, |
| // kernelState, |
| // kernelState)); |
| // return eStatus; |
| // } |
| //#endif |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.bBrcResetRequested = bBrcInit ? false : bBrcReset; // Set BrcResetRequested to false if init is also set |
| sendKernelCmdsParams.pKernelState = kernelState; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| //Add surface states |
| CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS brcInitResetSurfaceParams; |
| brcInitResetSurfaceParams.presBrcHistoryBuffer = |
| &BrcBuffers.resBrcHistoryBuffer; |
| brcInitResetSurfaceParams.psMeBrcDistortionBuffer = |
| &BrcBuffers.sMeBrcDistortionBuffer; |
| brcInitResetSurfaceParams.dwMeBrcDistortionBottomFieldOffset = |
| BrcBuffers.dwMeBrcDistortionBottomFieldOffset; |
| brcInitResetSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x; |
| brcInitResetSurfaceParams.dwDownscaledFrameFieldHeightInMb4x = |
| m_downscaledFrameFieldHeightInMb4x; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendBrcInitResetSurfaces( |
| &cmdBuffer, |
| &brcInitResetSurfaceParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| MHW_MEDIA_OBJECT_PARAMS mediaObjectParams; |
| MediaObjectInlineData mediaObjectInlineData; |
| MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams)); |
| MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData)); |
| mediaObjectParams.pInlineData = &mediaObjectInlineData; |
| mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObject( |
| &cmdBuffer, |
| nullptr, |
| &mediaObjectParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| encFunctionType, |
| nullptr))); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::InitKernelStateSFD() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| pSFDKernelState = MOS_New(MHW_KERNEL_STATE); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pSFDKernelState); |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| uint32_t kuid = m_useCommonKernel ? m_kuidCommon : m_kuid; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetKernelBinaryAndSize(m_kernelBase, kuid, &kernelBinary, &kernelSize)); |
| |
| CODECHAL_KERNEL_HEADER currKrnHeader; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(pfnGetKernelHeaderAndSize( |
| kernelBinary, |
| ENC_SFD, |
| 0, |
| &currKrnHeader, |
| (uint32_t*)&kernelSize)); |
| |
| auto kernelStatePtr = pSFDKernelState; |
| kernelStatePtr->KernelParams.iBTCount = CODECHAL_ENCODE_AVC_SFD_NUM_SURFACES; |
| kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| kernelStatePtr->KernelParams.iCurbeLength = sizeof(CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON); |
| 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 CodechalEncodeAvcEnc::InitKernelState() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMe()); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMbEnc()); |
| if(!CodecHalIsFeiEncode(m_codecFunction)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMfeMbEnc()); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pMbEncKernelStates); |
| } |
| |
| if (CodecHalIsFeiEncode(m_codecFunction)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStatePreProc()); |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateBrc()); |
| } |
| if (bWeightedPredictionSupported) |
| { |
| if(m_feiEnable == false) |
| { |
| if (m_wpUseCommonKernel) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_wpState->InitKernelState()); |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateWP()); |
| } |
| } |
| else |
| { |
| if((m_codecFunction == CODECHAL_FUNCTION_FEI_ENC_PAK)||(m_codecFunction == CODECHAL_FUNCTION_FEI_ENC)) |
| { |
| if (m_wpUseCommonKernel) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_wpState->InitKernelState()); |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateWP()); |
| } |
| } |
| } |
| } |
| |
| if ((bStaticFrameDetectionEnable) && (!bPerMbSFD) && (!m_feiEnable)) |
| { |
| // init Static frame detection kernel |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateSFD()); |
| } |
| |
| if (m_singleTaskPhaseSupported) |
| { |
| if (m_codecFunction == CODECHAL_FUNCTION_FEI_PRE_ENC) |
| { |
| uint32_t dwScalingBtCount = MOS_ALIGN_CEIL( |
| m_scaling4xKernelStates[0].KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| uint32_t dwMeBtCount = MOS_ALIGN_CEIL( |
| m_meKernelStates[0].KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| uint32_t dwPreProcBtCount = MOS_ALIGN_CEIL( |
| PreProcKernelState.KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| // in preenc stateless case, the maximum scaling pass number is 1(for current frame/field) |
| // + 4 (4 forward ref frames/fields) + 2(2 backward ref frames/fields) |
| m_maxBtCount = dwScalingBtCount*(1 + 4 + 2) + dwMeBtCount + dwPreProcBtCount; |
| } |
| else |
| { |
| uint32_t dwScalingBtCount = MOS_ALIGN_CEIL( |
| m_scaling4xKernelStates[0].KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| uint32_t dwMeBtCount = MOS_ALIGN_CEIL( |
| m_hmeKernel ? m_hmeKernel->GetBTCount() : m_meKernelStates[0].KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| |
| uint32_t wpbtCount = 0; |
| if(bWeightedPredictionSupported) |
| { |
| if (m_wpUseCommonKernel) |
| { |
| wpbtCount += MOS_ALIGN_CEIL( |
| m_wpState->GetBTCount(), |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| } |
| else |
| { |
| wpbtCount += MOS_ALIGN_CEIL( |
| pWPKernelState->KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| } |
| } |
| |
| uint32_t mbEncBtCount = 0; |
| if (nullptr != pMbEncKernelStates) |
| { |
| mbEncBtCount = MOS_ALIGN_CEIL( |
| pMbEncKernelStates->KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| } |
| |
| uint32_t brcBtCount = 0; |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_BRC_IDX_NUM; i++) |
| { |
| brcBtCount += MOS_ALIGN_CEIL( |
| BrcKernelStates[i].KernelParams.iBTCount, |
| m_stateHeapInterface->pStateHeapInterface->GetBtIdxAlignment()); |
| } |
| |
| uint32_t encOneBtCount = dwScalingBtCount + dwMeBtCount; |
| encOneBtCount += (m_16xMeSupported) ? encOneBtCount : 0; |
| encOneBtCount += (m_32xMeSupported) ? encOneBtCount : 0; |
| uint32_t encTwoBtCount = mbEncBtCount + brcBtCount + wpbtCount; |
| m_maxBtCount = MOS_MAX(encOneBtCount, encTwoBtCount); |
| } |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::InsertInRefPicSelectList() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto refPicSelectList = &RefPicSelectList[0]; |
| auto picParams = m_avcPicParam; |
| auto currEncodeRefList = m_refList[picParams->CurrReconstructedPic.FrameIdx]; |
| |
| uint8_t index = 0; |
| uint8_t refFrameListIndex = 0; |
| bool inserted = false; |
| // Check if current PicIdx is already present in the list |
| for (index = 0; index < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; index++) |
| { |
| if (refPicSelectList[index].FrameIdx == picParams->CurrReconstructedPic.FrameIdx) |
| { |
| ucCurrRefPicSelectIndex = index; |
| return eStatus; |
| } |
| } |
| |
| // Save this picture in the list for future use |
| // Use the first available index to save it |
| for (index = 0; index < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; index++) |
| { |
| if (refPicSelectList[index].FrameIdx == CODECHAL_ENCODE_AVC_INVALID_PIC_ID) // Index not used |
| { |
| refPicSelectList[index].FrameIdx = picParams->CurrReconstructedPic.FrameIdx; |
| ucCurrRefPicSelectIndex = index; |
| inserted = true; |
| break; |
| } |
| } |
| |
| if (!inserted) |
| { |
| // No unused index available, need to bump off an existing entry |
| // Compare with RefFrameList sent through PicParams |
| for (index = 0; index < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; index++) |
| { |
| bool foundMatch = false; |
| |
| for (refFrameListIndex = 0; refFrameListIndex < CODEC_AVC_MAX_NUM_REF_FRAME; refFrameListIndex++) |
| { |
| if (currEncodeRefList->RefList[refFrameListIndex].FrameIdx == refPicSelectList[index].FrameIdx) |
| { |
| // reference still present in ref frame list, cannot be replaced |
| foundMatch = true; |
| } |
| } |
| |
| // Found an entry thats not in ref frame list anymore, safe to reuse |
| if (foundMatch == false) |
| { |
| refPicSelectList[index].FrameIdx = picParams->CurrReconstructedPic.FrameIdx; |
| ucCurrRefPicSelectIndex = index; |
| inserted = true; |
| break; |
| } |
| } |
| |
| if (!inserted) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Could not find an unused entry, this should never happen."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::MbEncKernel(bool mbEncIFrameDistInUse) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| uint8_t ppsidx = m_avcSliceParams->pic_parameter_set_id; |
| uint8_t spsidx = m_avcPicParams[ppsidx]->seq_parameter_set_id; |
| auto refList = &m_refList[0]; |
| auto currRefList = m_refList[m_currReconstructedPic.FrameIdx]; |
| bool use45DegreePattern = false; |
| bool roiEnabled = (m_avcPicParams[ppsidx]->NumROI > 0) ? true : false; |
| uint8_t refPicListIdx = m_avcSliceParams[ppsidx].RefPicList[0][0].FrameIdx; |
| uint8_t refFrameListIdx = m_avcPicParam[ppsidx].RefFrameList[refPicListIdx].FrameIdx; |
| bool bDirtyRoiEnabled = (m_pictureCodingType == P_TYPE |
| && m_avcPicParams[ppsidx]->NumDirtyROI > 0 |
| && m_prevReconFrameIdx == refFrameListIdx); |
| |
| // Two flags(bMbConstDataBufferNeeded, bMbQpBufferNeeded) |
| // would be used as there are two buffers and not all cases need both the buffers |
| // Constant Data buffer needed for MBBRC, MBQP, ROI, RollingIntraRefresh |
| // Please note that this surface needs to be programmed for |
| // all usage cases(including CQP cases) because DWord13 includes mode cost for high texture MB?s cost. |
| bool bMbConstDataBufferInUse = bMbBrcEnabled || bMbQpDataEnabled || roiEnabled || bDirtyRoiEnabled || |
| m_avcPicParam->EnableRollingIntraRefresh || bHighTextureModeCostEnable; |
| |
| bool mbQpBufferInUse = bMbBrcEnabled || bBrcRoiEnabled || bMbQpDataEnabled; |
| |
| if (m_feiEnable) |
| { |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcFeiPicParams); |
| bMbConstDataBufferInUse |= m_avcFeiPicParams->bMBQp; |
| mbQpBufferInUse |= m_avcFeiPicParams->bMBQp; |
| } |
| |
| // MFE MBEnc kernel handles several frames from different streams in one submission. |
| // All the streams use the same HW/OS/StateHeap interfaces during this submssion. |
| // All the streams use the kernel state from the first stream. |
| // The first stream allocates the DSH and SSH, send the binding table. |
| // The last stream sets mfe curbe, prepare and submit the command buffer. |
| // All the streams set their own curbe surfaces and surface states. |
| CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC origMbEncBindingTable; |
| if (IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| auto mfeEncodeSharedState = m_mfeEncodeSharedState; |
| if (m_mfeFirstStream) |
| { |
| mfeEncodeSharedState->pHwInterface = m_hwInterface; |
| mfeEncodeSharedState->pOsInterface = m_osInterface; |
| m_hwInterface->GetRenderInterface()->m_stateHeapInterface = m_stateHeapInterface; |
| m_osInterface->pfnResetOsStates(m_osInterface); |
| } |
| else |
| { |
| m_hwInterface = mfeEncodeSharedState->pHwInterface; |
| m_osInterface = mfeEncodeSharedState->pOsInterface; |
| m_stateHeapInterface = m_hwInterface->GetRenderInterface()->m_stateHeapInterface; |
| m_renderEngineInterface->SetOsInterface(m_osInterface); |
| } |
| // Set maximum width/height, it is used for initializing media walker parameters |
| // during submitting the command buffer at the last stream. |
| if (m_picWidthInMb > mfeEncodeSharedState->dwPicWidthInMB) |
| { |
| mfeEncodeSharedState->dwPicWidthInMB = m_picWidthInMb; |
| } |
| if (m_frameFieldHeightInMb > mfeEncodeSharedState->dwPicHeightInMB) |
| { |
| mfeEncodeSharedState->dwPicHeightInMB = m_frameFieldHeightInMb; |
| } |
| |
| uint16_t sliceHeight = m_arbitraryNumMbsInSlice ? m_frameFieldHeightInMb : m_sliceHeight; |
| |
| if (sliceHeight > mfeEncodeSharedState->sliceHeight) |
| { |
| mfeEncodeSharedState->sliceHeight = sliceHeight; |
| } |
| |
| m_osInterface->pfnSetGpuContext(m_osInterface, m_renderContext); |
| CODECHAL_DEBUG_TOOL( |
| m_debugInterface->m_osInterface = m_osInterface;) |
| // bookkeeping the original binding table |
| origMbEncBindingTable = MbEncBindingTable; |
| } |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = (mbEncIFrameDistInUse && !m_singleTaskPhaseSupported) ? |
| CODECHAL_ENCODE_PERFTAG_CALL_INTRA_DIST : CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType; |
| if (mbEncIFrameDistInUse) |
| { |
| encFunctionType = CODECHAL_MEDIA_STATE_ENC_I_FRAME_DIST; |
| } |
| else if (bUseMbEncAdvKernel) |
| { |
| encFunctionType = CODECHAL_MEDIA_STATE_ENC_ADV; |
| } |
| else if (m_kernelMode == encodeNormalMode) |
| { |
| encFunctionType = CODECHAL_MEDIA_STATE_ENC_NORMAL; |
| } |
| else if (m_kernelMode == encodePerformanceMode) |
| { |
| encFunctionType = CODECHAL_MEDIA_STATE_ENC_PERFORMANCE; |
| } |
| else |
| { |
| encFunctionType = CODECHAL_MEDIA_STATE_ENC_QUALITY; |
| } |
| |
| // Initialize DSH kernel region |
| PMHW_KERNEL_STATE kernelState; |
| if (mbEncIFrameDistInUse) |
| { |
| kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_IFRAMEDIST]; |
| } |
| else if (IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| kernelState = &mfeMbEncKernelState; |
| } |
| else |
| { |
| CodechalEncodeIdOffsetParams idOffsetParams; |
| MOS_ZeroMemory(&idOffsetParams, sizeof(idOffsetParams)); |
| idOffsetParams.Standard = m_standard; |
| idOffsetParams.EncFunctionType = encFunctionType; |
| idOffsetParams.wPictureCodingType = m_pictureCodingType; |
| idOffsetParams.ucDmvPredFlag = m_avcSliceParams->direct_spatial_mv_pred_flag; |
| idOffsetParams.interlacedField = CodecHal_PictureIsField(m_currOriginalPic); |
| |
| uint32_t krnStateIdx; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetMbEncKernelStateIdx( |
| &idOffsetParams, |
| &krnStateIdx)); |
| kernelState = &pMbEncKernelStates[krnStateIdx]; |
| } |
| |
| // All the streams use the kernel state from the first stream. |
| if (IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| if (m_mfeFirstStream) |
| { |
| m_mfeEncodeSharedState->pMfeMbEncKernelState = kernelState; |
| } |
| else |
| { |
| kernelState = m_mfeEncodeSharedState->pMfeMbEncKernelState; |
| } |
| } |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported || |
| (IsMfeMbEncEnabled(mbEncIFrameDistInUse) && m_mfeFirstStream)) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| // Allocate DSH and SSH for the first stream, which will be passed to other streams through the shared kernel state. |
| if ((IsMfeMbEncEnabled(mbEncIFrameDistInUse) && m_mfeFirstStream) || |
| (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) && !bMbEncCurbeSetInBrcUpdate)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| } |
| |
| if (bMbEncCurbeSetInBrcUpdate) |
| { |
| if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| // If BRC update was used to set up the DSH & SSH, SSH only needs to |
| // be obtained if single task phase is enabled because the same SSH |
| // could not be shared between BRC update and MbEnc |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| true, |
| 0, |
| m_singleTaskPhaseSupported, |
| m_storeData)); |
| } |
| } |
| else |
| { |
| // Setup AVC Curbe |
| CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS mbEncCurbeParams; |
| MOS_ZeroMemory(&mbEncCurbeParams, sizeof(mbEncCurbeParams)); |
| mbEncCurbeParams.pPicParams = m_avcPicParams[ppsidx]; |
| mbEncCurbeParams.pSeqParams = m_avcSeqParams[spsidx]; |
| mbEncCurbeParams.pSlcParams = m_avcSliceParams; |
| mbEncCurbeParams.ppRefList = &(m_refList[0]); |
| mbEncCurbeParams.pPicIdx = &(m_picIdx[0]); |
| mbEncCurbeParams.bRoiEnabled = roiEnabled; |
| mbEncCurbeParams.bDirtyRoiEnabled = bDirtyRoiEnabled; |
| mbEncCurbeParams.bMbEncIFrameDistEnabled = mbEncIFrameDistInUse; |
| mbEncCurbeParams.pdwBlockBasedSkipEn = &dwMbEncBlockBasedSkipEn; |
| if (mbEncIFrameDistInUse) |
| { |
| mbEncCurbeParams.bBrcEnabled = false; |
| mbEncCurbeParams.wPicWidthInMb = (uint16_t)m_downscaledWidthInMb4x; |
| mbEncCurbeParams.wFieldFrameHeightInMb = (uint16_t)m_downscaledFrameFieldHeightInMb4x; |
| mbEncCurbeParams.usSliceHeight = (m_sliceHeight + SCALE_FACTOR_4x - 1) / SCALE_FACTOR_4x; |
| } |
| else |
| { |
| mbEncCurbeParams.bBrcEnabled = bBrcEnabled; |
| mbEncCurbeParams.wPicWidthInMb = m_picWidthInMb; |
| mbEncCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb; |
| mbEncCurbeParams.usSliceHeight = (m_arbitraryNumMbsInSlice) ? |
| m_frameFieldHeightInMb : m_sliceHeight; |
| mbEncCurbeParams.bUseMbEncAdvKernel = bUseMbEncAdvKernel; |
| } |
| mbEncCurbeParams.pKernelState = kernelState; |
| mbEncCurbeParams.pAvcQCParams = m_avcQCParams ; |
| mbEncCurbeParams.bMbDisableSkipMapEnabled = bMbDisableSkipMapEnabled; |
| mbEncCurbeParams.bStaticFrameDetectionEnabled = bStaticFrameDetectionEnable && m_hmeEnabled; |
| mbEncCurbeParams.bApdatvieSearchWindowSizeEnabled = bApdatvieSearchWindowEnable; |
| mbEncCurbeParams.bSquareRollingIEnabled = bSquareRollingIEnabled; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMbEnc( |
| &mbEncCurbeParams)); |
| } |
| |
| if (IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| // Set MFE specific curbe in the last stream |
| // MFE MBEnc specific curbe is different from the normal MBEnc curbe which is passed |
| // to MFE MBEnc kernel as a surface. |
| if (m_mfeLastStream) |
| { |
| CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS mfeMbEncCurbeParams; |
| MOS_ZeroMemory(&mfeMbEncCurbeParams, sizeof(mfeMbEncCurbeParams)); |
| mfeMbEncCurbeParams.submitNumber = m_mfeEncodeParams.submitNumber; |
| mfeMbEncCurbeParams.pKernelState = kernelState; |
| mfeMbEncCurbeParams.pBindingTable = &MbEncBindingTable; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMfeMbEnc(&mfeMbEncCurbeParams)); |
| } |
| // Change the binding table according to the index during this submission |
| UpdateMfeMbEncBindingTable(m_mfeEncodeParams.submitIndex); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| for (uint8_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++) |
| { |
| if (m_picIdx[i].bValid) |
| { |
| uint8_t index = m_picIdx[i].ucPicIdx; |
| refList[index]->sRefBuffer = m_userFlags.bUseRawPicForRef ? |
| refList[index]->sRefRawBuffer : refList[index]->sRefReconBuffer; |
| |
| CodecHalGetResourceInfo(m_osInterface, &refList[index]->sRefBuffer); |
| } |
| } |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| MOS_ZeroMemory(&cmdBuffer,sizeof(cmdBuffer)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| // For MFE, All the commands are sent in the last stream and can not be sent in different streams |
| // since cmdBuffer is zeroed for each stream and cmd buffer pointer is reset. |
| if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) || m_mfeLastStream) |
| { |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.ucDmvPredFlag = |
| m_avcSliceParams->direct_spatial_mv_pred_flag; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| } |
| |
| // Set up MB BRC Constant Data Buffer if there is QP change within a frame |
| if (bMbConstDataBufferInUse) |
| { |
| CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS initMbBrcConstantDataBufferParams; |
| |
| MOS_ZeroMemory(&initMbBrcConstantDataBufferParams, sizeof(initMbBrcConstantDataBufferParams)); |
| initMbBrcConstantDataBufferParams.pOsInterface = m_osInterface; |
| initMbBrcConstantDataBufferParams.presBrcConstantDataBuffer = |
| &BrcBuffers.resMbBrcConstDataBuffer[m_currRecycledBufIdx]; |
| initMbBrcConstantDataBufferParams.dwMbEncBlockBasedSkipEn = dwMbEncBlockBasedSkipEn; |
| initMbBrcConstantDataBufferParams.pPicParams = m_avcPicParams[ppsidx]; |
| initMbBrcConstantDataBufferParams.wPictureCodingType = m_pictureCodingType; |
| initMbBrcConstantDataBufferParams.bSkipBiasAdjustmentEnable = m_skipBiasAdjustmentEnable; |
| initMbBrcConstantDataBufferParams.bAdaptiveIntraScalingEnable = bAdaptiveIntraScalingEnable; |
| initMbBrcConstantDataBufferParams.bOldModeCostEnable = bOldModeCostEnable; |
| initMbBrcConstantDataBufferParams.pAvcQCParams = m_avcQCParams ; |
| initMbBrcConstantDataBufferParams.bEnableKernelTrellis = bKernelTrellis && m_trellisQuantParams.dwTqEnabled; |
| |
| // Kernel controlled Trellis Quantization |
| if (bKernelTrellis && m_trellisQuantParams.dwTqEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CalcLambdaTable( |
| m_pictureCodingType, |
| &initMbBrcConstantDataBufferParams.Lambda[0][0])); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitMbBrcConstantDataBuffer(&initMbBrcConstantDataBufferParams)); |
| |
| // dump MbBrcLut |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| initMbBrcConstantDataBufferParams.presBrcConstantDataBuffer, |
| CodechalDbgAttr::attrInput, |
| "MbBrcLut", |
| 16 * (CODEC_AVC_NUM_QP) * sizeof(uint32_t), |
| 0, |
| CODECHAL_MEDIA_STATE_ENC_QUALITY))); |
| |
| } |
| |
| // Add binding table |
| // For MFE first stream sends binding table since the function zeros the whole SSH. |
| // If last stream sends binding table it will clean the surface states from other streams. |
| if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) || m_mfeFirstStream) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| } |
| |
| //Add surface states |
| CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS mbEncSurfaceParams; |
| MOS_ZeroMemory(&mbEncSurfaceParams, sizeof(mbEncSurfaceParams)); |
| mbEncSurfaceParams.MediaStateType = encFunctionType; |
| mbEncSurfaceParams.pAvcSlcParams = m_avcSliceParams; |
| mbEncSurfaceParams.ppRefList = &m_refList[0]; |
| mbEncSurfaceParams.pAvcPicIdx = &m_picIdx[0]; |
| mbEncSurfaceParams.pCurrOriginalPic = &m_currOriginalPic; |
| mbEncSurfaceParams.pCurrReconstructedPic = &m_currReconstructedPic; |
| mbEncSurfaceParams.wPictureCodingType = m_pictureCodingType; |
| mbEncSurfaceParams.psCurrPicSurface = mbEncIFrameDistInUse ? m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER) : m_rawSurfaceToEnc; |
| if (mbEncIFrameDistInUse && CodecHal_PictureIsBottomField(m_currOriginalPic)) |
| { |
| mbEncSurfaceParams.dwCurrPicSurfaceOffset = m_scaledBottomFieldOffset; |
| } |
| mbEncSurfaceParams.dwMbCodeBottomFieldOffset = (uint32_t)m_mbcodeBottomFieldOffset; |
| mbEncSurfaceParams.dwMvBottomFieldOffset = (uint32_t)m_mvBottomFieldOffset; |
| mbEncSurfaceParams.ps4xMeMvDataBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer; |
| mbEncSurfaceParams.ps4xMeDistortionBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xDistortionBuffer) : &m_4xMeDistortionBuffer; |
| mbEncSurfaceParams.dwMeMvBottomFieldOffset = m_hmeKernel ? m_hmeKernel->Get4xMeMvBottomFieldOffset(): (uint32_t)m_meMvBottomFieldOffset; |
| mbEncSurfaceParams.psMeBrcDistortionBuffer = &BrcBuffers.sMeBrcDistortionBuffer; |
| mbEncSurfaceParams.dwMeBrcDistortionBottomFieldOffset = BrcBuffers.dwMeBrcDistortionBottomFieldOffset; |
| mbEncSurfaceParams.dwMeDistortionBottomFieldOffset = m_hmeKernel ? m_hmeKernel->GetDistortionBottomFieldOffset() : (uint32_t)m_meDistortionBottomFieldOffset; |
| mbEncSurfaceParams.dwRefPicSelectBottomFieldOffset = (uint32_t)ulRefPicSelectBottomFieldOffset; |
| mbEncSurfaceParams.dwFrameWidthInMb = (uint32_t)m_picWidthInMb; |
| mbEncSurfaceParams.dwFrameFieldHeightInMb = (uint32_t)m_frameFieldHeightInMb; |
| mbEncSurfaceParams.dwFrameHeightInMb = (uint32_t)m_picHeightInMb; |
| // Interleaved input surfaces |
| mbEncSurfaceParams.dwVerticalLineStride = m_verticalLineStride; |
| mbEncSurfaceParams.dwVerticalLineStrideOffset = m_verticalLineStrideOffset; |
| // Vertical line stride is not used for the case of scaled surfaces saved as separate fields |
| if (!m_fieldScalingOutputInterleaved && mbEncIFrameDistInUse) |
| { |
| mbEncSurfaceParams.dwVerticalLineStride = 0; |
| mbEncSurfaceParams.dwVerticalLineStrideOffset = 0; |
| } |
| mbEncSurfaceParams.bHmeEnabled = m_hmeSupported; |
| mbEncSurfaceParams.bMbEncIFrameDistInUse = mbEncIFrameDistInUse; |
| mbEncSurfaceParams.presMbBrcConstDataBuffer = &BrcBuffers.resMbBrcConstDataBuffer[m_currRecycledBufIdx]; |
| mbEncSurfaceParams.psMbQpBuffer = |
| bMbQpDataEnabled ? &sMbQpDataSurface : &BrcBuffers.sBrcMbQpBuffer; |
| mbEncSurfaceParams.dwMbQpBottomFieldOffset = bMbQpDataEnabled ? 0 : BrcBuffers.dwBrcMbQpBottomFieldOffset; |
| mbEncSurfaceParams.bUsedAsRef = |
| m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef; |
| mbEncSurfaceParams.presMADDataBuffer = &m_resMadDataBuffer[m_currMadBufferIdx]; |
| mbEncSurfaceParams.bMbQpBufferInUse = mbQpBufferInUse; |
| mbEncSurfaceParams.bMbSpecificDataEnabled = bMbSpecificDataEnabled; |
| mbEncSurfaceParams.presMbSpecificDataBuffer = &resMbSpecificDataBuffer[m_currRecycledBufIdx]; |
| mbEncSurfaceParams.bMbConstDataBufferInUse = bMbConstDataBufferInUse; |
| mbEncSurfaceParams.bMADEnabled = mbEncIFrameDistInUse ? false : m_madEnabled; |
| mbEncSurfaceParams.bUseMbEncAdvKernel = mbEncIFrameDistInUse ? false : bUseMbEncAdvKernel; |
| mbEncSurfaceParams.presMbEncCurbeBuffer = |
| (mbEncIFrameDistInUse && bUseMbEncAdvKernel) ? nullptr : &BrcBuffers.resMbEncAdvancedDsh; |
| mbEncSurfaceParams.presMbEncBRCBuffer = &BrcBuffers.resMbEncBrcBuffer; |
| |
| if (IsMfeMbEncEnabled(mbEncIFrameDistInUse) || bDecoupleMbEncCurbeFromBRC) |
| { |
| mbEncSurfaceParams.dwMbEncBRCBufferSize = m_mbencBrcBufferSize; |
| } |
| |
| mbEncSurfaceParams.bUseAdvancedDsh = bAdvancedDshInUse; |
| mbEncSurfaceParams.bBrcEnabled = bBrcEnabled; |
| mbEncSurfaceParams.bArbitraryNumMbsInSlice = m_arbitraryNumMbsInSlice; |
| mbEncSurfaceParams.psSliceMapSurface = &m_sliceMapSurface[m_currRecycledBufIdx]; |
| mbEncSurfaceParams.dwSliceMapBottomFieldOffset = (uint32_t)m_sliceMapBottomFieldOffset; |
| mbEncSurfaceParams.pMbEncBindingTable = &MbEncBindingTable; |
| mbEncSurfaceParams.pKernelState = kernelState; |
| |
| if (m_mbStatsSupported) |
| { |
| mbEncSurfaceParams.bMBVProcStatsEnabled = m_flatnessCheckEnabled || |
| m_adaptiveTransformDecisionEnabled || |
| bMbBrcEnabled || |
| bMbQpDataEnabled; |
| mbEncSurfaceParams.presMBVProcStatsBuffer = &m_resMbStatsBuffer; |
| mbEncSurfaceParams.dwMBVProcStatsBottomFieldOffset = m_mbStatsBottomFieldOffset; |
| } |
| else |
| { |
| mbEncSurfaceParams.bFlatnessCheckEnabled = m_flatnessCheckEnabled; |
| mbEncSurfaceParams.psFlatnessCheckSurface = &m_flatnessCheckSurface; |
| mbEncSurfaceParams.dwFlatnessCheckBottomFieldOffset = (uint32_t)m_flatnessCheckBottomFieldOffset; |
| } |
| |
| // Set up pFeiPicParams |
| mbEncSurfaceParams.pFeiPicParams = m_avcFeiPicParams; |
| |
| mbEncSurfaceParams.bMbDisableSkipMapEnabled = bMbDisableSkipMapEnabled; |
| mbEncSurfaceParams.psMbDisableSkipMapSurface = psMbDisableSkipMapSurface; |
| |
| if (bUseWeightedSurfaceForL0 || bUseWeightedSurfaceForL1) |
| { |
| if (!m_wpUseCommonKernel) |
| { |
| mbEncSurfaceParams.pWeightedPredOutputPicSelectList = &WeightedPredOutputPicSelectList[0]; |
| } |
| mbEncSurfaceParams.bUseWeightedSurfaceForL0 = bUseWeightedSurfaceForL0; |
| mbEncSurfaceParams.bUseWeightedSurfaceForL1 = bUseWeightedSurfaceForL1; |
| } |
| |
| // Clear the MAD buffer -- the kernel requires it to be 0 as it accumulates the result |
| if (mbEncSurfaceParams.bMADEnabled) |
| { |
| // set lock flag to WRITE_ONLY |
| MOS_LOCK_PARAMS lockFlags; |
| MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.WriteOnly = 1; |
| |
| uint8_t* pbData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| mbEncSurfaceParams.presMADDataBuffer, |
| &lockFlags); |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pbData); |
| |
| MOS_ZeroMemory(pbData, CODECHAL_MAD_BUFFER_SIZE); |
| |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| mbEncSurfaceParams.presMADDataBuffer); |
| |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_resMadDataBuffer[m_currMadBufferIdx], |
| CodechalDbgAttr::attrOutput, |
| "MADRead", |
| CODECHAL_MAD_BUFFER_SIZE, |
| 0, |
| encFunctionType))); |
| } |
| |
| // static frame detection buffer |
| mbEncSurfaceParams.bStaticFrameDetectionEnabled = bStaticFrameDetectionEnable && m_hmeEnabled; |
| mbEncSurfaceParams.presSFDOutputBuffer = &resSFDOutputBuffer[0]; |
| if (m_pictureCodingType == P_TYPE) |
| { |
| mbEncSurfaceParams.presSFDCostTableBuffer = &resSFDCostTablePFrameBuffer; |
| } |
| else if (m_pictureCodingType == B_TYPE) |
| { |
| mbEncSurfaceParams.presSFDCostTableBuffer = &resSFDCostTableBFrameBuffer; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcMbEncSurfaces(&cmdBuffer, &mbEncSurfaceParams)); |
| |
| // For MFE, only one walker processes frame in parallel through color bits. |
| if (!IsMfeMbEncEnabled(mbEncIFrameDistInUse) || m_mfeLastStream) |
| { |
| uint32_t dwResolutionX = mbEncIFrameDistInUse ? |
| m_downscaledWidthInMb4x : (uint32_t)m_picWidthInMb; |
| uint32_t dwResolutionY = mbEncIFrameDistInUse ? |
| m_downscaledFrameFieldHeightInMb4x : (uint32_t)m_frameFieldHeightInMb; |
| |
| CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams; |
| MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams)); |
| walkerCodecParams.WalkerMode = m_walkerMode; |
| walkerCodecParams.bUseScoreboard = m_useHwScoreboard; |
| walkerCodecParams.wPictureCodingType = m_pictureCodingType; |
| walkerCodecParams.bMbEncIFrameDistInUse = mbEncIFrameDistInUse; |
| walkerCodecParams.bMbaff = m_mbaffEnabled; |
| walkerCodecParams.bDirectSpatialMVPredFlag = m_avcSliceParams->direct_spatial_mv_pred_flag; |
| |
| if (IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| walkerCodecParams.bColorbitSupported = true; |
| walkerCodecParams.dwNumSlices = m_mfeEncodeParams.submitNumber; // MFE use color bit to handle frames in parallel |
| walkerCodecParams.WalkerDegree = CODECHAL_26_DEGREE; // MFE use 26 degree dependency |
| walkerCodecParams.dwResolutionX = m_mfeEncodeSharedState->dwPicWidthInMB; |
| walkerCodecParams.dwResolutionY = m_mfeEncodeSharedState->dwPicHeightInMB; |
| walkerCodecParams.usSliceHeight = m_mfeEncodeSharedState->sliceHeight; |
| } |
| else |
| { |
| walkerCodecParams.bColorbitSupported = (m_colorbitSupported && !m_arbitraryNumMbsInSlice) ? m_cmKernelEnable : false; |
| walkerCodecParams.dwResolutionX = dwResolutionX; |
| walkerCodecParams.dwResolutionY = dwResolutionY; |
| walkerCodecParams.dwNumSlices = m_numSlices; |
| walkerCodecParams.usSliceHeight = m_sliceHeight; |
| } |
| walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported; |
| walkerCodecParams.ucGroupId = m_groupId; |
| |
| MHW_WALKER_PARAMS walkerParams; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams( |
| m_hwInterface, |
| &walkerParams, |
| &walkerCodecParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd( |
| &cmdBuffer, |
| &walkerParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| // Add dump for MBEnc surface state heap here |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| encFunctionType, |
| nullptr))); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if ((!m_singleTaskPhaseSupported || m_lastTaskInPhase)) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| } |
| |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.sBrcMbQpBuffer.OsResource, |
| CodechalDbgAttr::attrInput, |
| "MbQp", |
| BrcBuffers.sBrcMbQpBuffer.dwPitch*BrcBuffers.sBrcMbQpBuffer.dwHeight, |
| BrcBuffers.dwBrcMbQpBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_ENC_NORMAL))); |
| |
| currRefList->ucMADBufferIdx = m_currMadBufferIdx; |
| currRefList->bMADEnabled = m_madEnabled; |
| |
| if (IsMfeMbEncEnabled(mbEncIFrameDistInUse)) |
| { |
| m_stateHeapInterface = m_origStateHeapInterface; |
| m_hwInterface = m_origHwInterface; |
| m_osInterface = m_origOsInterface; |
| m_renderEngineInterface->SetOsInterface(m_origOsInterface); |
| |
| MbEncBindingTable = origMbEncBindingTable; |
| |
| CODECHAL_DEBUG_TOOL( |
| m_debugInterface->m_osInterface = m_osInterface;) |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::BrcFrameUpdateKernel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| if (m_lastTaskInPhase) |
| { |
| perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE; |
| } |
| else |
| { |
| perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE; |
| } |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| auto kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_FrameBRC_UPDATE]; |
| |
| uint8_t ppsidx = m_avcSliceParams->pic_parameter_set_id; |
| uint8_t refPicListIdx = m_avcSliceParams[ppsidx].RefPicList[0][0].FrameIdx; |
| uint8_t refFrameListIdx = m_avcPicParam[ppsidx].RefFrameList[refPicListIdx].FrameIdx; |
| |
| bool bDirtyRoiEnabled = (m_pictureCodingType == P_TYPE |
| && m_avcPicParams[ppsidx]->NumDirtyROI > 0 |
| && m_prevReconFrameIdx == refFrameListIdx); |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_BRC_UPDATE; |
| CODECHAL_MEDIA_STATE_TYPE mbEncFunctionType; |
| if (bUseMbEncAdvKernel) |
| { |
| mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_ADV; |
| } |
| else if (m_kernelMode == encodeNormalMode) |
| { |
| mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_NORMAL; |
| } |
| else if (m_kernelMode == encodePerformanceMode) |
| { |
| mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_PERFORMANCE; |
| } |
| else |
| { |
| mbEncFunctionType = CODECHAL_MEDIA_STATE_ENC_QUALITY; |
| } |
| |
| uint32_t krnStateIdx; |
| CodechalEncodeIdOffsetParams idOffsetParams; |
| MOS_ZeroMemory(&idOffsetParams, sizeof(idOffsetParams)); |
| idOffsetParams.Standard = m_standard; |
| idOffsetParams.EncFunctionType = mbEncFunctionType; |
| idOffsetParams.wPictureCodingType = m_pictureCodingType; |
| idOffsetParams.ucDmvPredFlag = m_avcSliceParams->direct_spatial_mv_pred_flag; |
| idOffsetParams.interlacedField = CodecHal_PictureIsField(m_currOriginalPic); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetMbEncKernelStateIdx( |
| &idOffsetParams, |
| &krnStateIdx)); |
| auto mbEncKernelState = &pMbEncKernelStates[krnStateIdx]; |
| |
| auto brcImageStatesReadBuffer = |
| &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx]; |
| |
| // No need to setup MBEnc Curbe for Gen95+ platforms. |
| if (!bDecoupleMbEncCurbeFromBRC) |
| { |
| // Mfe use MBEnc Curbe buffer instead of DSH |
| if (IsMfeMbEncEnabled(false)) |
| { |
| BrcBuffers.pMbEncKernelStateInUse = nullptr; |
| } |
| else |
| { |
| BrcBuffers.pMbEncKernelStateInUse = mbEncKernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| mbEncKernelState, |
| false, |
| 0, |
| !m_singleTaskPhaseSupported, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = mbEncKernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| } |
| |
| CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS mbEncCurbeParams; |
| MOS_ZeroMemory(&mbEncCurbeParams, sizeof(mbEncCurbeParams)); |
| mbEncCurbeParams.pPicParams = m_avcPicParam; |
| mbEncCurbeParams.pSeqParams = m_avcSeqParam; |
| mbEncCurbeParams.pSlcParams = m_avcSliceParams; |
| mbEncCurbeParams.ppRefList = &(m_refList[0]); |
| mbEncCurbeParams.pPicIdx = &(m_picIdx[0]); |
| mbEncCurbeParams.pdwBlockBasedSkipEn = &dwMbEncBlockBasedSkipEn; |
| mbEncCurbeParams.wPicWidthInMb = m_picWidthInMb; |
| mbEncCurbeParams.wFieldFrameHeightInMb = m_frameFieldHeightInMb; |
| mbEncCurbeParams.usSliceHeight = (m_arbitraryNumMbsInSlice) ? |
| m_frameFieldHeightInMb : m_sliceHeight; |
| mbEncCurbeParams.bRoiEnabled = (m_avcPicParams[m_avcSliceParams->pic_parameter_set_id]->NumROI > 0) ? true : false; |
| mbEncCurbeParams.bDirtyRoiEnabled = bDirtyRoiEnabled; |
| mbEncCurbeParams.bBrcEnabled = true; |
| mbEncCurbeParams.pKernelState = mbEncKernelState; |
| mbEncCurbeParams.pAvcQCParams = m_avcQCParams ; |
| mbEncCurbeParams.bMbDisableSkipMapEnabled = bMbDisableSkipMapEnabled; |
| mbEncCurbeParams.bStaticFrameDetectionEnabled = bStaticFrameDetectionEnable && m_hmeEnabled; |
| mbEncCurbeParams.bApdatvieSearchWindowSizeEnabled = bApdatvieSearchWindowEnable; |
| mbEncCurbeParams.bSquareRollingIEnabled = bSquareRollingIEnabled; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMbEnc(&mbEncCurbeParams)); |
| |
| // BrcCopy is not needed if MbEnc Adv kenrel is used. |
| if (!bUseMbEncAdvKernel && bAdvancedDshInUse) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(BrcCopyKernel()); |
| } |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| (m_swBrcMode != nullptr), |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| // Setup BRC Update Curbe |
| CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS brcUpdateCurbeParams; |
| MOS_ZeroMemory(&brcUpdateCurbeParams, sizeof(brcUpdateCurbeParams)); |
| // set skipped frame params to be used in pfnSetCurbeAvcFrameBrcUpdate() |
| if (m_numSkipFrames > 0) |
| { |
| // CP case: one or more frames with skip flag = 2 received and copied |
| brcUpdateCurbeParams.dwNumSkipFrames = m_numSkipFrames; |
| brcUpdateCurbeParams.dwSizeSkipFrames = m_sizeSkipFrames; |
| |
| // this should not happen since skip flag == 1 means non-CP user case |
| // but we accumulate the num/size of skipped frame per BRC |
| if (FRAME_SKIP_NORMAL == m_skipFrameFlag) |
| { |
| brcUpdateCurbeParams.dwNumSkipFrames += m_avcPicParam->NumSkipFrames; |
| brcUpdateCurbeParams.dwSizeSkipFrames += m_avcPicParam->SizeSkipFrames; |
| } |
| } |
| else if (FRAME_SKIP_NORMAL == m_skipFrameFlag) |
| { |
| // non-CP case: use the num/size of skipped frames passed in by MSDK |
| brcUpdateCurbeParams.dwNumSkipFrames = m_avcPicParam->NumSkipFrames; |
| brcUpdateCurbeParams.dwSizeSkipFrames = m_avcPicParam->SizeSkipFrames; |
| } |
| else |
| brcUpdateCurbeParams.dwNumSkipFrames = 0; |
| |
| // Setting min/max QP to zero indicates to the kernel that no QP control is desired |
| if (m_pictureCodingType == I_TYPE) |
| { |
| brcUpdateCurbeParams.ucMinQP = ucIMinQP; |
| brcUpdateCurbeParams.ucMaxQP = ucIMaxQP; |
| } |
| else if (m_pictureCodingType == P_TYPE) |
| { |
| brcUpdateCurbeParams.ucMinQP = ucPMinQP; |
| brcUpdateCurbeParams.ucMaxQP = ucPMaxQP; |
| } |
| else |
| { |
| brcUpdateCurbeParams.ucMinQP = ucBMinQP; |
| brcUpdateCurbeParams.ucMaxQP = ucBMaxQP; |
| } |
| // reset skip frame statistics |
| m_numSkipFrames = 0; |
| m_sizeSkipFrames = 0; |
| |
| bMbEncCurbeSetInBrcUpdate = !bDecoupleMbEncCurbeFromBRC; |
| |
| brcUpdateCurbeParams.pdBrcInitCurrentTargetBufFullInBits = &dBrcInitCurrentTargetBufFullInBits; |
| brcUpdateCurbeParams.pKernelState = kernelState; |
| brcUpdateCurbeParams.ucEnableROI = (uint8_t)bBrcRoiEnabled; |
| brcUpdateCurbeParams.dwIntraRefreshQpThreshold = dwIntraRefreshQpThreshold; |
| brcUpdateCurbeParams.bSquareRollingIEnabled = bSquareRollingIEnabled; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcFrameBrcUpdate( |
| &brcUpdateCurbeParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| if (!bDecoupleMbEncCurbeFromBRC && !IsMfeMbEncEnabled(false)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| mbEncFunctionType, |
| MHW_DSH_TYPE, |
| mbEncKernelState)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| auto trellisQuantParams = &m_trellisQuantParams; |
| |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| |
| if (m_swBrcMode != nullptr) |
| { |
| CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS initBrcConstantBufferParams; |
| // Check if the constant data surface is present |
| initBrcConstantBufferParams.pOsInterface = m_osInterface; |
| initBrcConstantBufferParams.pAvcSlcParams = m_avcSliceParams; |
| initBrcConstantBufferParams.pAvcPicIdx = &m_picIdx[0]; |
| initBrcConstantBufferParams.sBrcConstantDataBuffer = |
| BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx]; |
| initBrcConstantBufferParams.dwMbEncBlockBasedSkipEn = dwMbEncBlockBasedSkipEn; |
| initBrcConstantBufferParams.pPicParams = m_avcPicParam; |
| initBrcConstantBufferParams.wPictureCodingType = m_pictureCodingType; |
| initBrcConstantBufferParams.bSkipBiasAdjustmentEnable = m_skipBiasAdjustmentEnable; |
| initBrcConstantBufferParams.bAdaptiveIntraScalingEnable = bAdaptiveIntraScalingEnable; |
| initBrcConstantBufferParams.bOldModeCostEnable = bOldModeCostEnable; |
| initBrcConstantBufferParams.pAvcQCParams = m_avcQCParams ; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitBrcConstantBuffer(&initBrcConstantBufferParams)); |
| |
| MHW_VDBOX_AVC_IMG_PARAMS imageStateParams; |
| imageStateParams.pEncodeAvcPicParams = m_avcPicParam; |
| imageStateParams.pEncodeAvcSeqParams = m_avcSeqParam; |
| imageStateParams.wPicWidthInMb = m_picWidthInMb; |
| imageStateParams.wPicHeightInMb = m_picHeightInMb; |
| imageStateParams.ppRefList = &(m_refList[0]); |
| imageStateParams.dwTqEnabled = trellisQuantParams->dwTqEnabled; |
| imageStateParams.dwTqRounding = trellisQuantParams->dwTqRounding; |
| imageStateParams.dwMaxVmvR = CodecHalAvcEncode_GetMaxVmvR(m_avcSeqParam->Level); |
| imageStateParams.ucKernelMode = m_kernelMode; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgBrcBuffer( |
| brcImageStatesReadBuffer, |
| &imageStateParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx], |
| CodechalDbgAttr::attrInput, |
| "ImgStateRead", |
| 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.sBrcConstantDataBuffer[m_currRecycledBufIdx].OsResource, |
| CodechalDbgAttr::attrInput, |
| "ConstData", |
| BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwPitch * BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwHeight, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| // PAK statistics buffer is only dumped for BrcUpdate kernel input |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcPakStatisticBuffer[0], |
| CodechalDbgAttr::attrInput, |
| "PakStats", |
| m_brcPakStatisticsSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.sMeBrcDistortionBuffer.OsResource, |
| CodechalDbgAttr::attrInput, |
| "BrcDist", |
| BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight, |
| BrcBuffers.dwMeBrcDistortionBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcHistoryBuffer, |
| CodechalDbgAttr::attrInput, |
| "HistoryRead", |
| m_brcHistoryBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| if (BrcBuffers.pMbEncKernelStateInUse) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| CODECHAL_MEDIA_STATE_BRC_UPDATE, |
| BrcBuffers.pMbEncKernelStateInUse)); |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_resMbStatsBuffer, |
| CodechalDbgAttr::attrInput, |
| "MBStatsSurf", |
| m_hwInterface->m_avcMbStatBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| // CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHal_DbgCallAvcSwBrcImpl( |
| // m_debugInterface, |
| // encFunctionType, |
| // this, |
| // &BrcBuffers, |
| // false, |
| // kernelState, |
| // mbEncKernelState)); |
| |
| return eStatus; |
| } |
| |
| #endif |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS initBrcConstantBufferParams; |
| // Check if the constant data surface is present |
| initBrcConstantBufferParams.pOsInterface = m_osInterface; |
| initBrcConstantBufferParams.pAvcSlcParams = m_avcSliceParams; |
| initBrcConstantBufferParams.pAvcPicIdx = &m_picIdx[0]; |
| initBrcConstantBufferParams.sBrcConstantDataBuffer = |
| BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx]; |
| initBrcConstantBufferParams.dwMbEncBlockBasedSkipEn = dwMbEncBlockBasedSkipEn; |
| initBrcConstantBufferParams.pPicParams = m_avcPicParam; |
| initBrcConstantBufferParams.wPictureCodingType = m_pictureCodingType; |
| initBrcConstantBufferParams.bSkipBiasAdjustmentEnable = m_skipBiasAdjustmentEnable; |
| initBrcConstantBufferParams.bAdaptiveIntraScalingEnable = bAdaptiveIntraScalingEnable; |
| initBrcConstantBufferParams.bOldModeCostEnable = bOldModeCostEnable; |
| initBrcConstantBufferParams.pAvcQCParams = m_avcQCParams ; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InitBrcConstantBuffer(&initBrcConstantBufferParams)); |
| |
| MHW_VDBOX_AVC_IMG_PARAMS imageStateParams; |
| imageStateParams.pEncodeAvcPicParams = m_avcPicParam; |
| imageStateParams.pEncodeAvcSeqParams = m_avcSeqParam; |
| imageStateParams.wPicWidthInMb = m_picWidthInMb; |
| imageStateParams.wPicHeightInMb = m_picHeightInMb; |
| imageStateParams.ppRefList = &(m_refList[0]); |
| imageStateParams.dwTqEnabled = trellisQuantParams->dwTqEnabled; |
| imageStateParams.dwTqRounding = trellisQuantParams->dwTqRounding; |
| imageStateParams.dwMaxVmvR = CodecHalAvcEncode_GetMaxVmvR(m_avcSeqParam->Level); |
| imageStateParams.ucKernelMode = m_kernelMode; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgBrcBuffer( |
| brcImageStatesReadBuffer, |
| &imageStateParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulatePakParam( |
| nullptr, |
| nullptr)); |
| ) |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| //Add surface state |
| CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS brcUpdateSurfaceParams; |
| MOS_ZeroMemory(&brcUpdateSurfaceParams, sizeof(brcUpdateSurfaceParams)); |
| brcUpdateSurfaceParams.MbEncMediaStateType = mbEncFunctionType; |
| brcUpdateSurfaceParams.pBrcBuffers = &BrcBuffers; |
| brcUpdateSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x; |
| brcUpdateSurfaceParams.dwDownscaledFrameFieldHeightInMb4x = m_downscaledFrameFieldHeightInMb4x; |
| brcUpdateSurfaceParams.bMbBrcEnabled = bMbBrcEnabled; |
| brcUpdateSurfaceParams.bUseAdvancedDsh = bAdvancedDshInUse; |
| brcUpdateSurfaceParams.dwBrcPakStatisticsSize = m_brcPakStatisticsSize; |
| brcUpdateSurfaceParams.dwBrcHistoryBufferSize = m_brcHistoryBufferSize; |
| brcUpdateSurfaceParams.presMbEncCurbeBuffer = &BrcBuffers.resMbEncAdvancedDsh; |
| brcUpdateSurfaceParams.ucCurrRecycledBufIdx = m_currRecycledBufIdx; |
| brcUpdateSurfaceParams.pBrcUpdateBindingTable = &BrcUpdateBindingTable; |
| brcUpdateSurfaceParams.pKernelState = kernelState; |
| brcUpdateSurfaceParams.presMbEncBRCBuffer = &BrcBuffers.resMbEncBrcBuffer; |
| |
| if (bDecoupleMbEncCurbeFromBRC || IsMfeMbEncEnabled(false)) |
| { |
| brcUpdateSurfaceParams.dwMbEncBRCBufferSize = m_mbencBrcBufferSize; |
| } |
| brcUpdateSurfaceParams.presMbStatBuffer = &m_resMbStatsBuffer; //Starting from GEN9 |
| |
| PMOS_SURFACE buffer4xMeMvData = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(buffer4xMeMvData); |
| uint32_t dwMvBufferHeightBack = buffer4xMeMvData->dwHeight; // save 4x ME output MV buffer height |
| if (bMvDataNeededByBRC) //starting from G95 |
| { |
| brcUpdateSurfaceParams.psMvDataBuffer = buffer4xMeMvData; |
| brcUpdateSurfaceParams.dwMvBottomFieldOffset = (uint32_t)m_mvBottomFieldOffset; |
| |
| // BRC kernel only needs the MV data for reference 0 |
| brcUpdateSurfaceParams.psMvDataBuffer->dwHeight = m_downscaledFrameFieldHeightInMb4x * 4; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcBrcFrameUpdateSurfaces( |
| &cmdBuffer, |
| &brcUpdateSurfaceParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| if (bMvDataNeededByBRC) //starting from G95 |
| { |
| // restore back 4x ME mv buffer height |
| buffer4xMeMvData->dwHeight = dwMvBufferHeightBack; |
| } |
| |
| MHW_MEDIA_OBJECT_PARAMS mediaObjectParams; |
| MediaObjectInlineData mediaObjectInlineData; |
| MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams)); |
| MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData)); |
| mediaObjectParams.pInlineData = &mediaObjectInlineData; |
| mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObject( |
| &cmdBuffer, |
| nullptr, |
| &mediaObjectParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| encFunctionType, |
| nullptr)); |
| |
| if (m_swBrcMode == nullptr) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx], |
| CodechalDbgAttr::attrInput, |
| "ImgStateRead", |
| 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.sBrcConstantDataBuffer[m_currRecycledBufIdx].OsResource, |
| CodechalDbgAttr::attrInput, |
| "ConstData", |
| BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwPitch * BrcBuffers.sBrcConstantDataBuffer[m_currRecycledBufIdx].dwHeight, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| // PAK statistics buffer is only dumped for BrcUpdate kernel input |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcPakStatisticBuffer[0], |
| CodechalDbgAttr::attrInput, |
| "PakStats", |
| m_brcPakStatisticsSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.sMeBrcDistortionBuffer.OsResource, |
| CodechalDbgAttr::attrInput, |
| "BrcDist", |
| BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight, |
| BrcBuffers.dwMeBrcDistortionBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcHistoryBuffer, |
| CodechalDbgAttr::attrInput, |
| "HistoryRead", |
| m_brcHistoryBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| if (BrcBuffers.pMbEncKernelStateInUse) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| CODECHAL_MEDIA_STATE_BRC_UPDATE, |
| BrcBuffers.pMbEncKernelStateInUse)); |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_resMbStatsBuffer, |
| CodechalDbgAttr::attrInput, |
| "MBStatsSurf", |
| m_hwInterface->m_avcMbStatBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| } |
| ) |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcHistoryBuffer, |
| CodechalDbgAttr::attrOutput, |
| "HistoryWrite", |
| m_brcHistoryBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE));) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::BrcCopyKernel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(BrcBuffers.pMbEncKernelStateInUse); |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL : |
| CODECHAL_ENCODE_PERFTAG_CALL_BRC_COPY; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_BRC_BLOCK_COPY; |
| auto kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_BLOCKCOPY]; |
| auto mbEncKernelState = BrcBuffers.pMbEncKernelStateInUse; |
| uint32_t blockCopyHeight = |
| mbEncKernelState->m_dshRegion.GetSize() / CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH; |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| if (kernelState->KernelParams.iCurbeLength > 0) |
| { |
| CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS brcBlockCopyCurbeParams; |
| brcBlockCopyCurbeParams.pKernelState = kernelState; |
| brcBlockCopyCurbeParams.dwBufferOffset = 0x00; |
| brcBlockCopyCurbeParams.dwBlockHeight = blockCopyHeight; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcBrcBlockCopy( |
| &brcBlockCopyCurbeParams)); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| ) |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| //Add surface states for Brc Copy |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendBrcBlockCopySurfaces( |
| m_hwInterface, |
| &cmdBuffer, |
| mbEncKernelState, |
| kernelState, |
| &BrcBuffers.resMbEncAdvancedDsh)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| MHW_MEDIA_OBJECT_PARAMS mediaObjectParams; |
| MediaObjectInlineData mediaObjectInlineData; |
| MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams)); |
| MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData)); |
| mediaObjectParams.pInlineData = &mediaObjectInlineData; |
| mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData); |
| |
| uint32_t blockHeight = |
| CODECHAL_ENCODE_AVC_BRC_COPY_NUM_ROWS_PER_VME_SEND_MSG * CODECHAL_ENCODE_AVC_BRC_COPY_NUM_SEND_MSGS_PER_KERNEL; |
| uint32_t remainingRows = blockCopyHeight; |
| for (uint32_t i = 0; i < blockCopyHeight; i++) |
| { |
| if (remainingRows < blockHeight) |
| { |
| blockHeight = remainingRows; |
| } |
| mediaObjectInlineData.DW0.blockHeight = blockHeight; |
| mediaObjectInlineData.DW0.bufferOffset = i; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetRenderInterface()->AddMediaObject( |
| &cmdBuffer, |
| nullptr, |
| &mediaObjectParams)); |
| |
| remainingRows -= blockHeight; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->GetMiInterface()->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::BrcMbUpdateKernel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| auto kernelState = &BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_MbBRC_UPDATE]; |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_MB_BRC_UPDATE; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| // Setup MbBRC Curbe |
| CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS brcUpdateCurbeParams; |
| MOS_ZeroMemory(&brcUpdateCurbeParams, sizeof(brcUpdateCurbeParams)); |
| brcUpdateCurbeParams.ucEnableROI = (uint8_t)bBrcRoiEnabled; |
| brcUpdateCurbeParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcMbBrcUpdate( |
| &brcUpdateCurbeParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| // Setup ROI Surface |
| if (bBrcRoiSupported && bBrcRoiEnabled) |
| { |
| SetupROISurface(); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcHistoryBuffer, |
| CodechalDbgAttr::attrInput, |
| "HistoryRead", |
| m_brcHistoryBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_MB_BRC_UPDATE));) |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| //Add surface state |
| CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS brcUpdateSurfaceParams; |
| MOS_ZeroMemory(&brcUpdateSurfaceParams, sizeof(brcUpdateSurfaceParams)); |
| brcUpdateSurfaceParams.pBrcBuffers = &BrcBuffers; |
| brcUpdateSurfaceParams.bMbBrcEnabled = bMbBrcEnabled; |
| brcUpdateSurfaceParams.bBrcRoiEnabled = bBrcRoiEnabled; |
| brcUpdateSurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x; |
| brcUpdateSurfaceParams.dwDownscaledFrameFieldHeightInMb4x = m_downscaledFrameFieldHeightInMb4x; |
| brcUpdateSurfaceParams.psRoiSurface = &BrcBuffers.sBrcRoiSurface; |
| brcUpdateSurfaceParams.presMbStatBuffer = &m_resMbStatsBuffer; |
| brcUpdateSurfaceParams.dwBrcPakStatisticsSize = m_brcPakStatisticsSize; |
| brcUpdateSurfaceParams.dwBrcHistoryBufferSize = m_brcHistoryBufferSize; |
| brcUpdateSurfaceParams.ucCurrRecycledBufIdx = m_currRecycledBufIdx; |
| brcUpdateSurfaceParams.pBrcUpdateBindingTable = &BrcUpdateBindingTable; |
| brcUpdateSurfaceParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcBrcMbUpdateSurfaces( |
| &cmdBuffer, |
| &brcUpdateSurfaceParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| // set-up media walker |
| CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams; |
| MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams)); |
| walkerCodecParams.WalkerMode = m_walkerMode; |
| walkerCodecParams.dwResolutionX = MOS_ROUNDUP_SHIFT(m_picWidthInMb, 2); |
| walkerCodecParams.dwResolutionY = MOS_ROUNDUP_SHIFT(m_picHeightInMb, 2); |
| walkerCodecParams.bNoDependency = true; |
| walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported; |
| |
| MHW_WALKER_PARAMS walkerParams; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams( |
| m_hwInterface, |
| &walkerParams, |
| &walkerCodecParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd( |
| &cmdBuffer, |
| &walkerParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| encFunctionType, |
| nullptr)); |
| ) |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::WPKernel(bool useRefPicList1, uint32_t index) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| if (Mos_ResourceIsNull(&WeightedPredOutputPicSelectList[0].sBuffer.OsResource)) |
| { |
| // initiate allocation parameters |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferNV12; |
| MOS_ZeroMemory(&allocParamsForBufferNV12, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBufferNV12.Type = MOS_GFXRES_2D; |
| allocParamsForBufferNV12.TileType = MOS_TILE_Y; |
| allocParamsForBufferNV12.Format = Format_NV12; |
| |
| // WP allocation |
| auto refPicSelect = WeightedPredOutputPicSelectList; |
| for (uint32_t i = 0; i < CODEC_AVC_NUM_WP_FRAME; i++) |
| { |
| MOS_ZeroMemory(&refPicSelect[i].sBuffer, sizeof(MOS_SURFACE)); |
| refPicSelect[i].FrameIdx = CODECHAL_ENCODE_AVC_INVALID_PIC_ID; |
| refPicSelect[i].sBuffer.dwWidth = m_frameWidth; |
| refPicSelect[i].sBuffer.dwHeight = m_frameHeight; |
| |
| allocParamsForBufferNV12.dwWidth = refPicSelect[i].sBuffer.dwWidth; |
| allocParamsForBufferNV12.dwHeight = refPicSelect[i].sBuffer.dwHeight; |
| allocParamsForBufferNV12.pBufName = "WP Scaled output Buffer"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferNV12, |
| &refPicSelect[i].sBuffer.OsResource), |
| "Failed to allocate WP Scaled output Buffer."); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo( |
| m_osInterface, |
| &refPicSelect[i].sBuffer)); |
| } |
| } |
| |
| auto refList = &m_refList[0]; |
| auto currRefList = m_refList[m_currReconstructedPic.FrameIdx]; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_WP_KERNEL; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType = CODECHAL_MEDIA_STATE_ENC_WP; |
| |
| auto kernelState = pWPKernelState; |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| // Set up the DSH/SSH as normal |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| // Setup AVC Curbe |
| CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS wpcurbeParams; |
| MOS_ZeroMemory(&wpcurbeParams, sizeof(wpcurbeParams)); |
| wpcurbeParams.RefPicListIdx = (useRefPicList1) ? LIST_1 : LIST_0; |
| wpcurbeParams.WPIdx = index; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcWP( |
| &wpcurbeParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| uint8_t picIndex = 0; |
| uint8_t wpindex; |
| uint8_t refVDirection; |
| uint32_t refVerticalLineStride; |
| uint32_t refVerticalLineStrideOffset; |
| auto refPic = m_avcSliceParams->RefPicList[useRefPicList1][index]; |
| if (!CodecHal_PictureIsInvalid(refPic) && m_picIdx[refPic.FrameIdx].bValid) |
| { |
| picIndex = m_picIdx[refPic.FrameIdx].ucPicIdx; |
| refList[picIndex]->sRefBuffer = m_userFlags.bUseRawPicForRef ? |
| refList[picIndex]->sRefRawBuffer : refList[picIndex]->sRefReconBuffer; |
| |
| bool currFieldPicture = CodecHal_PictureIsField(m_currOriginalPic); |
| bool refBottomField = (CodecHal_PictureIsBottomField(refPic)); |
| |
| // 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; |
| refVerticalLineStride = CODECHAL_VLINESTRIDE_FIELD; |
| refVerticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_BOT_FIELD; |
| } |
| else |
| { |
| refVDirection = CODECHAL_VDIRECTION_TOP_FIELD; |
| refVerticalLineStride = CODECHAL_VLINESTRIDE_FIELD; |
| refVerticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_TOP_FIELD; |
| } |
| } |
| else // if current picture is frame |
| { |
| refVDirection = CODECHAL_VDIRECTION_FRAME; |
| refVerticalLineStride = CODECHAL_VLINESTRIDE_FRAME; |
| refVerticalLineStrideOffset = CODECHAL_VLINESTRIDEOFFSET_TOP_FIELD; |
| } |
| |
| (useRefPicList1) ? bUseWeightedSurfaceForL1 = true : bUseWeightedSurfaceForL0 = true; |
| } |
| else |
| { |
| (useRefPicList1) ? bUseWeightedSurfaceForL1 = false : bUseWeightedSurfaceForL0 = false; |
| return eStatus; |
| } |
| |
| CodecHalGetResourceInfo(m_osInterface, &refList[picIndex]->sRefBuffer); |
| |
| //Add surface states |
| CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS wpsurfaceParams; |
| MOS_ZeroMemory(&wpsurfaceParams, sizeof(wpsurfaceParams)); |
| |
| wpsurfaceParams.psInputRefBuffer = &refList[picIndex]->sRefBuffer; |
| if (useRefPicList1) { |
| wpindex = CODEC_AVC_WP_OUTPUT_L1_START + index; |
| } |
| else { |
| wpindex = CODEC_AVC_WP_OUTPUT_L0_START + index; |
| } |
| wpsurfaceParams.psOutputScaledBuffer = &(WeightedPredOutputPicSelectList[wpindex].sBuffer); |
| wpsurfaceParams.ucVDirection = refVDirection; |
| wpsurfaceParams.dwVerticalLineStride = refVerticalLineStride; |
| wpsurfaceParams.dwVerticalLineStrideOffset = refVerticalLineStrideOffset; |
| wpsurfaceParams.pKernelState = kernelState; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcWPSurfaces(&cmdBuffer, &wpsurfaceParams)); |
| |
| if (m_hwWalker) |
| { |
| uint32_t resolutionX = CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_frameWidth); |
| uint32_t resolutionY = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight); |
| |
| CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams; |
| MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams)); |
| walkerCodecParams.WalkerMode = m_walkerMode; |
| walkerCodecParams.bUseScoreboard = m_useHwScoreboard; |
| walkerCodecParams.dwResolutionX = resolutionX; |
| walkerCodecParams.dwResolutionY = resolutionY; |
| walkerCodecParams.wPictureCodingType = m_pictureCodingType; |
| walkerCodecParams.bMbaff = m_mbaffEnabled; |
| walkerCodecParams.dwNumSlices = m_numSlices; |
| walkerCodecParams.usSliceHeight = m_sliceHeight; |
| walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported; |
| walkerCodecParams.ucGroupId = m_groupId; |
| walkerCodecParams.bNoDependency = true; /* Enforce no dependency dispatch order for Scaling kernel, */ |
| |
| MHW_WALKER_PARAMS walkerParams; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams( |
| m_hwInterface, |
| &walkerParams, |
| &walkerCodecParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd( |
| &cmdBuffer, |
| &walkerParams)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| // Add dump for WP surface state heap here |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| encFunctionType, |
| nullptr))); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if ((!m_singleTaskPhaseSupported || m_lastTaskInPhase)) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| currRefList->ucMADBufferIdx = m_currMadBufferIdx; |
| currRefList->bMADEnabled = m_madEnabled; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SFDKernel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_ME_KERNEL; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| // set function type and kernel state pointer |
| auto encFunctionType = CODECHAL_MEDIA_STATE_STATIC_FRAME_DETECTION; |
| auto kernelState = pSFDKernelState; |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| // set-up SFD Curbe |
| CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS sfdcurbeParams; |
| MOS_ZeroMemory(&sfdcurbeParams, sizeof(sfdcurbeParams)); |
| sfdcurbeParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeAvcSFD( |
| &sfdcurbeParams)); |
| |
| // dump DSH/Curbe/ISH |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| encFunctionType, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = encFunctionType; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| // Add surface states |
| CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS sfdsurfaceParams; |
| MOS_ZeroMemory(&sfdsurfaceParams, sizeof(sfdsurfaceParams)); |
| sfdsurfaceParams.dwDownscaledWidthInMb4x = m_downscaledWidthInMb4x; |
| sfdsurfaceParams.dwDownscaledHeightInMb4x = m_downscaledFrameFieldHeightInMb4x; |
| sfdsurfaceParams.psMeMvDataSurface = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer; |
| sfdsurfaceParams.dwMeMvBottomFieldOffset = m_hmeKernel ? m_hmeKernel->Get4xMeMvBottomFieldOffset() : (uint32_t)m_meMvBottomFieldOffset; |
| sfdsurfaceParams.psMeDistortionSurface = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xDistortionBuffer) : &m_4xMeDistortionBuffer; |
| sfdsurfaceParams.dwMeDistortionBottomFieldOffset = m_hmeKernel ? m_hmeKernel->GetDistortionBottomFieldOffset() : (uint32_t)m_meDistortionBottomFieldOffset; |
| sfdsurfaceParams.presOutputBuffer = &resSFDOutputBuffer[0]; |
| sfdsurfaceParams.pKernelState = kernelState; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendAvcSFDSurfaces( |
| &cmdBuffer, |
| &sfdsurfaceParams)); |
| |
| // dump SSH |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| encFunctionType, |
| MHW_SSH_TYPE, |
| kernelState)); |
| ) |
| |
| MHW_MEDIA_OBJECT_PARAMS mediaObjectParams; |
| MediaObjectInlineData mediaObjectInlineData; |
| MOS_ZeroMemory(&mediaObjectParams, sizeof(mediaObjectParams)); |
| MOS_ZeroMemory(&mediaObjectInlineData, sizeof(mediaObjectInlineData)); |
| mediaObjectParams.pInlineData = &mediaObjectInlineData; |
| mediaObjectParams.dwInlineDataSize = sizeof(mediaObjectInlineData); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObject( |
| &cmdBuffer, |
| nullptr, |
| &mediaObjectParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, encFunctionType)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| encFunctionType, |
| nullptr)); |
| ) |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SetCurbeAvcSFD(PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pKernelState); |
| |
| CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON curbe; |
| MOS_ZeroMemory(&curbe, sizeof(curbe)); |
| curbe.DW0.EnableIntraCostScalingForStaticFrame = 1; |
| curbe.DW0.EnableAdaptiveMvStreamIn = 0; |
| curbe.DW0.StreamInType = 7; |
| curbe.DW0.SliceType = (m_pictureCodingType + 1) % 3; |
| curbe.DW0.BRCModeEnable = (bBrcEnabled != 0); |
| curbe.DW0.VDEncModeDisable = true; |
| |
| curbe.DW1.HMEStreamInRefCost = 5; |
| curbe.DW1.NumOfRefs = m_avcSliceParams->num_ref_idx_l0_active_minus1; |
| curbe.DW1.QPValue = m_avcPicParam->QpY + m_avcSliceParams->slice_qp_delta; |
| |
| // SFD kernel requires to round-down to 4-MB aligned |
| curbe.DW2.FrameHeightInMBs = (m_oriFrameHeight / CODECHAL_MACROBLOCK_HEIGHT >> 2) << 2; |
| curbe.DW2.FrameWidthInMBs = (m_oriFrameWidth / CODECHAL_MACROBLOCK_WIDTH >> 2) << 2; |
| curbe.DW3.LargeMvThresh = 128; |
| uint32_t totalMb = curbe.DW2.FrameWidthInMBs * curbe.DW2.FrameHeightInMBs; |
| curbe.DW4.TotalLargeMvThreshold = totalMb / 100; |
| curbe.DW5.ZMVThreshold = 4; |
| curbe.DW6.TotalZMVThreshold = totalMb * m_avcPicParam->dwZMvThreshold / 100; |
| curbe.DW7.MinDistThreshold = 10; |
| |
| if (P_TYPE == m_pictureCodingType) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(curbe.CostTable, CODEC_AVC_NUM_QP * sizeof(uint8_t), m_codechalEncodeAvcSfdCostTablePFrame, CODEC_AVC_NUM_QP * sizeof(uint8_t)), |
| "Failed to copy P-frame SFD cost table"); |
| } |
| else if (B_TYPE == m_pictureCodingType) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(curbe.CostTable, CODEC_AVC_NUM_QP * sizeof(uint8_t), m_codechalEncodeAvcSfdCostTableBFrame, CODEC_AVC_NUM_QP * sizeof(uint8_t)), |
| "Failed to copy B-frame SFD cost table"); |
| } |
| |
| curbe.DW21.ActualHeightInMB = curbe.DW2.FrameHeightInMBs; |
| curbe.DW21.ActualWidthInMB = curbe.DW2.FrameWidthInMBs; |
| curbe.DW26.MVDataSurfaceIndex = CODECHAL_ENCODE_AVC_SFD_MV_DATA_SURFACE_COMMON; |
| curbe.DW27.InterDistortionSurfaceIndex = CODECHAL_ENCODE_AVC_SFD_INTER_DISTORTION_SURFACE_COMMON; |
| curbe.DW28.OutputDataSurfaceIndex = CODECHAL_ENCODE_AVC_SFD_OUTPUT_DATA_SURFACE_COMMON; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &curbe, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(curbe))); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SetSequenceStructs() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto seqParams = m_avcSeqParam; |
| |
| if (m_targetUsageOverride) |
| { |
| seqParams->TargetUsage = m_targetUsageOverride; |
| } |
| |
| if (m_feiEnable) |
| { |
| // FEI kernel is based on normal mode TU = TARGETUSAGE_RT_SPEED(4) |
| seqParams->TargetUsage = TARGETUSAGE_RT_SPEED; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::SetSequenceStructs()); |
| |
| // If 16xMe is supported then check if it is supported in the TU settings |
| if (!m_16xMeUserfeatureControl && m_16xMeSupported) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetHmeSupportedBasedOnTU(HME_LEVEL_16x, &m_16xMeSupported)); |
| } |
| |
| // If 32xMe is supported then check if it is supported in the TU settings |
| if (!m_32xMeUserfeatureControl && m_32xMeSupported) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetHmeSupportedBasedOnTU(HME_LEVEL_32x, &m_32xMeSupported)); |
| } |
| |
| if (m_firstFrame) |
| { |
| m_oriFrameHeight = seqParams->FrameHeight; |
| m_oriFrameWidth = seqParams->FrameWidth; |
| } |
| |
| // check if there is a dynamic resolution change |
| if ((m_oriFrameHeight && (m_oriFrameHeight != seqParams->FrameHeight)) || |
| (m_oriFrameWidth && (m_oriFrameWidth != seqParams->FrameWidth))) |
| { |
| m_resolutionChanged = true; |
| m_oriFrameHeight = seqParams->FrameHeight; |
| m_oriFrameWidth = seqParams->FrameWidth; |
| // Need to call BRCInit instead of BRCReset for dynamic resolution change |
| bBrcInit = true; |
| } |
| else |
| { |
| m_resolutionChanged = false; |
| } |
| |
| usAVBRAccuracy = CODECHAL_ENCODE_AVC_DEFAULT_AVBR_ACCURACY; |
| usAVBRConvergence = CODECHAL_ENCODE_AVC_DEFAULT_AVBR_CONVERGENCE; |
| |
| bBrcEnabled = |
| CodecHalIsRateControlBrc(seqParams->RateControlMethod, CODECHAL_AVC); |
| |
| if (m_osInterface->osCpInterface->IsHMEnabled()) |
| { |
| // use MbEnc Adv kernel when DSH protection is disabled and Brc is enabled |
| if (bBrcEnabled) |
| { |
| bAdvancedDshInUse = true; |
| bUseMbEncAdvKernel = true; |
| } |
| } |
| |
| if (ucMbBrcSupportCaps && bBrcEnabled) |
| { |
| // control MBBRC if the user feature key does not exist |
| if (!bMbBrcUserFeatureKeyControl) |
| { |
| if (seqParams->RateControlMethod == RATECONTROL_ICQ || seqParams->RateControlMethod == RATECONTROL_QVBR) |
| { |
| // If the rate control method is ICQ or QVBR then enable MBBRC by default for all TUs and ignore the app input |
| bMbBrcEnabled = true; |
| CODECHAL_ENCODE_NORMALMESSAGE("MBBRC enabled with rate control = %d", seqParams->RateControlMethod); |
| } |
| else if (seqParams->RateControlMethod == RATECONTROL_VCM) |
| { |
| // If the rate control method is VCM then disable MBBRC by default for all TUs and ignore the app input |
| bMbBrcEnabled = false; |
| } |
| else |
| { |
| switch (seqParams->MBBRC) |
| { |
| case mbBrcInternal: |
| // Enable or disable MBBRC based on TU |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetMbBrcEnabled(seqParams->TargetUsage, &bMbBrcEnabled)); |
| break; |
| case mbBrcDisabled: |
| bMbBrcEnabled = false; |
| break; |
| case mbBrcEnabled: |
| bMbBrcEnabled = true; |
| break; |
| } |
| } |
| } |
| } |
| |
| dwTrellis = seqParams->Trellis; |
| bROIValueInDeltaQP = seqParams->ROIValueInDeltaQP; |
| |
| // Simple check for BRC parameters; if error, disable BRC and continue encoding |
| if (bBrcEnabled && |
| ((((!seqParams->InitVBVBufferFullnessInBit || |
| !seqParams->VBVBufferSizeInBit || |
| !seqParams->MaxBitRate) && |
| (seqParams->RateControlMethod != RATECONTROL_AVBR)) || |
| !seqParams->TargetBitRate || |
| !seqParams->FramesPer100Sec) && |
| seqParams->RateControlMethod != RATECONTROL_ICQ)) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Fatal error in AVC Encoding BRC parameters."); |
| CODECHAL_ENCODE_ASSERTMESSAGE("RateControlMethod = %d, InitVBVBufferFullnessInBit = %d, VBVBufferSizeInBit = %d, MaxBitRate = %d, TargetBitRate = %d, FramesPer100Sec = %d", |
| seqParams->RateControlMethod, seqParams->InitVBVBufferFullnessInBit, seqParams->VBVBufferSizeInBit, seqParams->MaxBitRate, seqParams->TargetBitRate, seqParams->FramesPer100Sec); |
| bBrcEnabled = false; |
| } |
| |
| // Mb Qp data is only enabled for CQP |
| if (bBrcEnabled) |
| { |
| bMbQpDataEnabled = false; |
| } |
| |
| // BRC Init or Reset |
| if (seqParams->bInitBRC) |
| { |
| bBrcInit = seqParams->bInitBRC; |
| } |
| else |
| { |
| bBrcReset = seqParams->bResetBRC; |
| } |
| |
| if (bBrcReset && |
| (!bBrcEnabled || |
| seqParams->RateControlMethod == RATECONTROL_ICQ || |
| !bBrcDistortionBufferSupported)) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("BRC Reset cannot be trigerred on SNB or in CQP/CBR/ICQ modes - invalid BRC parameters."); |
| bBrcReset = 0; |
| } |
| |
| if (seqParams->RateControlMethod == RATECONTROL_ICQ) |
| { |
| if (seqParams->ICQQualityFactor < CODECHAL_ENCODE_AVC_MIN_ICQ_QUALITYFACTOR || |
| seqParams->ICQQualityFactor > CODECHAL_ENCODE_AVC_MAX_ICQ_QUALITYFACTOR) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid ICQ Quality Factor input\n"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| } |
| |
| if (bBrcEnabled && !bPerMbSFD) |
| { |
| bStaticFrameDetectionEnable = false; |
| } |
| |
| // if GOP structure is I-frame only, we use 3 non-ref slots for tracked buffer |
| m_gopIsIdrFrameOnly = (seqParams->GopPicSize == 1 && seqParams->GopRefDist == 0); |
| |
| // Set sliding window size to one second by default, up to 60 |
| if (dwSlidingWindowSize == 0) |
| { |
| dwSlidingWindowSize = MOS_MIN((uint32_t)(seqParams->FramesPer100Sec / 100), 60); |
| } |
| |
| m_maxNumSlicesAllowed = CodecHalAvcEncode_GetMaxNumSlicesAllowed( |
| (CODEC_AVC_PROFILE_IDC)(seqParams->Profile), |
| (CODEC_AVC_LEVEL_IDC)(seqParams->Level), |
| seqParams->FramesPer100Sec); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SetPictureStructs() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto picParams = m_avcPicParam; |
| auto seqParams = m_avcSeqParam; |
| auto avcRefList = &m_refList[0]; |
| auto avcPicIdx = &m_picIdx[0]; |
| |
| uint8_t prevRefIdx = m_currReconstructedPic.FrameIdx; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(picParams); |
| uint8_t currRefIdx = picParams->CurrReconstructedPic.FrameIdx; |
| |
| int16_t prevFrameNum = m_frameNum; |
| int16_t currFrameNum = picParams->frame_num; |
| |
| if (m_firstFrame) |
| { |
| m_oriFieldCodingFlag = picParams->FieldCodingFlag; |
| } |
| |
| if (Mos_ResourceIsNull(&m_reconSurface.OsResource) && |
| (!picParams->UserFlags.bUseRawPicForRef || !(m_codecFunction == CODECHAL_FUNCTION_ENC || m_codecFunction == CODECHAL_FUNCTION_FEI_ENC))) |
| { |
| return MOS_STATUS_INVALID_PARAMETER; |
| } |
| |
| // Sync initialize |
| if ((m_firstFrame) || |
| (!bBrcEnabled && picParams->UserFlags.bUseRawPicForRef) || // No need to wait for previous PAK if reconstructed pic is not used as reference (but RAW pic is used for ref) |
| (!bBrcEnabled && (picParams->CodingType == I_TYPE)) || // No need to wait for I-Frames |
| (!bBrcEnabled && (currFrameNum == prevFrameNum) && |
| CodecHal_PictureIsFrame(picParams->CurrOriginalPic)) || // No need to wait if current and previous pics have same frame numbers (Same reference list is used for two pictures with same frame numbers) |
| (!bBrcEnabled && !avcRefList[prevRefIdx]->bUsedAsRef && |
| CodecHal_PictureIsField(picParams->CurrOriginalPic))) |
| { |
| m_waitForPak = false; |
| } |
| else |
| { |
| m_waitForPak = true; |
| } |
| |
| if ((bBrcEnabled || picParams->RefPicFlag)) |
| { |
| m_signalEnc = true; |
| } |
| else |
| { |
| m_signalEnc = false; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::SetPictureStructs()); |
| |
| // use MbEnc Adv kenrel if rolling I or DirtyROI is enabled |
| if (picParams->EnableRollingIntraRefresh || (picParams->NumDirtyROI > 0)) |
| { |
| bAdvancedDshInUse = bBrcEnabled; |
| bUseMbEncAdvKernel = true; |
| } |
| |
| bMbEncIFrameDistEnabled = |
| bBrcDistortionBufferSupported && |
| bBrcEnabled && |
| (m_pictureCodingType == I_TYPE); |
| |
| m_mfxInterface->SetBrcNumPakPasses(GetNumBrcPakPasses(picParams->BRCPrecision)); |
| if (bBrcEnabled) |
| { |
| // For ICQ mode, ignore BRCPrecision sent by the app and set the number of passes internally |
| if (seqParams->RateControlMethod == RATECONTROL_ICQ) |
| { |
| m_numPasses = CODECHAL_ENCODE_AVC_ICQ_NUM_OF_PASSES - 1; // 1 original plus extra to handle IPCM MBs |
| } |
| // If min/max QP control is on, set single PAK pass. |
| else if (bMinMaxQPControlEnabled) |
| { |
| m_numPasses = CODECHAL_ENCODE_BRC_SINGLE_PASS - 1; // single PAK pass, no IPCM (-1 because of the loop condition) |
| } |
| else |
| { |
| m_numPasses = (uint8_t)(m_mfxInterface->GetBrcNumPakPasses() - 1); // 1 original plus extra to handle BRC |
| } |
| // Call BrcInitReset kernel for field/frame mode change |
| if ((m_oriFieldCodingFlag != picParams->FieldCodingFlag) && (!m_firstFrame)) |
| { |
| bBrcReset = true; |
| m_oriFieldCodingFlag = picParams->FieldCodingFlag; |
| } |
| |
| // check if BRC ROI feature enabled |
| bBrcRoiEnabled = (seqParams->RateControlMethod != RATECONTROL_CQP) && picParams->NumROI; |
| |
| // allocated resource for MB-level BRC |
| if ((bMbBrcEnabled = (bMbBrcEnabled || bBrcRoiEnabled))) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateResourcesMbBrc()); |
| } |
| } |
| else |
| { |
| // legacy AVC : 1 original plus extra to handle IPCM MBs |
| m_numPasses = (CODECHAL_ENCODE_AVC_CQP_NUM_OF_PASSES - 1); |
| |
| if (picParams->bEnableQpAdjustment) |
| { |
| bMbBrcEnabled = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateResourcesMbBrc()); |
| } |
| } |
| |
| //add for multiple Pass Pak |
| if (CodecHalIsFeiEncode(m_codecFunction)) |
| { |
| CodecEncodeAvcFeiPicParams *feiPicParams; |
| |
| feiPicParams = (CodecEncodeAvcFeiPicParams *)m_encodeParams.pFeiPicParams; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(feiPicParams); |
| if (feiPicParams->dwMaxFrameSize != 0) |
| { |
| m_numPasses = (uint8_t)feiPicParams->dwNumPasses; //-1+1 for additional one IPCM pass |
| } |
| } |
| else if (CodecHalUsesPakEngine(m_codecFunction) && picParams->dwMaxFrameSize != 0) |
| { |
| m_numPasses = (uint8_t)picParams->dwNumPasses; //-1+1 for additional one IPCM pass |
| } |
| |
| if (seqParams->RateControlMethod == RATECONTROL_VCM && m_pictureCodingType == B_TYPE) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("VCM BRC mode does not support B-frames\n"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| |
| if (seqParams->RateControlMethod == RATECONTROL_VCM && (picParams->FieldCodingFlag || picParams->FieldFrameCodingFlag)) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("VCM BRC mode does not support interlaced\n"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| |
| if (bRefPicSelectListSupported && m_encEnabled && m_refList[currRefIdx]->bUsedAsRef) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(InsertInRefPicSelectList()); |
| avcRefList[currRefIdx]->pRefPicSelectListEntry = &RefPicSelectList[ucCurrRefPicSelectIndex]; |
| } |
| else |
| { |
| avcRefList[currRefIdx]->pRefPicSelectListEntry = nullptr; |
| } |
| |
| // Force RepartitionCheck |
| CODECHAL_ENCODE_AVC_RPC forceRepartitionCheck; |
| |
| if (picParams != nullptr) |
| { |
| forceRepartitionCheck = (CODECHAL_ENCODE_AVC_RPC)picParams->ForceRepartitionCheck; |
| } |
| else |
| { |
| forceRepartitionCheck = CODECHAL_ENCODE_RPC_FOLLOW_DRIVER; |
| } |
| |
| switch (forceRepartitionCheck) |
| { |
| case CODECHAL_ENCODE_RPC_FOLLOW_DRIVER: |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetCAFEnabled(&bCAFEnable)); |
| break; |
| |
| case CODECHAL_ENCODE_RPC_FORCE_ENABLE: |
| bCAFEnable = 1; |
| break; |
| |
| case CODECHAL_ENCODE_RPC_FORCE_DISABLE: |
| bCAFEnable = 0; |
| break; |
| |
| default: |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid ForceRepartitionCheck Flag"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| break; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetATDEnabled()); |
| |
| // Flatness check is enabled only if scaling will be performed and CAF is enabled. Always enable Flatness for I_type to improve quality. |
| m_flatnessCheckEnabled = m_flatnessCheckSupported ? |
| ((bCAFEnable || ((m_pictureCodingType == I_TYPE))) && (m_hmeSupported || bBrcEnabled)) : 0; |
| |
| //ATD enabled or BRC enabled for dual pipe AVC on KBL |
| if (m_adaptiveTransformDecisionEnabled || (bBrcEnabled && m_forceBrcMbStatsEnabled)) |
| { |
| m_mbStatsEnabled = true; |
| } |
| else |
| { |
| m_mbStatsEnabled = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SetSliceStructs() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto slcParams = m_avcSliceParams; |
| auto seqParams = m_avcSeqParam; |
| auto picParams = m_avcPicParam; |
| if (m_pictureCodingType != I_TYPE) |
| { |
| CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS validateNumRefsParams; |
| validateNumRefsParams.pSeqParams = seqParams; |
| validateNumRefsParams.pPicParams = picParams; |
| validateNumRefsParams.pAvcSliceParams = slcParams; |
| validateNumRefsParams.wPictureCodingType = m_pictureCodingType; |
| validateNumRefsParams.wPicHeightInMB = m_picHeightInMb; |
| validateNumRefsParams.wFrameFieldHeightInMB = m_frameFieldHeightInMb; |
| validateNumRefsParams.bFirstFieldIPic = m_firstFieldIdrPic; |
| validateNumRefsParams.bVDEncEnabled = false; |
| validateNumRefsParams.bPAKonly = (m_codecFunction == CODECHAL_FUNCTION_FEI_PAK) ? true : false; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(ValidateNumReferences(&validateNumRefsParams)); |
| } |
| else |
| { |
| slcParams->num_ref_idx_l0_active_minus1 = 0; |
| slcParams->num_ref_idx_l1_active_minus1 = 0; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::SetSliceStructs()); |
| |
| if (eStatus == MOS_STATUS_INVALID_PARAMETER) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid slice parameters."); |
| } |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SendBrcInitResetSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_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->presBrcHistoryBuffer); |
| |
| uint32_t kernelIdx = |
| (bBrcInit) ? CODECHAL_ENCODE_BRC_IDX_INIT : CODECHAL_ENCODE_BRC_IDX_RESET; |
| auto kernelState = &BrcKernelStates[kernelIdx]; |
| |
| // BRC history buffer |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams; |
| uint32_t size = MOS_BYTES_TO_DWORDS(m_brcHistoryBufferSize); |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.presBuffer = params->presBrcHistoryBuffer; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_HISTORY_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // AVC_ME BRC Distortion data buffer - output |
| params->psMeBrcDistortionBuffer->dwWidth = MOS_ALIGN_CEIL((params->dwDownscaledWidthInMb4x * 8), 64); |
| params->psMeBrcDistortionBuffer->dwHeight = |
| MOS_ALIGN_CEIL((params->dwDownscaledFrameFieldHeightInMb4x * 4), 8); |
| |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.psSurface = params->psMeBrcDistortionBuffer; |
| surfaceCodecParams.dwOffset = params->dwMeBrcDistortionBottomFieldOffset; |
| surfaceCodecParams.dwSize = size; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SendAvcSFDSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params); |
| |
| auto kernelState = params->pKernelState; |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceCodecParams; |
| // HME MV Data surface |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeMvDataSurface); |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psMeMvDataSurface; |
| surfaceCodecParams.dwOffset = params->dwMeMvBottomFieldOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_SFD_MV_DATA_SURFACE_COMMON; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // HME distortion surface |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeDistortionSurface); |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.bIs2DSurface = true; |
| surfaceCodecParams.bMediaBlockRW = true; |
| surfaceCodecParams.psSurface = params->psMeDistortionSurface; |
| surfaceCodecParams.dwOffset = params->dwMeDistortionBottomFieldOffset; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_SFD_INTER_DISTORTION_SURFACE_COMMON; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| // output buffer |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->presOutputBuffer); |
| MOS_ZeroMemory(&surfaceCodecParams, sizeof(CODECHAL_SURFACE_CODEC_PARAMS)); |
| surfaceCodecParams.presBuffer = params->presOutputBuffer; |
| surfaceCodecParams.dwSize = MOS_BYTES_TO_DWORDS(CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON); |
| surfaceCodecParams.dwOffset = 0; |
| surfaceCodecParams.bRenderTarget = true; |
| surfaceCodecParams.bIsWritable = true; |
| surfaceCodecParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value; |
| surfaceCodecParams.dwBindingTableOffset = CODECHAL_ENCODE_AVC_SFD_OUTPUT_DATA_SURFACE_COMMON; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceCodecParams, |
| kernelState)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::InitializePicture(const EncoderParams& params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto ppsidx = ((PCODEC_AVC_ENCODE_SLICE_PARAMS)(params.pSliceParams))->pic_parameter_set_id; |
| auto spsidx = ((PCODEC_AVC_ENCODE_PIC_PARAMS)(params.pPicParams))->seq_parameter_set_id; |
| |
| m_madEnabled = params.bMADEnabled; |
| |
| m_avcSeqParams[spsidx] = (PCODEC_AVC_ENCODE_SEQUENCE_PARAMS)(params.pSeqParams); |
| m_avcPicParams[ppsidx] = (PCODEC_AVC_ENCODE_PIC_PARAMS)(params.pPicParams); |
| m_avcQCParams = (PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS)params.pAVCQCParams; |
| m_avcRoundingParams = (PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS)params.pAVCRoundingParams; |
| |
| m_avcSeqParam = m_avcSeqParams[spsidx]; |
| m_avcPicParam = m_avcPicParams[ppsidx]; |
| m_avcVuiParams = (PCODECHAL_ENCODE_AVC_VUI_PARAMS)params.pVuiParams; |
| m_avcSliceParams = (PCODEC_AVC_ENCODE_SLICE_PARAMS)params.pSliceParams; |
| m_avcFeiPicParams = (CodecEncodeAvcFeiPicParams *)params.pFeiPicParams; |
| m_avcIQMatrixParams = (PCODEC_AVC_IQ_MATRIX_PARAMS)params.pIQMatrixBuffer; |
| m_avcIQWeightScaleLists = (PCODEC_AVC_ENCODE_IQ_WEIGTHSCALE_LISTS)params.pIQWeightScaleLists; |
| m_nalUnitParams = params.ppNALUnitParams; |
| m_sliceStructCaps = params.uiSlcStructCaps; |
| |
| m_skipFrameFlag = m_avcPicParam->SkipFrameFlag; |
| |
| // Picture and slice header packing flag from DDI caps |
| bAcceleratorHeaderPackingCaps = params.bAcceleratorHeaderPackingCaps; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcIQMatrixParams); |
| |
| // so far this only applies to AVC |
| // can move to MotionEstimationDisableCheck() if the logic applies to other codecs later |
| if ((!m_feiEnable) && (m_avcQCParams )) |
| { |
| // disable 4x/16x/32 HME if DDI wants to do so, enabling logic is not affected |
| if (m_avcQCParams ->HMEDisable) |
| { |
| m_hmeSupported = false; |
| m_16xMeSupported = false; |
| m_32xMeSupported = false; |
| } |
| else if (m_avcQCParams ->SuperHMEDisable) |
| { |
| m_16xMeSupported = false; |
| m_32xMeSupported = false; |
| } |
| else if (m_avcQCParams ->UltraHMEDisable) |
| { |
| m_32xMeSupported = false; |
| } |
| } |
| |
| // Mb Qp data |
| bMbQpDataEnabled = params.bMbQpDataEnabled; |
| if (bMbQpDataEnabled) |
| { |
| sMbQpDataSurface = *(params.psMbQpDataSurface); |
| } |
| |
| // Mb Disable Skip Map |
| bMbDisableSkipMapEnabled = params.bMbDisableSkipMapEnabled; |
| if (bMbDisableSkipMapEnabled) |
| { |
| psMbDisableSkipMapSurface = params.psMbDisableSkipMapSurface; |
| } |
| |
| // Sei for AVC |
| if (params.pSeiData != nullptr) |
| { |
| if (params.pSeiData->dwSEIBufSize > 0) // sei is present |
| { |
| if (params.pSeiData->dwSEIBufSize > SeiData.dwSEIBufSize) |
| { |
| // Destroy and re-allocate |
| if (SeiData.pSEIBuffer) |
| { |
| MOS_FreeMemory(SeiData.pSEIBuffer); |
| SeiData.pSEIBuffer = nullptr; |
| } |
| SeiData.dwSEIBufSize = params.pSeiData->dwSEIBufSize; |
| SeiData.pSEIBuffer = (uint8_t *)MOS_AllocAndZeroMemory(SeiData.dwSEIBufSize); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(SeiData.pSEIBuffer); |
| } |
| |
| pSeiParamBuffer = params.pSeiParamBuffer; |
| dwSEIDataOffset = params.dwSEIDataOffset; |
| SeiData.newSEIData = params.pSeiData->newSEIData; |
| SeiData.dwSEIDataSize = params.pSeiData->dwSEIDataSize; |
| |
| eStatus = MOS_SecureMemcpy(SeiData.pSEIBuffer, |
| SeiData.dwSEIDataSize, |
| (pSeiParamBuffer + dwSEIDataOffset), |
| SeiData.dwSEIDataSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| |
| m_extraPictureStatesSize = SeiData.dwSEIDataSize; |
| } |
| |
| m_deblockingEnabled = 0; |
| for (uint32_t i = 0; i < m_numSlices; i++) |
| { |
| if (m_avcSliceParams[i].disable_deblocking_filter_idc != 1) |
| { |
| m_deblockingEnabled = 1; |
| break; |
| } |
| } |
| |
| if (m_newSeq) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetSequenceStructs()); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetPictureStructs()); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetSliceStructs()); |
| |
| // MB control data |
| bMbSpecificDataEnabled = false; // Reset this flag at start of each frame encode. |
| if (params.pMbCtrlBuffer) |
| { |
| bMbSpecificDataEnabled = true; |
| |
| MOS_LOCK_PARAMS lockFlagsWriteOnly; |
| MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(lockFlagsWriteOnly)); |
| lockFlagsWriteOnly.WriteOnly = true; |
| |
| PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS mbSpecificData = nullptr; |
| CODECHAL_ENCODE_CHK_NULL_RETURN(mbSpecificData = \ |
| (PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &resMbSpecificDataBuffer[m_currRecycledBufIdx], |
| &lockFlagsWriteOnly)); |
| |
| uint32_t frameFieldMbNum = m_picWidthInMb * m_frameFieldHeightInMb; |
| for (unsigned idx = 0; idx < frameFieldMbNum; ++idx) |
| { |
| mbSpecificData[idx].DW0.ForceToIntra = params.pMbCtrlBuffer[idx].MBParams.bForceIntra; |
| } |
| |
| m_osInterface->pfnUnlockResource(m_osInterface, &resMbSpecificDataBuffer[m_currRecycledBufIdx]); |
| } |
| |
| // Scaling occurs when either HME or BRC is enabled, and for Interlaced only called on first field |
| m_scalingEnabled = (m_hmeSupported || bBrcEnabled) && m_firstField; |
| m_useRawForRef = m_userFlags.bUseRawPicForRef; |
| |
| //Allocate and Generate the slice map surface |
| if (m_arbitraryNumMbsInSlice) |
| { |
| /********** Allocate slice map surface **********/ |
| |
| if (Mos_ResourceIsNull(&m_sliceMapSurface[m_currRecycledBufIdx].OsResource)) // Allocate only if not allocated before |
| { |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| MOS_ZeroMemory(&m_sliceMapSurface[i], sizeof(MOS_SURFACE)); |
| m_sliceMapSurface[i].TileType = MOS_TILE_LINEAR; |
| m_sliceMapSurface[i].bArraySpacing = true; |
| m_sliceMapSurface[i].Format = Format_Buffer_2D; |
| m_sliceMapSurface[i].dwWidth = (m_picWidthInMb + 1) * sizeof(uint32_t); |
| m_sliceMapSurface[i].dwHeight = 2 * m_frameFieldHeightInMb; |
| m_sliceMapSurface[i].dwPitch = MOS_ALIGN_CEIL(m_sliceMapSurface[i].dwWidth, 64); |
| |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D; |
| MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBuffer2D.Type = MOS_GFXRES_2D; |
| allocParamsForBuffer2D.TileType = (MOS_TILE_TYPE)m_sliceMapSurface[i].TileType; |
| allocParamsForBuffer2D.Format = m_sliceMapSurface[i].Format; |
| allocParamsForBuffer2D.dwWidth = m_sliceMapSurface[i].dwPitch; |
| allocParamsForBuffer2D.dwHeight = m_sliceMapSurface[i].dwHeight; |
| allocParamsForBuffer2D.pBufName = "Slice Map Surface"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBuffer2D, |
| &m_sliceMapSurface[i].OsResource); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate slice map Surface."); |
| return eStatus; |
| } |
| } |
| } |
| else // If sSliceMapSurface was already allocated, reassign width and height, in case there was a dynamic resolution change. Pitch doesn't need to be udpated. |
| { |
| m_sliceMapSurface[m_currRecycledBufIdx].dwWidth = (m_picWidthInMb + 1) * sizeof(uint32_t); |
| m_sliceMapSurface[m_currRecycledBufIdx].dwHeight = 2 * m_frameFieldHeightInMb; |
| } |
| |
| /********** Generate slice map surface **********/ |
| uint8_t* data = nullptr; |
| MOS_LOCK_PARAMS lockFlagsWriteOnly; |
| MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(lockFlagsWriteOnly)); |
| lockFlagsWriteOnly.WriteOnly = true; |
| |
| // lock the internal lockable buffer. |
| CODECHAL_ENCODE_CHK_NULL_RETURN(data = (uint8_t*)m_osInterface->pfnLockResource(m_osInterface, |
| &m_sliceMapSurface[m_currRecycledBufIdx].OsResource, &lockFlagsWriteOnly)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EncodeGenerateSliceMap(data, m_avcSliceParams)); |
| |
| // Unlock the internal lockable buffer |
| m_osInterface->pfnUnlockResource(m_osInterface, &m_sliceMapSurface[m_currRecycledBufIdx].OsResource); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| m_debugInterface->m_currPic = m_avcPicParam->CurrOriginalPic; |
| m_debugInterface->m_bufferDumpFrameNum = m_storeData; |
| m_debugInterface->m_frameType = m_pictureCodingType; |
| |
| if (m_newSeq) { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpSeqParams( |
| m_avcSeqParam, |
| m_avcIQMatrixParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateConstParam()); |
| } |
| |
| if (m_newVuiData) { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpVuiParams( |
| m_avcVuiParams)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpPicParams( |
| m_avcPicParam, |
| m_avcIQMatrixParams)); |
| |
| if (m_feiEnable) { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpFeiPicParams( |
| m_avcFeiPicParams)); |
| } |
| |
| for (uint32_t i = 0; i < m_numSlices; i++) { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpSliceParams( |
| &m_avcSliceParams[i], |
| m_avcPicParam)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateDdiParam( |
| m_avcSeqParam, |
| m_avcPicParam, |
| &m_avcSliceParams[i])); |
| }) |
| |
| ulRefPicSelectBottomFieldOffset = 0; |
| BrcBuffers.dwMeBrcDistortionBottomFieldOffset = 0; |
| BrcBuffers.dwBrcMbQpBottomFieldOffset = 0; |
| |
| if (CodecHal_PictureIsField(m_currOriginalPic)) |
| { |
| if (CodecHal_PictureIsBottomField(m_currOriginalPic)) |
| { |
| if (bVMEKernelDump) |
| { |
| ulVMEKernelDumpBottomFieldOffset = |
| m_frameFieldHeightInMb * m_picWidthInMb * 64; |
| } |
| |
| ulRefPicSelectBottomFieldOffset = |
| MOS_ALIGN_CEIL((m_picWidthInMb * 8), 64) * |
| m_frameFieldHeightInMb; |
| BrcBuffers.dwMeBrcDistortionBottomFieldOffset = |
| BrcBuffers.sMeBrcDistortionBuffer.dwPitch * |
| MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4), 8); |
| BrcBuffers.dwBrcMbQpBottomFieldOffset = |
| MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 4), 64) * |
| MOS_ALIGN_CEIL((m_downscaledFrameFieldHeightInMb4x * 4), 8); |
| } |
| } |
| |
| // Set min/max QP values in AVC State based on frame type if atleast one of them is non-zero |
| if (m_avcPicParam->ucMinimumQP || m_avcPicParam->ucMaximumQP) |
| { |
| bMinMaxQPControlEnabled = true; |
| if (m_avcPicParam->CodingType == I_TYPE) |
| { |
| ucIMaxQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMaximumQP, 1), 51); // Clamp to the max QP to [1, 51] . Zero is not used by our Kernel. |
| ucIMinQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMinimumQP, 1), ucIMaxQP); // Clamp the min QP to [1, maxQP] to make sure minQP <= maxQP |
| if (!bPFrameMinMaxQPControl) |
| { |
| ucPMinQP = ucIMinQP; |
| ucPMaxQP = ucIMaxQP; |
| } |
| if (!bBFrameMinMaxQPControl) |
| { |
| ucBMinQP = ucIMinQP; |
| ucBMaxQP = ucIMaxQP; |
| } |
| } |
| else if (m_avcPicParam->CodingType == P_TYPE) |
| { |
| bPFrameMinMaxQPControl = true; |
| ucPMaxQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMaximumQP, 1), 51); // Clamp to the max QP to [1, 51]. Zero is not used by our Kernel. |
| ucPMinQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMinimumQP, 1), ucPMaxQP); // Clamp the min QP to [1, maxQP] to make sure minQP <= maxQP |
| if (!bBFrameMinMaxQPControl) |
| { |
| ucBMinQP = ucPMinQP; |
| ucBMaxQP = ucPMaxQP; |
| } |
| } |
| else // B_TYPE |
| { |
| bBFrameMinMaxQPControl = true; |
| ucBMaxQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMaximumQP, 1), 51); // Clamp to the max QP to [1, 51] . Zero is not used by our Kernel. |
| ucBMinQP = MOS_MIN(MOS_MAX(m_avcPicParam->ucMinimumQP, 1), ucBMaxQP); // Clamp the min QP to [1, maxQP] to make sure minQP <= maxQP |
| } |
| // Zero out the QP values, so we don't update the AVCState settings until new values are sent in MiscParamsRC |
| m_avcPicParam->ucMinimumQP = 0; |
| m_avcPicParam->ucMaximumQP = 0; |
| } |
| |
| if (!(m_codecFunction == CODECHAL_FUNCTION_ENC || m_codecFunction == CODECHAL_FUNCTION_FEI_ENC) |
| && !m_userFlags.bDisableAcceleratorHeaderPacking |
| && bAcceleratorHeaderPackingCaps) |
| { |
| CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS packPicHeaderParams; |
| packPicHeaderParams.pBsBuffer = &m_bsBuffer; |
| packPicHeaderParams.pPicParams = m_avcPicParam; |
| packPicHeaderParams.pSeqParams = m_avcSeqParam; |
| packPicHeaderParams.pAvcVuiParams = m_avcVuiParams; |
| packPicHeaderParams.pAvcIQMatrixParams = m_avcIQMatrixParams; |
| packPicHeaderParams.ppNALUnitParams = m_nalUnitParams; |
| packPicHeaderParams.pSeiData = &SeiData; |
| packPicHeaderParams.dwFrameHeight = m_frameHeight; |
| packPicHeaderParams.dwOriFrameHeight = m_oriFrameHeight; |
| packPicHeaderParams.wPictureCodingType = m_avcPicParam->CodingType; |
| packPicHeaderParams.bNewSeq = m_newSeq; |
| packPicHeaderParams.pbNewPPSHeader = &m_newPpsHeader; |
| packPicHeaderParams.pbNewSeqHeader = &m_newSeqHeader; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_PackPictureHeader(&packPicHeaderParams)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetStatusReportParams(m_refList[m_currReconstructedPic.FrameIdx])); |
| |
| m_bitstreamUpperBound = m_encodeParams.dwBitstreamSize; |
| uint8_t sliceQP = m_avcPicParam->pic_init_qp_minus26 + 26 + m_avcSliceParams->slice_qp_delta; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetSkipBiasAdjustment(sliceQP, m_avcSeqParam->GopRefDist, |
| &m_skipBiasAdjustmentEnable)); |
| |
| // Determine if Trellis Quantization should be enabled |
| MOS_ZeroMemory(&m_trellisQuantParams, sizeof(m_trellisQuantParams)); |
| // Trellis must remain switched off if it is explicitly disabled or picture is encoded with CAVLC |
| if (!(dwTrellis & trellisDisabled) && m_avcPicParam->entropy_coding_mode_flag) |
| { |
| if (dwTrellis == trellisInternal) |
| { |
| CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS tqInputParams; |
| tqInputParams.ucQP = sliceQP; |
| tqInputParams.ucTargetUsage = m_avcSeqParam->TargetUsage; |
| tqInputParams.wPictureCodingType = m_pictureCodingType; |
| tqInputParams.bBrcEnabled = bBrcEnabled; |
| tqInputParams.bVdEncEnabled = false; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetTrellisQuantization( |
| &tqInputParams, |
| &m_trellisQuantParams)); |
| } |
| else if ((m_pictureCodingType == I_TYPE && (dwTrellis & trellisEnabledI)) || |
| (m_pictureCodingType == P_TYPE && (dwTrellis & trellisEnabledP)) || |
| (m_pictureCodingType == B_TYPE && (dwTrellis & trellisEnabledB))) |
| { |
| m_trellisQuantParams.dwTqEnabled = true; |
| m_trellisQuantParams.dwTqRounding = CODECHAL_ENCODE_AVC_DEFAULT_TRELLIS_QUANT_ROUNDING; |
| } |
| } |
| |
| InitMfe(); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ExecuteKernelFunctions() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| auto slcParams = m_avcSliceParams; |
| auto sliceType = Slice_Type[slcParams->slice_type]; |
| |
| CODECHAL_DEBUG_TOOL( |
| //CodecHal_DbgMapSurfaceFormatToDumpFormat(m_rawSurfaceToEnc->Format, &u32DumpType); |
| 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; |
| MOS_ZeroMemory(&cscScalingKernelParams, 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)); |
| } |
| |
| // call SFD kernel after HME in same command buffer |
| if (staticFrameDetectionInUse) |
| { |
| m_lastTaskInPhase = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SFDKernel()); |
| } |
| |
| // 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 |
| } |
| |
| // Dump BrcDist 4X_ME buffer here because it will be overwritten in BrcFrameUpdateKernel |
| CODECHAL_DEBUG_TOOL( |
| if (m_hmeEnabled && bBrcDistortionBufferSupported) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.sMeBrcDistortionBuffer.OsResource, |
| CodechalDbgAttr::attrOutput, |
| "BrcDist", |
| BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight, |
| BrcBuffers.dwMeBrcDistortionBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_4X_ME)); |
| }) |
| |
| // 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)); |
| } |
| |
| // Separate the MBEnc kernel and BrcUpdate Kernel |
| if (IsMfeMbEncEnabled(false)) |
| { |
| m_lastTaskInPhase = 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; |
| |
| 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<(slcParams->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<(slcParams->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(true, 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, m_osInterface->pOsContext); |
| |
| // 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, m_osInterface->pOsContext); |
| |
| #endif // _DEBUG || _RELEASE_INTERNAL |
| |
| m_lastTaskInPhase = true; |
| |
| if (IsMfeMbEncEnabled(false)) |
| { |
| // Submit MBEnc kernel in the last stream |
| if (m_mfeLastStream) |
| { |
| m_lastEncPhase = true; |
| m_firstTaskInPhase = true; |
| m_lastTaskInPhase = true; |
| } |
| else |
| { |
| m_firstTaskInPhase = false; |
| m_lastTaskInPhase = false; |
| } |
| } |
| |
| 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(DumpEncodeKernelOutput()); |
| |
| if (bBrcEnabled) |
| { |
| bMbEncCurbeSetInBrcUpdate = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::DumpEncodeKernelOutput() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto staticFrameDetectionInUse = bStaticFrameDetectionEnable && m_hmeEnabled; |
| staticFrameDetectionInUse = !bPerMbSFD && staticFrameDetectionInUse; |
| CODECHAL_DEBUG_TOOL( |
| if (m_hmeEnabled) |
| { |
| CODECHAL_ME_OUTPUT_PARAMS meOutputParams; |
| MOS_ZeroMemory(&meOutputParams, sizeof(meOutputParams)); |
| meOutputParams.psMeMvBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xMvDataBuffer) : &m_4xMeMvDataBuffer; |
| meOutputParams.psMeDistortionBuffer = |
| m_4xMeDistortionBufferSupported ? |
| (m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me4xDistortionBuffer) : &m_4xMeDistortionBuffer) : nullptr; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeMvBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MvData", |
| meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch, |
| m_hmeKernel ? m_hmeKernel->Get4xMeMvBottomFieldOffset() : (uint32_t)m_meMvBottomFieldOffset, |
| 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, |
| m_hmeKernel ? m_hmeKernel->GetDistortionBottomFieldOffset() : (uint32_t)m_meDistortionBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_4X_ME)); |
| } |
| |
| if (m_16xMeEnabled) |
| { |
| meOutputParams.psMeMvBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me16xMvDataBuffer) : &m_16xMeMvDataBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN( |
| m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeMvBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MvData", |
| meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch, |
| m_hmeKernel ? m_hmeKernel->Get16xMeMvBottomFieldOffset() : (uint32_t)m_meMv16xBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_16X_ME)); |
| |
| if (m_32xMeEnabled) |
| { |
| meOutputParams.psMeMvBuffer = m_hmeKernel ? m_hmeKernel->GetSurface(CodechalKernelHme::SurfaceId::me32xMvDataBuffer) : &m_32xMeMvDataBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN( |
| m_debugInterface->DumpBuffer( |
| &meOutputParams.psMeMvBuffer->OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MvData", |
| meOutputParams.psMeMvBuffer->dwHeight *meOutputParams.psMeMvBuffer->dwPitch, |
| m_hmeKernel ? m_hmeKernel->Get32xMeMvBottomFieldOffset() : (uint32_t)m_meMv32xBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_32X_ME)); |
| } |
| } |
| } |
| if (staticFrameDetectionInUse) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &resSFDOutputBuffer[0], |
| CodechalDbgAttr::attrOutput, |
| "Out", |
| CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON, |
| 0, |
| CODECHAL_MEDIA_STATE_STATIC_FRAME_DETECTION)); |
| } |
| |
| if (bBrcEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcImageStatesWriteBuffer, |
| CodechalDbgAttr::attrOutput, |
| "ImgStateWrite", |
| BRC_IMG_STATE_SIZE_PER_PASS * m_hwInterface->GetMfxInterface()->GetBrcNumPakPasses(), |
| 0, |
| CODECHAL_MEDIA_STATE_BRC_UPDATE)); |
| |
| if (!Mos_ResourceIsNull(&BrcBuffers.sBrcMbQpBuffer.OsResource)) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.sBrcMbQpBuffer.OsResource, |
| CodechalDbgAttr::attrOutput, |
| "MbQp", |
| BrcBuffers.sBrcMbQpBuffer.dwPitch*BrcBuffers.sBrcMbQpBuffer.dwHeight, |
| BrcBuffers.dwBrcMbQpBottomFieldOffset, |
| CODECHAL_MEDIA_STATE_MB_BRC_UPDATE)); |
| } |
| if (bMbBrcEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &BrcBuffers.resBrcHistoryBuffer, |
| CodechalDbgAttr::attrOutput, |
| "HistoryWrite", |
| m_brcHistoryBufferSize, |
| 0, |
| CODECHAL_MEDIA_STATE_MB_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 * m_frameFieldHeightInMb * 16 * sizeof(uint32_t), |
| CodecHal_PictureIsBottomField(m_currOriginalPic) ? m_mbStatsBottomFieldOffset : 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)); |
| } |
| |
| 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[CODEC_WP_OUTPUT_L0_START + 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[CODEC_WP_OUTPUT_L1_START + 0].sBuffer, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| "WP_In_L1")); |
| } |
| |
| if (m_feiEnable) |
| { |
| if(m_avcFeiPicParams->bMBQp){ |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_avcFeiPicParams->resMBQp, |
| CodechalDbgAttr::attrInput, |
| "MbQp", |
| m_picWidthInMb * m_frameFieldHeightInMb + 3, |
| 0, |
| CODECHAL_MEDIA_STATE_ENC_QUALITY)); |
| |
| } |
| 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)); |
| } |
| |
| auto refList = &m_refList[0]; |
| auto currRefList = m_refList[m_currReconstructedPic.FrameIdx]; |
| // Dump MBEnc output buffer "MbCodebuffer" |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &currRefList->resRefMbCodeBuffer, |
| CodechalDbgAttr::attrOutput, |
| "EncMbCode", |
| m_picWidthInMb * m_frameFieldHeightInMb * 64, |
| CodecHal_PictureIsBottomField(currRefList->RefPic) ? m_frameFieldHeightInMb * m_picWidthInMb * 64 : 0, |
| CODECHAL_MEDIA_STATE_ENC_NORMAL)); |
| |
| // Dump MBEnc output buffer "MVdatabuffer" |
| if (m_mvDataSize) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &currRefList->resRefMvDataBuffer, |
| CodechalDbgAttr::attrOutput, |
| "MbData", |
| m_picWidthInMb * m_frameFieldHeightInMb * (32 * 4), |
| CodecHal_PictureIsBottomField(currRefList->RefPic) ? MOS_ALIGN_CEIL(m_frameFieldHeightInMb * m_picWidthInMb * (32 * 4), 0x1000) : 0, |
| CODECHAL_MEDIA_STATE_ENC_NORMAL)); |
| } |
| ) |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ExecutePictureLevel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcPicParam); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcSliceParams); |
| |
| MHW_BATCH_BUFFER batchBuffer; |
| MOS_ZeroMemory(&batchBuffer, sizeof(batchBuffer)); |
| batchBuffer.OsResource = BrcBuffers.resBrcImageStatesWriteBuffer; |
| batchBuffer.dwOffset = m_currPass * BRC_IMG_STATE_SIZE_PER_PASS; |
| batchBuffer.bSecondLevel = true; |
| |
| CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS encodePictureLevelParams; |
| MOS_ZeroMemory(&encodePictureLevelParams, sizeof(encodePictureLevelParams)); |
| encodePictureLevelParams.psPreDeblockSurface = &m_reconSurface; |
| encodePictureLevelParams.psPostDeblockSurface = &m_reconSurface; |
| encodePictureLevelParams.bBrcEnabled = bBrcEnabled; |
| encodePictureLevelParams.pImgStateBatchBuffer = &batchBuffer; |
| encodePictureLevelParams.presBrcHistoryBuffer = &BrcBuffers.resBrcHistoryBuffer; |
| |
| bool deblockingEnabled = m_deblockingEnabled; |
| bool suppressReconPic = |
| ((!m_refList[m_currReconstructedPic.FrameIdx]->bUsedAsRef) && m_suppressReconPicSupported); |
| encodePictureLevelParams.bDeblockerStreamOutEnable = 0; |
| encodePictureLevelParams.bPreDeblockOutEnable = !deblockingEnabled && !suppressReconPic; |
| encodePictureLevelParams.bPostDeblockOutEnable = deblockingEnabled && !suppressReconPic; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GenericEncodePictureLevel(&encodePictureLevelParams)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ExecuteSliceLevel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface->osCpInterface); |
| |
| auto cpInterface = m_hwInterface->GetCpInterface(); |
| auto avcSlcParams = m_avcSliceParams; |
| auto avcPicParams = m_avcPicParams[avcSlcParams->pic_parameter_set_id]; |
| auto avcSeqParams = m_avcSeqParams[avcPicParams->seq_parameter_set_id]; |
| auto slcData = m_slcData; |
| |
| // For use with the single task phase implementation |
| if (m_sliceStructCaps != CODECHAL_SLICE_STRUCT_ARBITRARYMBSLICE) |
| { |
| uint32_t numSlc = (m_frameFieldHeightInMb + m_sliceHeight - 1) / m_sliceHeight; |
| |
| if (numSlc != m_numSlices) |
| { |
| return MOS_STATUS_INVALID_PARAMETER; |
| } |
| } |
| |
| bool useBatchBufferForPakSlices = false; |
| if (m_singleTaskPhaseSupported && m_singleTaskPhaseSupportedInPak) |
| { |
| if (m_currPass == 0) |
| { |
| // The same buffer is used for all slices for all passes. |
| uint32_t batchBufferForPakSlicesSize = |
| (m_numPasses + 1) * m_numSlices * m_pakSliceSize; |
| if (batchBufferForPakSlicesSize > |
| (uint32_t)m_batchBufferForPakSlices[m_currRecycledBufIdx].iSize) |
| { |
| if (m_batchBufferForPakSlices[m_currRecycledBufIdx].iSize) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(ReleaseBatchBufferForPakSlices(m_currRecycledBufIdx)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateBatchBufferForPakSlices( |
| m_numSlices, |
| m_numPasses, |
| m_currRecycledBufIdx)); |
| } |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(Mhw_LockBb( |
| m_osInterface, |
| &m_batchBufferForPakSlices[m_currRecycledBufIdx])); |
| useBatchBufferForPakSlices = true; |
| } |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| if (m_osInterface->osCpInterface->IsCpEnabled()) |
| { |
| MHW_CP_SLICE_INFO_PARAMS sliceInfoParam; |
| sliceInfoParam.bLastPass = (m_currPass == m_numPasses) ? true : false; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(cpInterface->SetMfxProtectionState(false, &cmdBuffer, nullptr, &sliceInfoParam)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(cpInterface->UpdateParams(false)); |
| } |
| |
| avcSlcParams = m_avcSliceParams; |
| |
| CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS packSlcHeaderParams; |
| packSlcHeaderParams.pBsBuffer = &m_bsBuffer; |
| packSlcHeaderParams.pPicParams = avcPicParams; |
| packSlcHeaderParams.pSeqParams = m_avcSeqParam; |
| packSlcHeaderParams.ppRefList = &(m_refList[0]); |
| packSlcHeaderParams.CurrPic = m_currOriginalPic; |
| packSlcHeaderParams.CurrReconPic = m_currReconstructedPic; |
| packSlcHeaderParams.UserFlags = m_userFlags; |
| packSlcHeaderParams.NalUnitType = m_nalUnitType; |
| packSlcHeaderParams.wPictureCodingType = m_pictureCodingType; |
| packSlcHeaderParams.bVdencEnabled = false; |
| |
| MHW_VDBOX_AVC_SLICE_STATE sliceState; |
| MOS_ZeroMemory(&sliceState, sizeof(sliceState)); |
| sliceState.presDataBuffer = &m_resMbCodeSurface; |
| sliceState.pAvcPicIdx = &(m_picIdx[0]); |
| sliceState.pEncodeAvcSeqParams = m_avcSeqParam; |
| sliceState.pEncodeAvcPicParams = avcPicParams; |
| sliceState.pBsBuffer = &m_bsBuffer; |
| sliceState.ppNalUnitParams = m_nalUnitParams; |
| sliceState.bBrcEnabled = bBrcEnabled; |
| // Disable Panic mode when min/max QP control is on. kernel may disable it, but disable in driver also. |
| if (avcSeqParams->bForcePanicModeControl == 1) { |
| sliceState.bRCPanicEnable = (!avcSeqParams->bPanicModeDisable) && (!bMinMaxQPControlEnabled); |
| } else { |
| sliceState.bRCPanicEnable = m_panicEnable && (!bMinMaxQPControlEnabled); |
| } |
| sliceState.bAcceleratorHeaderPackingCaps = m_encodeParams.bAcceleratorHeaderPackingCaps; |
| sliceState.wFrameFieldHeightInMB = m_frameFieldHeightInMb; |
| |
| MHW_VDBOX_VD_PIPE_FLUSH_PARAMS vdPipelineFlushParams; |
| for (uint16_t slcCount = 0; slcCount < m_numSlices; slcCount++) |
| { |
| if (m_currPass == 0) |
| { |
| packSlcHeaderParams.pAvcSliceParams = &avcSlcParams[slcCount]; |
| if (bAcceleratorHeaderPackingCaps) |
| { |
| slcData[slcCount].SliceOffset = m_bsBuffer.SliceOffset; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_PackSliceHeader(&packSlcHeaderParams)); |
| slcData[slcCount].BitSize = m_bsBuffer.BitSize; |
| } |
| if (m_sliceStructCaps != CODECHAL_SLICE_STRUCT_ARBITRARYMBSLICE) |
| { |
| slcData[slcCount].CmdOffset = slcCount * m_sliceHeight * m_picWidthInMb * 16 * 4; |
| } |
| else |
| { |
| slcData[slcCount].CmdOffset = packSlcHeaderParams.pAvcSliceParams->first_mb_in_slice * 16 * 4; |
| } |
| } |
| |
| sliceState.pEncodeAvcSliceParams = &avcSlcParams[slcCount]; |
| sliceState.dwDataBufferOffset = |
| m_slcData[slcCount].CmdOffset + m_mbcodeBottomFieldOffset; |
| sliceState.dwOffset = slcData[slcCount].SliceOffset; |
| sliceState.dwLength = slcData[slcCount].BitSize; |
| sliceState.uiSkipEmulationCheckCount = slcData[slcCount].SkipEmulationByteCount; |
| sliceState.dwSliceIndex = (uint32_t)slcCount; |
| sliceState.bFirstPass = (m_currPass == 0); |
| sliceState.bLastPass = (m_currPass == m_numPasses); |
| sliceState.bInsertBeforeSliceHeaders = (slcCount == 0); |
| sliceState.bVdencInUse = false; |
| // App handles tail insertion for VDEnc dynamic slice in non-cp case |
| sliceState.bVdencNoTailInsertion = false; |
| |
| uint32_t batchBufferForPakSlicesStartOffset = |
| (uint32_t)m_batchBufferForPakSlices[m_currRecycledBufIdx].iCurrent; |
| |
| if (useBatchBufferForPakSlices) |
| { |
| sliceState.pBatchBufferForPakSlices = |
| &m_batchBufferForPakSlices[m_currRecycledBufIdx]; |
| sliceState.bSingleTaskPhaseSupported = true; |
| sliceState.dwBatchBufferForPakSlicesStartOffset = batchBufferForPakSlicesStartOffset; |
| } |
| |
| if (m_avcRoundingParams != nullptr && m_avcRoundingParams->bEnableCustomRoudingIntra) |
| { |
| sliceState.dwRoundingIntraValue = m_avcRoundingParams->dwRoundingIntra; |
| } |
| else |
| { |
| sliceState.dwRoundingIntraValue = 5; |
| } |
| if (m_avcRoundingParams != nullptr && m_avcRoundingParams->bEnableCustomRoudingInter) |
| { |
| sliceState.bRoundingInterEnable = true; |
| sliceState.dwRoundingValue = m_avcRoundingParams->dwRoundingInter; |
| } |
| else |
| { |
| sliceState.bRoundingInterEnable = bRoundingInterEnable; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetInterRounding(&sliceState)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendSlice(&cmdBuffer, &sliceState)); |
| |
| // Add dumps for 2nd level batch buffer |
| if (sliceState.bSingleTaskPhaseSupported) |
| { |
| CODECHAL_ENCODE_CHK_NULL_RETURN(sliceState.pBatchBufferForPakSlices); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->Dump2ndLvlBatch( |
| sliceState.pBatchBufferForPakSlices, |
| CODECHAL_MEDIA_STATE_ENC_NORMAL, |
| nullptr)); |
| ) |
| } |
| } |
| |
| if (useBatchBufferForPakSlices) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(Mhw_UnlockBb( |
| m_osInterface, |
| &m_batchBufferForPakSlices[m_currRecycledBufIdx], |
| m_lastTaskInPhase)); |
| } |
| |
| // Insert end of sequence/stream if set |
| if (m_lastPicInStream || m_lastPicInSeq) |
| { |
| MHW_VDBOX_PAK_INSERT_PARAMS pakInsertObjectParams; |
| MOS_ZeroMemory(&pakInsertObjectParams, sizeof(pakInsertObjectParams)); |
| pakInsertObjectParams.bLastPicInSeq = m_lastPicInSeq; |
| pakInsertObjectParams.bLastPicInStream = m_lastPicInStream; |
| pakInsertObjectParams.dwBitSize = 32; // use dwBitSize for SrcDataEndingBitInclusion |
| if (m_lastPicInSeq) |
| { |
| pakInsertObjectParams.dwLastPicInSeqData = (uint32_t)((1 << 16) | CODECHAL_ENCODE_AVC_NAL_UT_EOSEQ << 24); |
| } |
| if (m_lastPicInStream) |
| { |
| pakInsertObjectParams.dwLastPicInStreamData = (uint32_t)((1 << 16) | CODECHAL_ENCODE_AVC_NAL_UT_EOSTREAM << 24); |
| } |
| pakInsertObjectParams.bHeaderLengthExcludeFrmSize = true; |
| if (pakInsertObjectParams.bEmulationByteBitsInsert) |
| { |
| //Does not matter here, but keeping for consistency |
| CODECHAL_ENCODE_ASSERTMESSAGE("The emulation prevention bytes are not inserted by the app and are requested to be inserted by HW."); |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPakInsertObject(&cmdBuffer, nullptr, &pakInsertObjectParams)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadMfcStatus(&cmdBuffer)); |
| |
| // BRC PAK statistics different for each pass |
| if (bBrcEnabled) |
| { |
| uint32_t offset = |
| (m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) + |
| m_encodeStatusBuf.dwNumPassesOffset + // Num passes offset |
| sizeof(uint32_t) * 2; // pEncodeStatus is offset by 2 DWs in the resource |
| |
| EncodeReadBrcPakStatsParams readBrcPakStatsParams; |
| readBrcPakStatsParams.pHwInterface = m_hwInterface; |
| readBrcPakStatsParams.presBrcPakStatisticBuffer = &BrcBuffers.resBrcPakStatisticBuffer[0]; |
| readBrcPakStatsParams.presStatusBuffer = &m_encodeStatusBuf.resStatusBuffer; |
| readBrcPakStatsParams.dwStatusBufNumPassesOffset = offset; |
| readBrcPakStatsParams.ucPass = m_currPass; |
| readBrcPakStatsParams.VideoContext = m_videoContext; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(ReadBrcPakStatistics(&cmdBuffer, &readBrcPakStatsParams)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, CODECHAL_NUM_MEDIA_STATES)); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| std::string pakPassName = "PAK_PASS" + std::to_string(static_cast<uint32_t>(m_currPass)); |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| CODECHAL_NUM_MEDIA_STATES, |
| pakPassName.data())); |
| //CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHal_DbgReplaceAllCommands( |
| // m_debugInterface, |
| // &cmdBuffer)); |
| ) |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| // For VDEnc SHME and CSC need to wait workload finish on render engine |
| if ((m_currPass == 0) && !Mos_ResourceIsNull(&m_resSyncObjectRenderContextInUse)) |
| { |
| auto syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContext; |
| syncParams.presSyncResource = &m_resSyncObjectRenderContextInUse; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams)); |
| } |
| |
| bool renderingFlags = m_videoContextUsesNullHw; |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SubmitCommandBuffer(&cmdBuffer, renderingFlags)); |
| |
| CODECHAL_DEBUG_TOOL( |
| if (!m_mmcUserFeatureUpdated) { |
| CODECHAL_UPDATE_ENCODE_MMC_USER_FEATURE(m_reconSurface, m_osInterface->pOsContext); |
| m_mmcUserFeatureUpdated = true; |
| }) |
| |
| if (m_sliceSizeStreamoutSupported) |
| { |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &m_pakSliceSizeStreamoutBuffer, |
| CodechalDbgAttr::attrOutput, |
| "SliceSizeStreamout", |
| CODECHAL_ENCODE_SLICESIZE_BUF_SIZE, |
| 0, |
| CODECHAL_NUM_MEDIA_STATES))); |
| } |
| |
| if ((m_currPass == m_numPasses) && |
| m_signalEnc && |
| !Mos_ResourceIsNull(&m_resSyncObjectVideoContextInUse)) |
| { |
| // Check if the signal obj count exceeds max value |
| if (m_semaphoreObjCount == MOS_MIN(m_semaphoreMaxCount, MOS_MAX_OBJECT_SIGNALED)) |
| { |
| auto syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_renderContext; |
| syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams)); |
| m_semaphoreObjCount--; |
| } |
| |
| // signal semaphore |
| auto syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContext; |
| syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams)); |
| m_semaphoreObjCount++; |
| } |
| } |
| |
| // Reset parameters for next PAK execution |
| if (m_currPass == m_numPasses) |
| { |
| if (!m_singleTaskPhaseSupported) |
| { |
| m_osInterface->pfnResetPerfBufferID(m_osInterface); |
| } |
| |
| m_newPpsHeader = 0; |
| m_newSeqHeader = 0; |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateSliceStateParam( |
| bAdaptiveRoundingInterEnable, |
| &sliceState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(DumpFrameParFile()); |
| ) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::UserFeatureKeyReport() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcBase::UserFeatureKeyReport()); |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_avcSeqParam); |
| |
| // AVC Encode BRC Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_BRC_ENABLE_ID, bBrcEnabled, m_osInterface->pOsContext); |
| |
| // AVC HME Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_ME_IN_USE_ID, m_hmeSupported, m_osInterface->pOsContext); |
| |
| // AVC SuperHME Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_16xME_IN_USE_ID, m_16xMeSupported, m_osInterface->pOsContext); |
| |
| // AVC UltraHME Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_32xME_IN_USE_ID, m_32xMeSupported, m_osInterface->pOsContext); |
| |
| // AVC RateControl Method Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ENCODE_RATECONTROL_METHOD_ID, m_avcSeqParam->RateControlMethod, m_osInterface->pOsContext); |
| |
| // AVC Adaptive Transform Decision Enable Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_ADAPTIVE_TRANSFORM_DECISION_ENABLE_ID, m_adaptiveTransformDecisionEnabled, m_osInterface->pOsContext); |
| |
| // FBR Bypass Enable Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_FBR_BYPASS_ENABLE_ID, bFBRBypassEnable, m_osInterface->pOsContext); |
| |
| // Static frame detection Enable Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_STATIC_FRAME_DETECTION_ENABLE_ID, bStaticFrameDetectionEnable, m_osInterface->pOsContext); |
| |
| // Adaptive Search Windows Enable Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_ADAPTIVE_SEARCH_WINDOW_ENABLE_ID, bApdatvieSearchWindowEnable, m_osInterface->pOsContext); |
| |
| // AVC FTQ Reporting |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_FTQ_IN_USE_ID, bFTQEnable, m_osInterface->pOsContext); |
| |
| // AVC CAF Reporting |
| CodecHalEncode_WriteKey(__MEDIA_USER_FEATURE_VALUE_AVC_CAF_IN_USE_ID, bCAFEnable, m_osInterface->pOsContext); |
| |
| #endif // _DEBUG || _RELEASE_INTERNAL |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::EncodeGenerateSliceMap(uint8_t* data, PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(data); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(avcSliceParams); |
| |
| auto sliceMapRow = (uint32_t*)(data + m_sliceMapBottomFieldOffset); |
| auto sliceMap = sliceMapRow; |
| uint32_t sliceMapPitch = m_sliceMapSurface[m_currRecycledBufIdx].dwPitch / sizeof(uint32_t); |
| uint32_t count = 0; |
| |
| for (uint32_t j = 0; j < m_numSlices; j++) |
| { |
| for (uint32_t i = 0; i < avcSliceParams->NumMbsForSlice; i++) |
| { |
| *sliceMap++ = j; |
| if ((count > 0) && ((count % m_picWidthInMb == 0))) |
| { |
| sliceMapRow += sliceMapPitch; |
| sliceMap = sliceMapRow; |
| *sliceMap++ = j; |
| } |
| count++; |
| } |
| avcSliceParams++; |
| } |
| *sliceMap++ = 0xFFFFFFFF; // Set last uint32_t to -1. |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::AllocateResources() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CodechalEncodeAvcBase::AllocateResources(); |
| |
| uint32_t fieldNumMBs = m_picWidthInMb * ((m_picHeightInMb + 1) >> 1); |
| // Field/frame info not ready here, need to round up to even Height for field mode |
| uint32_t picWidthHeightInMB = fieldNumMBs * 2; |
| uint32_t fieldHeightInMB = |
| CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(((m_frameHeight + 1) >> 1)); |
| |
| // initiate allocation parameters and lock flags |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferLinear; |
| MOS_ZeroMemory(&allocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER; |
| allocParamsForBufferLinear.TileType = MOS_TILE_LINEAR; |
| allocParamsForBufferLinear.Format = Format_Buffer; |
| |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D; |
| MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBuffer2D.Type = MOS_GFXRES_2D; |
| allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR; |
| allocParamsForBuffer2D.Format = Format_Buffer_2D; |
| |
| MOS_LOCK_PARAMS lockFlagsWriteOnly; |
| MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS)); |
| lockFlagsWriteOnly.WriteOnly = 1; |
| |
| if (m_pakEnabled) |
| { |
| // Allocate skip frame copy buffer |
| allocParamsForBufferLinear.dwBytes = dwSkipFrameBufferSize = CODECHAL_PAGE_SIZE; |
| allocParamsForBufferLinear.pBufName = "Skip Frame Copy Buffer"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resSkipFrameBuffer), "Failed to allocate Skip Frame Copy Buffer\n"); |
| } |
| |
| // Allocate SEI buffer |
| SeiData.pSEIBuffer = (uint8_t *)MOS_AllocAndZeroMemory(CODECHAL_ENCODE_AVC_SEI_BUFFER_SIZE); |
| if (SeiData.pSEIBuffer == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate SEI Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| SeiData.dwSEIBufSize = CODECHAL_ENCODE_AVC_SEI_BUFFER_SIZE; |
| |
| // Resources required by legacy AVC ENC |
| if (m_encEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(AllocateResourcesBrc()); |
| |
| bVMEScratchBuffer = |
| (MbEncBindingTable.dwAvcMBEncDebugScratch != CODECHAL_INVALID_BINDING_TABLE_IDX); |
| |
| if (bVMEScratchBuffer) |
| { |
| // VME Scratch buffer (HSW), 256 bytes (8 GRFs) per MB |
| uint32_t size = m_picWidthInMb * m_picHeightInMb * 256; |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "VME Scratch Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resVMEScratchBuffer); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate VME Scratch Buffer."); |
| return eStatus; |
| } |
| |
| uint8_t* data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(resVMEScratchBuffer), |
| &lockFlagsWriteOnly); |
| MOS_ZeroMemory(data, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &resVMEScratchBuffer); |
| } |
| |
| // allocate VME Kernel Dump buffer |
| if (bVMEKernelDump) |
| { |
| allocParamsForBufferLinear.dwBytes = picWidthHeightInMB; |
| allocParamsForBufferLinear.pBufName = "VME Kernel Dump Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resVmeKernelDumpBuffer); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate VME Kernel Dump Buffer."); |
| return eStatus; |
| } |
| } |
| |
| if (bRefPicSelectListSupported) |
| { |
| auto refPicSelect = RefPicSelectList; |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES; i++, refPicSelect++) |
| { |
| MOS_ZeroMemory(&refPicSelect->sBuffer, sizeof(MOS_SURFACE)); |
| refPicSelect->FrameIdx = CODECHAL_ENCODE_AVC_INVALID_PIC_ID; |
| refPicSelect->sBuffer.TileType = MOS_TILE_LINEAR; |
| refPicSelect->sBuffer.bArraySpacing = true; |
| refPicSelect->sBuffer.Format = Format_Buffer_2D; |
| refPicSelect->sBuffer.dwWidth = MOS_ALIGN_CEIL((m_picWidthInMb * 8), 64); |
| refPicSelect->sBuffer.dwHeight = MOS_ALIGN_CEIL(2 * fieldHeightInMB, 8); |
| refPicSelect->sBuffer.dwPitch = MOS_ALIGN_CEIL((m_picWidthInMb * 8), 64); |
| |
| allocParamsForBuffer2D.dwWidth = refPicSelect->sBuffer.dwWidth; |
| allocParamsForBuffer2D.dwHeight = refPicSelect->sBuffer.dwHeight; |
| allocParamsForBuffer2D.pBufName = "RefPicSelectList Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBuffer2D, |
| &refPicSelect->sBuffer.OsResource); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate RefPicSelectList Buffer."); |
| return eStatus; |
| } |
| } |
| } |
| } |
| |
| if (bStaticFrameDetectionEnable) |
| { |
| // SFD output buffer |
| allocParamsForBufferLinear.dwBytes = MOS_ALIGN_CEIL(CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON, CODECHAL_CACHELINE_SIZE); |
| allocParamsForBufferLinear.pBufName = "Static frame detection output buffer"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resSFDOutputBuffer[0]), "Failed to allocate static frame detection output buffer\n"); |
| |
| // SFD P-frame cost table buffer |
| allocParamsForBufferLinear.dwBytes = MOS_ALIGN_CEIL(CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON, CODECHAL_CACHELINE_SIZE); |
| allocParamsForBufferLinear.pBufName = "SFD P-frame cost table buffer"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resSFDCostTablePFrameBuffer), "Failed to allocate SFD P-frame cost table buffer\n"); |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resSFDCostTableBFrameBuffer), "Failed to allocate SFD B-frame cost table buffer\n"); |
| |
| // copy SFD P-frame cost table |
| uint8_t* data; |
| if (nullptr == (data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &resSFDCostTablePFrameBuffer, |
| &lockFlagsWriteOnly))) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock SFD P-frame cost table Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(data, |
| CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t), |
| m_codechalEncodeAvcSfdCostTablePFrame, |
| CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t)), |
| "Failed to copy SFD P-frame cost table"); |
| m_osInterface->pfnUnlockResource(m_osInterface, &resSFDCostTablePFrameBuffer); |
| |
| // copy SFD B-frame cost table |
| if (nullptr == (data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &resSFDCostTableBFrameBuffer, |
| &lockFlagsWriteOnly))) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock SFD B-frame cost table Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(MOS_SecureMemcpy(data, |
| CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t), |
| m_codechalEncodeAvcSfdCostTableBFrame, |
| CODECHAL_ENCODE_AVC_SFD_COST_TABLE_BUFFER_SIZE_COMMON * sizeof(uint8_t)), |
| "Failed to copy SFD B-frame cost table"); |
| m_osInterface->pfnUnlockResource(m_osInterface, &resSFDCostTableBFrameBuffer); |
| } |
| |
| // allocate MB specific data buffer |
| allocParamsForBufferLinear.dwBytes = picWidthHeightInMB * sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS); |
| allocParamsForBufferLinear.pBufName = "MB Specific Data Buffer"; |
| |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &resMbSpecificDataBuffer[i]); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MB Specific Data Buffer."); |
| return eStatus; |
| } |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::AllocateResourcesBrc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| // initiate allocation parameters and lock flags |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBufferLinear; |
| MOS_ZeroMemory(&allocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER; |
| allocParamsForBufferLinear.TileType = MOS_TILE_LINEAR; |
| allocParamsForBufferLinear.Format = Format_Buffer; |
| |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D; |
| MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBuffer2D.Type = MOS_GFXRES_2D; |
| allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR; |
| allocParamsForBuffer2D.Format = Format_Buffer_2D; |
| |
| MOS_LOCK_PARAMS lockFlagsWriteOnly; |
| MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS)); |
| lockFlagsWriteOnly.WriteOnly = 1; |
| |
| // BRC history buffer |
| uint32_t size = m_brcHistoryBufferSize; |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "BRC History Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resBrcHistoryBuffer); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC History Buffer."); |
| return eStatus; |
| } |
| |
| uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resBrcHistoryBuffer), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC History Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcHistoryBuffer); |
| |
| // PAK Statistics buffer |
| size = m_brcPakStatisticsSize; |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "BRC PAK Statistics Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resBrcPakStatisticBuffer[0]); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC PAK Statistics Buffer."); |
| return eStatus; |
| } |
| |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resBrcPakStatisticBuffer[0]), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC PAK Statistics Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcPakStatisticBuffer[0]); |
| |
| // PAK IMG_STATEs buffer |
| // Use BRC_MAXIMUM_NUM_PASSES here since actual number of passes is determined later using PicParams.BRCPrecision |
| size = BRC_IMG_STATE_SIZE_PER_PASS * CODECHAL_ENCODE_BRC_MAXIMUM_NUM_PASSES; |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "PAK IMG State Read Buffer"; |
| |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resBrcImageStatesReadBuffer[i]); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC IMG State Read Buffer."); |
| return eStatus; |
| } |
| |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resBrcImageStatesReadBuffer[i]), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC IMG State Read Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcImageStatesReadBuffer[i]); |
| } |
| |
| allocParamsForBufferLinear.pBufName = "PAK IMG State Write Buffer"; |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resBrcImageStatesWriteBuffer); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC IMG State Write Buffer."); |
| return eStatus; |
| } |
| |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resBrcImageStatesWriteBuffer), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC IMG State Write Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resBrcImageStatesWriteBuffer); |
| |
| // Check if the constant data surface is present |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| //BRC Constant Data Surfaces |
| MOS_ZeroMemory(&BrcBuffers.sBrcConstantDataBuffer[i], sizeof(MOS_SURFACE)); |
| BrcBuffers.sBrcConstantDataBuffer[i].TileType = MOS_TILE_LINEAR; |
| BrcBuffers.sBrcConstantDataBuffer[i].bArraySpacing = true; |
| BrcBuffers.sBrcConstantDataBuffer[i].Format = Format_Buffer_2D; |
| BrcBuffers.sBrcConstantDataBuffer[i].dwWidth = |
| dwBrcConstantSurfaceWidth; |
| BrcBuffers.sBrcConstantDataBuffer[i].dwHeight = |
| dwBrcConstantSurfaceHeight; |
| BrcBuffers.sBrcConstantDataBuffer[i].dwPitch = |
| dwBrcConstantSurfaceWidth; |
| |
| allocParamsForBuffer2D.dwWidth = MOS_ALIGN_CEIL(dwBrcConstantSurfaceWidth, 64); |
| allocParamsForBuffer2D.dwHeight = dwBrcConstantSurfaceHeight; |
| allocParamsForBuffer2D.pBufName = "BRC Constant Data Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBuffer2D, |
| &BrcBuffers.sBrcConstantDataBuffer[i].OsResource); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate BRC Constant Data Buffer."); |
| return eStatus; |
| } |
| } |
| |
| uint32_t width, height, downscaledFieldHeightInMB4x; |
| if (bBrcDistortionBufferSupported) |
| { |
| // BRC Distortion Surface |
| downscaledFieldHeightInMB4x = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS((m_frameHeight + 1) >> 3); |
| width = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 3), 64); |
| height = MOS_ALIGN_CEIL((downscaledFieldHeightInMB4x << 2), 8) << 1; |
| |
| allocParamsForBuffer2D.dwWidth = width; |
| allocParamsForBuffer2D.dwHeight = height; |
| allocParamsForBuffer2D.pBufName = "BRC Distortion Surface Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBuffer2D, |
| &BrcBuffers.sMeBrcDistortionBuffer.OsResource); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate ME BRC Distortion Buffer."); |
| return eStatus; |
| } |
| |
| BrcBuffers.sMeBrcDistortionBuffer.TileType = MOS_TILE_LINEAR; |
| BrcBuffers.sMeBrcDistortionBuffer.bArraySpacing = true; |
| BrcBuffers.sMeBrcDistortionBuffer.Format = Format_Buffer_2D; |
| BrcBuffers.sMeBrcDistortionBuffer.dwWidth = width; |
| BrcBuffers.sMeBrcDistortionBuffer.dwHeight = height; |
| BrcBuffers.sMeBrcDistortionBuffer.dwPitch = (uint32_t)BrcBuffers.sMeBrcDistortionBuffer.OsResource.pGmmResInfo->GetRenderPitch(); |
| |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.sMeBrcDistortionBuffer.OsResource), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock ME BRC Distortion Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| size = BrcBuffers.sMeBrcDistortionBuffer.dwPitch * BrcBuffers.sMeBrcDistortionBuffer.dwHeight; |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, &BrcBuffers.sMeBrcDistortionBuffer.OsResource); |
| } |
| |
| // MbBrcConstDataBuffer |
| // 16 DWs per QP value |
| size = 16 * (CODEC_AVC_NUM_QP) * sizeof(uint32_t); |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "MB BRC Constant Data Buffer"; |
| |
| for (uint32_t i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resMbBrcConstDataBuffer[i]); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MB BRC Constant Data Buffer."); |
| return eStatus; |
| } |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resMbBrcConstDataBuffer[i]), |
| &lockFlagsWriteOnly); |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &BrcBuffers.resMbBrcConstDataBuffer[i]); |
| } |
| |
| // Use a separate surface MbEnc DSH data |
| if(!CodecHalIsFeiEncode(m_codecFunction)) |
| { |
| size = |
| m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData() + |
| MOS_ALIGN_CEIL(pMbEncKernelStates->KernelParams.iCurbeLength, |
| m_renderEngineInterface->m_stateHeapInterface->pStateHeapInterface->GetCurbeAlignment()); |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "MbEnc Curbe Buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resMbEncAdvancedDsh); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MbEnc Curbe Buffer."); |
| return eStatus; |
| } |
| |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &BrcBuffers.resMbEncAdvancedDsh, |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock MbEnc Curbe Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &BrcBuffers.resMbEncAdvancedDsh); |
| } |
| // MbEnc BRC buffer - buffer written by BRC and used by MbEnc |
| if (bDecoupleMbEncCurbeFromBRC) |
| { |
| size = m_mbencBrcBufferSize; |
| allocParamsForBufferLinear.dwBytes = size; |
| allocParamsForBufferLinear.pBufName = "MbEnc BRC buffer"; |
| |
| eStatus = (MOS_STATUS)m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBufferLinear, |
| &BrcBuffers.resMbEncBrcBuffer); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to allocate MbEnc BRC buffer."); |
| return eStatus; |
| } |
| |
| pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resMbEncBrcBuffer), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock MbEnc BRC buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resMbEncBrcBuffer); |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::AllocateResourcesMbBrc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| // initiate allocation paramters and lock flags |
| MOS_ALLOC_GFXRES_PARAMS allocParamsForBuffer2D; |
| MOS_ZeroMemory(&allocParamsForBuffer2D, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| allocParamsForBuffer2D.Type = MOS_GFXRES_2D; |
| allocParamsForBuffer2D.TileType = MOS_TILE_LINEAR; |
| allocParamsForBuffer2D.Format = Format_Buffer_2D; |
| |
| MOS_LOCK_PARAMS lockFlagsWriteOnly; |
| MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS)); |
| lockFlagsWriteOnly.WriteOnly = 1; |
| |
| uint32_t downscaledFieldHeightInMB4x = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS((m_frameHeight + 1) >> 3); |
| |
| // Mb QP Surface |
| if (Mos_ResourceIsNull(&BrcBuffers.sBrcMbQpBuffer.OsResource)) |
| { |
| uint32_t width = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 2), 64); |
| uint32_t height = MOS_ALIGN_CEIL((downscaledFieldHeightInMB4x << 2), 8) << 1; |
| uint32_t size = width * height; |
| |
| MOS_ZeroMemory(&BrcBuffers.sBrcMbQpBuffer, sizeof(MOS_SURFACE)); |
| BrcBuffers.sBrcMbQpBuffer.TileType = MOS_TILE_LINEAR; |
| BrcBuffers.sBrcMbQpBuffer.bArraySpacing = true; |
| BrcBuffers.sBrcMbQpBuffer.Format = Format_Buffer_2D; |
| BrcBuffers.sBrcMbQpBuffer.dwWidth = allocParamsForBuffer2D.dwWidth = width; |
| BrcBuffers.sBrcMbQpBuffer.dwHeight = allocParamsForBuffer2D.dwHeight = height; |
| BrcBuffers.sBrcMbQpBuffer.dwPitch = width; |
| allocParamsForBuffer2D.pBufName = "BRC MB QP Buffer"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBuffer2D, |
| &BrcBuffers.sBrcMbQpBuffer.OsResource), "Failed to allocate BRC MB QP surface."); |
| |
| uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.sBrcMbQpBuffer.OsResource), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC MB QP Buffer."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &BrcBuffers.sBrcMbQpBuffer.OsResource); |
| } |
| |
| // BRC ROI Surface |
| if (Mos_ResourceIsNull(&BrcBuffers.sBrcRoiSurface.OsResource) && bBrcRoiEnabled) |
| { |
| uint32_t width = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x << 4), 64); |
| uint32_t height = MOS_ALIGN_CEIL((downscaledFieldHeightInMB4x << 2), 8) << 1; |
| |
| MOS_ZeroMemory(&BrcBuffers.sBrcRoiSurface, sizeof(MOS_SURFACE)); |
| allocParamsForBuffer2D.dwWidth = width; |
| allocParamsForBuffer2D.dwHeight = height; |
| allocParamsForBuffer2D.pBufName = "BRC ROI Surface"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &allocParamsForBuffer2D, |
| &BrcBuffers.sBrcRoiSurface.OsResource), "Failed to allocate BRC ROI surface."); |
| |
| BrcBuffers.sBrcRoiSurface.TileType = MOS_TILE_LINEAR; |
| BrcBuffers.sBrcRoiSurface.bArraySpacing = true; |
| BrcBuffers.sBrcRoiSurface.Format = Format_Buffer_2D; |
| BrcBuffers.sBrcRoiSurface.dwWidth = width; |
| BrcBuffers.sBrcRoiSurface.dwHeight = height; |
| BrcBuffers.sBrcRoiSurface.dwPitch = (uint32_t)BrcBuffers.sBrcRoiSurface.OsResource.pGmmResInfo->GetRenderPitch(); |
| |
| uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.sBrcRoiSurface.OsResource), |
| &lockFlagsWriteOnly); |
| |
| if (pData == nullptr) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to Lock BRC ROI surface."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| |
| uint32_t size = BrcBuffers.sBrcRoiSurface.dwPitch * BrcBuffers.sBrcRoiSurface.dwHeight; |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &BrcBuffers.sBrcRoiSurface.OsResource); |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ReleaseResourcesBrc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.resBrcHistoryBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.resBrcPakStatisticBuffer[0]); |
| |
| for (int i = 0; i < CODECHAL_ENCODE_RECYCLED_BUFFER_NUM; i++) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.resBrcImageStatesReadBuffer[i]); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.sBrcConstantDataBuffer[i].OsResource); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.resMbBrcConstDataBuffer[i]); |
| } |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.resBrcImageStatesWriteBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.sMeBrcDistortionBuffer.OsResource); |
| |
| m_osInterface->pfnFreeResource(m_osInterface, &BrcBuffers.resMbEncAdvancedDsh); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.resMbEncBrcBuffer); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ReleaseResourcesMbBrc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.sBrcMbQpBuffer.OsResource); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &BrcBuffers.sBrcRoiSurface.OsResource); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GenericEncodeMeKernel(EncodeBrcBuffers* brcBuffers, HmeLevel hmeLevel) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = m_singleTaskPhaseSupported ? CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL : CODECHAL_ENCODE_PERFTAG_CALL_ME_KERNEL; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| // Each ME kernel buffer counts as a separate perf task |
| m_osInterface->pfnResetPerfBufferID(m_osInterface); |
| |
| CODECHAL_MEDIA_STATE_TYPE EncFunctionType = (hmeLevel == HME_LEVEL_32x) ? CODECHAL_MEDIA_STATE_32X_ME : |
| (hmeLevel == HME_LEVEL_16x) ? CODECHAL_MEDIA_STATE_16X_ME : CODECHAL_MEDIA_STATE_4X_ME; |
| |
| uint32_t krnStateIdx = ((m_pictureCodingType == P_TYPE) ? CODECHAL_ENCODE_ME_IDX_P : CODECHAL_ENCODE_ME_IDX_B); |
| auto kernelState = &m_meKernelStates[krnStateIdx]; |
| |
| // If Single Task Phase is not enabled, use BT count for the kernel state. |
| if (m_firstTaskInPhase == true || !m_singleTaskPhaseSupported) |
| { |
| uint32_t dwMaxBtCount = m_singleTaskPhaseSupported ? |
| m_maxBtCount : kernelState->KernelParams.iBTCount; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnRequestSshSpaceForCmdBuf( |
| m_stateHeapInterface, |
| dwMaxBtCount)); |
| m_vmeStatesSize = m_hwInterface->GetKernelLoadCommandSize(dwMaxBtCount); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(VerifySpaceAvailable()); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->AssignDshAndSshSpace( |
| m_stateHeapInterface, |
| kernelState, |
| false, |
| 0, |
| false, |
| m_storeData)); |
| |
| MHW_INTERFACE_DESCRIPTOR_PARAMS idParams; |
| MOS_ZeroMemory(&idParams, sizeof(idParams)); |
| idParams.pKernelState = kernelState; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetInterfaceDescriptor( |
| m_stateHeapInterface, |
| 1, |
| &idParams)); |
| |
| // Setup AVC Curbe |
| MeCurbeParams meParams; |
| MOS_ZeroMemory(&meParams, sizeof(meParams)); |
| meParams.hmeLvl = hmeLevel; |
| meParams.pKernelState = kernelState; |
| |
| if (!m_useCommonKernel) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SetCurbeMe( |
| &meParams)); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| EncFunctionType, |
| MHW_DSH_TYPE, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCurbe( |
| EncFunctionType, |
| kernelState)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| EncFunctionType, |
| MHW_ISH_TYPE, |
| kernelState)); |
| ) |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| SendKernelCmdsParams sendKernelCmdsParams = SendKernelCmdsParams(); |
| sendKernelCmdsParams.EncFunctionType = EncFunctionType; |
| sendKernelCmdsParams.pKernelState = kernelState; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendGenericKernelCmds(&cmdBuffer, &sendKernelCmdsParams)); |
| |
| // Add binding table |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSetBindingTable( |
| m_stateHeapInterface, |
| kernelState)); |
| |
| //Add surface states |
| MeSurfaceParams meSurfaceParams; |
| MOS_ZeroMemory(&meSurfaceParams, sizeof(meSurfaceParams)); |
| meSurfaceParams.dwNumRefIdxL0ActiveMinus1 = m_avcSliceParams->num_ref_idx_l0_active_minus1; |
| meSurfaceParams.dwNumRefIdxL1ActiveMinus1 = m_avcSliceParams->num_ref_idx_l1_active_minus1; |
| meSurfaceParams.pL0RefFrameList = &(m_avcSliceParams->RefPicList[LIST_0][0]); |
| meSurfaceParams.pL1RefFrameList = &(m_avcSliceParams->RefPicList[LIST_1][0]); |
| meSurfaceParams.ppRefList = &m_refList[0]; |
| meSurfaceParams.pPicIdx = &m_picIdx[0]; |
| meSurfaceParams.pCurrOriginalPic = &m_currOriginalPic; |
| meSurfaceParams.ps4xMeMvDataBuffer = &m_4xMeMvDataBuffer; |
| meSurfaceParams.dw4xMeMvBottomFieldOffset = (uint32_t)m_meMvBottomFieldOffset; |
| meSurfaceParams.ps16xMeMvDataBuffer = &m_16xMeMvDataBuffer; |
| meSurfaceParams.dw16xMeMvBottomFieldOffset = (uint32_t)m_meMv16xBottomFieldOffset; |
| meSurfaceParams.ps32xMeMvDataBuffer = &m_32xMeMvDataBuffer; |
| meSurfaceParams.dw32xMeMvBottomFieldOffset = (uint32_t)m_meMv32xBottomFieldOffset; |
| meSurfaceParams.dw4xScaledBottomFieldOffset = (uint32_t)m_scaledBottomFieldOffset; |
| meSurfaceParams.dw16xScaledBottomFieldOffset = (uint32_t)m_scaled16xBottomFieldOffset; |
| meSurfaceParams.dw32xScaledBottomFieldOffset = (uint32_t)m_scaled32xBottomFieldOffset; |
| meSurfaceParams.psMeDistortionBuffer = &m_4xMeDistortionBuffer; |
| meSurfaceParams.dwMeDistortionBottomFieldOffset = (uint32_t)m_meDistortionBottomFieldOffset; |
| meSurfaceParams.psMeBrcDistortionBuffer = &brcBuffers->sMeBrcDistortionBuffer; |
| meSurfaceParams.dwMeBrcDistortionBottomFieldOffset = brcBuffers->dwMeBrcDistortionBottomFieldOffset; |
| meSurfaceParams.dwDownscaledWidthInMb = (hmeLevel == HME_LEVEL_32x) ? m_downscaledWidthInMb32x : |
| (hmeLevel == HME_LEVEL_16x) ? m_downscaledWidthInMb16x : m_downscaledWidthInMb4x; |
| meSurfaceParams.dwDownscaledHeightInMb = (hmeLevel == HME_LEVEL_32x) ? m_downscaledFrameFieldHeightInMb32x : |
| (hmeLevel == HME_LEVEL_16x) ? m_downscaledFrameFieldHeightInMb16x : m_downscaledFrameFieldHeightInMb4x; |
| meSurfaceParams.dwVerticalLineStride = m_verticalLineStride; |
| meSurfaceParams.dwVerticalLineStrideOffset = m_verticalLineStrideOffset; |
| meSurfaceParams.b32xMeInUse = (hmeLevel == HME_LEVEL_32x) ? true : false; |
| meSurfaceParams.b16xMeInUse = (hmeLevel == HME_LEVEL_16x) ? true : false; |
| meSurfaceParams.b32xMeEnabled = m_32xMeEnabled; |
| meSurfaceParams.b16xMeEnabled = m_16xMeEnabled; |
| meSurfaceParams.pMeBindingTable = &m_meBindingTable; |
| meSurfaceParams.pKernelState = kernelState; |
| |
| if (!m_useCommonKernel) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendMeSurfaces(&cmdBuffer, &meSurfaceParams)); |
| } |
| |
| // Dump SSH for ME kernel |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpKernelRegion( |
| EncFunctionType, |
| MHW_SSH_TYPE, |
| kernelState))); |
| |
| /* zero out the mv data memory and me distortion buffer for the driver ULT |
| kernel only writes out this data used for current frame, in some cases the the data used for |
| previous frames would be left in the buffer (for example, the L1 mv for B frame would still show |
| in the P frame mv data buffer */ |
| |
| /* Zeroing out the buffers has perf impact, so zero it out only when dumps are actually enabled */ |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_debugInterface); |
| uint8_t* data; |
| uint32_t size; |
| bool driverMeDumpEnabled; |
| |
| driverMeDumpEnabled = m_debugInterface->DumpIsEnabled(CodechalDbgKernel::kernel4xMe)|| |
| m_debugInterface->DumpIsEnabled(CodechalDbgKernel::kernel16xMe)|| |
| m_debugInterface->DumpIsEnabled(CodechalDbgKernel::kernel32xMe); |
| |
| if (driverMeDumpEnabled) |
| { |
| MOS_LOCK_PARAMS lockFlags; |
| MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.WriteOnly = 1; |
| |
| switch (hmeLevel) |
| { |
| case HME_LEVEL_32x: |
| data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &m_32xMeMvDataBuffer.OsResource, |
| &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(data); |
| size = MOS_ALIGN_CEIL((m_downscaledWidthInMb32x * 32), 64) * |
| (m_downscaledHeightInMb32x * 2 * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER); |
| MOS_ZeroMemory(data, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &m_32xMeMvDataBuffer.OsResource); |
| break; |
| case HME_LEVEL_16x: |
| data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &m_16xMeMvDataBuffer.OsResource, |
| &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(data); |
| size = MOS_ALIGN_CEIL((m_downscaledWidthInMb16x * 32), 64) * |
| (m_downscaledHeightInMb16x * 2 * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER); |
| MOS_ZeroMemory(data, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &m_16xMeMvDataBuffer.OsResource); |
| break; |
| case HME_LEVEL_4x: |
| data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &m_4xMeMvDataBuffer.OsResource, |
| &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(data); |
| size = MOS_ALIGN_CEIL((m_downscaledWidthInMb4x * 32), 64) * |
| (m_downscaledHeightInMb4x * 2 * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER); |
| MOS_ZeroMemory(data, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &m_4xMeMvDataBuffer.OsResource); |
| break; |
| default: |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| |
| // zeroing out ME dist buffer |
| if (m_4xMeDistortionBufferSupported) |
| { |
| data = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, &m_4xMeDistortionBuffer.OsResource, &lockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(data); |
| size = m_4xMeDistortionBuffer.dwHeight * m_4xMeDistortionBuffer.dwPitch; |
| MOS_ZeroMemory(data, size); |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &m_4xMeDistortionBuffer.OsResource); |
| } |
| } |
| ); |
| |
| uint32_t uiScalingFactor = (hmeLevel == HME_LEVEL_32x) ? SCALE_FACTOR_32x : |
| (hmeLevel == HME_LEVEL_16x) ? SCALE_FACTOR_16x : SCALE_FACTOR_4x; |
| |
| uint32_t resolutionX = CODECHAL_GET_WIDTH_IN_MACROBLOCKS(m_frameWidth / uiScalingFactor); |
| uint32_t resolutionY = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight / uiScalingFactor); |
| |
| CODECHAL_WALKER_CODEC_PARAMS walkerCodecParams; |
| MOS_ZeroMemory(&walkerCodecParams, sizeof(walkerCodecParams)); |
| walkerCodecParams.WalkerMode = m_walkerMode; |
| walkerCodecParams.dwResolutionX = resolutionX; |
| walkerCodecParams.dwResolutionY = resolutionY; |
| walkerCodecParams.bNoDependency = true; |
| walkerCodecParams.bMbaff = m_mbaffEnabled; |
| walkerCodecParams.bGroupIdSelectSupported = m_groupIdSelectSupported; |
| walkerCodecParams.ucGroupId = m_groupId; |
| |
| MHW_WALKER_PARAMS walkerParams; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalInitMediaObjectWalkerParams( |
| m_hwInterface, |
| &walkerParams, |
| &walkerCodecParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_renderEngineInterface->AddMediaObjectWalkerCmd( |
| &cmdBuffer, |
| &walkerParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(EndStatusReport(&cmdBuffer, EncFunctionType)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnSubmitBlocks( |
| m_stateHeapInterface, |
| kernelState)); |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnUpdateGlobalCmdBufId( |
| m_stateHeapInterface)); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| } |
| |
| CODECHAL_DEBUG_TOOL(CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| & cmdBuffer, |
| EncFunctionType, |
| nullptr))); |
| |
| m_hwInterface->UpdateSSEuForCmdBuffer(&cmdBuffer, m_singleTaskPhaseSupported, m_lastTaskInPhase); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| if (!m_singleTaskPhaseSupported || m_lastTaskInPhase) |
| { |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface); |
| m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_renderContextUsesNullHw); |
| m_lastTaskInPhase = false; |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::InitKernelStateMe() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| uint32_t kuid = m_useCommonKernel ? m_kuidCommon : m_kuid; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetKernelBinaryAndSize(m_kernelBase, kuid, &kernelBinary, &kernelSize)); |
| |
| for (auto krnStateIdx = 0; krnStateIdx < 2; krnStateIdx++) |
| { |
| CODECHAL_KERNEL_HEADER currKrnHeader; |
| auto kernelStatePtr = &m_meKernelStates[krnStateIdx]; |
| |
| auto encOperation = ENC_ME; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(this->pfnGetKernelHeaderAndSize( |
| kernelBinary, |
| encOperation, |
| krnStateIdx, |
| &currKrnHeader, |
| (uint32_t*)&kernelSize)); |
| |
| kernelStatePtr->KernelParams.iBTCount = CODECHAL_ENCODE_AVC_ME_NUM_SURFACES_CM; |
| kernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| kernelStatePtr->KernelParams.iCurbeLength = sizeof(CODECHAL_ENCODE_AVC_ME_CURBE); |
| 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)); |
| |
| if (m_noMeKernelForPFrame) |
| { |
| m_meKernelStates[1] = m_meKernelStates[0]; |
| break; |
| } |
| } |
| |
| // Until a better way can be found, maintain old binding table structures |
| auto bindingTable = &m_meBindingTable; |
| bindingTable->dwMEMVDataSurface = CODECHAL_ENCODE_AVC_ME_MV_DATA_SURFACE_CM; |
| bindingTable->dw16xMEMVDataSurface = CODECHAL_ENCODE_AVC_16xME_MV_DATA_SURFACE_CM; |
| bindingTable->dw32xMEMVDataSurface = CODECHAL_ENCODE_AVC_32xME_MV_DATA_SURFACE_CM; |
| bindingTable->dwMEDist = CODECHAL_ENCODE_AVC_ME_DISTORTION_SURFACE_CM; |
| bindingTable->dwMEBRCDist = CODECHAL_ENCODE_AVC_ME_BRC_DISTORTION_CM; |
| bindingTable->dwMECurrForFwdRef = CODECHAL_ENCODE_AVC_ME_CURR_FOR_FWD_REF_CM; |
| bindingTable->dwMEFwdRefPicIdx[0] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX0_CM; |
| bindingTable->dwMEFwdRefPicIdx[1] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX1_CM; |
| bindingTable->dwMEFwdRefPicIdx[2] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX2_CM; |
| bindingTable->dwMEFwdRefPicIdx[3] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX3_CM; |
| bindingTable->dwMEFwdRefPicIdx[4] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX4_CM; |
| bindingTable->dwMEFwdRefPicIdx[5] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX5_CM; |
| bindingTable->dwMEFwdRefPicIdx[6] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX6_CM; |
| bindingTable->dwMEFwdRefPicIdx[7] = CODECHAL_ENCODE_AVC_ME_FWD_REF_IDX7_CM; |
| bindingTable->dwMECurrForBwdRef = CODECHAL_ENCODE_AVC_ME_CURR_FOR_BWD_REF_CM; |
| bindingTable->dwMEBwdRefPicIdx[0] = CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX0_CM; |
| bindingTable->dwMEBwdRefPicIdx[1] = CODECHAL_ENCODE_AVC_ME_BWD_REF_IDX1_CM; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SetCurbeMe(MeCurbeParams* params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| CODECHAL_ENCODE_ASSERT(m_avcSeqParam->TargetUsage <= NUM_TARGET_USAGE_MODES); |
| |
| auto slcParams = m_avcSliceParams; |
| auto framePicture = CodecHal_PictureIsFrame(m_avcPicParam->CurrOriginalPic); |
| auto qpPrimeY = |
| (m_avcPicParam->pic_init_qp_minus26 + 26) + |
| m_avcSliceParams->slice_qp_delta; |
| |
| auto mvShiftFactor = 0; |
| auto prevMvReadPosFactor = 0; |
| bool useMvFromPrevStep, writeDistortions; |
| uint32_t scaleFactor; |
| |
| switch (params->hmeLvl) |
| { |
| case HME_LEVEL_32x: |
| useMvFromPrevStep = CODECHAL_ENCODE_AVC_HME_FIRST_STEP; |
| writeDistortions = false; |
| scaleFactor = SCALE_FACTOR_32x; |
| mvShiftFactor = CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_32x; |
| break; |
| case HME_LEVEL_16x: |
| useMvFromPrevStep = (m_32xMeEnabled) ? CODECHAL_ENCODE_AVC_HME_FOLLOWING_STEP : CODECHAL_ENCODE_AVC_HME_FIRST_STEP; |
| writeDistortions = false; |
| scaleFactor = SCALE_FACTOR_16x; |
| mvShiftFactor = CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_16x; |
| prevMvReadPosFactor = CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_16x; |
| break; |
| case HME_LEVEL_4x: |
| useMvFromPrevStep = (m_16xMeEnabled) ? CODECHAL_ENCODE_AVC_HME_FOLLOWING_STEP : CODECHAL_ENCODE_AVC_HME_FIRST_STEP; |
| writeDistortions = true; |
| scaleFactor = SCALE_FACTOR_4x; |
| mvShiftFactor = CODECHAL_ENCODE_AVC_MV_SHIFT_FACTOR_4x; |
| prevMvReadPosFactor = CODECHAL_ENCODE_AVC_PREV_MV_READ_POSITION_4x; |
| break; |
| default: |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| break; |
| } |
| |
| CODECHAL_ENCODE_AVC_ME_CURBE cmd; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &cmd, |
| sizeof(CODECHAL_ENCODE_AVC_ME_CURBE), |
| g_cInit_CODECHAL_ENCODE_AVC_ME_CURBE, |
| sizeof(CODECHAL_ENCODE_AVC_ME_CURBE))); |
| |
| if (m_avcPicParam->bEnableSubPelMode) |
| { |
| cmd.DW3.SubPelMode = m_avcPicParam->SubPelMode; |
| } |
| else |
| { |
| cmd.DW3.SubPelMode = 3; |
| } |
| |
| if (m_fieldScalingOutputInterleaved) |
| { |
| cmd.DW3.SrcAccess = |
| cmd.DW3.RefAccess = CodecHal_PictureIsField(m_avcPicParam->CurrOriginalPic) ? 1 : 0; |
| cmd.DW7.SrcFieldPolarity = CodecHal_PictureIsBottomField(m_avcPicParam->CurrOriginalPic) ? 1 : 0; |
| } |
| |
| cmd.DW4.PictureHeightMinus1 = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight / scaleFactor) - 1; |
| cmd.DW4.PictureWidth = CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameWidth / scaleFactor); |
| cmd.DW5.QpPrimeY = qpPrimeY; |
| cmd.DW6.WriteDistortions = writeDistortions; |
| cmd.DW6.UseMvFromPrevStep = useMvFromPrevStep; |
| |
| cmd.DW6.SuperCombineDist = m_superCombineDistGeneric[m_avcSeqParam->TargetUsage]; |
| cmd.DW6.MaxVmvR = (framePicture) ? |
| CodecHalAvcEncode_GetMaxMvLen(m_avcSeqParam->Level) * 4 : |
| (CodecHalAvcEncode_GetMaxMvLen(m_avcSeqParam->Level) >> 1) * 4; |
| |
| if (m_pictureCodingType == B_TYPE) |
| { |
| // This field is irrelevant since we are not using the bi-direct search. |
| // set it to 32 |
| cmd.DW1.BiWeight = 32; |
| cmd.DW13.NumRefIdxL1MinusOne = |
| m_avcSliceParams->num_ref_idx_l1_active_minus1; |
| } |
| |
| if (m_pictureCodingType == P_TYPE || |
| m_pictureCodingType == B_TYPE) |
| { |
| cmd.DW13.NumRefIdxL0MinusOne = |
| m_avcSliceParams->num_ref_idx_l0_active_minus1; |
| } |
| |
| cmd.DW13.RefStreaminCost = 5; |
| // This flag is to indicate the ROI source type instead of indicating ROI is enabled or not |
| cmd.DW13.ROIEnable = 0; |
| |
| if (!framePicture) |
| { |
| if (m_pictureCodingType != I_TYPE) |
| { |
| cmd.DW14.List0RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_0); |
| cmd.DW14.List0RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_1); |
| cmd.DW14.List0RefID2FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_2); |
| cmd.DW14.List0RefID3FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_3); |
| cmd.DW14.List0RefID4FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_4); |
| cmd.DW14.List0RefID5FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_5); |
| cmd.DW14.List0RefID6FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_6); |
| cmd.DW14.List0RefID7FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_0, CODECHAL_ENCODE_REF_ID_7); |
| } |
| if (m_pictureCodingType == B_TYPE) |
| { |
| cmd.DW14.List1RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| cmd.DW14.List1RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(slcParams, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| } |
| } |
| |
| cmd.DW15.MvShiftFactor = mvShiftFactor; |
| cmd.DW15.PrevMvReadPosFactor = prevMvReadPosFactor; |
| |
| // r3 & r4 |
| uint8_t meMethod, tableIdx, tu = 0; |
| tu = m_avcSeqParam->TargetUsage; |
| if (m_pictureCodingType == B_TYPE) |
| { |
| meMethod = m_bmeMethodTable ? // use the ME table dependent on prototype or codec standard |
| m_bmeMethodTable[tu] |
| : m_bMeMethodGeneric[tu]; |
| } |
| else |
| { |
| meMethod = m_meMethodTable ? // use the ME table dependent on prototype or codec standard |
| m_meMethodTable[tu] |
| : m_meMethodGeneric[tu]; |
| } |
| |
| tableIdx = (m_pictureCodingType == B_TYPE) ? 1 : 0; |
| eStatus = MOS_SecureMemcpy(&(cmd.SPDelta), 14 * sizeof(uint32_t), m_encodeSearchPath[tableIdx][meMethod], 14 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| // r5 |
| cmd.DW32._4xMeMvOutputDataSurfIndex = CODECHAL_ENCODE_AVC_ME_MV_DATA_SURFACE_CM; |
| cmd.DW33._16xOr32xMeMvInputDataSurfIndex = (params->hmeLvl == HME_LEVEL_32x) ? |
| CODECHAL_ENCODE_AVC_32xME_MV_DATA_SURFACE_CM : CODECHAL_ENCODE_AVC_16xME_MV_DATA_SURFACE_CM; |
| cmd.DW34._4xMeOutputDistSurfIndex = CODECHAL_ENCODE_AVC_ME_DISTORTION_SURFACE_CM; |
| cmd.DW35._4xMeOutputBrcDistSurfIndex = CODECHAL_ENCODE_AVC_ME_BRC_DISTORTION_CM; |
| cmd.DW36.VMEFwdInterPredictionSurfIndex = CODECHAL_ENCODE_AVC_ME_CURR_FOR_FWD_REF_CM; |
| cmd.DW37.VMEBwdInterPredictionSurfIndex = CODECHAL_ENCODE_AVC_ME_CURR_FOR_BWD_REF_CM; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(params->pKernelState->m_dshRegion.AddData( |
| &cmd, |
| params->pKernelState->dwCurbeOffset, |
| sizeof(cmd))); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateHmeParam( |
| m_16xMeEnabled, |
| m_32xMeEnabled, |
| meMethod, |
| &cmd)); |
| ) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer, MeSurfaceParams* 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->pCurrOriginalPic); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps4xMeMvDataBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeDistortionBuffer); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->psMeBrcDistortionBuffer); |
| |
| CODECHAL_MEDIA_STATE_TYPE encMediaStateType; |
| encMediaStateType = (params->b32xMeInUse) ? CODECHAL_MEDIA_STATE_32X_ME : |
| params->b16xMeInUse ? CODECHAL_MEDIA_STATE_16X_ME : CODECHAL_MEDIA_STATE_4X_ME; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->pMeBindingTable); |
| auto meBindingTable = params->pMeBindingTable; |
| |
| auto currFieldPicture = CodecHal_PictureIsField(*(params->pCurrOriginalPic)) ? 1 : 0; |
| auto currBottomField = CodecHal_PictureIsBottomField(*(params->pCurrOriginalPic)) ? 1 : 0; |
| uint8_t ucCurrVDirection = (!currFieldPicture) ? CODECHAL_VDIRECTION_FRAME : |
| ((currBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD); |
| |
| PMOS_SURFACE currScaledSurface = nullptr, meMvDataBuffer = nullptr; |
| uint32_t meMvBottomFieldOffset = 0, currScaledBottomFieldOffset = 0, refScaledBottomFieldOffset = 0; |
| if (params->b32xMeInUse) |
| { |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps32xMeMvDataBuffer); |
| currScaledSurface = m_trackedBuf->Get32xDsSurface(CODEC_CURR_TRACKED_BUFFER); |
| meMvDataBuffer = params->ps32xMeMvDataBuffer; |
| meMvBottomFieldOffset = params->dw32xMeMvBottomFieldOffset; |
| currScaledBottomFieldOffset = params->dw32xScaledBottomFieldOffset; |
| } |
| else if (params->b16xMeInUse) |
| { |
| CODECHAL_ENCODE_CHK_NULL_RETURN(params->ps16xMeMvDataBuffer); |
| currScaledSurface = m_trackedBuf->Get16xDsSurface(CODEC_CURR_TRACKED_BUFFER); |
| meMvDataBuffer = params->ps16xMeMvDataBuffer; |
| meMvBottomFieldOffset = params->dw16xMeMvBottomFieldOffset; |
| currScaledBottomFieldOffset = params->dw16xScaledBottomFieldOffset; |
| } |
| else |
| { |
| currScaledSurface = m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER); |
| meMvDataBuffer = params->ps4xMeMvDataBuffer; |
| meMvBottomFieldOffset = params->dw4xMeMvBottomFieldOffset; |
| currScaledBottomFieldOffset = params->dw4xScaledBottomFieldOffset; |
| } |
| |
| // Reference height and width information should be taken from the current scaled surface rather |
| // than from the reference scaled surface in the case of PAFF. |
| auto refScaledSurface = *currScaledSurface; |
| |
| auto width = MOS_ALIGN_CEIL(params->dwDownscaledWidthInMb * 32, 64); |
| auto height = params->dwDownscaledHeightInMb * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER; |
| |
| // Force the values |
| meMvDataBuffer->dwWidth = width; |
| meMvDataBuffer->dwHeight = height; |
| meMvDataBuffer->dwPitch = width; |
| |
| CODECHAL_SURFACE_CODEC_PARAMS surfaceParams; |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = meMvDataBuffer; |
| surfaceParams.dwOffset = meMvBottomFieldOffset; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMEMVDataSurface; |
| surfaceParams.bIsWritable = true; |
| surfaceParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| |
| if (params->b16xMeInUse && params->b32xMeEnabled) |
| { |
| // Pass 32x MV to 16x ME operation |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = params->ps32xMeMvDataBuffer; |
| surfaceParams.dwOffset = |
| currBottomField ? params->dw32xMeMvBottomFieldOffset : 0; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dw32xMEMVDataSurface; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| else if (!params->b32xMeInUse && params->b16xMeEnabled) |
| { |
| // Pass 16x MV to 4x ME operation |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = params->ps16xMeMvDataBuffer; |
| surfaceParams.dwOffset = |
| currBottomField ? params->dw16xMeMvBottomFieldOffset : 0; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dw16xMEMVDataSurface; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| |
| // Insert Distortion buffers only for 4xMe case |
| if (!params->b32xMeInUse && !params->b16xMeInUse) |
| { |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = params->psMeBrcDistortionBuffer; |
| surfaceParams.dwOffset = params->dwMeBrcDistortionBottomFieldOffset; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMEBRCDist; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE].Value; |
| surfaceParams.bIsWritable = true; |
| surfaceParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bIs2DSurface = true; |
| surfaceParams.bMediaBlockRW = true; |
| surfaceParams.psSurface = params->psMeDistortionBuffer; |
| surfaceParams.dwOffset = params->dwMeDistortionBottomFieldOffset; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMEDist; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value; |
| surfaceParams.bIsWritable = true; |
| surfaceParams.bRenderTarget = true; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| |
| // Setup references 1...n |
| // LIST 0 references |
| uint8_t refPicIdx, refIdx; |
| CODEC_PICTURE refPic; |
| bool refFieldPicture, refBottomField; |
| for (refIdx = 0; refIdx <= params->dwNumRefIdxL0ActiveMinus1; refIdx++) |
| { |
| refPic = params->pL0RefFrameList[refIdx]; |
| |
| if (!CodecHal_PictureIsInvalid(refPic) && params->pPicIdx[refPic.FrameIdx].bValid) |
| { |
| if (refIdx == 0) |
| { |
| // Current Picture Y - VME |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bUseAdvState = true; |
| surfaceParams.psSurface = currScaledSurface; |
| surfaceParams.dwOffset = currBottomField ? currScaledBottomFieldOffset : 0; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMECurrForFwdRef; |
| surfaceParams.ucVDirection = ucCurrVDirection; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| |
| refFieldPicture = CodecHal_PictureIsField(refPic) ? 1 : 0; |
| refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0; |
| refPicIdx = params->pPicIdx[refPic.FrameIdx].ucPicIdx; |
| uint8_t scaledIdx = params->ppRefList[refPicIdx]->ucScalingIdx; |
| MOS_SURFACE* surface; |
| if (params->b32xMeInUse) |
| { |
| surface = m_trackedBuf->Get32xDsSurface(scaledIdx); |
| } |
| else if (params->b16xMeInUse) |
| { |
| surface = m_trackedBuf->Get16xDsSurface(scaledIdx); |
| } |
| else |
| { |
| surface = m_trackedBuf->Get4xDsSurface(scaledIdx); |
| } |
| CODECHAL_ENCODE_CHK_NULL_RETURN(surface); |
| refScaledSurface.OsResource = surface->OsResource; |
| refScaledBottomFieldOffset = refBottomField ? currScaledBottomFieldOffset : 0; |
| // L0 Reference Picture Y - VME |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bUseAdvState = true; |
| surfaceParams.psSurface = &refScaledSurface; |
| surfaceParams.dwOffset = refBottomField ? refScaledBottomFieldOffset : 0; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMEFwdRefPicIdx[refIdx]; |
| surfaceParams.ucVDirection = !currFieldPicture ? CODECHAL_VDIRECTION_FRAME : |
| ((refBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| } |
| |
| // Setup references 1...n |
| // LIST 1 references |
| for (refIdx = 0; refIdx <= params->dwNumRefIdxL1ActiveMinus1; refIdx++) |
| { |
| refPic = params->pL1RefFrameList[refIdx]; |
| |
| if (!CodecHal_PictureIsInvalid(refPic) && params->pPicIdx[refPic.FrameIdx].bValid) |
| { |
| if (refIdx == 0) |
| { |
| // Current Picture Y - VME |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bUseAdvState = true; |
| surfaceParams.psSurface = currScaledSurface; |
| surfaceParams.dwOffset = currBottomField ? currScaledBottomFieldOffset : 0; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMECurrForBwdRef; |
| surfaceParams.ucVDirection = ucCurrVDirection; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| |
| refFieldPicture = CodecHal_PictureIsField(refPic) ? 1 : 0; |
| refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0; |
| refPicIdx = params->pPicIdx[refPic.FrameIdx].ucPicIdx; |
| uint8_t scaledIdx = params->ppRefList[refPicIdx]->ucScalingIdx; |
| MOS_SURFACE* surface; |
| if (params->b32xMeInUse) |
| { |
| surface = m_trackedBuf->Get32xDsSurface(scaledIdx); |
| } |
| else if (params->b16xMeInUse) |
| { |
| surface = m_trackedBuf->Get16xDsSurface(scaledIdx); |
| } |
| else |
| { |
| surface = m_trackedBuf->Get4xDsSurface(scaledIdx); |
| } |
| CODECHAL_ENCODE_CHK_NULL_RETURN(surface); |
| refScaledSurface.OsResource = surface->OsResource; |
| refScaledBottomFieldOffset = refBottomField ? currScaledBottomFieldOffset : 0; |
| // L1 Reference Picture Y - VME |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.bUseAdvState = true; |
| surfaceParams.psSurface = &refScaledSurface; |
| surfaceParams.dwOffset = refBottomField ? refScaledBottomFieldOffset : 0; |
| surfaceParams.dwCacheabilityControl = m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_HME_DOWNSAMPLED_ENCODE].Value; |
| surfaceParams.dwBindingTableOffset = meBindingTable->dwMEBwdRefPicIdx[refIdx]; |
| surfaceParams.ucVDirection = (!currFieldPicture) ? CODECHAL_VDIRECTION_FRAME : |
| ((refBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState( |
| m_hwInterface, |
| cmdBuffer, |
| &surfaceParams, |
| params->pKernelState)); |
| } |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::GenericEncodePictureLevel(PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| auto trellisQuantParams = &m_trellisQuantParams; |
| |
| PerfTagSetting perfTag; |
| perfTag.Value = 0; |
| perfTag.Mode = (uint16_t)m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; |
| perfTag.CallType = CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE; |
| perfTag.PictureCodingType = m_pictureCodingType; |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| // set MFX_PIPE_MODE_SELECT values |
| MHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams; |
| pipeModeSelectParams.Mode = m_mode; |
| pipeModeSelectParams.bStreamOutEnabled = (m_currPass != m_numPasses);// Disable Stream Out for final pass; its important for multiple passes, because , next pass will take the qp from stream out |
| |
| pipeModeSelectParams.bDeblockerStreamOutEnable = params->bDeblockerStreamOutEnable; |
| pipeModeSelectParams.bPostDeblockOutEnable = params->bPostDeblockOutEnable; |
| pipeModeSelectParams.bPreDeblockOutEnable = params->bPreDeblockOutEnable; |
| pipeModeSelectParams.bDynamicSliceEnable = m_avcSeqParam->EnableSliceLevelRateCtrl; |
| |
| // set MFX_PIPE_BUF_ADDR_STATE values |
| MHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams; |
| pipeBufAddrParams.Mode = m_mode; |
| pipeBufAddrParams.psPreDeblockSurface = params->psPreDeblockSurface; |
| pipeBufAddrParams.psPostDeblockSurface = params->psPostDeblockSurface; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_mmcState); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mmcState->SetPipeBufAddr(&pipeBufAddrParams)); |
| |
| pipeBufAddrParams.psRawSurface = m_rawSurfaceToPak; |
| pipeBufAddrParams.presStreamOutBuffer = &m_resStreamOutBuffer[m_currRecycledBufIdx]; |
| pipeBufAddrParams.presMfdDeblockingFilterRowStoreScratchBuffer = &m_resDeblockingFilterRowStoreScratchBuffer; |
| pipeBufAddrParams.presMfdIntraRowStoreScratchBuffer = &m_intraRowStoreScratchBuffer; |
| pipeBufAddrParams.presMacroblockIldbStreamOutBuffer1 = params->presMacroblockIldbStreamOutBuffer1; |
| pipeBufAddrParams.presMacroblockIldbStreamOutBuffer2 = params->presMacroblockIldbStreamOutBuffer2; |
| |
| CODECHAL_DEBUG_TOOL( |
| // PAK Input Raw Surface |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| m_rawSurfaceToPak, |
| CodechalDbgAttr::attrEncodeRawInputSurface, |
| "PAK_Input_SrcSurf")); |
| ) |
| |
| auto firstValidFrame = &m_reconSurface.OsResource; |
| |
| // Setting invalid entries to nullptr |
| for (uint32_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++) |
| { |
| pipeBufAddrParams.presReferences[i] = nullptr; |
| } |
| |
| uint8_t firstValidFrameId = CODEC_AVC_MAX_NUM_REF_FRAME; |
| |
| for (uint32_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++) |
| { |
| if (m_picIdx[i].bValid) |
| { |
| uint8_t picIdx = m_picIdx[i].ucPicIdx; |
| uint8_t frameStoreId = m_refList[picIdx]->ucFrameId; |
| |
| CodecHalGetResourceInfo( |
| m_osInterface, |
| &(m_refList[picIdx]->sRefReconBuffer)); |
| pipeBufAddrParams.presReferences[frameStoreId] = |
| &(m_refList[picIdx]->sRefReconBuffer.OsResource); |
| |
| if (picIdx < firstValidFrameId) |
| { |
| firstValidFrameId = picIdx; |
| firstValidFrame = pipeBufAddrParams.presReferences[picIdx]; |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_NULL_RETURN(m_debugInterface); |
| MOS_SURFACE refSurface; |
| |
| MOS_ZeroMemory(&refSurface, sizeof(refSurface)); |
| refSurface.Format = Format_NV12; |
| refSurface.OsResource = *(pipeBufAddrParams.presReferences[frameStoreId]); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo( |
| m_osInterface, |
| &refSurface)); |
| |
| m_debugInterface->m_refIndex = frameStoreId; |
| std::string refSurfName = "RefSurf[" + std::to_string(static_cast<uint32_t>(m_debugInterface->m_refIndex)) + "]"; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| &refSurface, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| refSurfName.c_str()));) |
| } |
| } |
| |
| for (uint32_t i = 0; i < CODEC_AVC_MAX_NUM_REF_FRAME; i++) |
| { |
| // error concealment for the unset reference addresses |
| if (!pipeBufAddrParams.presReferences[i]) |
| { |
| pipeBufAddrParams.presReferences[i] = firstValidFrame; |
| } |
| } |
| |
| if (m_sliceSizeStreamoutSupported) |
| { |
| pipeBufAddrParams.presSliceSizeStreamOutBuffer = &m_pakSliceSizeStreamoutBuffer; |
| } |
| |
| // set MFX_IND_OBJ_BASE_ADDR_STATE values |
| MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams; |
| MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams)); |
| indObjBaseAddrParams.Mode = CODECHAL_ENCODE_MODE_AVC; |
| |
| indObjBaseAddrParams.presMvObjectBuffer = &m_resMvDataSurface; |
| indObjBaseAddrParams.dwMvObjectOffset = m_mvBottomFieldOffset; |
| indObjBaseAddrParams.dwMvObjectSize = m_mvDataSize; |
| indObjBaseAddrParams.presPakBaseObjectBuffer = &m_resBitstreamBuffer; |
| indObjBaseAddrParams.dwPakBaseObjectSize = m_bitstreamUpperBound; |
| |
| // set MFX_BSP_BUF_BASE_ADDR_STATE values |
| MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS bspBufBaseAddrParams; |
| MOS_ZeroMemory(&bspBufBaseAddrParams, sizeof(bspBufBaseAddrParams)); |
| bspBufBaseAddrParams.presBsdMpcRowStoreScratchBuffer = &m_resMPCRowStoreScratchBuffer; |
| |
| MHW_VDBOX_QM_PARAMS qmParams; |
| qmParams.Standard = CODECHAL_AVC; |
| qmParams.pAvcIqMatrix = (PMHW_VDBOX_AVC_QM_PARAMS)m_avcIQWeightScaleLists; |
| |
| MHW_VDBOX_QM_PARAMS fqmParams; |
| fqmParams.Standard = CODECHAL_AVC; |
| fqmParams.pAvcIqMatrix = (PMHW_VDBOX_AVC_QM_PARAMS)m_avcIQWeightScaleLists; |
| |
| // Add AVC Direct Mode command |
| MHW_VDBOX_AVC_DIRECTMODE_PARAMS directmodeParams; |
| MOS_ZeroMemory(&directmodeParams, sizeof(directmodeParams)); |
| directmodeParams.CurrPic = m_avcPicParam->CurrReconstructedPic; |
| directmodeParams.isEncode = true; |
| directmodeParams.uiUsedForReferenceFlags = 0xFFFFFFFF; |
| directmodeParams.pAvcPicIdx = &(m_picIdx[0]); |
| directmodeParams.avcRefList = (void**)m_refList; |
| directmodeParams.bPicIdRemappingInUse = false; |
| directmodeParams.bDisableDmvBuffers = true; |
| |
| // PAK cmd buffer header insertion for 1) non STF 2) STF (except VDEnc BRC case inserted in HuC cmd buffer) |
| if (!m_singleTaskPhaseSupported || m_firstTaskInPhase) |
| { |
| bool requestFrameTracking = false; |
| |
| m_hwInterface->m_numRequestedEuSlices = ((m_frameHeight * m_frameWidth) >= m_ssdResolutionThreshold && |
| m_targetUsage <= m_ssdTargetUsageThreshold) ? |
| m_sliceShutdownRequestState : m_sliceShutdownDefaultState; |
| |
| // Send command buffer header at the beginning (OS dependent) |
| // frame tracking tag is only added in the last command buffer header |
| requestFrameTracking = m_singleTaskPhaseSupported ? m_firstTaskInPhase : m_lastTaskInPhase; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(&cmdBuffer, requestFrameTracking)); |
| |
| m_hwInterface->m_numRequestedEuSlices = CODECHAL_SLICE_SHUTDOWN_DEFAULT; |
| } |
| |
| if (m_currPass == 0 && params->bBrcEnabled) |
| { |
| CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS encodePictureLevelParam; |
| MOS_ZeroMemory(&encodePictureLevelParam, sizeof(encodePictureLevelParam)); |
| encodePictureLevelParam.presBrcHistoryBuffer = params->presBrcHistoryBuffer; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(SceneChangeReport(&cmdBuffer, &encodePictureLevelParam)); |
| } |
| |
| if (m_currPass) |
| { |
| MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS miConditionalBatchBufferEndParams; |
| // Insert conditional batch buffer end |
| MOS_ZeroMemory( |
| &miConditionalBatchBufferEndParams, |
| sizeof(MHW_MI_CONDITIONAL_BATCH_BUFFER_END_PARAMS)); |
| |
| miConditionalBatchBufferEndParams.presSemaphoreBuffer = |
| &m_encodeStatusBuf.resStatusBuffer; |
| miConditionalBatchBufferEndParams.dwOffset = |
| (m_encodeStatusBuf.wCurrIndex * m_encodeStatusBuf.dwReportSize) + |
| m_encodeStatusBuf.dwImageStatusMaskOffset + |
| (sizeof(uint32_t) * 2); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiConditionalBatchBufferEndCmd( |
| &cmdBuffer, |
| &miConditionalBatchBufferEndParams)); |
| } |
| |
| if (!m_currPass && m_osInterface->bTagResourceSync) |
| { |
| // This is a short term solution to solve the sync tag issue: the sync tag write for PAK is inserted at the end of 2nd pass PAK BB |
| // which may be skipped in multi-pass PAK enabled case. The idea here is to insert the previous frame's tag at the beginning |
| // of the BB and keep the current frame's tag at the end of the BB. There will be a delay for tag update but it should be fine |
| // as long as Dec/VP/Enc won't depend on this PAK so soon. |
| MHW_MI_STORE_DATA_PARAMS params; |
| PMOS_RESOURCE globalGpuContextSyncTagBuffer = nullptr; |
| uint32_t value; |
| |
| CODECHAL_HW_CHK_STATUS_RETURN(m_osInterface->pfnGetGpuStatusBufferResource( |
| m_osInterface, |
| globalGpuContextSyncTagBuffer)); |
| CODECHAL_HW_CHK_NULL_RETURN(globalGpuContextSyncTagBuffer); |
| |
| value = m_osInterface->pfnGetGpuStatusTag(m_osInterface, m_osInterface->CurrentGpuContextOrdinal); |
| params.pOsResource = globalGpuContextSyncTagBuffer; |
| params.dwResourceOffset = m_osInterface->pfnGetGpuStatusTagOffset(m_osInterface, m_osInterface->CurrentGpuContextOrdinal); |
| params.dwValue = (value > 0) ? (value - 1) : 0; |
| CODECHAL_HW_CHK_STATUS_RETURN(m_miInterface->AddMiStoreDataImmCmd(&cmdBuffer, ¶ms)); |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(StartStatusReport(&cmdBuffer, CODECHAL_NUM_MEDIA_STATES)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeModeSelectCmd(&cmdBuffer, &pipeModeSelectParams)); |
| |
| // set MFX_SURFACE_STATE values |
| // Ref surface |
| MHW_VDBOX_SURFACE_PARAMS reconSurfaceParams; |
| MOS_ZeroMemory(&reconSurfaceParams, sizeof(reconSurfaceParams)); |
| reconSurfaceParams.Mode = m_mode; |
| reconSurfaceParams.ucSurfaceStateId = CODECHAL_MFX_REF_SURFACE_ID; |
| reconSurfaceParams.psSurface = &m_reconSurface; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd(&cmdBuffer, &reconSurfaceParams)); |
| |
| // Src surface |
| MHW_VDBOX_SURFACE_PARAMS surfaceParams; |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.Mode = m_mode; |
| surfaceParams.ucSurfaceStateId = CODECHAL_MFX_SRC_SURFACE_ID; |
| surfaceParams.psSurface = m_rawSurfaceToPak; |
| surfaceParams.bDisplayFormatSwizzle = m_avcPicParam->bDisplayFormatSwizzle; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd(&cmdBuffer, &surfaceParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeBufAddrCmd(&cmdBuffer, &pipeBufAddrParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxIndObjBaseAddrCmd(&cmdBuffer, &indObjBaseAddrParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxBspBufBaseAddrCmd(&cmdBuffer, &bspBufBaseAddrParams)); |
| |
| if (params->bBrcEnabled && m_avcSeqParam->RateControlMethod != RATECONTROL_ICQ) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferStartCmd( |
| &cmdBuffer, |
| params->pImgStateBatchBuffer)); |
| } |
| else |
| { |
| //Set MFX_AVC_IMG_STATE command |
| MHW_VDBOX_AVC_IMG_PARAMS imageStateParams; |
| imageStateParams.currPass = m_currPass; |
| imageStateParams.pEncodeAvcPicParams = m_avcPicParam; |
| imageStateParams.pEncodeAvcSeqParams = m_avcSeqParam; |
| imageStateParams.pEncodeAvcSliceParams = m_avcSliceParams; |
| if (CodecHalIsFeiEncode(m_codecFunction) && m_avcFeiPicParams && m_avcFeiPicParams->dwMaxFrameSize) |
| { |
| imageStateParams.pDeltaQp = m_avcFeiPicParams->pDeltaQp; |
| imageStateParams.dwMaxFrameSize = m_avcFeiPicParams->dwMaxFrameSize; |
| } |
| else if (CodecHalUsesPakEngine(m_codecFunction) && m_avcPicParam->dwMaxFrameSize) |
| { |
| imageStateParams.pDeltaQp = m_avcPicParam->pDeltaQp; |
| imageStateParams.dwMaxFrameSize = m_avcPicParam->dwMaxFrameSize; |
| } |
| imageStateParams.wPicWidthInMb = m_picWidthInMb; |
| imageStateParams.wPicHeightInMb = m_picHeightInMb; |
| imageStateParams.ppRefList = &(m_refList[0]); |
| imageStateParams.dwTqEnabled = trellisQuantParams->dwTqEnabled; |
| imageStateParams.dwTqRounding = trellisQuantParams->dwTqRounding; |
| imageStateParams.ucKernelMode = m_kernelMode; |
| imageStateParams.wSlcHeightInMb = m_sliceHeight; |
| imageStateParams.dwMaxVmvR = CodecHalAvcEncode_GetMaxVmvR(m_avcSeqParam->Level); |
| imageStateParams.bSliceSizeStreamOutEnabled = m_sliceSizeStreamoutSupported; |
| |
| if (m_currPass && m_currPass == m_numPasses) |
| { |
| // Enable IPCM pass, excluding VDENC BRC case |
| imageStateParams.bIPCMPass = true; |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcImgCmd(&cmdBuffer, nullptr, &imageStateParams)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulatePakParam( |
| &cmdBuffer, |
| nullptr)); |
| ) |
| } |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxQmCmd(&cmdBuffer, &qmParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxFqmCmd(&cmdBuffer, &fqmParams)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxAvcDirectmodeCmd(&cmdBuffer, &directmodeParams)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::SendPrologWithFrameTracking( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| bool frameTracking, |
| MHW_MI_MMIOREGISTERS *mmioRegister) |
| { |
| return CodechalEncoderState::SendPrologWithFrameTracking(cmdBuffer, frameTracking, mmioRegister); |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::ExecutePreEnc(EncoderParams* encodeParams) |
| { |
| MOS_SYNC_PARAMS syncParams; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(encodeParams->pPreEncParams); |
| FeiPreEncParams *preEncParams = (FeiPreEncParams *)encodeParams->pPreEncParams; |
| |
| m_encodeParams = *encodeParams; |
| m_newSeqHeader = encodeParams->newSeqHeader; |
| m_newPpsHeader = encodeParams->newPpsHeader; |
| m_arbitraryNumMbsInSlice = encodeParams->arbitraryNumMbsInSlice; |
| |
| if (preEncParams->bDisableMVOutput && preEncParams->bDisableStatisticsOutput) |
| { |
| m_disableStatusReport = true; |
| } |
| |
| m_osInterface->pfnIncPerfFrameID(m_osInterface); |
| |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(InitializePicture(m_encodeParams), |
| "Encoding initialization failed."); |
| |
| // Check if source surface needs to be synchronized and should wait for decode or VPP or any other context |
| if (m_firstField) |
| { |
| syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_renderContext; |
| syncParams.presSyncResource = &m_rawSurface.OsResource; |
| syncParams.bReadOnly = true; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(m_osInterface, &syncParams)); |
| |
| // Update the resource tag (s/w tag) for On-Demand Sync |
| // set the tag on render context for ENC case only, else set it on video context for ENC+PAK case |
| m_osInterface->pfnSetResourceSyncTag(m_osInterface, &syncParams); |
| } |
| |
| // set render engine context |
| m_osInterface->pfnSetGpuContext(m_osInterface, m_renderContext); |
| m_osInterface->pfnResetOsStates(m_osInterface); |
| |
| // set all status reports to completed state |
| InitStatusReport(); |
| |
| // Call ENC Kernels |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(ExecuteKernelFunctions(), |
| "ENC failed."); |
| |
| #ifndef FEI_ENABLE_CMRT |
| // Flush encode eStatus buffer |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(ResetStatusReport(), |
| "ResetStatusReprot failed."); |
| #else |
| CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(ResetStatusReport(), |
| "ResetStatusReprot failed."); |
| #endif |
| m_disableStatusReport = false; |
| |
| if (m_firstFrame == false && m_firstTwoFrames == true) |
| { |
| m_firstTwoFrames = false; |
| } |
| |
| m_firstFrame = false; |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| MOS_STATUS CodechalEncodeAvcEnc::PopulateHmeParam( |
| bool is16xMeEnabled, |
| bool is32xMeEnabled, |
| 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; |
| } |
| |
| CODECHAL_ENCODE_AVC_ME_CURBE *curbe = (CODECHAL_ENCODE_AVC_ME_CURBE *)cmd; |
| |
| if (m_pictureCodingType == P_TYPE) |
| { |
| m_avcPar->SuperHME = is16xMeEnabled; |
| m_avcPar->UltraHME = is32xMeEnabled; |
| m_avcPar->SuperCombineDist = curbe->DW6.SuperCombineDist; |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::DumpFrameParFile() |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| std::ostringstream oss; |
| oss.setf(std::ios::showbase | std::ios::uppercase); |
| |
| if (m_pictureCodingType == I_TYPE) |
| { |
| // I Slice Parameters |
| // DDI Params |
| oss << "ProfileIDC = " << std::dec << +m_avcPar->ProfileIDC << std::endl; |
| oss << "LevelIDC = " << std::dec << +m_avcPar->LevelIDC << std::endl; |
| oss << "DisableVUIHeader = " << std::dec << +m_avcPar->DisableVUIHeader << std::endl; |
| oss << "ChromaFormatIDC = " << std::dec << +m_avcPar->ChromaFormatIDC << std::endl; |
| oss << "ChromaQpOffset = " << std::dec << +m_avcPar->ChromaQpOffset << std::endl; |
| oss << "SecondChromaQpOffset = " << std::dec << +m_avcPar->SecondChromaQpOffset << std::endl; |
| oss << "PictureCodingType = " << std::dec << +m_avcPar->PictureCodingType << std::endl; |
| oss << "NumP = " << std::dec << +m_avcPar->NumP << std::endl; |
| oss << "NumB = " << std::dec << +m_avcPar->NumB << std::endl; |
| oss << "NumSlices = " << std::dec << +m_avcPar->NumSlices << std::endl; |
| oss << "ISliceQP = " << std::dec << +m_avcPar->ISliceQP << std::endl; |
| oss << "FrameRateM = " << std::dec << +m_avcPar->FrameRateM << std::endl; |
| oss << "FrameRateD = " << std::dec << +m_avcPar->FrameRateD << std::endl; |
| oss << "BRCMethod = " << std::dec << +m_avcPar->BRCMethod << std::endl; |
| oss << "BRCType = " << std::dec << +m_avcPar->BRCType << std::endl; |
| oss << "DeblockingIDC = " << std::dec << +m_avcPar->DeblockingIDC << std::endl; |
| oss << "DeblockingFilterAlpha = " << std::dec << +m_avcPar->DeblockingFilterAlpha << std::endl; |
| oss << "DeblockingFilterBeta = " << std::dec << +m_avcPar->DeblockingFilterBeta << std::endl; |
| oss << "EntropyCodingMode = " << std::dec << +m_avcPar->EntropyCodingMode << std::endl; |
| oss << "DirectInference = " << std::dec << +m_avcPar->DirectInference << std::endl; |
| oss << "Transform8x8Mode = " << std::dec << +m_avcPar->Transform8x8Mode << std::endl; |
| oss << "CRFQualityFactor = " << std::dec << +m_avcPar->CRFQualityFactor << std::endl; |
| oss << "ConstrainedIntraPred = " << std::dec << +m_avcPar->ConstrainedIntraPred << std::endl; |
| if (m_avcPar->NumP == 0) // There's no P frame |
| { |
| oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl; |
| oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl; |
| } |
| |
| // DS Params |
| oss << "MBFlatnessThreshold = " << std::dec << +m_encodeParState->m_commonPar->mbFlatnessThreshold << std::endl; |
| |
| // BRC init Params |
| oss << "MBBRCEnable = " << std::dec << +m_avcPar->MBBRCEnable << std::endl; |
| oss << "MBRC = " << std::dec << +m_avcPar->MBRC << std::endl; |
| oss << "BitRate = " << std::dec << +m_avcPar->BitRate << std::endl; |
| oss << "InitVbvFullnessInBit = " << std::dec << +m_avcPar->InitVbvFullnessInBit << std::endl; |
| oss << "MaxBitRate = " << std::dec << +m_avcPar->MaxBitRate << std::endl; |
| oss << "VbvSzInBit = " << std::dec << +m_avcPar->VbvSzInBit << std::endl; |
| oss << "AvbrAccuracy = " << std::dec << +m_avcPar->AvbrAccuracy << std::endl; |
| oss << "AvbrConvergence = " << std::dec << +m_avcPar->AvbrConvergence << std::endl; |
| oss << "Window_Size = " << std::dec << +m_avcPar->SlidingWindowSize << std::endl; |
| oss << "LongTermReferenceInterval = " << std::dec << +m_avcPar->LongTermInterval << std::endl; |
| |
| // BRC frame update Params |
| oss << "EnableMultipass = " << std::dec << +m_avcPar->EnableMultipass << std::endl; |
| oss << "MaxNumPakPasses = " << std::dec << +m_avcPar->MaxNumPakPasses << std::endl; |
| oss << "Sliding_Window_Enable = " << std::dec << +m_avcPar->SlidingWindowEnable << std::endl; |
| oss << "UserMaxFrame = " << std::dec << +m_avcPar->UserMaxFrame << std::endl; |
| oss << "FrameSkip_enable = " << std::dec << +m_avcPar->FrameSkipEnable << std::endl; |
| |
| // Enc Params |
| oss << "BlockBasedSkip = " << std::dec << +m_avcPar->BlockBasedSkip << std::endl; |
| oss << "DisableExtendedMvCostRange = " << std::dec << +m_avcPar->DisableExtendedMvCostRange << std::endl; |
| oss << "EnableAdaptiveSearch = " << std::dec << +m_avcPar->EnableAdaptiveSearch << std::endl; |
| oss << "EnableFBRBypass = " << std::dec << +m_avcPar->EnableFBRBypass << std::endl; |
| oss << "MRDisableQPCheck = " << std::dec << +m_avcPar->MRDisableQPCheck << std::endl; |
| oss << "MADEnableFlag = " << std::dec << +m_avcPar->MADEnableFlag << std::endl; |
| oss << "EnableMBFlatnessCheckOptimization = " << std::dec << +m_avcPar->EnableMBFlatnessCheckOptimization << std::endl; |
| oss << "EnableArbitrarySliceSize = " << std::dec << +m_avcPar->EnableArbitrarySliceSize << std::endl; |
| oss << "RefThresh = " << std::dec << +m_avcPar->RefThresh << std::endl; |
| oss << "EnableWavefrontOptimization = " << std::dec << +m_avcPar->EnableWavefrontOptimization << std::endl; |
| oss << "AllFractional = " << std::dec << +m_avcPar->AllFractional << std::endl; |
| oss << "DisableAllFractionalCheckForHighRes = " << std::dec << +m_avcPar->DisableAllFractionalCheckForHighRes << std::endl; |
| oss << "MaxLenSP = " << std::dec << +m_avcPar->MaxLenSP << std::endl; |
| |
| // PAK Params |
| oss << "TrellisQuantizationEnable = " << std::dec << +m_avcPar->TrellisQuantizationEnable << std::endl; |
| oss << "RoundingIntraEnabled = " << std::dec << +m_avcPar->RoundingIntraEnabled << std::endl; |
| oss << "RoundingIntra = " << std::dec << +m_avcPar->RoundingIntra << std::endl; |
| oss << "EnableAdaptiveTrellisQuantization = " << std::dec << +m_avcPar->EnableAdaptiveTrellisQuantization << std::endl; |
| oss << "TrellisQuantizationRounding = " << std::dec << +m_avcPar->TrellisQuantizationRounding << std::endl; |
| oss << "TrellisQuantizationChromaDisable = " << std::dec << +m_avcPar->TrellisQuantizationChromaDisable << std::endl; |
| oss << "ExtendedRhoDomainEn = " << std::dec << +m_avcPar->ExtendedRhoDomainEn << std::endl; |
| oss << "EnableSEI = " << std::dec << +m_avcPar->EnableSEI << std::endl; |
| if (m_avcPar->NumP == 0) // There's no P frame |
| { |
| oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl; |
| } |
| } |
| else if (m_pictureCodingType == P_TYPE) |
| { |
| // P Slice Parameters |
| // DDI Params |
| oss << "PSliceQP = " << std::dec << +m_avcPar->PSliceQP << std::endl; |
| oss << "CabacInitIDC = " << std::dec << +m_avcPar->CabacInitIDC << std::endl; |
| oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl; |
| oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl; |
| if (m_avcPar->NumB == 0) // There's no B frame |
| { |
| oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl; |
| } |
| oss << "WeightedPred = " << std::dec << +m_avcPar->WeightedPred << std::endl; |
| oss << "UseOrigAsRef = " << std::dec << +m_avcPar->UseOrigAsRef << std::endl; |
| oss << "BiSubMbPartMask = " << std::dec << +m_avcPar->BiSubMbPartMask << std::endl; |
| |
| // HME Params |
| oss << "SuperHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superHME : m_avcPar->SuperHME) << std::endl; |
| oss << "UltraHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->ultraHME : m_avcPar->UltraHME) << std::endl; |
| oss << "SuperCombineDist = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superCombineDist : m_avcPar->SuperCombineDist) << std::endl; |
| |
| // Enc Params |
| oss << "SubPelMode = " << std::dec << +m_avcPar->SubPelMode << std::endl; |
| oss << "FTQBasedSkip = " << std::dec << +m_avcPar->FTQBasedSkip << std::endl; |
| oss << "BiMixDisable = " << std::dec << +m_avcPar->BiMixDisable << std::endl; |
| oss << "SurvivedSkipCost = " << std::dec << +m_avcPar->SurvivedSkipCost << std::endl; |
| oss << "UniMixDisable = " << std::dec << +m_avcPar->UniMixDisable << std::endl; |
| oss << "EnableIntraCostScalingForStaticFrame = " << std::dec << +m_avcPar->EnableIntraCostScalingForStaticFrame << std::endl; |
| if (m_avcPar->EnableIntraCostScalingForStaticFrame) |
| { |
| oss << "IntraCostUpdateMethod = 3" << std::endl; |
| } |
| oss << "StaticFrameIntraCostScalingRatioP = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioP << std::endl; |
| oss << "MEMethod = " << std::dec << +m_avcPar->MEMethod << std::endl; |
| oss << "HMECombineLen = " << std::dec << +m_avcPar->HMECombineLen << std::endl; |
| oss << "HMECombineOverlap = " << std::dec << +m_avcPar->HMECombineOverlap << std::endl; |
| oss << "SearchX = " << std::dec << +m_avcPar->SearchX << std::endl; |
| oss << "SearchY = " << std::dec << +m_avcPar->SearchY << std::endl; |
| oss << "SearchControl = " << std::dec << +m_avcPar->SearchControl << std::endl; |
| oss << "MultiplePred = " << std::dec << +m_avcPar->MultiplePred << std::endl; |
| oss << "EnableAdaptiveTxDecision = " << std::dec << +m_avcPar->EnableAdaptiveTxDecision << std::endl; |
| oss << "MBTextureThreshold = " << std::dec << +m_avcPar->MBTextureThreshold << std::endl; |
| oss << "TxDecisionThr = " << std::dec << +m_avcPar->TxDecisionThr << std::endl; |
| oss << "EnablePerMBStaticCheck = " << std::dec << +m_avcPar->EnablePerMBStaticCheck << std::endl; |
| oss << "EnableAdaptiveSearchWindowSize = " << std::dec << +m_avcPar->EnableAdaptiveSearchWindowSize << std::endl; |
| oss << "EnableAdaptiveIntraScaling = " << std::dec << +m_avcPar->EnableAdaptiveIntraScaling << std::endl; |
| |
| // BRC Frame Update |
| oss << "UserMaxFrame_P = " << std::dec << +m_avcPar->UserMaxFrameP << std::endl; |
| |
| // PAK Params |
| oss << "RoundingInterEnabled = " << std::dec << +m_avcPar->RoundingInterEnabled << std::endl; |
| oss << "RoundingInter = " << std::dec << +m_avcPar->RoundingInter << std::endl; |
| oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl; |
| oss << "EnableAdaptiveRounding = " << std::dec << +m_avcPar->EnableAdaptiveRounding << std::endl; |
| } |
| else if (m_pictureCodingType == B_TYPE) |
| { |
| // B Slice Parameters |
| // DDI Params |
| oss << "BSliceQP = " << std::dec << +m_avcPar->BSliceQP << std::endl; |
| oss << "MaxBRefIdxL0 = " << std::dec << +m_avcPar->MaxBRefIdxL0 << std::endl; |
| oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl; |
| oss << "WeightedBiPred = " << std::dec << +m_avcPar->WeightedBiPred << std::endl; |
| |
| // Enc Params |
| oss << "BMEMethod = " << std::dec << +m_avcPar->BMEMethod << std::endl; |
| oss << "HMEBCombineLen = " << std::dec << +m_avcPar->HMEBCombineLen << std::endl; |
| oss << "BSearchX = " << std::dec << +m_avcPar->BSearchX << std::endl; |
| oss << "BSearchY = " << std::dec << +m_avcPar->BSearchY << std::endl; |
| oss << "BSearchControl = " << std::dec << +m_avcPar->BSearchControl << std::endl; |
| oss << "BSkipType = " << std::dec << +m_avcPar->BSkipType << std::endl; |
| oss << "DirectMode = " << std::dec << +m_avcPar->DirectMode << std::endl; |
| oss << "BiWeight = " << std::dec << +m_avcPar->BiWeight << std::endl; |
| oss << "StaticFrameIntraCostScalingRatioB = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioB << std::endl; |
| |
| // PAK Params |
| oss << "RoundingInterB = " << std::dec << +m_avcPar->RoundingInterB << std::endl; |
| } |
| |
| // Dump per frame par file |
| const char *fileName = m_debugInterface->CreateFileName( |
| "EncodeFrame", |
| "EncodePar", |
| CodechalDbgExtType::par); |
| |
| std::ofstream ofs(fileName, std::ios::out); |
| ofs << oss.str(); |
| ofs.close(); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEnc::DumpSeqParFile() |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| std::ostringstream oss; |
| oss.setf(std::ios::showbase | std::ios::uppercase); |
| |
| // I Slice Parameters |
| // DDI Params |
| oss << "ProfileIDC = " << std::dec << +m_avcPar->ProfileIDC << std::endl; |
| oss << "LevelIDC = " << std::dec << +m_avcPar->LevelIDC << std::endl; |
| oss << "DisableVUIHeader = " << std::dec << +m_avcPar->DisableVUIHeader << std::endl; |
| oss << "ChromaFormatIDC = " << std::dec << +m_avcPar->ChromaFormatIDC << std::endl; |
| oss << "ChromaQpOffset = " << std::dec << +m_avcPar->ChromaQpOffset << std::endl; |
| oss << "SecondChromaQpOffset = " << std::dec << +m_avcPar->SecondChromaQpOffset << std::endl; |
| oss << "PictureCodingType = " << std::dec << +m_avcPar->PictureCodingType << std::endl; |
| oss << "NumP = " << std::dec << +m_avcPar->NumP << std::endl; |
| oss << "NumB = " << std::dec << +m_avcPar->NumB << std::endl; |
| oss << "NumSlices = " << std::dec << +m_avcPar->NumSlices << std::endl; |
| oss << "ISliceQP = " << std::dec << +m_avcPar->ISliceQP << std::endl; |
| oss << "FrameRateM = " << std::dec << +m_avcPar->FrameRateM << std::endl; |
| oss << "FrameRateD = " << std::dec << +m_avcPar->FrameRateD << std::endl; |
| oss << "BRCMethod = " << std::dec << +m_avcPar->BRCMethod << std::endl; |
| oss << "BRCType = " << std::dec << +m_avcPar->BRCType << std::endl; |
| oss << "DeblockingIDC = " << std::dec << +m_avcPar->DeblockingIDC << std::endl; |
| oss << "DeblockingFilterAlpha = " << std::dec << +m_avcPar->DeblockingFilterAlpha << std::endl; |
| oss << "DeblockingFilterBeta = " << std::dec << +m_avcPar->DeblockingFilterBeta << std::endl; |
| oss << "EntropyCodingMode = " << std::dec << +m_avcPar->EntropyCodingMode << std::endl; |
| oss << "DirectInference = " << std::dec << +m_avcPar->DirectInference << std::endl; |
| oss << "Transform8x8Mode = " << std::dec << +m_avcPar->Transform8x8Mode << std::endl; |
| oss << "CRFQualityFactor = " << std::dec << +m_avcPar->CRFQualityFactor << std::endl; |
| oss << "ConstrainedIntraPred = " << std::dec << +m_avcPar->ConstrainedIntraPred << std::endl; |
| if (m_avcPar->NumP == 0) // There's no P frame |
| { |
| oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl; |
| oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl; |
| } |
| |
| // DS Params |
| oss << "MBFlatnessThreshold = " << std::dec << +m_encodeParState->m_commonPar->mbFlatnessThreshold << std::endl; |
| |
| // BRC init Params |
| oss << "MBBRCEnable = " << std::dec << +m_avcPar->MBBRCEnable << std::endl; |
| oss << "MBRC = " << std::dec << +m_avcPar->MBRC << std::endl; |
| oss << "BitRate = " << std::dec << +m_avcPar->BitRate << std::endl; |
| oss << "InitVbvFullnessInBit = " << std::dec << +m_avcPar->InitVbvFullnessInBit << std::endl; |
| oss << "MaxBitRate = " << std::dec << +m_avcPar->MaxBitRate << std::endl; |
| oss << "VbvSzInBit = " << std::dec << +m_avcPar->VbvSzInBit << std::endl; |
| oss << "AvbrAccuracy = " << std::dec << +m_avcPar->AvbrAccuracy << std::endl; |
| oss << "AvbrConvergence = " << std::dec << +m_avcPar->AvbrConvergence << std::endl; |
| oss << "Window_Size = " << std::dec << +m_avcPar->SlidingWindowSize << std::endl; |
| oss << "LongTermReferenceInterval = " << std::dec << +m_avcPar->LongTermInterval << std::endl; |
| |
| // BRC frame update Params |
| oss << "EnableMultipass = " << std::dec << +m_avcPar->EnableMultipass << std::endl; |
| oss << "MaxNumPakPasses = " << std::dec << +m_avcPar->MaxNumPakPasses << std::endl; |
| oss << "Sliding_Window_Enable = " << std::dec << +m_avcPar->SlidingWindowEnable << std::endl; |
| oss << "UserMaxFrame = " << std::dec << +m_avcPar->UserMaxFrame << std::endl; |
| oss << "FrameSkip_enable = " << std::dec << +m_avcPar->FrameSkipEnable << std::endl; |
| |
| // Enc Params |
| oss << "BlockBasedSkip = " << std::dec << +m_avcPar->BlockBasedSkip << std::endl; |
| oss << "DisableExtendedMvCostRange = " << std::dec << +m_avcPar->DisableExtendedMvCostRange << std::endl; |
| oss << "EnableAdaptiveSearch = " << std::dec << +m_avcPar->EnableAdaptiveSearch << std::endl; |
| oss << "EnableFBRBypass = " << std::dec << +m_avcPar->EnableFBRBypass << std::endl; |
| oss << "MRDisableQPCheck = " << std::dec << +m_avcPar->MRDisableQPCheck << std::endl; |
| oss << "MADEnableFlag = " << std::dec << +m_avcPar->MADEnableFlag << std::endl; |
| oss << "EnableMBFlatnessCheckOptimization = " << std::dec << +m_avcPar->EnableMBFlatnessCheckOptimization << std::endl; |
| oss << "EnableArbitrarySliceSize = " << std::dec << +m_avcPar->EnableArbitrarySliceSize << std::endl; |
| oss << "RefThresh = " << std::dec << +m_avcPar->RefThresh << std::endl; |
| oss << "EnableWavefrontOptimization = " << std::dec << +m_avcPar->EnableWavefrontOptimization << std::endl; |
| oss << "AllFractional = " << std::dec << +m_avcPar->AllFractional << std::endl; |
| oss << "DisableAllFractionalCheckForHighRes = " << std::dec << +m_avcPar->DisableAllFractionalCheckForHighRes << std::endl; |
| oss << "MaxLenSP = " << std::dec << +m_avcPar->MaxLenSP << std::endl; |
| |
| // PAK Params |
| oss << "TrellisQuantizationEnable = " << std::dec << +m_avcPar->TrellisQuantizationEnable << std::endl; |
| oss << "RoundingIntraEnabled = " << std::dec << +m_avcPar->RoundingIntraEnabled << std::endl; |
| oss << "RoundingIntra = " << std::dec << +m_avcPar->RoundingIntra << std::endl; |
| oss << "EnableAdaptiveTrellisQuantization = " << std::dec << +m_avcPar->EnableAdaptiveTrellisQuantization << std::endl; |
| oss << "TrellisQuantizationRounding = " << std::dec << +m_avcPar->TrellisQuantizationRounding << std::endl; |
| oss << "TrellisQuantizationChromaDisable = " << std::dec << +m_avcPar->TrellisQuantizationChromaDisable << std::endl; |
| oss << "ExtendedRhoDomainEn = " << std::dec << +m_avcPar->ExtendedRhoDomainEn << std::endl; |
| oss << "EnableSEI = " << std::dec << +m_avcPar->EnableSEI << std::endl; |
| if (m_avcPar->NumP == 0) // There's no P frame |
| { |
| oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl; |
| } |
| |
| if (m_avcPar->NumP > 0) |
| { |
| // P Slice Parameters |
| // DDI Params |
| oss << "PSliceQP = " << std::dec << +m_avcPar->PSliceQP << std::endl; |
| oss << "CabacInitIDC = " << std::dec << +m_avcPar->CabacInitIDC << std::endl; |
| oss << "MaxRefIdxL0 = " << std::dec << +m_avcPar->MaxRefIdxL0 << std::endl; |
| oss << "MaxRefIdxL1 = " << std::dec << +m_avcPar->MaxRefIdxL1 << std::endl; |
| if (m_avcPar->NumB == 0) // There's no B frame |
| { |
| oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl; |
| } |
| oss << "WeightedPred = " << std::dec << +m_avcPar->WeightedPred << std::endl; |
| oss << "UseOrigAsRef = " << std::dec << +m_avcPar->UseOrigAsRef << std::endl; |
| oss << "BiSubMbPartMask = " << std::dec << +m_avcPar->BiSubMbPartMask << std::endl; |
| |
| // HME Params |
| oss << "SuperHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superHME : m_avcPar->SuperHME) << std::endl; |
| oss << "UltraHME = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->ultraHME : m_avcPar->UltraHME) << std::endl; |
| oss << "SuperCombineDist = " << std::dec << +(m_useCommonKernel ? m_encodeParState->m_commonPar->superCombineDist : m_avcPar->SuperCombineDist) << std::endl; |
| |
| // Enc Params |
| oss << "SubPelMode = " << std::dec << +m_avcPar->SubPelMode << std::endl; |
| oss << "FTQBasedSkip = " << std::dec << +m_avcPar->FTQBasedSkip << std::endl; |
| oss << "BiMixDisable = " << std::dec << +m_avcPar->BiMixDisable << std::endl; |
| oss << "SurvivedSkipCost = " << std::dec << +m_avcPar->SurvivedSkipCost << std::endl; |
| oss << "UniMixDisable = " << std::dec << +m_avcPar->UniMixDisable << std::endl; |
| oss << "EnableIntraCostScalingForStaticFrame = " << std::dec << +m_avcPar->EnableIntraCostScalingForStaticFrame << std::endl; |
| if (m_avcPar->EnableIntraCostScalingForStaticFrame) |
| { |
| oss << "IntraCostUpdateMethod = 3" << std::endl; |
| } |
| oss << "StaticFrameIntraCostScalingRatioP = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioP << std::endl; |
| oss << "MEMethod = " << std::dec << +m_avcPar->MEMethod << std::endl; |
| oss << "HMECombineLen = " << std::dec << +m_avcPar->HMECombineLen << std::endl; |
| oss << "HMECombineOverlap = " << std::dec << +m_avcPar->HMECombineOverlap << std::endl; |
| oss << "SearchX = " << std::dec << +m_avcPar->SearchX << std::endl; |
| oss << "SearchY = " << std::dec << +m_avcPar->SearchY << std::endl; |
| oss << "SearchControl = " << std::dec << +m_avcPar->SearchControl << std::endl; |
| oss << "MultiplePred = " << std::dec << +m_avcPar->MultiplePred << std::endl; |
| oss << "EnableAdaptiveTxDecision = " << std::dec << +m_avcPar->EnableAdaptiveTxDecision << std::endl; |
| oss << "MBTextureThreshold = " << std::dec << +m_avcPar->MBTextureThreshold << std::endl; |
| oss << "TxDecisionThr = " << std::dec << +m_avcPar->TxDecisionThr << std::endl; |
| oss << "EnablePerMBStaticCheck = " << std::dec << +m_avcPar->EnablePerMBStaticCheck << std::endl; |
| oss << "EnableAdaptiveSearchWindowSize = " << std::dec << +m_avcPar->EnableAdaptiveSearchWindowSize << std::endl; |
| oss << "EnableAdaptiveIntraScaling = " << std::dec << +m_avcPar->EnableAdaptiveIntraScaling << std::endl; |
| |
| // BRC Frame Update |
| oss << "UserMaxFrame_P = " << std::dec << +m_avcPar->UserMaxFrameP << std::endl; |
| |
| // PAK Params |
| oss << "RoundingInterEnabled = " << std::dec << +m_avcPar->RoundingInterEnabled << std::endl; |
| oss << "RoundingInter = " << std::dec << +m_avcPar->RoundingInter << std::endl; |
| oss << "FrmHdrEncodingFrequency = " << std::dec << +m_avcPar->FrmHdrEncodingFrequency << std::endl; |
| oss << "EnableAdaptiveRounding = " << std::dec << +m_avcPar->EnableAdaptiveRounding << std::endl; |
| } |
| |
| if (m_avcPar->NumB > 0) |
| { |
| // B Slice Parameters |
| // DDI Params |
| oss << "BSliceQP = " << std::dec << +m_avcPar->BSliceQP << std::endl; |
| oss << "MaxBRefIdxL0 = " << std::dec << +m_avcPar->MaxBRefIdxL0 << std::endl; |
| oss << "EnableWeightPredictionDetection = " << std::dec << +m_avcPar->EnableWeightPredictionDetection << std::endl; |
| oss << "WeightedBiPred = " << std::dec << +m_avcPar->WeightedBiPred << std::endl; |
| |
| // Enc Params |
| oss << "BMEMethod = " << std::dec << +m_avcPar->BMEMethod << std::endl; |
| oss << "HMEBCombineLen = " << std::dec << +m_avcPar->HMEBCombineLen << std::endl; |
| oss << "BSearchX = " << std::dec << +m_avcPar->BSearchX << std::endl; |
| oss << "BSearchY = " << std::dec << +m_avcPar->BSearchY << std::endl; |
| oss << "BSearchControl = " << std::dec << +m_avcPar->BSearchControl << std::endl; |
| oss << "BSkipType = " << std::dec << +m_avcPar->BSkipType << std::endl; |
| oss << "DirectMode = " << std::dec << +m_avcPar->DirectMode << std::endl; |
| oss << "BiWeight = " << std::dec << +m_avcPar->BiWeight << std::endl; |
| oss << "StaticFrameIntraCostScalingRatioB = " << std::dec << +m_avcPar->StaticFrameIntraCostScalingRatioB << std::endl; |
| |
| // PAK Params |
| oss << "RoundingInterB = " << std::dec << +m_avcPar->RoundingInterB << std::endl; |
| } |
| |
| const char *fileName = m_debugInterface->CreateFileName( |
| "EncodeSequence", |
| "EncodePar", |
| CodechalDbgExtType::par); |
| |
| std::ofstream ofs(fileName, std::ios::app); |
| ofs << oss.str(); |
| ofs.close(); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| #endif |