1 /*
2 * Copyright (c) 2011-2023, 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 codechal_vdenc_avc.h
24 //! \brief This file defines the base C++ class/interface for AVC VDENC encoding
25 //! to be used across CODECHAL components.
26 //!
27
28 #ifndef __CODECHAL_VDENC_AVC_H__
29 #define __CODECHAL_VDENC_AVC_H__
30
31 #include "codechal_encode_avc_base.h"
32 #define CODECHAL_VDENC_AVC_MMIO_MFX_LRA_0_VMC240 0xF5F0EF00
33 #define CODECHAL_VDENC_AVC_MMIO_MFX_LRA_1_VMC240 0xFFFBFAF6
34 #define CODECHAL_VDENC_AVC_MMIO_MFX_LRA_2_VMC240 0x000002D3
35 #define CODECHAL_ENCODE_AVC_BRC_MIN_QP 1
36 #define CODECHAL_VDENC_AVC_MB_SLICE_TRHESHOLD 12
37
38 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_REENCODE_MASK (1 << 31)
39 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_SKIP_FRAME_MASK (1 << 30)
40 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_ERROR_MASK (1 << 29)
41 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_SCENE_CHANGE_MASK (1 << 28)
42 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_ARITHMETIC_OVERFLOW_ERROR_MASK (1 << 27)
43 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_MEMORY_ACCESS_ERROR_MASK (1 << 26)
44 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_HISTORY_BUFFER_ERROR_MASK (1 << 25)
45 #define CODECHAL_VDENC_AVC_BRC_HUC_STATUS_DMEM_ERROR_MASK (1 << 24)
46
47 #define CODECHAL_VDENC_AVC_BRC_MIN_QP 10
48 #define CODECHAL_VDENC_AVC_CQP_NUM_OF_PASSES 1 // No standalone PAK IPCM pass for VDENC
49
50 #define CODECHAL_VDENC_AVC_BRC_HISTORY_BUF_SIZE 0x1000
51 #define CODECHAL_VDENC_AVC_BRC_DEBUG_BUF_SIZE 0x1000
52 #define CODECHAL_VDENC_AVC_BRC_MB_BUDGET_SIZE 104
53
54 #define CODECHAL_VDENC_AVC_BRC_TOPQPDELTATHRFORADAPT2PASS 2
55 #define CODECHAL_VDENC_AVC_BRC_BOTQPDELTATHRFORADAPT2PASS 1
56 #define CODECHAL_VDENC_AVC_BRC_TOPFRMSZTHRFORADAPT2PASS 32
57 #define CODECHAL_VDENC_AVC_BRC_BOTFRMSZTHRFORADAPT2PASS 24
58
59 #define CODECHAL_VDENC_AVC_AVBR_TOPQPDELTATHRFORADAPT2PASS 2
60 #define CODECHAL_VDENC_AVC_AVBR_BOTQPDELTATHRFORADAPT2PASS 2
61 #define CODECHAL_VDENC_AVC_AVBR_TOPFRMSZTHRFORADAPT2PASS 48
62 #define CODECHAL_VDENC_AVC_AVBR_BOTFRMSZTHRFORADAPT2PASS 32
63
64 #define CODECHAL_VDENC_AVC_BRC_TOPQPDELTATHRFORADAPT2PASS_4K 5
65 #define CODECHAL_VDENC_AVC_BRC_BOTQPDELTATHRFORADAPT2PASS_4K 5
66 #define CODECHAL_VDENC_AVC_BRC_TOPFRMSZTHRFORADAPT2PASS_4K 80
67 #define CODECHAL_VDENC_AVC_BRC_BOTFRMSZTHRFORADAPT2PASS_4K 80
68
69 #define CODECHAL_VDENC_AVC_STATIC_FRAME_ZMV_PERCENT 80
70 #define CODECHAL_VDENC_AVC_STATIC_FRAME_INTRACOSTSCLRatioP 240
71
72 //dynamic deviation thresholds calculation
73 #define CODECHAL_VDENC_AVC_N_DEV_THRESHLDS 8
74 #define CODECHAL_VDENC_AVC_DEV_STD_FPS 30.
75 #define CODECHAL_VDENC_AVC_BPS_RATIO_LOW 0.1
76 #define CODECHAL_VDENC_AVC_BPS_RATIO_HIGH 3.5
77 #define CODECHAL_VDENC_AVC_POS_MULT_I 50
78 #define CODECHAL_VDENC_AVC_NEG_MULT_I -50
79 #define CODECHAL_VDENC_AVC_POS_MULT_PB 50
80 #define CODECHAL_VDENC_AVC_NEG_MULT_PB -50
81 #define CODECHAL_VDENC_AVC_POS_MULT_VBR 100
82 #define CODECHAL_VDENC_AVC_NEG_MULT_VBR -50
83
84 #define __CODEGEN_BITFIELD(l, h) (h) - (l) + 1
85 //!
86 //! \brief CODECHAL_VDENC_STREAMIN_STATE
87 //! \details
88 //!
89 //!
90 struct CODECHAL_VDENC_STREAMIN_STATE
91 {
92 union
93 {
94 //!< DWORD 0
95 struct
96 {
97 uint32_t RegionOfInterestRoiSelection : __CODEGEN_BITFIELD(0, 7); //!< Region of Interest (ROI) Selection
98 uint32_t Forceintra : __CODEGEN_BITFIELD(8, 8); //!< FORCEINTRA
99 uint32_t Forceskip : __CODEGEN_BITFIELD(9, 9); //!< FORCESKIP
100 uint32_t Reserved10 : __CODEGEN_BITFIELD(10, 31); //!< Reserved
101 };
102 uint32_t Value;
103 } DW0;
104 union
105 {
106 //!< DWORD 1
107 struct
108 {
109 uint32_t Qpprimey : __CODEGEN_BITFIELD(0, 7); //!< QPPRIMEY
110 uint32_t Targetsizeinword : __CODEGEN_BITFIELD(8, 15); //!< TargetSizeInWord
111 uint32_t Maxsizeinword : __CODEGEN_BITFIELD(16, 23); //!< MaxSizeInWord
112 uint32_t Reserved56 : __CODEGEN_BITFIELD(24, 31); //!< Reserved
113 };
114 uint32_t Value;
115 } DW1;
116 union
117 {
118 //!< DWORD 2
119 struct
120 {
121 uint32_t FwdPredictorX : __CODEGEN_BITFIELD(0, 15); //!< Fwd Predictor.X
122 uint32_t FwdPredictorY : __CODEGEN_BITFIELD(16, 31); //!< Fwd Predictor.Y
123 };
124 uint32_t Value;
125 } DW2;
126 union
127 {
128 //!< DWORD 3
129 struct
130 {
131 uint32_t BwdPredictorX : __CODEGEN_BITFIELD(0, 15); //!< Bwd Predictor.X
132 uint32_t BwdPredictorY : __CODEGEN_BITFIELD(16, 31); //!< Bwd Predictor.Y
133 };
134 uint32_t Value;
135 } DW3;
136 union
137 {
138 //!< DWORD 4
139 struct
140 {
141 uint32_t FwdRefid0 : __CODEGEN_BITFIELD(0, 3); //!< Fwd RefID0
142 uint32_t BwdRefid0 : __CODEGEN_BITFIELD(4, 7); //!< Bwd RefID0
143 uint32_t Reserved136 : __CODEGEN_BITFIELD(8, 31); //!< Reserved
144 };
145 uint32_t Value;
146 } DW4;
147
148 uint32_t Reserved160[11]; //!< Reserved
149
150 //! \name Local enumerations
151
152 //! \brief FORCEINTRA
153 //! \details
154 //! This field specifies whether current macroblock should be coded as an
155 //! intra macroblock.
156 //! It is illegal to enable both ForceSkip and ForceIntra for
157 //! the same macroblock.
158 //! This should be disabled if Rolling-I is enabled in the
159 //! VDEnc Image State.
160 enum FORCEINTRA
161 {
162 FORCEINTRA_DISABLE = 0, //!< VDEnc determined macroblock type
163 FORCEINTRA_ENABLE = 1, //!< Force to be coded as an intra macroblock
164 };
165
166 //! \brief FORCESKIP
167 //! \details
168 //! This field specifies whether current macroblock should be coded as a
169 //! skipped macroblock.
170 //! It is illegal to enable both ForceSkip and ForceIntra for
171 //! the same macroblock.
172 //! This should be disabled if Rolling-I is enabled in the
173 //! VDEnc Image State.
174 //! It is illegal to enable ForceSkip for I-Frames.
175 enum FORCESKIP
176 {
177 FORCESKIP_DISABLE = 0, //!< VDEnc determined macroblock type
178 FORCESKIP_ENABLE = 1, //!< Force to be coded as a skipped macroblock
179 };
180
181 //! \brief QPPRIMEY
182 //! \details
183 //! Quantization parameter for Y.
184 enum QPPRIMEY
185 {
186 QPPRIMEY_UNNAMED0 = 0, //!< No additional details
187 QPPRIMEY_UNNAMED51 = 51, //!< No additional details
188 };
189
CODECHAL_VDENC_STREAMIN_STATECODECHAL_VDENC_STREAMIN_STATE190 CODECHAL_VDENC_STREAMIN_STATE()
191 {
192 DW0.Value = 0;
193 DW0.Forceintra = 0;
194 DW0.Forceskip = 0;
195 DW1.Value = 0;
196 DW1.Qpprimey = 0;
197 DW2.Value = 0;
198 DW3.Value = 0;
199 DW4.Value = 0;
200 MOS_ZeroMemory(&Reserved160, sizeof(Reserved160));
201 }
202
203 static const size_t dwSize = 16;
204 static const size_t byteSize = 64;
205 };
206
207 typedef struct _AVCVdencBRCCostantData
208 {
209 uint8_t UPD_GlobalRateQPAdjTabI_U8[64];
210 uint8_t UPD_GlobalRateQPAdjTabP_U8[64];
211 uint8_t UPD_GlobalRateQPAdjTabB_U8[64];
212 uint8_t UPD_DistThreshldI_U8[10];
213 uint8_t UPD_DistThreshldP_U8[10];
214 uint8_t UPD_DistThreshldB_U8[10];
215 uint8_t UPD_DistQPAdjTabI_U8[81];
216 uint8_t UPD_DistQPAdjTabP_U8[81];
217 uint8_t UPD_DistQPAdjTabB_U8[81];
218 int8_t UPD_BufRateAdjTabI_S8[72];
219 int8_t UPD_BufRateAdjTabP_S8[72];
220 int8_t UPD_BufRateAdjTabB_S8[72];
221 uint8_t UPD_FrmSzMinTabP_U8[9];
222 uint8_t UPD_FrmSzMinTabB_U8[9];
223 uint8_t UPD_FrmSzMinTabI_U8[9];
224 uint8_t UPD_FrmSzMaxTabP_U8[9];
225 uint8_t UPD_FrmSzMaxTabB_U8[9];
226 uint8_t UPD_FrmSzMaxTabI_U8[9];
227 uint8_t UPD_FrmSzSCGTabP_U8[9];
228 uint8_t UPD_FrmSzSCGTabB_U8[9];
229 uint8_t UPD_FrmSzSCGTabI_U8[9];
230 // Cost Table 14*42 = 588 bytes
231 uint8_t UPD_I_IntraNonPred[42];
232 uint8_t UPD_I_Intra16x16[42];
233 uint8_t UPD_I_Intra8x8[42];
234 uint8_t UPD_I_Intra4x4[42];
235 uint8_t UPD_I_IntraChroma[42];
236 uint8_t UPD_P_IntraNonPred[42];
237 uint8_t UPD_P_Intra16x16[42];
238 uint8_t UPD_P_Intra8x8[42];
239 uint8_t UPD_P_Intra4x4[42];
240 uint8_t UPD_P_IntraChroma[42];
241 uint8_t UPD_P_Inter16x8[42];
242 uint8_t UPD_P_Inter8x8[42];
243 uint8_t UPD_P_Inter16x16[42];
244 uint8_t UPD_P_RefId[42];
245 uint8_t UPD_HMEMVCost[8][42];
246 uint8_t RSVD[42];
247 } AVCVdencBRCCostantData, *PAVCVdencBRCCostantData;
248
249 //!
250 //! \class CodechalVdencAvcState
251 //! \brief Codechal Vdenc Avc state
252 //!
253 class CodechalVdencAvcState : public CodechalEncodeAvcBase
254 {
255 public:
256 const bool m_perfModeEnabled[NUM_VDENC_TARGET_USAGE_MODES] =
257 {
258 0, 0, 0, 0, 0, 0, 1, 1};
259
260 // VDEnc BRC Flag in BRC Init Kernel
261 typedef enum _BRCFLAG
262 {
263 BRCFLAG_ISICQ = 0x0000,
264 BRCFLAG_ISCBR = 0x0010,
265 BRCFLAG_ISVBR = 0x0020,
266 BRCFLAG_ISVCM = 0x0040,
267 BRCFLAG_ISLOWDELAY = 0x0080
268 } BRCFLAG;
269
270 typedef enum _LutMode
271 {
272 LutMode_INTRA_NONPRED = 0x00, // extra penalty for non-predicted modes
273 LutMode_INTRA = 0x01,
274 LutMode_INTRA_16x16 = 0x01,
275 LutMode_INTRA_8x8 = 0x02,
276 LutMode_INTRA_4x4 = 0x03,
277 LutMode_INTER_BWD = 0x09,
278 LutMode_REF_ID = 0x0A,
279 LutMode_INTRA_CHROMA = 0x0B,
280 LutMode_INTER = 0x08,
281 LutMode_INTER_16x16 = 0x08,
282 LutMode_INTER_16x8 = 0x04,
283 LutMode_INTER_8x16 = 0x04,
284 LutMode_INTER_8x8q = 0x05,
285 LutMode_INTER_8x4q = 0x06,
286 LutMode_INTER_4x8q = 0x06,
287 LutMode_INTER_4x4q = 0x07,
288 LutMode_INTER_16x8_FIELD = 0x06,
289 LutMode_INTER_8x8_FIELD = 0x07
290 } LutMode;
291
292 typedef struct _TLBAllocationParams
293 {
294 PMOS_RESOURCE presTlbMmioBuffer;
295 uint32_t dwMmioMfxLra0Override;
296 uint32_t dwMmioMfxLra1Override;
297 uint32_t dwMmioMfxLra2Override;
298 } TLBAllocationParams, *PTLBAllocationParams;
299
300 //!
301 //! \brief Constructor
302 //!
303 CodechalVdencAvcState(
304 CodechalHwInterface * hwInterface,
305 CodechalDebugInterface *debugInterface,
306 PCODECHAL_STANDARD_INFO standardInfo);
307
308 //!
309 //! \brief Copy constructor
310 //!
311 CodechalVdencAvcState(const CodechalVdencAvcState&) = delete;
312
313 //!
314 //! \brief Copy assignment operator
315 //!
316 CodechalVdencAvcState& operator=(const CodechalVdencAvcState&) = delete;
317
318 //!
319 //! \brief Destructor
320 //!
321 virtual ~CodechalVdencAvcState();
322
323 virtual MOS_STATUS Initialize( CodechalSetting * settings) override;
324
325 virtual MOS_STATUS InitializePicture(const EncoderParams& params) override;
326
327 virtual MOS_STATUS ExecuteKernelFunctions() override;
328
329 virtual MOS_STATUS SendPrologWithFrameTracking(
330 PMOS_COMMAND_BUFFER cmdBuffer,
331 bool frameTracking,
332 MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override;
333
334 virtual MOS_STATUS ExecutePictureLevel() override;
335
336 virtual MOS_STATUS ExecuteSliceLevel() override;
337
338 virtual MOS_STATUS UserFeatureKeyReport() override;
339
340 //!
341 //! \brief Add VDENC_WALKER_STATE commands to command buffer
342 //!
343 //! \param [in, out] cmdBuffer
344 //! Pointer to the command buffer
345 //!
346 //! \return MOS_STATUS
347 //! MOS_STATUS_SUCCESS if success, else fail reason
348 //!
349 virtual MOS_STATUS AddVdencWalkerStateCmd(
350 PMOS_COMMAND_BUFFER cmdBuffer);
351
352 //!
353 //! \brief Initialize data members of AVC encoder instance
354 //!
355 //! \return void
356 //!
357 virtual void InitializeDataMember();
358
359 // state related funcs
360 //!
361 //! \brief Initialize encode state
362 //!
363 //! \return MOS_STATUS
364 //! MOS_STATUS_SUCCESS if success, else fail reason
365 //!
366 virtual MOS_STATUS InitializeState();
367
368 //!
369 //! \brief Validate reference list L0 and L1.
370 //!
371 //! \param [in] params
372 //! Pointer to CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS
373 //!
374 //! \return MOS_STATUS
375 //! MOS_STATUS_SUCCESS if success, else fail reason
376 //!
377 virtual MOS_STATUS ValidateNumReferences( PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params);
378
379 //!
380 //! \brief Set intra/inter rounding value.
381 //!
382 //! \param [in] rounding
383 //! Pointer to CODECHAL_ENCODE_AVC_ROUNDING_PARAMS
384 //!
385 //! \param [out] sliceState
386 //! Pointer to MHW_VDBOX_AVC_SLICE_STATE
387 //!
388 //! \return MOS_STATUS
389 //! MOS_STATUS_SUCCESS if success, else fail reason
390 //!
391 virtual MOS_STATUS SetRounding(PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS param, PMHW_VDBOX_AVC_SLICE_STATE sliceState);
392
393 //!
394 //! \brief Get Skip Bias Adjustment.
395 //!
396 //! \param [in] sliceQP
397 //! Slice QP.
398 //! \param [in] gopRefDist
399 //! GOP reference dist.
400 //! \param [in] skipBiasAdjustmentEnable
401 //! Adjustable or not.
402 //!
403 //! \return MOS_STATUS
404 //! MOS_STATUS_SUCCESS if success, else fail reason
405 //!
406 virtual MOS_STATUS GetSkipBiasAdjustment(
407 uint8_t sliceQP,
408 uint16_t gopRefDist,
409 bool* skipBiasAdjustmentEnable);
410
411 //!
412 //! \brief Get Hme Supported Based On TU.
413 //!
414 //! \param [in] hmeLevel
415 //! HME level
416 //! \param [out] supported
417 //! Supported or not
418 //!
419 //! \return MOS_STATUS
420 //! MOS_STATUS_SUCCESS if success, else fail reason
421 //!
422 virtual MOS_STATUS GetHmeSupportedBasedOnTU(
423 HmeLevel hmeLevel,
424 bool *supported);
425
426 //!
427 //! \brief Get Trellis Quantization mode/value enable or not.
428 //!
429 //! \param [in] params
430 //! Pointer to CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS.
431 //! \param [out] trellisQuantParams
432 //! Pointer to CODECHAL_ENCODE_AVC_TQ_PARAMS, mode & value setup.
433 //!
434 //! \return MOS_STATUS
435 //! MOS_STATUS_SUCCESS if success, else fail reason
436 //!
GetTrellisQuantization(PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params,PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams)437 virtual MOS_STATUS GetTrellisQuantization(
438 PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params,
439 PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams)
440 {
441 return MOS_STATUS_SUCCESS;
442 }
443
444 //!
445 //! \brief Init SFD(still frame detection) kernel state
446 //!
447 //! \return MOS_STATUS
448 //! MOS_STATUS_SUCCESS if success, else fail reason
449 //!
450 virtual MOS_STATUS InitKernelStateSFD();
451
452 //!
453 //! \brief Get SFD kernel curbe data
454 //!
455 //! \param [in] params
456 //! Pointer to CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS
457 //!
458 //! \return MOS_STATUS
459 //! MOS_STATUS_SUCCESS if success, else fail reason
460 //!
461 virtual MOS_STATUS SetCurbeSFD( PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params);
462
463 //!
464 //! \brief Set SFD kernel Surface state
465 //!
466 //! \param [in] cmdBuffer
467 //! Cmd Buffer
468 //! \param [in] params
469 //! Pointer to CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS
470 //!
471 //! \return MOS_STATUS
472 //! MOS_STATUS_SUCCESS if success, else fail reason
473 //!
474 virtual MOS_STATUS SendSFDSurfaces(
475 PMOS_COMMAND_BUFFER cmdBuffer,
476 PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params);
477
478 //!
479 //! \brief Run SFD(still frame detection) kernel
480 //!
481 //! \return MOS_STATUS
482 //! MOS_STATUS_SUCCESS if success, else fail reason
483 //!
484 virtual MOS_STATUS SFDKernel();
485
486 //!
487 //! \brief Set VDENC Dirty ROI StreamIn Surface state
488 //!
489 //! \param [in] vdencStreamIn
490 //! StreamIn Surface Resource.
491 //!
492 //! \return MOS_STATUS
493 //! MOS_STATUS_SUCCESS if success, else fail reason
494 //!
495 virtual MOS_STATUS SetupDirtyROI( PMOS_RESOURCE vdencStreamIn);
496
497 //!
498 //! \brief Set VDENC HuC Brc InitReset state
499 //!
500 //! \return MOS_STATUS
501 //! MOS_STATUS_SUCCESS if success, else fail reason
502 //!
503 virtual MOS_STATUS SetDmemHuCBrcInitReset() = 0;
504
505 //!
506 //! \brief Set VDENC HuC Brc Update state
507 //!
508 //! \return MOS_STATUS
509 //! MOS_STATUS_SUCCESS if success, else fail reason
510 //!
511 virtual MOS_STATUS SetDmemHuCBrcUpdate() = 0;
512
513 //!
514 //! \brief VDENC Load Mv Cost based on QP
515 //!
516 //! \param [in] QP
517 //! QP value
518 //!
519 //! \return MOS_STATUS
520 //! MOS_STATUS_SUCCESS if success, else fail reason
521 //!
522 virtual MOS_STATUS LoadMvCost( uint8_t QP) = 0;
523
524 //!
525 //! \brief VDENC Load HME Mv Cost based on QP
526 //!
527 //! \param [in] QP
528 //! QP value
529 //!
530 //! \return MOS_STATUS
531 //! MOS_STATUS_SUCCESS if success, else fail reason
532 //!
533 virtual MOS_STATUS LoadHmeMvCost( uint8_t QP) = 0;
534
535 //!
536 //! \brief VDENC Load HME Mv Cost based on QP
537 //!
538 //! \param [in] seqParams
539 //! QP value
540 //! \param [in] HMEMVCostTable
541 //! HME MV Cost Table
542 //! \return MOS_STATUS
543 //! MOS_STATUS_SUCCESS if success, else fail reason
544 //!
545 virtual MOS_STATUS LoadHmeMvCostTable(
546 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
547 uint8_t HMEMVCostTable[8][42]) = 0;
548
549 //!
550 //! \brief Set VDENC ROI StreamIn Surface state
551 //!
552 //! \param [in] picParams
553 //! Pointer to CODEC_AVC_ENCODE_PIC_PARAMS.
554 //! \param [in] vdencStreamIn
555 //! StreamIn Surface Resource.
556 //!
557 //! \return MOS_STATUS
558 //! MOS_STATUS_SUCCESS if success, else fail reason
559 //!
560 virtual MOS_STATUS SetupROIStreamIn(
561 PCODEC_AVC_ENCODE_PIC_PARAMS picParams,
562 PCODEC_AVC_ENCODE_SLICE_PARAMS slcParams,
563 PMOS_RESOURCE vdencStreamIn);
564
565 //!
566 //! \brief Set VDENC BRC ROI buffer
567 //!
568 //! \param [in] picParams
569 //! Pointer to CODEC_AVC_ENCODE_PIC_PARAMS.
570 //! \param [in] brcRoiBuffer
571 //! BRC ROI Resource.
572 //!
573 //! \return MOS_STATUS
574 //! MOS_STATUS_SUCCESS if success, else fail reason
575 //!
576 MOS_STATUS SetupBrcROIBuffer(
577 PCODEC_AVC_ENCODE_PIC_PARAMS picParams,
578 PMOS_RESOURCE brcRoiBuffer);
579
580 //!
581 //! \brief Set VDENC ForceSkip StreamIn Surface state
582 //!
583 //! \param [in] picParams
584 //! Pointer to CODEC_AVC_ENCODE_PIC_PARAMS.
585 //! \param [in] vdencStreamIn
586 //! StreamIn Surface Resource.
587 //!
588 //! \return MOS_STATUS
589 //! MOS_STATUS_SUCCESS if success, else fail reason
590 //!
591 MOS_STATUS SetupForceSkipStreamIn(
592 PCODEC_AVC_ENCODE_PIC_PARAMS picParams,
593 PMOS_RESOURCE vdencStreamIn);
594
595 //!
596 //! \brief Set VDENC StreamIn Surface for BRC Adaptive Region Boost
597 //!
598 //! \param [in] vdencStreamIn
599 //! StreamIn Surface Resource.
600 //! \param [in] boostIndex
601 //! Region index for boosting.
602 //!
603 //! \return MOS_STATUS
604 //! MOS_STATUS_SUCCESS if success, else fail reason
605 //!
606 MOS_STATUS SetupRegionBoosting(
607 PMOS_RESOURCE vdencStreamIn,
608 uint16_t boostIndex);
609
610 //!
611 //! \brief Sort and set distinct delta QPs
612 //!
613 //! \return bool
614 //! true if native ROI, otherwise false
615 //!
616 virtual bool ProcessRoiDeltaQp();
617
618 //!
619 //! \brief Add store HUC_ERROR_STATUS register command in the command buffer
620 //!
621 //! \param [in] mmioRegisters
622 //! Pointer to mmio huc register
623 //! \param [in] cmdBuffer
624 //! Pointer to the command buffer
625 //! \param [in] addToEncodeStatus
626 //! Flag to indicate whether huc error status will be stored in encode status buffer
627 //!
628 //! \return MOS_STATUS
629 //! MOS_STATUS_SUCCESS if success, else fail reason
630 //!
AddHucOutputRegistersHandling(MmioRegistersHuc * mmioRegisters,PMOS_COMMAND_BUFFER cmdBuffer,bool addToEncodeStatus)631 virtual MOS_STATUS AddHucOutputRegistersHandling(
632 MmioRegistersHuc* mmioRegisters,
633 PMOS_COMMAND_BUFFER cmdBuffer,
634 bool addToEncodeStatus)
635 {
636 // HUC store HUC_STATUS only starting with G11
637 return MOS_STATUS_SUCCESS;
638 }
639
640 virtual MOS_STATUS StoreHucErrorStatus(MmioRegistersHuc* mmioRegisters, PMOS_COMMAND_BUFFER cmdBuffer, bool addToEncodeStatus);
641
642 //!
643 //! \brief VDENC BRC InitReset HuC FW Cmd.
644 //!
645 //! \return MOS_STATUS
646 //! MOS_STATUS_SUCCESS if success, else fail reason
647 //!
648 virtual MOS_STATUS HuCBrcInitReset();
649
650 //!
651 //! \brief VDENC BRC Update HuC FW Cmd.
652 //!
653 //! \return MOS_STATUS
654 //! MOS_STATUS_SUCCESS if success, else fail reason
655 //!
656 virtual MOS_STATUS HuCBrcUpdate();
657
658 //!
659 //! \brief VDENC Loads Cost According To CodingType & QP.
660 //!
661 //! \param [in] pictureCodingType
662 //! Picture encoding type.
663 //! \param [in] QP
664 //! QP value
665 //!
666 //! \return MOS_STATUS
667 //! MOS_STATUS_SUCCESS if success, else fail reason
668 //!
669 MOS_STATUS LoadCosts(
670 uint16_t pictureCodingType,
671 uint8_t QP);
672
673 //!
674 //! \brief VDENC using dummy stream object for HuC BRC FW.
675 //!
676 //! \param [in] cmdBuffer
677 //! Command Buffer.
678 //!
679 //! \return MOS_STATUS
680 //! MOS_STATUS_SUCCESS if success, else fail reason
681 //!
682 virtual MOS_STATUS HuCBrcDummyStreamObject( PMOS_COMMAND_BUFFER cmdBuffer);
683
684 //!
685 //! \brief VDENC Set const date to HuC for BRC Update FW..
686 //!
687 //! \return MOS_STATUS
688 //! MOS_STATUS_SUCCESS if success, else fail reason
689 //!
690 MOS_STATUS SetConstDataHuCBrcUpdate();
691
692 //!
693 //! \brief VDENC Compute BRC Init QP..
694 //! \param [in] seqParams
695 //! AVC VDENC encoder sequence params
696 //! \param [in] initQP
697 //! Pointer to Init QP
698 //! \return MOS_STATUS
699 //! MOS_STATUS_SUCCESS if success, else fail reason
700 //!
701 MOS_STATUS ComputeBRCInitQP(
702 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
703 int32_t* initQP);
704
705 //!
706 //! \brief VDENC Store HuC Status to Register..
707 //! \param [in] hwInterface
708 //! HW Interface
709 //! \param [in] cmdBuffer
710 //! cmd buffer
711 //! \return MOS_STATUS
712 //! MOS_STATUS_SUCCESS if success, else fail reason
713 //!
714 MOS_STATUS AvcVdencStoreHuCStatus2Register(
715 CodechalHwInterface *hwInterface,
716 PMOS_COMMAND_BUFFER cmdBuffer);
717
718 //!
719 //! \brief VDENC Set TLB allocation..
720 //! \param [in] cmdBuffer
721 //! cmd buffer
722 //! \param [in] params
723 //! AVC VDENC TLB allocation params
724 //! \return MOS_STATUS
725 //! MOS_STATUS_SUCCESS if success, else fail reason
726 //!
727 MOS_STATUS SetTLBAllocation(
728 PMOS_COMMAND_BUFFER cmdBuffer,
729 PTLBAllocationParams params);
730
731 //!
732 //! \brief VDENC Restore TLB allocation..
733 //! \param [in] cmdBuffer
734 //! cmd buffer
735 //! \param [in] tlbMmioBuffer
736 //! PMOS resource params
737 //! \return MOS_STATUS
738 //! MOS_STATUS_SUCCESS if success, else fail reason
739 //!
740 MOS_STATUS RestoreTLBAllocation(
741 PMOS_COMMAND_BUFFER cmdBuffer,
742 PMOS_RESOURCE tlbMmioBuffer);
743
744 //!
745 //! \brief Set VDENC HuC Brc InitReset state
746 //!
747 //! \param [in] hucVdencBrcInitDmem
748 //! Point to BrcInitDmem of different Gen-x Platforms.
749 //!
750 //! \return MOS_STATUS
751 //! MOS_STATUS_SUCCESS if success, else fail reason
752 //!
753 template <class CODECHAL_VDENC_AVC_BRC_INIT_DMEM>
754 MOS_STATUS SetDmemHuCBrcInitResetImpl( CODECHAL_VDENC_AVC_BRC_INIT_DMEM* hucVdencBrcInitDmem);
755
756 //!
757 //! \brief Set VDENC HuC Brc Update state
758 //!
759 //! \param [in] hucVDEncBrcDmem
760 //! Point to BRC DMEM of different Gen-x Platforms.
761 //!
762 //! \return MOS_STATUS
763 //! MOS_STATUS_SUCCESS if success, else fail reason
764 //!
765 template <class CODECHAL_VDENC_AVC_BRC_UPDATE_DMEM>
766 MOS_STATUS SetDmemHuCBrcUpdateImpl( CODECHAL_VDENC_AVC_BRC_UPDATE_DMEM* hucVDEncBrcDmem);
767
768 //!
769 //! \brief Functions to set parameter and execute ME kernel
770 //!
771 //! \return MOS_STATUS
772 //! MOS_STATUS_SUCCESS if success, else fail reason
773 //!
774 virtual MOS_STATUS ExecuteMeKernel();
775
776 virtual bool IsMBBRCControlEnabled();
777
778 MOS_STATUS SetCommonSliceState(
779 CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS &packSlcHeaderParams,
780 MHW_VDBOX_AVC_SLICE_STATE & sliceState);
781
782 MOS_STATUS SetSliceState(
783 CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS &packSlcHeaderParams,
784 MHW_VDBOX_AVC_SLICE_STATE & sliceState,
785 uint16_t slcIdx);
786
787 //!
788 //! \brief Get AVC VDenc frame level status extention
789 //!
790 //! \param [in] cmdBuffer
791 //! Point to MOS_COMMAND_BUFFER
792 //! [in] StatusReportFeedbackNumber
793 //! Status report number
794 //! \return MOS_STATUS
795 //! MOS_STATUS_SUCCESS if success, else fail reason
796 //!
GetAvcVdencFrameLevelStatusExt(uint32_t StatusReportFeedbackNumber,MOS_COMMAND_BUFFER * cmdBuffer)797 virtual MOS_STATUS GetAvcVdencFrameLevelStatusExt(uint32_t StatusReportFeedbackNumber, MOS_COMMAND_BUFFER *cmdBuffer)
798 {
799 return MOS_STATUS_SUCCESS;
800 };
801
802 protected:
803 // AvcGeneraicState functions
804 //!
805 //! \brief AVC VDEnc State Initialization.
806 //!
807 //! \return MOS_STATUS
808 //! MOS_STATUS_SUCCESS if success
809 //!
810 virtual MOS_STATUS Initialize() override;
811
812 //!
813 //! \brief Allocate VDENC necessary resources.
814 //!
815 //! \return MOS_STATUS
816 //! MOS_STATUS_SUCCESS if success
817 //!
818 virtual MOS_STATUS AllocateResources() override;
819
820 //!
821 //! \brief Set Sequence Structures.
822 //!
823 //! \return MOS_STATUS
824 //! MOS_STATUS_SUCCESS if success, else fail reason
825 //!
826 virtual MOS_STATUS SetSequenceStructs() override;
827
828 //!
829 //! \brief Set Picture Structures
830 //!
831 //! \return MOS_STATUS
832 //! MOS_STATUS_SUCCESS if success, else fail reason
833 //!
834 virtual MOS_STATUS SetPictureStructs() override;
835
836 //!
837 //! \brief Set slice Structs
838 //!
839 //! \return MOS_STATUS
840 //! MOS_STATUS_SUCCESS if success, else fail reason
841 //!
842 virtual MOS_STATUS SetSliceStructs() override;
843
844 //!
845 //! \brief Initialize Encode ME kernel state
846 //!
847 //! \return MOS_STATUS
848 //! MOS_STATUS_SUCCESS if success
849 //!
850 virtual MOS_STATUS InitKernelStateMe() override;
851
852 //!
853 //! \brief Set Encode ME kernel Curbe data.
854 //!
855 //! \param [in] params
856 //! Pointer to the MeCurbeParams
857 //!
858 //! \return MOS_STATUS
859 //! MOS_STATUS_SUCCESS if success
860 //!
861 virtual MOS_STATUS SetCurbeMe( MeCurbeParams* params) override;
862
863 //!
864 //! \brief Set Encode ME kernel Surfaces
865 //!
866 //! \param [in] cmdBuffer
867 //! Pointer to the MOS_COMMAND_BUFFER
868 //! \param [in] params
869 //! Pointer to the CODECHAL_ME_SURFACE_PARAMS
870 //!
871 //! \return MOS_STATUS
872 //! MOS_STATUS_SUCCESS if success
873 //!
874 virtual MOS_STATUS SendMeSurfaces(
875 PMOS_COMMAND_BUFFER cmdBuffer,
876 MeSurfaceParams* params) override;
877
878 //!
879 //! \brief Set MFX_PIPE_BUF_ADDR_STATE parameter
880 //!
881 //! \param [in] genericParam
882 //! Input parameters
883 //! \param [out] param
884 //! reference to MHW_VDBOX_PIPE_BUF_ADDR_PARAMS
885 //!
886 //! \return MOS_STATUS
887 //! MOS_STATUS_SUCCESS if success
888 //!
889 virtual MOS_STATUS SetMfxPipeBufAddrStateParams(
890 CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam,
891 MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& param) override;
892
893 //!
894 //! \brief Set MHW_VDBOX_VDENC_CQPT_STATE parameter
895 //!
896 //! \param [out] param
897 //! reference to MHW_VDBOX_VDENC_CQPT_STATE_PARAMS
898 //!
899 //! \return void
900 //!
901 virtual void SetVdencCqptStateParams(MHW_VDBOX_VDENC_CQPT_STATE_PARAMS& param);
902
903 //!
904 //! \brief Set MFX_AVC_IMG_STATE parameter
905 //!
906 //! \param [out] param
907 //! reference to MHW_VDBOX_AVC_IMG_PARAMS
908 //!
909 //! \return MOS_STATUS
910 //! MOS_STATUS_SUCCESS if success
911 //!
912 virtual void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param) override;
913
914 //!
915 //! \brief Calculate Vdenc Commands Size
916 //!
917 //! \return MOS_STATUS
918 //! MOS_STATUS_SUCCESS if success
919 //!
920 virtual MOS_STATUS CalculateVdencCommandsSize();
921
922 //!
923 //! \brief Create MHW_VDBOX_STATE_CMDSIZE_PARAMS
924 //!
925 //! \return PMHW_VDBOX_STATE_CMDSIZE_PARAMS
926 //!
927 virtual PMHW_VDBOX_STATE_CMDSIZE_PARAMS CreateMhwVdboxStateCmdsizeParams();
928
929 //!
930 //! \brief Create PMHW_VDBOX_AVC_IMG_PARAMS.
931 //!
932 //! \return PMHW_VDBOX_AVC_IMG_PARAMS
933 //!
934 virtual PMHW_VDBOX_AVC_IMG_PARAMS CreateMhwVdboxAvcImgParams();
935
936 //!
937 //! \brief Create PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS.
938 //!
939 //! \return PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS
940 //!
941 virtual PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS CreateMhwVdboxVdencWalkerStateParams();
942
GetBRCCostantDataSize()943 virtual uint32_t GetBRCCostantDataSize() { return sizeof(AVCVdencBRCCostantData); }
944
GetVdencBRCImgStateBufferSize()945 virtual uint32_t GetVdencBRCImgStateBufferSize() { return MOS_ALIGN_CEIL(m_hwInterface->m_vdencBrcImgStateBufferSize, CODECHAL_PAGE_SIZE); }
946
947 virtual MOS_STATUS FillHucConstData(uint8_t *data, uint8_t picType);
948
949 //!
950 //! \brief Prepare HW MetaData buffer
951 //! \details Prepare HW MetaData buffer.
952 //! \param [in] presMetadataBuffer
953 //! Pointer to allocated HW MetaData buffer
954 //! [in] presSliceSizeStreamoutBuffer
955 //! Pointer to m_pakSliceSizeStreamoutBuffer
956 //! [in] cmdBuffer
957 //! Pointer to primary cmd buffer
958 //! \return MOS_STATUS
959 //! MOS_STATUS_SUCCESS if success, else fail reason
960 //!
961 virtual MOS_STATUS PrepareHWMetaData(
962 PMOS_RESOURCE presMetadataBuffer,
963 PMOS_RESOURCE presSliceSizeStreamoutBuffer,
964 PMOS_COMMAND_BUFFER cmdBuffer) override;
965
966 virtual MOS_STATUS AddVdencBrcImgBuffer(
967 PMOS_RESOURCE vdencBrcImgBuffer,
968 PMHW_VDBOX_AVC_IMG_PARAMS params);
969
970 //!
971 //! \brief Report Slice Size to MetaData buffer
972 //! \details Report Slice Size to MetaData buffer.
973 //! \param [in] presMetadataBuffer
974 //! Pointer to allocated HW MetaData buffer
975 //! [in] cmdBuffer
976 //! Pointer to primary cmd buffer
977 //! [in] slcCount
978 //! Current slice count
979 //! \return MOS_STATUS
980 //! MOS_STATUS_SUCCESS if success, else fail reason
981 //!
982 virtual MOS_STATUS ReportSliceSizeMetaData(
983 PMOS_RESOURCE presMetadataBuffer,
984 PMOS_COMMAND_BUFFER cmdBuffer,
985 uint32_t slcCount);
986
987 //!
988 //! \brief Add MI_STORE commands in the command buffer to update DMEM from other HW output buffer if needed
989 //!
990 //! \param [in] cmdBuffer
991 //! Pointer to the command buffer
992 //!
993 //! \return MOS_STATUS
994 //! MOS_STATUS_SUCCESS if success, else fail reason
995 //!
AddMiStoreForHWOutputToHucDmem(PMOS_COMMAND_BUFFER cmdBuffer)996 virtual MOS_STATUS AddMiStoreForHWOutputToHucDmem(PMOS_COMMAND_BUFFER cmdBuffer)
997 {
998 // Nothing to do
999 // HW store PAK statistics directly to DMEM resource
1000 return MOS_STATUS_SUCCESS;
1001 }
1002
1003 virtual void SetBufferToStorePakStatistics();
1004
1005 virtual uint32_t GetCurrConstDataBufIdx();
1006
1007 protected:
1008 bool m_vdencSinglePassEnable = false; //!< Enable VDEnc single pass
1009
1010 MOS_RESOURCE m_vdencIntraRowStoreScratchBuffer; //!< Handle of intra row store surface
1011 MOS_RESOURCE m_pakStatsBuffer; //!< Handle of PAK status buffer
1012 MOS_RESOURCE m_pakStatsBufferFull[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Handle of PAK status buffer include PerMB and frame level.
1013 MOS_RESOURCE m_vdencStatsBuffer; //!< Handle of VDEnc status buffer
1014 MOS_RESOURCE m_vdencTlbMmioBuffer; //!< VDEnc TLB MMIO buffer
1015
1016 uint32_t m_mmioMfxLra0Override = 0; //!< Override Register MFX_LRA_0
1017 uint32_t m_mmioMfxLra1Override = 0; //!< Override Register MFX_LRA_1
1018 uint32_t m_mmioMfxLra2Override = 0; //!< Override Register MFX_LRA_2
1019
1020 uint8_t *m_vdencModeCostTbl = nullptr; //!< Pointer to VDEnc Mode Cost Table
1021 uint8_t *m_vdencMvCostTbl = nullptr; //!< Pointer to VDEnc MV Cost Table
1022 uint8_t *m_vdencHmeMvCostTbl = nullptr; //!< Pointer to VDEnc HME MV Cost Table
1023
1024 const uint16_t *m_vdencSSCThrsTblI = nullptr; //!< Pointer to VDEnc Slice size thresholds table for I picture
1025 const uint16_t *m_vdencSSCThrsTblP = nullptr; //!< Pointer to VDEnc Slice size thresholds table for P picture
1026
1027 // SEI
1028 CodechalEncodeSeiData m_seiData; //!< Encode SEI data parameter.
1029 uint32_t m_seiDataOffset; //!< Encode SEI data offset.
1030 uint8_t * m_seiParamBuffer; //!< Encode SEI data buffer.
1031
1032 bool m_brcInit; //!< BRC init enable flag.
1033 bool m_brcReset; //!< BRC reset enable flag.
1034 bool m_mbBrcEnabled; //!< MBBrc enable flag.
1035 bool m_nonNativeBrcRoiSupported; //!< Non native ROI in BRC mode enable flag.
1036 bool m_mbBrcUserFeatureKeyControl; //!< MBBRC user feature control enable flag.
1037 double m_dBrcTargetSize; //!< BRC target size.
1038 uint32_t m_trellis; //!< Trellis Number.
1039 bool m_acceleratorHeaderPackingCaps; //!< Flag set by driver from driver caps.
1040
1041 double m_dBrcInitCurrentTargetBufFullInBits; //!< BRC init current target buffer full in bits
1042 double m_dBrcInitResetInputBitsPerFrame; //!< BrcInitReset Input Bits Per Frame
1043 uint32_t m_brcInitResetBufSizeInBits; //!< BrcInitReset Buffer Size In Bits
1044 uint32_t m_brcInitPreviousTargetBufFullInBits; //!< BRC Init Previous Target Buffer Full In Bits
1045
1046 // Below values will be set if qp control params are sent by app
1047 bool m_minMaxQpControlEnabled; //!< Flag to indicate if min/max QP feature is enabled or not.
1048 uint8_t m_iMinQp; //!< I frame Minimum QP.
1049 uint8_t m_iMaxQp; //!< I frame Maximum QP.
1050 uint8_t m_pMinQp; //!< P frame Minimum QP.
1051 uint8_t m_pMaxQp; //!< P frame Maximum QP.
1052 bool m_pFrameMinMaxQpControl; //!< Indicates min/max QP values for P-frames are set separately or not.
1053
1054 uint32_t m_skipFrameBufferSize; //!< size of skip frame packed data.
1055 MOS_RESOURCE m_resSkipFrameBuffer; //!< copy skip frame packed data from DDI.
1056
1057 // VDENC BRC Buffers
1058 MOS_RESOURCE m_resVdencBrcUpdateDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES]; //!< Brc Update DMEM Buffer Array.
1059 MOS_RESOURCE m_resVdencBrcInitDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Brc Init DMEM Buffer Array.
1060 MOS_RESOURCE m_resVdencBrcImageStatesReadBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Read-only VDENC+PAK IMG STATE buffer.
1061 MOS_RESOURCE m_resVdencBrcConstDataBuffer[CODECHAL_ENCODE_VDENC_BRC_CONST_BUFFER_NUM]; //!< BRC Const Data Buffer for each frame type.
1062 MOS_RESOURCE m_resVdencBrcHistoryBuffer; //!< BRC History Buffer.
1063 MOS_RESOURCE m_resVdencBrcRoiBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< BRC ROI Buffer.
1064 MOS_RESOURCE m_resVdencBrcDbgBuffer; //!< BRC Debug Buffer.
1065
1066 // Static frame detection
1067 bool m_staticFrameDetectionEnable; //!< Static frame detection enable.
1068 MOS_RESOURCE m_resSfdOutputBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Array of SFDOutputBuffer.
1069 MOS_RESOURCE m_resSfdCostTablePFrameBuffer; //!< SFD CostTable of P Frame.
1070 MOS_RESOURCE m_resSfdCostTableBFrameBuffer; //!< SFD CostTable of B Frame.
1071 MOS_RESOURCE m_resVdencSfdImageStateReadBuffer; //!< SFD ImageState Read Buffer.
1072 PMHW_KERNEL_STATE m_sfdKernelState; //!< Point to SFD kernel state.
1073
1074 // Generation Specific Support Flags & User Feature Key Reads
1075 uint8_t m_mbBrcSupportCaps; //!< MbBrcSupport Capability.
1076 bool m_ftqEnable; //!< FTQEnable
1077 bool m_skipBiasAdjustmentSupported; //!< SkipBiasAdjustment support for P frame
1078 bool m_sliceLevelReportSupported; //!< Slice Level Report support
1079 bool m_brcRoiSupported; //!< BRC Roi Support Flag.
1080 bool m_brcMotionAdaptiveEnable; //!< BRC motion adaptive optimization enabled.
1081
1082 bool m_brcAdaptiveRegionBoostSupported; //!< ARB in BRC mode supported flag.
1083 bool m_brcAdaptiveRegionBoostEnable; //!< ARB in BRC mode enable flag.
1084
1085 bool m_roundingInterEnable; //!< RoundingInter Enable Flag.
1086 bool m_adaptiveRoundingInterEnable; //!< Adaptive Rounding Inter Enable Flag.
1087 uint32_t m_roundingInterP; //!< Rounding Inter for P frame.
1088
1089 uint8_t m_vdEncModeCost[12]; //!< VDEnc Mode Cost Table.
1090 uint8_t m_vdEncMvCost[8]; //!< VDEnc MV Cost Table.
1091 uint8_t m_vdEncHmeMvCost[8]; //!< VDEnc HME MV Cost Table.
1092
1093 uint32_t m_slidingWindowSize; //!< Slideing Window Size.
1094 bool m_forceToSkipEnable; //!< Force to Skip Flag.
1095 uint32_t m_vdencBrcInitDmemBufferSize; //!< Brc Init-Dmem Buffer Size.
1096 uint32_t m_vdencBrcUpdateDmemBufferSize; //!< Brc Update-Dmem Buffer Size.
1097 bool m_vdencStaticFrame; //!< Static Frame Indicator.
1098 uint32_t m_vdencStaticRegionPct; //!< Ratio of Static Region in One Frame.
1099 bool m_oneOnOneMapping = false; //!< Indicate if one on one ref index mapping is enabled
1100 bool m_perMBStreamOutEnable;
1101
1102 static const uint32_t TrellisQuantizationRounding[NUM_VDENC_TARGET_USAGE_MODES];
1103 static const bool TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES];
1104
1105 static const uint32_t m_vdboxHucVdencBrcInitKernelDescriptor = 4; //!< Huc Vdenc Brc init kernel descriptor
1106 static const uint32_t m_vdboxHucVdencBrcUpdateKernelDescriptor = 5; //!< Huc Vdenc Brc update kernel descriptor
1107
1108 static constexpr uint8_t m_maxNumRoi = 16; //!< VDEnc maximum number of ROI supported (including non-ROI zone0)
1109 static constexpr uint8_t m_maxNumBrcRoi = 8; //!< VDEnc maximum number of BRC ROI supported (including non-ROI zone0)
1110 static constexpr uint8_t m_maxNumNativeRoi = 3; //!< Number of native ROI supported by VDEnc HW
1111
1112 protected:
1113 static const uint32_t SFD_OUTPUT_BUFFER_SIZE = 128; //!< SFD_OUTPUT_BUFFER_SIZE
1114 static const uint32_t AVC_BRC_STATS_BUF_SIZE = 80; //!< VDENC BRC statistics buffer size
1115 static const uint32_t AVC_BRC_PAK_STATS_BUF_SIZE = 204; //!< VDENC BRC PAK statistics buffer size
1116 static const double BRC_DevThreshI0_FP_NEG[CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2]; //!< Negative BRC threshold for I frame
1117 static const double BRC_DevThreshI0_FP_POS[CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2]; //!< Positive BRC threshold for I frame
1118 static const double BRC_DevThreshPB0_FP_NEG[CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2]; //!< Negative BRC threshold for P/B frame
1119 static const double BRC_DevThreshPB0_FP_POS[CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2]; //!< Positive BRC threshold for P/B frame
1120 static const double BRC_DevThreshVBR0_NEG[CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2]; //!< Negative BRC threshold for VBR mode
1121 static const double BRC_DevThreshVBR0_POS[CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2]; //!< Positive BRC threshold for VBR mode
1122 static const int8_t BRC_LowDelay_DevThreshPB0_S8[8]; //!< Low Delay BRC threshold for P/B frame
1123 static const int8_t BRC_LowDelay_DevThreshI0_S8[8]; //!< Low Delay BRC threshold for I frame
1124 static const int8_t BRC_LowDelay_DevThreshVBR0_S8[8]; //!< Low Delay BRC threshold for VBR Mode
1125 static const int8_t BRC_INIT_DistQPDelta_I8[4]; //!< Distortion QP Delta
1126 static const uint8_t BRC_EstRateThreshP0_U8[7]; //!< Estimate Rate Thresh of P frame
1127 static const uint8_t BRC_EstRateThreshI0_U8[7]; //!< Estimate Rate Thresh of I frame
1128 static const uint16_t BRC_UPD_start_global_adjust_frame[4]; //!< Start Global Adjust Frame
1129 static const uint8_t BRC_UPD_global_rate_ratio_threshold[7]; //!< Global Rate Ratio Threshold
1130 static const uint8_t BRC_UPD_slwin_global_rate_ratio_threshold[7]; //!< Slide Window Global Rate Ratio Threshold
1131 static const uint8_t BRC_UPD_start_global_adjust_mult[5]; //!< Start Global Adjust Multiply
1132 static const uint8_t BRC_UPD_start_global_adjust_div[5]; //!< Start Global Adjust Division
1133 static const int8_t BRC_UPD_global_rate_ratio_threshold_qp[8]; //!< Global Rate Ratio QP Threshold
1134 static const uint32_t AVC_Mode_Cost[2][12][CODEC_AVC_NUM_QP]; //!< Mode Cost Table.
1135 static const int8_t BRC_UPD_GlobalRateQPAdjTabI_U8[64]; //!< I Picture Global Rate QP Adjustment Table.
1136 static const int8_t BRC_UPD_GlobalRateQPAdjTabP_U8[64]; //!< P Picture Global Rate QP Adjustment Table.
1137 static const int8_t BRC_UPD_SlWinGlobalRateQPAdjTabP_U8[64]; //!< P picture Global Rate QP Adjustment Table for Sliding Window BRC
1138 static const int8_t BRC_UPD_GlobalRateQPAdjTabB_U8[64]; //!< B Picture Global Rate QP Adjustment Table.
1139 static const uint8_t BRC_UPD_DistThreshldI_U8[10]; //!< I Picture Distortion THreshold.
1140 static const uint8_t BRC_UPD_DistThreshldP_U8[10]; //!< P Picture Distortion THreshold.
1141 static const int8_t CBR_UPD_DistQPAdjTabI_U8[81]; //!< I Picture Distortion QP Adjustment Table under CBR Mode.
1142 static const int8_t CBR_UPD_DistQPAdjTabP_U8[81]; //!< P Picture Distortion QP Adjustment Table under CBR Mode.
1143 static const int8_t CBR_UPD_DistQPAdjTabB_U8[81]; //!< B Picture Distortion QP Adjustment Table under CBR Mode.
1144 static const int8_t VBR_UPD_DistQPAdjTabI_U8[81]; //!< I Picture Distortion QP Adjustment Table under VBR Mode.
1145 static const int8_t VBR_UPD_DistQPAdjTabP_U8[81]; //!< P Picture Distortion QP Adjustment Table under VBR Mode.
1146 static const int8_t VBR_UPD_DistQPAdjTabB_U8[81]; //!< B Picture Distortion QP Adjustment Table under VBR Mode.
1147 static const int8_t CBR_UPD_FrmSzAdjTabI_S8[72]; //!< I Picture Frame Size Adjustment Table under CBR Mode.
1148 static const int8_t CBR_UPD_FrmSzAdjTabP_S8[72]; //!< P Picture Frame Size Adjustment Table under CBR Mode.
1149 static const int8_t CBR_UPD_FrmSzAdjTabB_S8[72]; //!< B Picture Frame Size Adjustment Table under CBR Mode.
1150 static const int8_t VBR_UPD_FrmSzAdjTabI_S8[72]; //!< I Picture Frame Size Adjustment Table under VBR Mode.
1151 static const int8_t VBR_UPD_FrmSzAdjTabP_S8[72]; //!< P Picture Frame Size Adjustment Table under VBR Mode.
1152 static const int8_t VBR_UPD_FrmSzAdjTabB_S8[72]; //!< B Picture Frame Size Adjustment Table under VBR Mode.
1153 static const int8_t QVBR_UPD_FrmSzAdjTabP_S8[72]; //!< P Picture Frame Size Adjustment Table under QVBR Mode.
1154 static const int8_t LOW_DELAY_UPD_FrmSzAdjTabI_S8[72]; //!< I Picture Frame Size Adjustment Table under Low Delay Mode.
1155 static const int8_t LOW_DELAY_UPD_FrmSzAdjTabP_S8[72]; //!< P Picture Frame Size Adjustment Table under Low Delay Mode.
1156 static const int8_t LOW_DELAY_UPD_FrmSzAdjTabB_S8[72]; //!< B Picture Frame Size Adjustment Table under Low Delay Mode.
1157 static const uint8_t BRC_UPD_FrmSzMinTabP_U8[9]; //!< I Picture Minimum Frame Size Table.
1158 static const uint8_t BRC_UPD_FrmSzMinTabI_U8[9]; //!< P Picture Minimum Frame Size Table.
1159 static const uint8_t BRC_UPD_FrmSzMaxTabP_U8[9]; //!< I Picture Maximum Frame Size Table.
1160 static const uint8_t BRC_UPD_FrmSzMaxTabI_U8[9]; //!< P Picture Maximum Frame Size Table.
1161 static const uint8_t BRC_UPD_FrmSzSCGTabP_U8[9]; //!<
1162 static const uint8_t BRC_UPD_FrmSzSCGTabI_U8[9]; //!<
1163
1164 ///< BRC Const Data.
1165 static const uint8_t BRC_UPD_I_IntraNonPred[42]; //!< Cost Table for Intra Non-Prediction
1166 static const uint8_t BRC_UPD_I_Intra8x8[42]; //!< Cost Table for Intra 8x8
1167 static const uint8_t BRC_UPD_I_Intra4x4[42]; //!< Cost Table for Intra 4x4
1168 static const uint8_t BRC_UPD_I_IntraChroma[42]; //!< Cost Table for Intra Chrome
1169 static const uint8_t BRC_UPD_P_IntraNonPred[42]; //!< Cost Table for Intra Non-Prediction
1170 static const uint8_t BRC_UPD_P_Intra16x16[42]; //!< Cost Table for Intra 16x16
1171 static const uint8_t BRC_UPD_P_Intra8x8[42]; //!< Cost Table for Intra 8x8
1172 static const uint8_t BRC_UPD_P_Intra4x4[42]; //!< Cost Table for Intra 4x4
1173 static const uint8_t BRC_UPD_P_Inter16x8[42]; //!< Cost Table for Inter 16x8
1174 static const uint8_t BRC_UPD_P_Inter8x8[42]; //!< Cost Table for Inter 8x8
1175 static const uint8_t BRC_UPD_P_Inter16x16[42]; //!< Cost Table for Inter 16x16
1176 static const uint8_t BRC_UPD_P_RefId[42]; //!< Cost Table for Reference Index
1177
1178 static const bool SHMEEnabled[NUM_VDENC_TARGET_USAGE_MODES]; //!< SHME Enabled Query Table.
1179 static const bool UHMEEnabled[NUM_VDENC_TARGET_USAGE_MODES]; //!< HME Enabled Query Table.
1180 static const uint8_t MaxRefIdx0[NUM_VDENC_TARGET_USAGE_MODES]; //!< Max Reference Index Query Table.
1181 static const uint8_t AdaptiveInterRoundingPWithoutB[CODEC_AVC_NUM_QP]; //!< InterRounding Table.
1182 static const uint8_t AdaptiveInterRoundingP[CODEC_AVC_NUM_QP]; //!< InterRounding Table.
1183 static const uint32_t InterRoundingP[NUM_TARGET_USAGE_MODES]; //!< P Picture InterRounding Table.
1184 static const uint32_t InterRoundingB[NUM_TARGET_USAGE_MODES]; //!< B Picture InterRounding Table.
1185 static const uint32_t InterRoundingBRef[NUM_TARGET_USAGE_MODES]; //!< B Ref Picture InterRounding Table.
1186 static const uint8_t AdaptiveInterRoundingB[CODEC_AVC_NUM_QP]; //!< B Picture Adaptive InterRounding Table.
1187
1188 static const uint16_t SliceSizeThrsholdsI[CODEC_AVC_NUM_QP]; //!< I picture slice size conformance thresholds table.
1189 static const uint16_t SliceSizeThrsholdsP[CODEC_AVC_NUM_QP]; //!< P picture slice size conformance thresholds table.
1190
1191 #if USE_CODECHAL_DEBUG_TOOL
1192 protected:
1193 virtual MOS_STATUS DumpHucBrcInit();
1194
1195 virtual MOS_STATUS DumpHucBrcUpdate(bool isInput);
1196
1197 virtual MOS_STATUS DumpEncodeImgStats(
1198 PMOS_COMMAND_BUFFER cmdbuffer);
1199
1200 virtual uint32_t GetPakVDEncPassDumpSize();
1201
1202 virtual MOS_STATUS DumpSeqParFile() override;
1203 virtual MOS_STATUS DumpFrameParFile() override;
1204
1205 virtual MOS_STATUS PopulateHmeParam(
1206 bool is16xMeEnabled,
1207 bool is32xMeEnabled,
1208 uint8_t meMethod,
1209 void *cmd) override;
1210
PopulateEncParam(uint8_t meMethod,void * cmd)1211 virtual MOS_STATUS PopulateEncParam(
1212 uint8_t meMethod,
1213 void *cmd) override
1214 {
1215 return MOS_STATUS_SUCCESS;
1216 }
1217
1218 //!
1219 //! \brief Modify the frame and slice header size with fake header size
1220 //!
1221 //! \param [in] cmdBuffer
1222 //! command buffer
1223 //!
1224 //! \return MOS_STATUS
1225 //! MOS_STATUS_SUCCESS if success, else fail reason
1226 //!
1227 virtual MOS_STATUS ModifyEncodedFrameSizeWithFakeHeaderSize( PMOS_COMMAND_BUFFER cmdBuffer);
1228 #endif
1229 };
1230
1231 // template functions for all gen-x platforms.
1232 template <class CODECHAL_VDENC_AVC_BRC_INIT_DMEM>
SetDmemHuCBrcInitResetImpl(CODECHAL_VDENC_AVC_BRC_INIT_DMEM * hucVDEncBrcInitDmem)1233 MOS_STATUS CodechalVdencAvcState::SetDmemHuCBrcInitResetImpl(CODECHAL_VDENC_AVC_BRC_INIT_DMEM* hucVDEncBrcInitDmem)
1234 {
1235 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1236
1237 CODECHAL_ENCODE_FUNCTION_ENTER;
1238
1239 auto avcSeqParams = m_avcSeqParam;
1240 if (avcSeqParams->FrameSizeTolerance == EFRAMESIZETOL_EXTREMELY_LOW) // Low Delay Mode
1241 {
1242 avcSeqParams->MaxBitRate = avcSeqParams->TargetBitRate;
1243 }
1244
1245 m_dBrcInitResetInputBitsPerFrame =
1246 ((double)avcSeqParams->MaxBitRate * 100) / avcSeqParams->FramesPer100Sec;
1247 m_dBrcInitCurrentTargetBufFullInBits = m_dBrcInitResetInputBitsPerFrame;
1248 m_dBrcTargetSize = avcSeqParams->InitVBVBufferFullnessInBit;
1249
1250 hucVDEncBrcInitDmem->BRCFunc_U8 = m_brcInit ? 0 : 2; // 0 for init, 2 for reset
1251
1252 hucVDEncBrcInitDmem->INIT_FrameWidth_U16 = (uint16_t)m_frameWidth;
1253 hucVDEncBrcInitDmem->INIT_FrameHeight_U16 = (uint16_t)m_frameHeight;
1254
1255 hucVDEncBrcInitDmem->INIT_TargetBitrate_U32 = avcSeqParams->TargetBitRate;
1256 hucVDEncBrcInitDmem->INIT_MinRate_U32 = avcSeqParams->MinBitRate;
1257 hucVDEncBrcInitDmem->INIT_MaxRate_U32 = avcSeqParams->MaxBitRate;
1258 hucVDEncBrcInitDmem->INIT_BufSize_U32 = avcSeqParams->VBVBufferSizeInBit;
1259 hucVDEncBrcInitDmem->INIT_InitBufFull_U32 = avcSeqParams->InitVBVBufferFullnessInBit;
1260
1261 if (hucVDEncBrcInitDmem->INIT_InitBufFull_U32 > avcSeqParams->VBVBufferSizeInBit)
1262 hucVDEncBrcInitDmem->INIT_InitBufFull_U32 = avcSeqParams->VBVBufferSizeInBit;
1263
1264 switch (avcSeqParams->RateControlMethod)
1265 {
1266 case RATECONTROL_CBR:
1267 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 |= BRCFLAG_ISCBR;
1268 break;
1269 case RATECONTROL_VBR:
1270 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 |= BRCFLAG_ISVBR;
1271 break;
1272 case RATECONTROL_QVBR:
1273 // QVBR will use VBR BRCFlag, triggered when ICQQualityFactor > 10
1274 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 |= BRCFLAG_ISVBR;
1275 break;
1276 // Temp solution using AVBR for low delay case, before the BRC flag is added to DDI
1277 case RATECONTROL_AVBR:
1278 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 |= BRCFLAG_ISLOWDELAY;
1279 break;
1280 case RATECONTROL_ICQ:
1281 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 |= BRCFLAG_ISICQ;
1282 break;
1283 case RATECONTROL_VCM:
1284 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 |= BRCFLAG_ISVCM;
1285 break;
1286 default:
1287 break;
1288 }
1289
1290 if (avcSeqParams->FrameSizeTolerance == EFRAMESIZETOL_EXTREMELY_LOW) // Low Delay Mode
1291 {
1292 hucVDEncBrcInitDmem->INIT_BRCFlag_U16 = BRCFLAG_ISLOWDELAY;
1293 hucVDEncBrcInitDmem->INIT_LowDelayGoldenFrameBoost_U8 = 0; //get from ?
1294 }
1295
1296 hucVDEncBrcInitDmem->INIT_FrameRateM_U32 = avcSeqParams->FramesPer100Sec;
1297 hucVDEncBrcInitDmem->INIT_FrameRateD_U32 = 100;
1298
1299 uint32_t profileLevelMaxFrame;
1300 CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalAvcEncode_GetProfileLevelMaxFrameSize(
1301 avcSeqParams, this, &profileLevelMaxFrame));
1302
1303 hucVDEncBrcInitDmem->INIT_ProfileLevelMaxFrame_U32 = profileLevelMaxFrame;
1304
1305 if (avcSeqParams->GopRefDist >= avcSeqParams->GopPicSize && avcSeqParams->GopPicSize > 1)
1306 {
1307 hucVDEncBrcInitDmem->INIT_GopP_U16 = 1;
1308 hucVDEncBrcInitDmem->INIT_GopB_U16 = avcSeqParams->GopPicSize - 2;
1309 }
1310 else if (avcSeqParams->GopRefDist && (avcSeqParams->GopPicSize > 0))
1311 {
1312 // Their ratio is used in BRC kernel to detect mini GOP structure. Have to be multiple.
1313 hucVDEncBrcInitDmem->INIT_GopP_U16 = (avcSeqParams->GopPicSize - 1) / avcSeqParams->GopRefDist;
1314 hucVDEncBrcInitDmem->INIT_GopB_U16 = (avcSeqParams->GopRefDist - 1) * hucVDEncBrcInitDmem->INIT_GopP_U16;
1315 }
1316
1317 if (m_minMaxQpControlEnabled)
1318 {
1319 // Convert range [1,51] to [10,51] for VDEnc due to HW limitation
1320 hucVDEncBrcInitDmem->INIT_MinQP_U16 = MOS_MAX(m_iMinQp, 10);
1321 hucVDEncBrcInitDmem->INIT_MaxQP_U16 = MOS_MAX(m_iMaxQp, 10);
1322 }
1323 else
1324 {
1325 hucVDEncBrcInitDmem->INIT_MinQP_U16 = CODECHAL_VDENC_AVC_BRC_MIN_QP; // Setting values from arch spec
1326 hucVDEncBrcInitDmem->INIT_MaxQP_U16 = CODECHAL_ENCODE_AVC_MAX_SLICE_QP; // Setting values from arch spec
1327 }
1328
1329 //dynamic deviation thresholds
1330 double inputBitsPerFrame = ((double)avcSeqParams->MaxBitRate * (double)100) / (double)avcSeqParams->FramesPer100Sec;
1331 double bps_ratio = inputBitsPerFrame / ((double)avcSeqParams->VBVBufferSizeInBit * 100 / avcSeqParams->FramesPer100Sec/*DEV_STD_FPS*/);
1332 if (bps_ratio < CODECHAL_VDENC_AVC_BPS_RATIO_LOW) bps_ratio = CODECHAL_VDENC_AVC_BPS_RATIO_LOW;
1333 if (bps_ratio > CODECHAL_VDENC_AVC_BPS_RATIO_HIGH) bps_ratio = CODECHAL_VDENC_AVC_BPS_RATIO_HIGH;
1334
1335 if (avcSeqParams->FrameSizeTolerance == EFRAMESIZETOL_EXTREMELY_LOW) // Low Delay Mode
1336 {
1337 MOS_SecureMemcpy(hucVDEncBrcInitDmem->INIT_DevThreshPB0_S8, 8 * sizeof(int8_t), (void*)BRC_LowDelay_DevThreshPB0_S8, 8 * sizeof(int8_t));
1338 MOS_SecureMemcpy(hucVDEncBrcInitDmem->INIT_DevThreshI0_S8, 8 * sizeof(int8_t), (void*)BRC_LowDelay_DevThreshI0_S8, 8 * sizeof(int8_t));
1339 MOS_SecureMemcpy(hucVDEncBrcInitDmem->INIT_DevThreshVBR0_S8, 8 * sizeof(int8_t), (void*)BRC_LowDelay_DevThreshVBR0_S8, 8 * sizeof(int8_t));
1340 }
1341 else
1342 {
1343 //dynamic deviation thresholds
1344 for (int i = 0; i < CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2; i++)
1345 {
1346 hucVDEncBrcInitDmem->INIT_DevThreshPB0_S8[i] =
1347 (int8_t)(CODECHAL_VDENC_AVC_NEG_MULT_PB * pow(BRC_DevThreshPB0_FP_NEG[i], bps_ratio));
1348 hucVDEncBrcInitDmem->INIT_DevThreshPB0_S8[i + CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2] =
1349 (int8_t)(CODECHAL_VDENC_AVC_POS_MULT_PB * pow(BRC_DevThreshPB0_FP_POS[i], bps_ratio));
1350
1351 hucVDEncBrcInitDmem->INIT_DevThreshI0_S8[i] =
1352 (int8_t)(CODECHAL_VDENC_AVC_NEG_MULT_I * pow(BRC_DevThreshI0_FP_NEG[i], bps_ratio));
1353 hucVDEncBrcInitDmem->INIT_DevThreshI0_S8[i + CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2] =
1354 (int8_t)(CODECHAL_VDENC_AVC_POS_MULT_I * pow(BRC_DevThreshI0_FP_POS[i], bps_ratio));
1355
1356 hucVDEncBrcInitDmem->INIT_DevThreshVBR0_S8[i] =
1357 (int8_t)(CODECHAL_VDENC_AVC_NEG_MULT_VBR * pow(BRC_DevThreshVBR0_NEG[i], bps_ratio));
1358 hucVDEncBrcInitDmem->INIT_DevThreshVBR0_S8[i + CODECHAL_VDENC_AVC_N_DEV_THRESHLDS / 2] =
1359 (int8_t)(CODECHAL_VDENC_AVC_POS_MULT_VBR * pow(BRC_DevThreshVBR0_POS[i], bps_ratio));
1360 }
1361 }
1362
1363 int32_t initQP;
1364 CODECHAL_ENCODE_CHK_STATUS_RETURN(ComputeBRCInitQP(avcSeqParams, &initQP));
1365
1366 hucVDEncBrcInitDmem->INIT_InitQPIP = (uint8_t)initQP;
1367
1368 // MBBRC control
1369 if (IsMBBRCControlEnabled())
1370 {
1371 hucVDEncBrcInitDmem->INIT_MbQpCtrl_U8 = 1;
1372 MOS_SecureMemcpy(hucVDEncBrcInitDmem->INIT_DistQPDelta_I8, 4 * sizeof(int8_t), (void*)BRC_INIT_DistQPDelta_I8, 4 * sizeof(int8_t));
1373 }
1374
1375 hucVDEncBrcInitDmem->INIT_SliceSizeCtrlEn_U8 = avcSeqParams->EnableSliceLevelRateCtrl; // Enable slice size control
1376
1377 hucVDEncBrcInitDmem->INIT_OscillationQpDelta_U8 =
1378 ((avcSeqParams->RateControlMethod == RATECONTROL_VCM) || (avcSeqParams->RateControlMethod == RATECONTROL_QVBR)) ? 16 : 0;
1379 hucVDEncBrcInitDmem->INIT_HRDConformanceCheckDisable_U8 =
1380 ((avcSeqParams->RateControlMethod == RATECONTROL_VCM) || (avcSeqParams->RateControlMethod == RATECONTROL_AVBR)) ? 1 : 0;
1381
1382 // Adaptive 2nd re-encode pass
1383 if (m_picWidthInMb * m_picHeightInMb >= ((3840 * 2160) >> 8)) // >= 4K
1384 {
1385 hucVDEncBrcInitDmem->INIT_TopQPDeltaThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_TOPQPDELTATHRFORADAPT2PASS_4K;
1386 hucVDEncBrcInitDmem->INIT_BotQPDeltaThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_BOTQPDELTATHRFORADAPT2PASS_4K;
1387 hucVDEncBrcInitDmem->INIT_TopFrmSzThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_TOPFRMSZTHRFORADAPT2PASS_4K;
1388 hucVDEncBrcInitDmem->INIT_BotFrmSzThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_BOTFRMSZTHRFORADAPT2PASS_4K;
1389 }
1390 else
1391 {
1392 if (avcSeqParams->RateControlMethod == RATECONTROL_AVBR)
1393 {
1394 hucVDEncBrcInitDmem->INIT_TopQPDeltaThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_AVBR_TOPQPDELTATHRFORADAPT2PASS;
1395 hucVDEncBrcInitDmem->INIT_BotQPDeltaThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_AVBR_BOTQPDELTATHRFORADAPT2PASS;
1396 hucVDEncBrcInitDmem->INIT_TopFrmSzThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_AVBR_TOPFRMSZTHRFORADAPT2PASS;
1397 hucVDEncBrcInitDmem->INIT_BotFrmSzThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_AVBR_BOTFRMSZTHRFORADAPT2PASS;
1398 }
1399 else
1400 {
1401 hucVDEncBrcInitDmem->INIT_TopQPDeltaThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_TOPQPDELTATHRFORADAPT2PASS;
1402 hucVDEncBrcInitDmem->INIT_BotQPDeltaThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_BOTQPDELTATHRFORADAPT2PASS;
1403 hucVDEncBrcInitDmem->INIT_TopFrmSzThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_TOPFRMSZTHRFORADAPT2PASS;
1404 hucVDEncBrcInitDmem->INIT_BotFrmSzThrForAdapt2Pass_U8 = CODECHAL_VDENC_AVC_BRC_BOTFRMSZTHRFORADAPT2PASS;
1405 }
1406 }
1407
1408 hucVDEncBrcInitDmem->INIT_QPSelectForFirstPass_U8 = 1;
1409 hucVDEncBrcInitDmem->INIT_MBHeaderCompensation_U8 = 1;
1410 hucVDEncBrcInitDmem->INIT_DeltaQP_Adaptation_U8 = 1;
1411 hucVDEncBrcInitDmem->INIT_MaxCRFQualityFactor_U8 = CODECHAL_ENCODE_AVC_MAX_ICQ_QUALITYFACTOR + 1;
1412
1413 if (RATECONTROL_QVBR == avcSeqParams->RateControlMethod || RATECONTROL_ICQ == avcSeqParams->RateControlMethod)
1414 {
1415 hucVDEncBrcInitDmem->INIT_CRFQualityFactor_U8 = (uint8_t)avcSeqParams->ICQQualityFactor;
1416 hucVDEncBrcInitDmem->INIT_ScenarioInfo_U8 = (RATECONTROL_QVBR == avcSeqParams->RateControlMethod) ? 1 : 0;
1417 }
1418
1419 if (m_avcPicParam->NumDirtyROI)
1420 {
1421 hucVDEncBrcInitDmem->INIT_ScenarioInfo_U8 = 1; //DISPLAYREMOTING
1422 }
1423
1424 if (avcSeqParams->FrameSizeTolerance == EFRAMESIZETOL_LOW) // Sliding Window BRC
1425 {
1426 hucVDEncBrcInitDmem->INIT_SlidingWidowRCEnable_U8 = 1;
1427 hucVDEncBrcInitDmem->INIT_SlidingWindowSize_U8 = (uint8_t)(avcSeqParams->FramesPer100Sec / 100);
1428 hucVDEncBrcInitDmem->INIT_SlidingWindowMaxRateRatio_U8 = 120;
1429 }
1430
1431 MOS_SecureMemcpy(hucVDEncBrcInitDmem->INIT_EstRateThreshP0_U8, 7 * sizeof(uint8_t), (void*)BRC_EstRateThreshP0_U8, 7 * sizeof(uint8_t));
1432 MOS_SecureMemcpy(hucVDEncBrcInitDmem->INIT_EstRateThreshI0_U8, 7 * sizeof(uint8_t), (void*)BRC_EstRateThreshI0_U8, 7 * sizeof(uint8_t));
1433
1434 return eStatus;
1435 }
1436
1437 template <class CODECHAL_VDENC_AVC_BRC_UPDATE_DMEM>
SetDmemHuCBrcUpdateImpl(CODECHAL_VDENC_AVC_BRC_UPDATE_DMEM * hucVDEncBrcDmem)1438 MOS_STATUS CodechalVdencAvcState::SetDmemHuCBrcUpdateImpl(CODECHAL_VDENC_AVC_BRC_UPDATE_DMEM* hucVDEncBrcDmem)
1439 {
1440 MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
1441
1442 CODECHAL_ENCODE_FUNCTION_ENTER;
1443
1444 auto avcSeqParams = m_avcSeqParam;
1445 auto avcPicParams = m_avcPicParam;
1446
1447 hucVDEncBrcDmem->BRCFunc_U8 = 1; // Update:1
1448
1449 if (!m_brcInit && (m_currPass == 0))
1450 {
1451 m_brcInitPreviousTargetBufFullInBits =
1452 (uint32_t)(m_dBrcInitCurrentTargetBufFullInBits + m_dBrcInitResetInputBitsPerFrame * m_numSkipFrames);
1453 m_dBrcInitCurrentTargetBufFullInBits += m_dBrcInitResetInputBitsPerFrame * (1 + m_numSkipFrames);
1454 m_dBrcTargetSize += m_dBrcInitResetInputBitsPerFrame * (1 + m_numSkipFrames);
1455 }
1456
1457 if (m_dBrcTargetSize > avcSeqParams->VBVBufferSizeInBit)
1458 {
1459 m_dBrcTargetSize -= avcSeqParams->VBVBufferSizeInBit;
1460 }
1461
1462 hucVDEncBrcDmem->UPD_FRAMENUM_U32 = m_avcSliceParams->frame_num;
1463 hucVDEncBrcDmem->UPD_TARGETSIZE_U32 = (uint32_t)(m_dBrcTargetSize);
1464 hucVDEncBrcDmem->UPD_PeakTxBitsPerFrame_U32 = (uint32_t)(m_dBrcInitCurrentTargetBufFullInBits - m_brcInitPreviousTargetBufFullInBits);
1465
1466 //Dynamic slice size control
1467 if (avcSeqParams->EnableSliceLevelRateCtrl)
1468 {
1469 hucVDEncBrcDmem->UPD_SLCSZ_TARGETSLCSZ_U16 = (uint16_t)avcPicParams->SliceSizeInBytes; // target slice size
1470 hucVDEncBrcDmem->UPD_TargetSliceSize_U16 = (uint16_t)avcPicParams->SliceSizeInBytes; // set max slice size to be same as target slice size
1471 hucVDEncBrcDmem->UPD_MaxNumSliceAllowed_U16 = (uint16_t)m_maxNumSlicesAllowed;
1472
1473 for (uint8_t k = 0; k < 42; k++)
1474 {
1475 hucVDEncBrcDmem->UPD_SLCSZ_UPD_THRDELTAI_U16[k] = MOS_MIN(avcPicParams->SliceSizeInBytes - 150, m_vdencSSCThrsTblI[k+10]);
1476 hucVDEncBrcDmem->UPD_SLCSZ_UPD_THRDELTAP_U16[k] = MOS_MIN(avcPicParams->SliceSizeInBytes - 150, m_vdencSSCThrsTblP[k+10]);
1477 }
1478 }
1479 else
1480 {
1481 hucVDEncBrcDmem->UPD_SLCSZ_TARGETSLCSZ_U16 = 0;
1482 hucVDEncBrcDmem->UPD_TargetSliceSize_U16 = 0;
1483 hucVDEncBrcDmem->UPD_MaxNumSliceAllowed_U16 = 0;
1484
1485 for (uint8_t k = 0; k < 42; k++)
1486 {
1487 hucVDEncBrcDmem->UPD_SLCSZ_UPD_THRDELTAI_U16[k] = 0;
1488 hucVDEncBrcDmem->UPD_SLCSZ_UPD_THRDELTAP_U16[k] = 0;
1489 }
1490 }
1491
1492 if (avcSeqParams->FrameSizeTolerance == EFRAMESIZETOL_LOW) // Sliding Window BRC
1493 {
1494 MOS_SecureMemcpy(hucVDEncBrcDmem->UPD_gRateRatioThreshold_U8, 7 * sizeof(uint8_t), (void*)BRC_UPD_slwin_global_rate_ratio_threshold, 7 * sizeof(uint8_t));
1495 }
1496 else
1497 {
1498 MOS_SecureMemcpy(hucVDEncBrcDmem->UPD_gRateRatioThreshold_U8, 7 * sizeof(uint8_t), (void*)BRC_UPD_global_rate_ratio_threshold, 7 * sizeof(uint8_t));
1499 }
1500
1501 hucVDEncBrcDmem->UPD_CurrFrameType_U8 = (m_pictureCodingType + 1) % 3; // I:1, P:2, B:0
1502
1503 MOS_SecureMemcpy(hucVDEncBrcDmem->UPD_startGAdjFrame_U16, 4 * sizeof(uint16_t), (void*)BRC_UPD_start_global_adjust_frame, 4 * sizeof(uint16_t));
1504
1505 MOS_SecureMemcpy(hucVDEncBrcDmem->UPD_startGAdjMult_U8, 5 * sizeof(uint8_t), (void*)BRC_UPD_start_global_adjust_mult, 5 * sizeof(uint8_t));
1506
1507 MOS_SecureMemcpy(hucVDEncBrcDmem->UPD_startGAdjDiv_U8, 5 * sizeof(uint8_t), (void*)BRC_UPD_start_global_adjust_div, 5 * sizeof(uint8_t));
1508
1509 MOS_SecureMemcpy(hucVDEncBrcDmem->UPD_gRateRatioThresholdQP_U8, 8 * sizeof(uint8_t), (void*)BRC_UPD_global_rate_ratio_threshold_qp, 8 * sizeof(uint8_t));
1510
1511 hucVDEncBrcDmem->UPD_PAKPassNum_U8 = m_currPass;
1512 hucVDEncBrcDmem->UPD_MaxNumPass_U8 = m_numPasses + 1;
1513
1514 uint32_t numP = 0;
1515 if (avcSeqParams->GopRefDist && (avcSeqParams->GopPicSize > 0))
1516 {
1517 numP = (avcSeqParams->GopPicSize - 1) / avcSeqParams->GopRefDist;
1518 }
1519
1520 for (int32_t i = 0; i < 2; i++)
1521 {
1522 hucVDEncBrcDmem->UPD_SceneChgWidth_U8[i] = (uint8_t)MOS_MIN((numP + 1) / 5, 6);
1523 }
1524
1525 hucVDEncBrcDmem->UPD_SceneChgDetectEn_U8 = 1;
1526 hucVDEncBrcDmem->UPD_SceneChgPrevIntraPctThreshold_U8 = 0x60;
1527 hucVDEncBrcDmem->UPD_SceneChgCurIntraPctThreshold_U8 = 0xc0;
1528
1529 hucVDEncBrcDmem->UPD_IPAverageCoeff_U8 =
1530 (avcSeqParams->FrameSizeTolerance == EFRAMESIZETOL_EXTREMELY_LOW) ? 0 : 0x80;
1531
1532 hucVDEncBrcDmem->UPD_CQP_FracQp_U8 = 0;
1533
1534 if (avcSeqParams->RateControlMethod == RATECONTROL_ICQ)
1535 {
1536 hucVDEncBrcDmem->UPD_CQP_QpValue_U8 = 18; //Cmodel suggested a few values to try: 18,20,26,30
1537 }
1538 else
1539 {
1540 hucVDEncBrcDmem->UPD_CQP_QpValue_U8 = 0;
1541 }
1542
1543 if (m_staticFrameDetectionInUse)
1544 {
1545 hucVDEncBrcDmem->UPD_HMEDetectionEnable_U8 = 1;
1546 }
1547 else
1548 {
1549 hucVDEncBrcDmem->UPD_HMEDetectionEnable_U8 = 0;
1550 }
1551
1552 // Skipped frame handling
1553 if (m_numSkipFrames)
1554 {
1555 // CP case: one or more frames with skip flag = 2 received and copied
1556 hucVDEncBrcDmem->UPD_SkipFrameSize_U16 = (uint16_t)m_sizeSkipFrames;
1557 hucVDEncBrcDmem->UPD_NumOfFramesSkipped_U16 = (uint16_t)m_numSkipFrames;
1558 }
1559 else if (FRAME_SKIP_NORMAL == m_skipFrameFlag)
1560 {
1561 // non-CP case: use the num/size of skipped frames passed in by MSDK
1562 hucVDEncBrcDmem->UPD_SkipFrameSize_U16 = (uint16_t)m_avcPicParam->SizeSkipFrames;
1563 hucVDEncBrcDmem->UPD_NumOfFramesSkipped_U16 = (uint16_t)m_avcPicParam->NumSkipFrames;
1564 }
1565 else
1566 {
1567 hucVDEncBrcDmem->UPD_SkipFrameSize_U16 = 0;
1568 hucVDEncBrcDmem->UPD_NumOfFramesSkipped_U16 = 0;
1569 }
1570
1571 // HMECost enabled by default in CModel V11738+
1572 hucVDEncBrcDmem->UPD_HMECostEnable_U8 = 1;
1573
1574 // ROI and static region pct parameters
1575 // must be zero if they are not used
1576 hucVDEncBrcDmem->UPD_RoiQpViaForceQp_U8 = 0;
1577 hucVDEncBrcDmem->UPD_StaticRegionPct_U16 = 0;
1578 hucVDEncBrcDmem->UPD_ROISource_U8 = 0;
1579 if (avcPicParams->NumROI)
1580 {
1581 CODECHAL_ENCODE_CHK_COND_RETURN(m_avcPicParam->NumROIDistinctDeltaQp > sizeof(hucVDEncBrcDmem->UPD_ROIQpDelta_I8) - 1, "Number of different ROI delta QP is greater that dmem roi array size");
1582
1583 hucVDEncBrcDmem->UPD_RoiQpViaForceQp_U8 = avcPicParams->bNativeROI ? 0 : 1;
1584 for (uint8_t i = 0; i < m_avcPicParam->NumROIDistinctDeltaQp; i++)
1585 {
1586 hucVDEncBrcDmem->UPD_ROIQpDelta_I8[i + 1] = m_avcPicParam->ROIDistinctDeltaQp[i];
1587 }
1588 }
1589 else if (avcPicParams->NumDirtyROI)
1590 {
1591 hucVDEncBrcDmem->UPD_StaticRegionPct_U16 = (uint16_t)m_vdencStaticRegionPct;
1592 if (m_mbBrcEnabled)
1593 {
1594 hucVDEncBrcDmem->UPD_ROISource_U8 = 2;
1595 }
1596 }
1597
1598 hucVDEncBrcDmem->UPD_SLBB_Size_U16 = (uint16_t)m_hwInterface->m_vdencBrcImgStateBufferSize;
1599
1600 // reset skip frame statistics
1601 m_numSkipFrames = 0;
1602 m_sizeSkipFrames = 0;
1603
1604 return eStatus;
1605 }
1606
1607 #endif // __CODECHAL_VDENC_AVC_H__
1608