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