| /* |
| * Copyright (c) 2020-2021, 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 encode_avc_huc_brc_init_packet.h |
| //! \brief Defines the implementation of avc huc init packet |
| //! |
| |
| #ifndef __CODECHAL_AVC_HUC_BRC_INIT_PACKET_H__ |
| #define __CODECHAL_AVC_HUC_BRC_INIT_PACKET_H__ |
| |
| #include "encode_huc.h" |
| #include "encode_avc_basic_feature.h" |
| |
| namespace encode |
| { |
| |
| struct VdencAvcHucBrcInitDmem |
| { |
| uint8_t BRCFunc_U8; // 0: Init; 2: Reset |
| uint8_t OpenSourceEnable_U8; // 0: disable opensource, 1: enable opensource |
| uint8_t RVSD[2]; |
| uint16_t INIT_BRCFlag_U16; // ICQ or CQP with slice size control: 0x00 CBR: 0x10; VBR: 0x20; VCM: 0x40; LOWDELAY: 0x80. |
| uint16_t Reserved; |
| uint16_t INIT_FrameWidth_U16; // Luma width in bytes |
| uint16_t INIT_FrameHeight_U16; // Luma height in bytes |
| uint32_t INIT_TargetBitrate_U32; // target bitrate, set by application |
| uint32_t INIT_MinRate_U32; // 0 |
| uint32_t INIT_MaxRate_U32; // Maximum bit rate in bits per second (bps). |
| uint32_t INIT_BufSize_U32; // buffer size |
| uint32_t INIT_InitBufFull_U32; // initial buffer fullness |
| uint32_t INIT_ProfileLevelMaxFrame_U32; // user defined. refer to AVC BRC for conformance check and correction |
| uint32_t INIT_FrameRateM_U32; // FrameRateM is the number of frames in FrameRateD |
| uint32_t INIT_FrameRateD_U32; // If driver gets this FrameRateD from VUI, it is the num_units_in_tick field (32 bits unsigned integer). |
| uint16_t INIT_GopP_U16; // number of P frames in a GOP |
| uint16_t INIT_GopB_U16; // number of B frames in a GOP |
| uint16_t INIT_MinQP_U16; // 10 |
| uint16_t INIT_MaxQP_U16; // 51 |
| int8_t INIT_DevThreshPB0_S8[8]; // lowdelay ? (-45, -33, -23, -15, -8, 0, 15, 25) : (-46, -38, -30, -23, 23, 30, 40, 46) |
| int8_t INIT_DevThreshVBR0_S8[8]; // lowdelay ? (-45, -35, -25, -15, -8, 0, 20, 40) : (-46, -40, -32, -23, 56, 64, 83, 93) |
| int8_t INIT_DevThreshI0_S8[8]; // lowdelay ? (-40, -30, -17, -10, -5, 0, 10, 20) : (-43, -36, -25, -18, 18, 28, 38, 46) |
| uint8_t INIT_InitQPIP; // Initial QP for I and P |
| |
| uint8_t INIT_NotUseRhoDm_U8; // Reserved |
| uint8_t INIT_InitQPB; // Initial QP for B |
| uint8_t INIT_MbQpCtrl_U8; // Enable MB level QP control (global) |
| uint8_t INIT_SliceSizeCtrlEn_U8; // Enable slice size control |
| int8_t INIT_IntraQPDelta_I8[3]; // set to zero for all by default |
| int8_t INIT_SkipQPDelta_I8; // Reserved |
| int8_t INIT_DistQPDelta_I8[4]; // lowdelay ? (-5, -2, 2, 5) : (0, 0, 0, 0) |
| uint8_t INIT_OscillationQpDelta_U8; // BRCFLAG_ISVCM ? 16 : 0 |
| uint8_t INIT_HRDConformanceCheckDisable_U8; // BRCFLAG_ISAVBR ? 1 : 0 |
| uint8_t INIT_SkipFrameEnableFlag; |
| uint8_t INIT_TopQPDeltaThrForAdapt2Pass_U8; // =1. QP Delta threshold for second pass. |
| uint8_t INIT_TopFrmSzThrForAdapt2Pass_U8; // lowdelay ? 10 : 50. Top frame size threshold for second pass |
| uint8_t INIT_BotFrmSzThrForAdapt2Pass_U8; // lowdelay ? 10 : 200. Bottom frame size threshold for second pass |
| uint8_t INIT_QPSelectForFirstPass_U8; // lowdelay ? 0 : 1. =0 to use previous frame final QP; or =1 to use (targetQP + previousQP) / 2. |
| uint8_t INIT_MBHeaderCompensation_U8; // Reserved |
| uint8_t INIT_OverShootCarryFlag_U8; // set to zero by default |
| uint8_t INIT_OverShootSkipFramePct_U8; // set to zero by default |
| uint8_t INIT_EstRateThreshP0_U8[7]; // 4, 8, 12, 16, 20, 24, 28 |
| uint8_t INIT_EstRateThreshB0_U8[7]; // 4, 8, 12, 16, 20, 24, 28 |
| uint8_t INIT_EstRateThreshI0_U8[7]; // 4, 8, 12, 16, 20, 24, 28 |
| uint8_t INIT_FracQPEnable_U8; // ExtendedRhoDomainEn from par file |
| uint8_t INIT_ScenarioInfo_U8; // 0: UNKNOWN, 1: DISPLAYREMOTING, 2: VIDEOCONFERENCE, 3: ARCHIVE, 4: LIVESTREAMING. |
| uint8_t INIT_StaticRegionStreamIn_U8; // should be programmed from par file |
| uint8_t INIT_DeltaQP_Adaptation_U8; // =1, should be programmed from par file |
| uint8_t INIT_MaxCRFQualityFactor_U8; // =52, should be programmed from par file |
| uint8_t INIT_CRFQualityFactor_U8; // =25, should be programmed from par file |
| uint8_t INIT_BotQPDeltaThrForAdapt2Pass_U8; // =1. QP Delta threshold for second pass. |
| uint8_t INIT_SlidingWindowSize_U8; // =30, the window size (in frames) used to compute bit rate |
| uint8_t INIT_SlidingWidowRCEnable_U8; // =0, sliding window based rate control (SWRC) disabled, 1: enabled |
| uint8_t INIT_SlidingWindowMaxRateRatio_U8; // =120, ratio between the max rate within the window and average target bitrate |
| uint8_t INIT_LowDelayGoldenFrameBoost_U8; // only for lowdelay mode, 0 (default): no boost for I and scene change frames, 1: boost |
| uint8_t INIT_AdaptiveCostEnable_U8; // 0: disabled, 1: enabled |
| uint8_t INIT_AdaptiveHMEExtensionEnable_U8; // 0: disabled, 1: enabled |
| uint8_t INIT_ICQReEncode_U8; // 0: disabled, 1: enabled |
| uint8_t INIT_LookaheadDepth_U8; // Lookahead depth in unit of frames [0, 127] |
| uint8_t INIT_SinglePassOnly; // 0: disabled, 1: enabled |
| uint8_t INIT_New_DeltaQP_Adaptation_U8; // = 1 to enable new delta QP adaption |
| uint8_t INIT_ExtMaxBrcLevel_U8; // max hierarchy level of B-frames |
| uint16_t INIT_ExtGopP_U16; // correctly calculated number of P frames in a GOP |
| uint16_t INIT_ExtGopB_U16; // correctly calculated number of B frames in a GOP |
| uint16_t INIT_ExtGopB1_U16; // correctly calculated number of B1 frames in a GOP |
| uint16_t INIT_ExtGopB2_U16; // correctly calculated number of B2 frames in a GOP |
| |
| uint8_t Rsvd2[46]; //!< reserved for 64 bytes aligned, total structure size 192 bytes |
| }; |
| |
| class AvcHucBrcInitPkt : public EncodeHucPkt |
| { |
| public: |
| AvcHucBrcInitPkt(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterfaceNext *hwInterface) : |
| EncodeHucPkt(pipeline, task, hwInterface) {} |
| |
| virtual ~AvcHucBrcInitPkt() {} |
| |
| virtual MOS_STATUS Init() override; |
| |
| virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER *commandBuffer, uint8_t packetPhase = otherPacket) override; |
| |
| virtual MOS_STATUS DumpOutput() override; |
| |
| //! |
| //! \brief Calculate Command Size |
| //! |
| //! \param [in, out] commandBufferSize |
| //! requested size |
| //! \param [in, out] requestedPatchListSize |
| //! requested size |
| //! \return MOS_STATUS |
| //! status |
| //! |
| virtual MOS_STATUS CalculateCommandSize( |
| uint32_t &commandBufferSize, |
| uint32_t &requestedPatchListSize) override; |
| |
| //! |
| //! \brief Get Packet Name |
| //! \return std::string |
| //! |
| virtual std::string GetPacketName() override |
| { |
| return "BRCINIT"; |
| } |
| |
| protected: |
| virtual MOS_STATUS AllocateResources() override; |
| virtual MOS_STATUS AddForceWakeup(MOS_COMMAND_BUFFER &cmdBuffer) override; |
| |
| MHW_SETPAR_DECL_HDR(HUC_IMEM_STATE); |
| MHW_SETPAR_DECL_HDR(HUC_DMEM_STATE); |
| MHW_SETPAR_DECL_HDR(HUC_VIRTUAL_ADDR_STATE); |
| |
| virtual MOS_STATUS SetDmemBuffer()const; |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| virtual MOS_STATUS DumpHucBrcInit(bool isInput); |
| #endif |
| |
| AvcBasicFeature *m_basicFeature = nullptr; //!< Avc Basic Feature used in each frame |
| |
| uint32_t m_vdencBrcInitDmemBufferSize = sizeof(VdencAvcHucBrcInitDmem); //!< Brc Init-Dmem Buffer Size |
| PMOS_RESOURCE m_vdencBrcInitDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {}; //!< Brc Init DMEM Buffer Array |
| |
| MEDIA_CLASS_DEFINE_END(encode__AvcHucBrcInitPkt) |
| }; |
| |
| } // namespace encode |
| |
| #endif // !__CODECHAL_AVC_HUC_BRC_INIT_PACKET_H__ |