1 /*
2 * Copyright (c) 2020, 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_av1_brc.h
24 //! \brief    Defines the common interface for av1 brc features
25 //!
26 #ifndef __ENCODE_AV1_BRC_H__
27 #define __ENCODE_AV1_BRC_H__
28 
29 #include "media_feature.h"
30 #include "encode_allocator.h"
31 #include "encode_pipeline.h"
32 #include "encode_recycle_resource.h"
33 #include "encode_av1_basic_feature.h"
34 
35 namespace encode
36 {
37 #define AV1_BRC_HUC_STATUS_REENCODE_MASK     (1<<31)
38 static const uint32_t BRC_KBPS = 1000;     // 1000bps for disk storage, aligned with industry usage
39 static const uint32_t BRC_DATA_SIZE = 16*4;
40 
41 enum AV1_BRC_FRAME_TYPE
42 {
43     AV1_BRC_FRAME_TYPE_P_OR_LB = 0,
44     AV1_BRC_FRAME_TYPE_B = 1,
45     AV1_BRC_FRAME_TYPE_I = 2,
46     AV1_BRC_FRAME_TYPE_B1 = 3,
47     AV1_BRC_FRAME_TYPE_B2 = 4,
48     AV1_BRC_FRAME_TYPE_B3 = 5,
49     AV1_BRC_FRAME_TYPE_INVALID
50 
51 };
52 
53     //!
54     //! \struct    Av1VdencPakInfo
55     //! \brief     AV1 Vdenc Pak info
56     //!
57     struct Av1VdencPakInfo
58     {
59         uint32_t  frameByteCount;
60         uint8_t   pakPassNum;
61     };
62     struct SlbData
63     {
64         //SLB related fields.
65         uint16_t slbSize = 0;
66         uint16_t avpPicStateCmdNum = 1;
67         uint16_t avpSegmentStateOffset = 0;
68         uint16_t avpInloopFilterStateOffset = 0;
69         uint16_t vdencCmd1Offset = 0;
70         uint16_t vdencCmd2Offset = 0;
71         uint16_t avpPicStateOffset = 0;
72         uint16_t secondAvpPicStateOffset = 0;
73         uint16_t pakInsertSlbSize = 0;
74         uint16_t vdencTileSliceStateOffset = 0;
75         uint16_t tileNum = 1;
76     };
77     //!
78     //! \struct Av1BrcPakMmio
79     //! \brief  MMIO of BRC and PAK
80     //!
81     struct Av1BrcPakMmio
82     {
83         uint32_t reEncode[4];
84     };
85 
86     struct VdencAv1HucBrcInitDmem;
87     struct VdencAv1HucBrcUpdateDmem;
88     struct VdencAv1HucBrcConstantData;
89 
90     class Av1Brc : public MediaFeature, public mhw::vdbox::vdenc::Itf::ParSetting, public mhw::vdbox::huc::Itf::ParSetting
91     {
92     public:
93         Av1Brc(MediaFeatureManager *featureManager, EncodeAllocator *allocator, CodechalHwInterfaceNext *hwInterface, void *constSettings);
94 
95         virtual ~Av1Brc();
96 
97         //!
98         //! \brief  Init av1 brc features related parameter
99         //! \param  [in] settings
100         //!         Pointer to settings
101         //! \return MOS_STATUS
102         //!         MOS_STATUS_SUCCESS if success, else fail reason
103         //!
104         MOS_STATUS Init(void *settings) override;
105 
106         //!
107         //! \brief  Update cqp basic features related parameter
108         //! \param  [in] params
109         //!         Pointer to parameters
110         //! \return MOS_STATUS
111         //!         MOS_STATUS_SUCCESS if success, else fail reason
112         //!
113         MOS_STATUS Update(void *params) override;
114 
115         //!
116         //! \brief    Check if BRC enabled
117         //!
118         //! \return   bool
119         //!           true if BRC enabled, else BRC disabled.
120         //!
IsBRCEnabled()121         virtual bool IsBRCEnabled() const { return m_brcEnabled; }
122 
123         //!
124         //! \brief    Disable Brc Init and Reset after BRC update
125         //!
DisableBrcInitReset()126         void DisableBrcInitReset() { m_brcInit = m_brcReset = false; };
127 
128         //!
129         //! \brief    Check if BRC Init or Reset enabled
130         //!
131         //! \return   bool
132         //!           true if BRC Init or Reset enabled.
133         //!
IsBRCInitRequired()134         virtual bool IsBRCInitRequired() const { return m_brcEnabled & (m_brcInit || m_brcReset); }
135 
136         //!
137         //! \brief    Check if BRC Reset enabled
138         //!
139         //! \return   bool
140         //!           true if BRC Reset enabled.
141         //!
IsBRCResetRequired()142         virtual bool IsBRCResetRequired() const { return m_brcEnabled & m_brcReset; }
143 
GetVdenc2ndLevelBatchBuffer(uint32_t currRecycledBufIdx)144         PMHW_BATCH_BUFFER GetVdenc2ndLevelBatchBuffer(uint32_t currRecycledBufIdx) {
145             return &m_vdenc2ndLevelBatchBuffer[currRecycledBufIdx];
146         };
147 
GetPakInsertOutputBatchBuffer(uint32_t currRecycledBufIdx)148         PMHW_BATCH_BUFFER GetPakInsertOutputBatchBuffer(uint32_t currRecycledBufIdx)
149         {
150             return &m_pakInsertOutputBatchBuffer[currRecycledBufIdx];
151         };
152 
153         MOS_STATUS GetBrcDataBuffer(MOS_RESOURCE *&buffer);
154 
155         //!
156         //! \brief  Set Dmem buffer for brc update
157         //! \param  [in] params
158         //!         Pointer to parameters
159         //! \return MOS_STATUS
160         //!         MOS_STATUS_SUCCESS if success, else fail reason
161         //!
162         MOS_STATUS SetDmemForUpdate(VdencAv1HucBrcUpdateDmem *params) const;
163 
164         //!
165         //! \brief  Set Const data for brc update
166         //! \param  [in] params
167         //!         Pointer to parameters
168         //! \return MOS_STATUS
169         //!         MOS_STATUS_SUCCESS if success, else fail reason
170         //!
171         MOS_STATUS SetConstForUpdate(VdencAv1HucBrcConstantData *params) const;
172 
173         //!
174         //! \brief  Set Dmem buffer for brc Init
175         //! \param  [in] params
176         //!         Pointer to parameters
177         //! \return MOS_STATUS
178         //!         MOS_STATUS_SUCCESS if success, else fail reason
179         //!
180         MOS_STATUS SetDmemForInit(VdencAv1HucBrcInitDmem *params) const;
181 
GetSLBData()182         const SlbData& GetSLBData() { return m_slbData; };
SetSLBData(const SlbData & input)183         void SetSLBData(const SlbData& input) { m_slbData = input; };
184 
185     protected:
186         //! \brief  Allocate feature related resources
187         //! \return MOS_STATUS
188         //!         MOS_STATUS_SUCCESS if success, else fail reason
189         //!
190         virtual MOS_STATUS AllocateResources() override;
191 
192         //!
193         //! \brief  Free resources
194         //! \return MOS_STATUS
195         //!         MOS_STATUS_SUCCESS if success, else fail reason
196         //!
197         virtual MOS_STATUS FreeBrcResources();
198 
199         MOS_STATUS SetSequenceStructs();
200 
201         MHW_SETPAR_DECL_HDR(VDENC_PIPE_MODE_SELECT);
202         MHW_SETPAR_DECL_HDR(HUC_DMEM_STATE);
203         MHW_SETPAR_DECL_HDR(HUC_VIRTUAL_ADDR_STATE);
204 
205         // const data
206         static constexpr uint32_t m_brcHistoryBufSize       = 6080;   //!< BRC history buffer size
207 
208         CodechalHwInterfaceNext  *m_hwInterface  = nullptr;
209         EncodeAllocator          *m_allocator    = nullptr;
210         Av1BasicFeature          *m_basicFeature = nullptr;  //!< EncodeBasicFeature
211 
212         SlbData  m_slbData = {};
213         uint8_t  m_rcMode  = 0;
214 
215         bool m_brcInit              = true;   //!< BRC init flag
216         bool m_brcReset             = false;  //!< BRC reset flag
217         bool m_brcEnabled           = false;  //!< BRC enable flag
218 
219         //Resources
220         MHW_BATCH_BUFFER   m_vdenc2ndLevelBatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]   = {};  //!< VDEnc 2nd level batch buffer
221         MHW_BATCH_BUFFER   m_pakInsertOutputBatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};  //!< PAK insert output batch buffer
222         MOS_RESOURCE       m_vdencBrcDbgBuffer                                               = {};  //!< VDEnc brc debug buffer
223         MOS_RESOURCE       m_resBrcDataBuffer                                                = {};  //!< Resource of bitrate control data buffer, only as an output of PAKintegrate Kernel
224 
225         MHW_VDBOX_NODE_IND m_vdboxIndex = MHW_VDBOX_NODE_1;
226 
227         mutable double m_curTargetFullness = 0;
228         int32_t  m_delay = 0;
229 
230         int32_t m_vbvSize      = 0;
231         int32_t m_frameRate    = 0;
232         double m_inputbitsperframe = 0;
233 
234     MEDIA_CLASS_DEFINE_END(encode__Av1Brc)
235     };
236 
237 }  // namespace encode
238 
239 #endif  // !__ENCODE_AV1_BRC_H__
240