1 /* 2 * Copyright (c) 2021, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file encode_hevc_vdenc_lpla_enc.cpp 24 //! \brief Implementation for encode hevc lowpower lookahead(Encode Pass) feature 25 //! 26 27 #include "encode_hevc_vdenc_lpla_enc.h" 28 #include "encode_hevc_vdenc_feature_manager.h" 29 30 namespace encode 31 { HEVCVdencLplaEnc(MediaFeatureManager * featureManager,EncodeAllocator * allocator,CodechalHwInterfaceNext * hwInterface,void * constSettings)32 HEVCVdencLplaEnc::HEVCVdencLplaEnc( 33 MediaFeatureManager *featureManager, 34 EncodeAllocator *allocator, 35 CodechalHwInterfaceNext *hwInterface, 36 void *constSettings) : 37 MediaFeature(constSettings) 38 { 39 } 40 ~HEVCVdencLplaEnc()41 HEVCVdencLplaEnc::~HEVCVdencLplaEnc() 42 { 43 if (m_lplaHelper) 44 { 45 MOS_Delete(m_lplaHelper); 46 m_lplaHelper = nullptr; 47 } 48 } 49 Init(void * setting)50 MOS_STATUS HEVCVdencLplaEnc::Init(void *setting) 51 { 52 ENCODE_FUNC_CALL(); 53 m_lplaHelper = MOS_New(EncodeLPLA); 54 ENCODE_CHK_NULL_RETURN(m_lplaHelper); 55 56 return MOS_STATUS_SUCCESS; 57 } 58 Update(void * params)59 MOS_STATUS HEVCVdencLplaEnc::Update(void *params) 60 { 61 ENCODE_FUNC_CALL(); 62 ENCODE_CHK_NULL_RETURN(params); 63 MOS_STATUS eStatus = MOS_STATUS_SUCCESS; 64 65 EncoderParams *encodeParams = (EncoderParams *)params; 66 m_hevcSeqParams = static_cast<PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS>(encodeParams->pSeqParams); 67 ENCODE_CHK_NULL_RETURN(m_hevcSeqParams); 68 m_enabled = (m_hevcSeqParams->LookaheadDepth > 0) && !m_hevcSeqParams->bLookAheadPhase; 69 if (!m_enabled) 70 { 71 return eStatus; 72 } 73 m_hevcPicParams = static_cast<PCODEC_HEVC_ENCODE_PICTURE_PARAMS>(encodeParams->pPicParams); 74 ENCODE_CHK_NULL_RETURN(m_hevcPicParams); 75 ENCODE_CHK_STATUS_RETURN(SetSequenceStructs()); 76 ENCODE_CHK_STATUS_RETURN(SetPictureStructs()); 77 78 return eStatus; 79 } 80 SetSequenceStructs()81 MOS_STATUS HEVCVdencLplaEnc::SetSequenceStructs() 82 { 83 ENCODE_FUNC_CALL(); 84 MOS_STATUS eStatus = MOS_STATUS_SUCCESS; 85 86 ENCODE_CHK_NULL_RETURN(m_lplaHelper); 87 ENCODE_CHK_STATUS_RETURN(m_lplaHelper->CheckFrameRate(m_hevcSeqParams->FrameRate.Numerator, 88 m_hevcSeqParams->FrameRate.Denominator, 89 m_hevcSeqParams->TargetBitRate, m_averageFrameSize)); 90 91 ENCODE_CHK_STATUS_RETURN(m_lplaHelper->CheckVBVBuffer(m_hevcSeqParams->VBVBufferSizeInBit, 92 m_hevcSeqParams->InitVBVBufferFullnessInBit)); 93 if (m_targetBufferFulness == 0 && m_prevTargetFrameSize == 0) 94 { 95 m_targetBufferFulness = m_hevcSeqParams->VBVBufferSizeInBit - m_hevcSeqParams->InitVBVBufferFullnessInBit; 96 } 97 98 return eStatus; 99 } 100 SetPictureStructs()101 MOS_STATUS HEVCVdencLplaEnc::SetPictureStructs() 102 { 103 ENCODE_FUNC_CALL(); 104 MOS_STATUS eStatus = MOS_STATUS_SUCCESS; 105 106 ENCODE_CHK_NULL_RETURN(m_lplaHelper); 107 ENCODE_CHK_STATUS_RETURN(m_lplaHelper->CalculateTargetBufferFullness(m_targetBufferFulness, m_prevTargetFrameSize, m_averageFrameSize)); 108 m_prevTargetFrameSize = m_hevcPicParams->TargetFrameSize; 109 110 return eStatus; 111 } 112 SetDmemForInit(VdencHevcHucBrcInitDmem * hucVdencBrcInitDmem)113 MOS_STATUS HEVCVdencLplaEnc::SetDmemForInit(VdencHevcHucBrcInitDmem *hucVdencBrcInitDmem) 114 { 115 ENCODE_FUNC_CALL(); 116 hucVdencBrcInitDmem->LookaheadDepth_U8 = m_hevcSeqParams->LookaheadDepth; 117 118 return MOS_STATUS_SUCCESS; 119 } 120 SetHucBrcUpdateExtBuffer(VdencHevcHucBrcUpdateDmem * hucVdencBrcUpdateDmem,bool isLastPass)121 MOS_STATUS HEVCVdencLplaEnc::SetHucBrcUpdateExtBuffer( 122 VdencHevcHucBrcUpdateDmem *hucVdencBrcUpdateDmem, 123 bool isLastPass) 124 { 125 ENCODE_FUNC_CALL(); 126 MOS_STATUS eStatus = MOS_STATUS_SUCCESS; 127 128 if (!m_enabled) 129 { 130 return eStatus; 131 } 132 hucVdencBrcUpdateDmem->TargetFulness = m_targetBufferFulness; 133 ENCODE_CHK_NULL_RETURN(m_lplaHelper); 134 ENCODE_CHK_STATUS_RETURN(m_lplaHelper->CalculateDeltaQP(m_hevcPicParams->QpModulationStrength, m_initDeltaQP, isLastPass, 135 hucVdencBrcUpdateDmem->Delta, m_prevQpModulationStrength)); 136 137 return eStatus; 138 } 139 } // encode 140