1 /*
2 * Copyright (c) 2022, 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     ddi_encode_av1_specific.h
24 //! \brief    AV1 class definition for DDI media encoder.
25 //!
26 
27 #ifndef __DDI_ENCODER_AV1_SPECIFIC_H__
28 #define __DDI_ENCODER_AV1_SPECIFIC_H__
29 
30 #include "ddi_encode_base_specific.h"
31 #include "codec_def_encode_av1.h"
32 
33 #define TILE_GROUP_NUM_INCREMENT 8
34 
35 namespace encode
36 {
37 
38 //!
39 //! \class  DdiEncodeAV1
40 //! \brief  DDi encode AV1
41 //!
42 class DdiEncodeAV1 : public encode::DdiEncodeBase
43 {
44 public:
45     //!
46     //! \brief    Constructor
47     //!
DdiEncodeAV1()48     DdiEncodeAV1(){};
49 
50     //!
51     //! \brief    Destructor
52     //!
53     ~DdiEncodeAV1();
54 
55     //!
56     //! \brief    Initialize Encode Context and CodecHal Setting for AV1
57     //!
58     //! \param    [out] codecHalSettings
59     //!           Pointer to CodecHalSetting *
60     //!
61     //! \return   VAStatus
62     //!           VA_STATUS_SUCCESS if successs, else fail reason
63     //!
64     VAStatus ContextInitialize(CodechalSetting *codecHalSettings) override;
65 
66     //!
67     //! \brief    Parse buffer to the server.
68     //!
69     //! \param    [in] ctx
70     //!           Pointer to VADriverContextP
71     //! \param    [in] context
72     //!           VA context ID
73     //! \param    [in] buffers
74     //!           Pointer to VABufferID
75     //! \parsm    [in] numBuffers
76     //!           Number of buffers
77     //!
78     //! \return   VAStatus
79     //!           VA_STATUS_SUCCESS if success, else fail reason
80     //!
81     VAStatus RenderPicture(
82         VADriverContextP ctx,
83         VAContextID      context,
84         VABufferID       *buffers,
85         int32_t          numBuffers) override;
86 
87 protected:
88     //!
89     //! \brief    Reset Encode Context At Frame Level
90     //!
91     //! \return   VAStatus
92     //!           VA_STATUS_SUCCESS if success, else fail reason
93     //!
94     VAStatus ResetAtFrameLevel() override;
95 
96     //!
97     //! \brief    Encode in CodecHal for Av1
98     //!
99     //! \param    [in] numSlices
100     //!           Number of slice data structures
101     //!
102     //! \return   VAStatus
103     //!           VA_STATUS_SUCCESS if success, else fail reason
104     //!
105     VAStatus EncodeInCodecHal(uint32_t numSlices) override;
106 
107     //!
108     //! \brief    Parse Picture Parameter buffer to Encode Context
109     //!
110     //! \param    [in] mediaCtx
111     //!           Pointer to DDI_MEDIA_CONTEXT
112     //! \param    [in] ptr
113     //!           Pointer to Picture Parameter buffer
114     //!
115     //! \return   VAStatus
116     //!           VA_STATUS_SUCCESS if success, else fail reason
117     //!
118     VAStatus ParsePicParams(DDI_MEDIA_CONTEXT *mediaCtx, void *ptr) override;
119 
120     //!
121     //! \brief    Parse Sequence Parameter buffer to Encode Context
122     //!
123     //! \param    [in] ptr
124     //!           Pointer to Sequence Parameter buffer
125     //!
126     //! \return   VAStatus
127     //!           VA_STATUS_SUCCESS if success, else fail reason
128     //!
129     VAStatus ParseSeqParams(void *ptr);
130 
131     //!
132     //! \brief    Parse Slice Parameter buffer to Encode Context
133     //!
134     //! \param    [in] mediaCtx
135     //!           Pointer to DDI_MEDIA_CONTEXT
136     //! \param    [in] ptr
137     //!           Pointer to Slice Parameter buffer
138     //! \param    [in] numSlices
139     //!           Number of slice
140     //!
141     //! \return   VAStatus
142     //!           VA_STATUS_SUCCESS if success, else fail reason
143     //!
144     VAStatus ParseTileGroupParams(void *ptr, uint32_t numTileGroupParams);
145 
146     //!
147     //! \brief    Parse Packed Header Parameter buffer to Encode Context
148     //!
149     //! \param    [in] ptr
150     //!           Pointer to Packed Header Parameter buffer
151     //!
152     //! return    VAStatus
153     //!           VA_STATUS_SUCCESS if success, else fail reason
154     //!
155     VAStatus ParsePackedHeaderParams(void *ptr);
156 
157     //!
158     //! \brief    Parse Packed Header Data buffer to Encode Context
159     //!
160     //! \param    [in] ptr
161     //!           Pointer to Packed Header Data buffer
162     //!
163     //! return    VAStatus
164     //!           VA_STATUS_SUCCESS if success, else fail reason
165     //!
166     VAStatus ParsePackedHeaderData(void *ptr);
167 
168     //!
169     //! \brief    Parse Misc Parameter buffer to Encode Context
170     //!
171     //! \param    [in] ptr
172     //!           Pointer to Misc Parameter buffer
173     //!
174     //! \return   VAStatus
175     //!           VA_STATUS_SUCCESS if success, else fail reason
176     //!
177     VAStatus ParseMiscParams(void *ptr);
178 
179     //!
180     //! \brief    Parse Segment Map Parameter buffer to Encode Context
181     //!
182     //! \param    [in] buf
183     //!           Pointer to Segment Map Parameter buffer
184     //!
185     //! \return   VAStatus
186     //!           VA_STATUS_SUCCESS if success, else fail reason
187     //!
188     VAStatus ParseSegMapParams(void *ptr);
189 
190     uint32_t getSequenceParameterBufferSize() override;
191 
192     uint32_t getPictureParameterBufferSize() override;
193 
194     uint32_t getSliceParameterBufferSize() override;
195 
196 private:
197     //!
198     //! \brief    Setup Codec Picture for AV1
199     //!
200     //! \param    [in] mediaCtx
201     //!           Pointer to DDI_MEDIA_CONTEXT
202     //! \param    [in] rtTbl
203     //!           Pointer to DDI_CODEC_RENDER_TARGET_TABLE
204     //! \param    [in] surfaceID
205     //!           VASurface index
206     //! \param    [in] picReference
207     //!           Reference picture flag
208     //! \param    [out] codecHalPic
209     //!           Pointer to CODEC_PICTURE
210     //!
211     //! \return   void
212     //!
213     void SetupCodecPicture(
214         DDI_MEDIA_CONTEXT                     *mediaCtx,
215         DDI_CODEC_RENDER_TARGET_TABLE         *rtTbl,
216         CODEC_PICTURE                         *codecHalPic,
217         VASurfaceID                           surfaceID,
218         bool                                  picReference);
219 
220     //!
221     //! \brief    Parse Misc Param VBV Data buffer to Encode Context
222     //!
223     //! \param    [in] data
224     //!           Pointer to Misc Param VBV Data buffer
225     //!
226     //! \return   VAStatus
227     //!           VA_STATUS_SUCCESS if success, else fail reason
228     //!
229     VAStatus ParseMiscParamVBV(void *data);
230 
231     //!
232     //! \brief    Parse Misc Param FrameRate Data buffer to Encode Context
233     //!
234     //! \param    [in] data
235     //!           Pointer to Misc Param FR Data buffer
236     //!
237     //! \return   VAStatus
238     //!           VA_STATUS_SUCCESS if success, else fail reason
239     //!
240     VAStatus ParseMiscParamFR(void *data);
241 
242     //!
243     //! \brief    Parse Misc Param RateControl Data buffer to Encode Context
244     //!
245     //! \param    [in] data
246     //!           Pointer to Misc Param RC Data buffer
247     //!
248     //! \return   VAStatus
249     //!           VA_STATUS_SUCCESS if success, else fail reason
250     //!
251     VAStatus ParseMiscParamRC(void *data);
252 
253     //!
254     //! \brief    Parse Misc Param Enc Quality to Encode Context
255     //!
256     //! \param    [in] data
257     //!           Pointer to Misc Param Private Data buffer
258     //!
259     //! \return   VAStatus
260     //!           VA_STATUS_SUCCESS if success, else fail reason
261     //!
262     VAStatus ParseMiscParamEncQuality(void *data);
263 
264     //!
265     //! \brief    Parse Misc Parameter Temporal Layer Params buffer to Encode Context
266     //!
267     //! \param    [in] data
268     //!           Pointer to Misc Parameter Temporal Layer Params buffer
269     //!
270     //! \return   VAStatus
271     //!           VA_STATUS_SUCCESS if success, else fail reason
272     //!
273     VAStatus ParseMiscParamTemporalLayerParams(void *data);
274 
275     //!
276     //! \brief    Parse Misc Param Buffer Quality Level to Encode Context
277     //!
278     //! \param    [in] data
279     //!           Pointer to Misc Param Buffer Quality Level
280     //!
281     //! \return   VAStatus
282     //!           VA_STATUS_SUCCESS if success, else fail reason
283     //!
284     VAStatus ParseMiscParamQualityLevel(void *data);
285 
286     //!
287     //! \brief    Parse Misc Param Max Frame Size to Encode Context
288     //!
289     //! \param    [in] data
290     //!           Pointer to Misc Param Buffer Max Frame Size
291     //!
292     //! \return   VAStatus
293     //!           VA_STATUS_SUCCESS if success, else fail reason
294     //!
295     VAStatus ParseMiscParamMaxFrameSize(void *data);
296 
297     //!
298     //! \brief    Setup Codec Picture for AV1
299     //!
300     //! \param    [in] picParams
301     //!           Pointer to picture parameters
302     //! \param    [in] platform
303     //!           Pointer to platform
304     //!
305     //! \return   VAStatus
306     //!           VA_STATUS_SUCCESS if success, else fail reason
307     //!
308     VAStatus CheckCDEF(const VAEncPictureParameterBufferAV1 *picParams,
309         PRODUCT_FAMILY platform);
310 
311     VAStatus CheckTile(const VAEncPictureParameterBufferAV1 *picParams);
312 
313     //!
314     //! \brief    Return the CODECHAL_FUNCTION type for give profile and entrypoint
315     //!
316     //! \param    [in] profile
317     //!           Specify the VAProfile
318     //!
319     //! \param    [in] entrypoint
320     //!           Specify the VAEntrypoint
321     //!
322     //! \return   Codehal function
323     //!
324     CODECHAL_FUNCTION GetEncodeCodecFunction(VAProfile profile, VAEntrypoint entrypoint, bool bVDEnc) override;
325     //!
326     //! \brief    Return internal encode mode for given profile and entrypoint
327     //!
328     //! \param    [in] profile
329     //!           Specify the VAProfile
330     //!
331     //! \param    [in] entrypoint
332     //!           Specify the VAEntrypoint
333     //!
334     //! \return   Codehal mode
335     //!
336     CODECHAL_MODE GetEncodeCodecMode(VAProfile profile, VAEntrypoint entrypoint) override;
337 
338     uint32_t savedTargetBit[ENCODE_AV1_MAX_NUM_TEMPORAL_LAYERS]  = { 0 };
339     uint32_t savedFrameRate[ENCODE_AV1_MAX_NUM_TEMPORAL_LAYERS]  = { 0 };
340     uint32_t savedMaxBitRate[ENCODE_AV1_MAX_NUM_TEMPORAL_LAYERS] = { 0 };
341     uint32_t savedQualityFactor = 0;
342 
343     uint32_t allocatedTileNum = 0;
344     bool m_isSegParamsChanged = false;
345     MEDIA_CLASS_DEFINE_END(encode__DdiEncodeAV1)
346 };
347 
348 }  // namespace encode
349 #endif  //__DDI_ENCODER_AV1_SPECIFIC_H__
350