1 /*
2 * Copyright (c) 2017, 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_encode_mpeg2.h
24 //! \brief    Defines base class for MPEG2 dual-pipe encoder.
25 //!
26 
27 #ifndef __CODECHAL_ENCODE_MPEG2_H__
28 #define __CODECHAL_ENCODE_MPEG2_H__
29 
30 #include "codechal_encoder_base.h"
31 
32 class CodechalKernelHme;
33 
34 //!
35 //! \class   CodechalEncodeMpeg2
36 //! \brief   MPEG2 dual-pipe encoder base class
37 //! \details This class defines the base class for MPEG2 dual-pipe encoder, it includes
38 //!          common member fields, functions, interfaces etc shared by all GENs.
39 //!          Gen specific definitions, features should be put into their corresponding classes.
40 //!          To create a MPEG2 dual-pipe encoder instance, client needs to new the instance in media interfaces
41 //!
42 class CodechalEncodeMpeg2 : public CodechalEncoderState
43 {
44 public:
45 
46     //!
47     //! \brief    Copy construtor
48     //!
49     CodechalEncodeMpeg2(const CodechalEncodeMpeg2&) = delete;
50 
51 
52     //!
53     //! \brief    Copy assignment construtor
54     //!
55     CodechalEncodeMpeg2& operator=(const CodechalEncodeMpeg2&) = delete;
56 
57     //!
58     //! \brief    Destructor
59     //!
60     virtual ~CodechalEncodeMpeg2();
61 
62     //!
63     //! \brief    Allocate resources for encoder instance
64     //! \details  It is invoked when initializing encoder instance and it would call #AllocateEncResources(), #AllocateBrcResources()
65     //!
66     //! \return   MOS_STATUS
67     //!           MOS_STATUS_SUCCESS if success, else fail reason
68     //!
69     MOS_STATUS AllocateResources() override;
70 
71     //!
72     //! \brief    Free encoder resources
73     //! \details  It is invoked when destorying encoder instance and it would call #FreeEncResources(), #FreeBrcResources()
74     //!           and FreePakResources()
75     //!
76     //! \return   void
77     //!
78     void FreeResources() override;
79 
80     //!
81     //! \brief    Initialize encoder at picture level
82     //!
83     //! \param    [in] params
84     //!           Picture encoding parameters
85     //!
86     //! \return   MOS_STATUS
87     //!           MOS_STATUS_SUCCESS if success, else fail reason
88     //!
89     MOS_STATUS InitializePicture(const EncoderParams& params) override;
90 
91     //!
92     //! \brief    Encode kernel functions
93     //!
94     //! \return   MOS_STATUS
95     //!           MOS_STATUS_SUCCESS if success, else fail reason
96     //!
97     virtual MOS_STATUS ExecuteKernelFunctions() override;
98 
99     //!
100     //! \brief    Encode command at picture level
101     //!
102     //! \return   MOS_STATUS
103     //!           MOS_STATUS_SUCCESS if success, else fail reason
104     //!
105     MOS_STATUS ExecutePictureLevel() override;
106 
107     //!
108     //! \brief    Encode command at slice level
109     //!
110     //! \return   MOS_STATUS
111     //!           MOS_STATUS_SUCCESS if success, else fail reason
112     //!
113     MOS_STATUS ExecuteSliceLevel() override;
114 
115     //!
116     //! \brief    Copy skip frame
117     //!
118     //! \return   MOS_STATUS
119     //!           MOS_STATUS_SUCCESS if success, else fail reason
120     //!
121     MOS_STATUS EncodeCopySkipFrame() override;
122 
123     //!
124     //! \brief    Initialize encoder instance
125     //! \details  When GEN specific derived class implements this function to do its own initialization,
126     //            it is required that the derived class calls #CodechalEncodeMpeg2::Initialize() first
127     //            which would do common initialization for all GENs
128     //!
129     //! \return   MOS_STATUS
130     //!           MOS_STATUS_SUCCESS if success, else fail reason
131     //!
132     virtual MOS_STATUS Initialize(CodechalSetting * codecHalSettings) override;
133 
134     //!
135     //! \brief  Inserts the generic prologue command for a command buffer
136     //! \param  [in] cmdBuffer
137     //!         Command buffer
138     //! \param  [in] frameTracking
139     //!         Indicate if frame tracking requested
140     //! \return MOS_STATUS
141     //!         MOS_STATUS_SUCCESS if success, else fail reason
142     //!
143     virtual MOS_STATUS SendPrologWithFrameTracking(
144         PMOS_COMMAND_BUFFER         cmdBuffer,
145         bool                        frameTracking,
146         MHW_MI_MMIOREGISTERS       *mmioRegister = nullptr) override;
147 
148     //!
149     //! \brief    Initialize MMC state
150     //!
151     //! \return   MOS_STATUS
152     //!           MOS_STATUS_SUCCESS if success
153     //!
154     virtual MOS_STATUS InitMmcState();
155 
156     CodecEncodeMpeg2PictureParams          *m_picParams = nullptr;        //!< Pointer to picture parameter
157     PCODEC_REF_LIST                        m_refList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_MPEG2];  //!< Pointer to reference list
158 
159     // Codec to define its own GetStatusReport
GetStatusReport(EncodeStatus * encodeStatus,EncodeStatusReport * encodeStatusReport)160     MOS_STATUS GetStatusReport(
161         EncodeStatus       *encodeStatus,
162         EncodeStatusReport *encodeStatusReport) override { return MOS_STATUS_SUCCESS; }
163 
164     MOS_STATUS AddMediaVfeCmd(
165         PMOS_COMMAND_BUFFER cmdBuffer,
166         SendKernelCmdsParams *params) override;
167 
168 protected:
169 
170     //!
171     //! \brief    Constructor
172     //!
173     CodechalEncodeMpeg2(
174         CodechalHwInterface* hwInterface,
175         CodechalDebugInterface* debugInterface,
176         PCODECHAL_STANDARD_INFO standardInfo);
177 
178     //!
179     //! \brief    Help function to allocate a 1D buffer
180     //!
181     //! \param    [in,out] buffer
182     //!           Pointer to allocated buffer
183     //! \param    [in] bufSize
184     //!           Buffer size
185     //! \param    [in] name
186     //!           Buffer name
187     //!
188     //! \return   MOS_STATUS
189     //!           MOS_STATUS_SUCCESS if success, else fail reason
190     //!
191     MOS_STATUS AllocateBuffer(
192         PMOS_RESOURCE           buffer,
193         uint32_t                bufSize,
194         PCCHAR                  name);
195 
196     //!
197     //! \brief    Help function to allocate a generic 2D surface
198     //!
199     //! \param    [in,out] surface
200     //!           Pointer to allocated surface
201     //! \param    [in] surfWidth
202     //!           Surface width
203     //! \param    [in] surfHeight
204     //!           Surface height
205     //! \param    [in] name
206     //!           Surface name
207     //!
208     //! \return   MOS_STATUS
209     //!           MOS_STATUS_SUCCESS if success, else fail reason
210     //!
211     MOS_STATUS AllocateBuffer2D(
212         PMOS_SURFACE         surface,
213         uint32_t             surfWidth,
214         uint32_t             surfHeight,
215         PCCHAR               name);
216 
217     //!
218     //! \brief    Help function to allocate a 1D buffer
219     //!
220     //! \param    [in,out] batchBuffer
221     //!           Pointer to allocated batch buffer
222     //! \param    [in] bufSize
223     //!           Buffer size
224     //! \param    [in] name
225     //!           Batch buffer name
226     //!
227     //! \return   MOS_STATUS
228     //!           MOS_STATUS_SUCCESS if success, else fail reason
229     //!
230     MOS_STATUS AllocateBatchBuffer(
231         PMHW_BATCH_BUFFER            batchBuffer,
232         uint32_t                     bufSize,
233         PCCHAR                       name);
234 
235     //!
236     //! \brief    Allocate resources for ENC
237     //!
238     //! \return   MOS_STATUS
239     //!           MOS_STATUS_SUCCESS if success, else fail reason
240     //!
241     MOS_STATUS AllocateEncResources();
242 
243     //!
244     //! \brief    Allocate BRC resources
245     //!
246     //! \return   MOS_STATUS
247     //!           MOS_STATUS_SUCCESS if success, else fail reason
248     //!
249     MOS_STATUS AllocateBrcResources();
250 
251     //!
252     //! \brief    Free BRC resources
253     //!
254     //! \return   MOS_STATUS
255     //!           MOS_STATUS_SUCCESS if success, else fail reason
256     //!
257     MOS_STATUS FreeBrcResources();
258 
259     //!
260     //! \brief    Free ENC resources
261     //!
262     //! \return   MOS_STATUS
263     //!           MOS_STATUS_SUCCESS if success, else fail reason
264     //!
265     MOS_STATUS FreeEncResources();
266 
267     //!
268     //! \brief    Check profile and level
269     //! \details  Check if the required profile and level are supported by driver
270     //!
271     //! \return   MOS_STATUS
272     //!           MOS_STATUS_SUCCESS if success, else fail reason
273     //!
274     MOS_STATUS CheckProfileAndLevel();
275 
276     //!
277     //! \brief    Setup/configure encoder based on sequence parameter set
278     //! \details  It is invoked when the encoder receives a new sequence parameter set and it would
279     //!           set up and configure the encoder state that used for the sequence
280     //!
281     //! \return   MOS_STATUS
282     //!           MOS_STATUS_SUCCESS if success, else fail reason
283     //!
284     MOS_STATUS SetSequenceStructs();
285 
286     //!
287     //! \brief    Setup/configure encoder based on picture parameter set
288     //! \details  It is invoked for every picture and it would set up and configure the
289     //            encoder state that used for current picture
290     //!
291     //! \return   MOS_STATUS
292     //!           MOS_STATUS_SUCCESS if success, else fail reason
293     //!
294     MOS_STATUS SetPictureStructs();
295 
296     //!
297     //! \brief    Setup/configure Slice Group
298     //! \details  It is invoked for every picture and it would set up and configure the
299     //            encoder state that used for current picture
300     //!
301     //! \return   MOS_STATUS
302     //!           MOS_STATUS_SUCCESS if success, else fail reason
303     //!
304     MOS_STATUS SetSliceGroups();
305 
306     //!
307     //! \brief    Get current byte offset
308     //! \details  Get current byte offset for the bit stream buffer
309     //! \param    bsBuffer
310     //!           [in] Bit stream buffer
311     //! \return   uint32_t
312     //!           Byte offset
313     //!
314     uint32_t GetCurByteOffset(BSBuffer* bsBuffer);
315 
316     //!
317     //! \brief    Pack display sequence extension
318     //! \details  Pack display sequence extension, MPEG2 Spec 6.2.2.4
319     //!
320     //! \return   MOS_STATUS
321     //!           MOS_STATUS_SUCCESS if success, else fail reason
322     MOS_STATUS PackDisplaySeqExtension();
323 
324     //!
325     //! \brief    Pack sequence extension
326     //! \details  Pack sequence extension, MPEG2 Spec 6.2.2.3
327     //!
328     //! \return   MOS_STATUS
329     //!           MOS_STATUS_SUCCESS if success, else fail reason
330     MOS_STATUS PackSeqExtension();
331 
332     //!
333     //! \brief    Pack sequence header
334     //! \details  Pack sequence extension
335     //!
336     //! \return   MOS_STATUS
337     //!           MOS_STATUS_SUCCESS if success, else fail reason
338     MOS_STATUS PackSeqHeader();
339 
340     //!
341     //! \brief    Pack sequence parameters
342     //! \details  Pack sequence parameters
343     //!
344     //! \return   MOS_STATUS
345     //!           MOS_STATUS_SUCCESS if success, else fail reason
346     MOS_STATUS PackSequenceParams();
347 
348     //!
349     //! \brief    Pack picture coding extension
350     //! \details  Pack picture coding extension, MPEG2 Spec 6.2.3.1
351     //!
352     //! \return   MOS_STATUS
353     //!           MOS_STATUS_SUCCESS if success, else fail reason
354     MOS_STATUS PackPicCodingExtension();
355 
356     //!
357     //! \brief    Pack picture user data
358     //! \details  Pack picture user data
359     //!
360     //! \return   MOS_STATUS
361     //!           MOS_STATUS_SUCCESS if success, else fail reason
362     MOS_STATUS PackPicUserData();
363 
364     //!
365     //! \brief    Pack picture header
366     //! \details  Pack picture header, MPEG2 Spec 6.2.3
367     //!
368     //! \return   MOS_STATUS
369     //!           MOS_STATUS_SUCCESS if success, else fail reason
370     MOS_STATUS PackPicHeader();
371 
372     //!
373     //! \brief    Pack group of pictures header
374     //! \details  Pack group of pictures header, MPEG2 Spec 6.2.2.6
375     //!
376     //! \return   MOS_STATUS
377     //!           MOS_STATUS_SUCCESS if success, else fail reason
378     MOS_STATUS PackGroupOfPicHeader();
379 
380     //!
381     //! \brief    Pack picture paramters
382     //! \details  Pack icture paramters
383     //!
384     //! \return   MOS_STATUS
385     //!           MOS_STATUS_SUCCESS if success, else fail reason
386     MOS_STATUS PackPictureParams();
387 
388     //!
389     //! \brief    Pack Picture Header
390     //! \details  Function to Pack Picture Header
391     //!
392     //! \return   MOS_STATUS
393     //!           MOS_STATUS_SUCCESS if success, else fail reason
394     MOS_STATUS PackPictureHeader();
395 
396     //!
397     //! \brief    Pack skip slice data
398     //! \details  Function to pack skip slice data
399     //!
400     //! \return   MOS_STATUS
401     //!           MOS_STATUS_SUCCESS if success, else fail reason
402     MOS_STATUS PackSkipSliceData();
403 
404     //!
405     //! \brief    Pack skipped MB
406     //! \details  Function to pack skipped MB
407     //! \param    [in]  mbIncrement
408     //!           Number MBs for slice
409     //!
410     //! \return   MOS_STATUS
411     //!           MOS_STATUS_SUCCESS if success, else fail reason
412     MOS_STATUS PackSkippedMB(uint32_t mbIncrement);
413 
414     //!
415     //! \brief    Invoke ME kernel
416     //!
417     //! \return   MOS_STATUS
418     //!           MOS_STATUS_SUCCESS if success, else fail reason
419     //!
420     virtual MOS_STATUS EncodeMeKernel();
421 
422     //!
423     //! \brief    Calculate frame rate value
424     //!
425     //! \param    [in] frameRateCode
426     //!           Frame rate code
427     //! \param    [in] factor
428     //!           factor
429     //!
430     //! \return   uint32_t
431     //!           Frame rate value
432     //!
433     uint32_t CalcFrameRateValue(uint16_t frameRateCode, uint32_t factor);
434 
435     //!
436     //! \brief    Setup Curbe for BRC Init/Reset kernel
437     //!
438     //! \return   MOS_STATUS
439     //!           MOS_STATUS_SUCCESS if success, else fail reason
440     //!
441     MOS_STATUS SetCurbeBrcInitReset();
442 
443     //!
444     //! \brief    Send surfaces BRC Init/Reset kernel
445     //!
446     //! \param    [in]  cmdBuffer
447     //!           Pointer to command buffer
448     //!
449     //! \return   MOS_STATUS
450     //!           MOS_STATUS_SUCCESS if success, else fail reason
451     //!
452     MOS_STATUS SendBrcInitResetSurfaces(PMOS_COMMAND_BUFFER cmdBuffer);
453 
454     //!
455     //! \brief    Invoke BRC Init/Reset kernel
456     //!
457     //! \return   MOS_STATUS
458     //!           MOS_STATUS_SUCCESS if success, else fail reason
459     //!
460     MOS_STATUS EncodeBrcInitResetKernel();
461 
462     //!
463     //! \brief    Top level function for invoking MBenc kernel
464     //!
465     //! \param    [in]  mbEncIFrameDistEnabled
466     //!           Indicate if MbEnc I-Frame distortion is enabled
467     //!
468     //! \return   MOS_STATUS
469     //!           MOS_STATUS_SUCCESS if success, else fail reason
470     //!
471     MOS_STATUS EncodeMbEncKernel(bool mbEncIFrameDistEnabled);
472 
473     //!
474     //! \brief    Send surfaces for BRC Update kernel
475     //!
476     //! \param    [in]  cmdBuffer
477     //!           Pointer to command buffer
478     //! \return   MOS_STATUS
479     //!           MOS_STATUS_SUCCESS if success, else fail reason
480     //!
481     MOS_STATUS SendBrcUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer);
482 
483     //!
484     //! \brief    Setup Curbe for BRC Update kernel
485     //!
486     //! \return   MOS_STATUS
487     //!           MOS_STATUS_SUCCESS if success, else fail reason
488     //!
489     MOS_STATUS SetCurbeBrcUpdate();
490 
491     //!
492     //! \brief    Initialize for BRC constant buffer
493     //!
494     //! \return   MOS_STATUS
495     //!           MOS_STATUS_SUCCESS if success, else fail reason
496     //!
497     MOS_STATUS InitBrcConstantBuffer();
498 
499     //!
500     //! \brief    Invoke BRC update kernel
501     //!
502     //! \return   MOS_STATUS
503     //!           MOS_STATUS_SUCCESS if success, else fail reason
504     //!
505     MOS_STATUS EncodeBrcUpdateKernel();
506 
507     //!
508     //! \brief    Send Slice parameters
509     //!
510     //! \param    [in]  cmdBuffer
511     //!           Pointer to command buffer
512     //! \param    [in]  params
513     //!           Pointer to PMHW_VDBOX_MPEG2_SLICE_STATE
514     //!
515     //! \return   MOS_STATUS
516     //!           MOS_STATUS_SUCCESS if success, else fail reason
517     //!
518     MOS_STATUS SendSliceParams(
519         PMOS_COMMAND_BUFFER             cmdBuffer,
520         PMHW_VDBOX_MPEG2_SLICE_STATE    params);
521 
522     //!
523     //! \brief    Send Surfaces for MbEnc kernel
524     //!
525     //! \param    [in]  cmdBuffer
526     //!           Pointer to command buffer
527     //! \param    [in]  mbEncIFrameDistEnabled
528     //!           Indicate if MbEnc I-Frame distortion is enabled
529     //!
530     //! \return   MOS_STATUS
531     //!           MOS_STATUS_SUCCESS if success, else fail reason
532     //!
533     virtual MOS_STATUS SendMbEncSurfaces(
534         PMOS_COMMAND_BUFFER  cmdBuffer,
535         bool mbEncIFrameDistEnabled);
536 
537     //!
538     //! \brief    Initialize kernel state
539     //!
540     //! \return   MOS_STATUS
541     //!           MOS_STATUS_SUCCESS if success, else fail reason
542     //!
543     virtual MOS_STATUS InitKernelState() = 0;
544 
545     //!
546     //! \brief    Get maximum BT count
547     //!
548     //! \return   uint32_t
549     //!           Maximum BT count
550     //!
551     virtual uint32_t GetMaxBtCount();
552 
553     //!
554     //! \brief    Prepare the Curbe for ME kernel
555     //!
556     //! \return   MOS_STATUS
557     //!           MOS_STATUS_SUCCESS if success, else fail reason
558     //!
SetCurbeMe()559     virtual MOS_STATUS SetCurbeMe()
560     {
561         // No operations when m_hmeKernel exists
562         return MOS_STATUS_SUCCESS;
563     }
564 
565     //!
566     //! \brief    Send surfaces to the ME kernel
567     //!
568     //! \param    [in]  cmdBuffer
569     //!           Pointer to command buffer
570     //!
571     //! \return   MOS_STATUS
572     //!           MOS_STATUS_SUCCESS if success, else fail reason
573     //!
SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer)574     virtual MOS_STATUS SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer)
575     {
576         // No operations when m_hmeKernel exists
577         return MOS_STATUS_SUCCESS;
578     }
579 
580     //!
581     //! \brief    Setup Curbe for MbEnc Kernels
582     //!
583     //! \param    [in]  mbEncIFrameDistEnabled
584     //!           Indicate if MbEnc I-Frame distortion is enabled
585     //! \param    [in]  mbQpDataEnabled
586     //!           Indicate if MB QP data is enabled
587     //!
588     //! \return   MOS_STATUS
589     //!           MOS_STATUS_SUCCESS if success, else fail reason
590     //!
591     virtual MOS_STATUS SetCurbeMbEnc(
592         bool mbEncIFrameDistEnabled,
593         bool mbQpDataEnabled) = 0;
594 
595     //!
596     //! \brief    Initialize BRC kernel state
597     //!
598     //! \return   MOS_STATUS
599     //!           MOS_STATUS_SUCCESS if success, else fail reason
600     //!
601     virtual MOS_STATUS InitKernelStateBrc();
602 
603     //!
604     //! \brief    Update the slice count according to the DymanicSliceShutdown policy
605     //!
606     virtual void UpdateSSDSliceCount();
607 
608 #if USE_CODECHAL_DEBUG_TOOL
609     MOS_STATUS DumpSeqParams(
610         CodecEncodeMpeg2SequenceParams *seqParams);
611 
612     MOS_STATUS DumpPicParams(
613         CodecEncodeMpeg2PictureParams *picParams);
614 
615     MOS_STATUS DumpSliceParams(
616         CodecEncodeMpeg2SliceParmas *sliceParams);
617 
618     MOS_STATUS DumpVuiParams(
619         CodecEncodeMpeg2VuiParams *vuiParams);
620 #endif
621     //!
622     //! \enum  MbEncKernelStateIdx
623     //! \brief MbEnc kernel index
624     //!
625     enum MbEncKernelStateIdx
626     {
627         mbEncKernelIdxI = 0,
628         mbEncKernelIdxP,
629         mbEncKernelIdxB,
630         mbEncKernelIdxNum,
631     };
632 
633     //!
634     //! \struct BindingTableMbEnc
635     //! \brief  MbEnc binding table r structure
636     //!
637     struct BindingTableMbEnc
638     {
639         uint32_t m_mbEncPakObj;
640         uint32_t m_mbEncPakObjPrev;
641         uint32_t m_mbEncCurrentY;
642         uint32_t m_mbEncBrcDistortionSurface;
643         uint32_t m_mbEncCurrentPic;
644         uint32_t m_mbEncForwardPic;
645         uint32_t m_mbEncBackwardPic;
646         uint32_t m_mbEncInterlaceFrameCurrentPic;
647         uint32_t m_mbEncInterlaceFrameBackwardPic;
648         uint32_t m_mbEncMbControl;
649         uint32_t m_mbEncScoreboard;
650     };
651 
652     static const uint32_t                  m_numSyncTags                  = 36;                 //!< Number of kernels: per frame & kernel workload
653     static const uint32_t                  m_initDshSize                  = MHW_PAGE_SIZE * 2;  //!< Perfomance tuning might be needed depending on curbe size
654     static const uint32_t                  m_frameRateDenom               = 100;                //!< Frame rate denom
655     static const uint32_t                  m_frameThresholdArraySize      = 64;                 //!< Frame threadold array size
656     static const uint32_t                  m_distQpAdjustmentArraySize    = 96;                 //!< QP adjustemnt array size
657     static const uint32_t                  m_brcConstantSurfaceWidth      = 64;                 //!< BRC constant surface width
658     static const uint32_t                  m_brcPicHeaderSurfaceSize      = 1024;               //!< BRC picture header surface size
659     static const uint32_t                  m_brcHistoryBufferSize         = 576;                //!< BRC history buffer size
660     static const uint32_t                  m_targetUsageNum               = 8;                  //!< Target usage number
661     static const uint32_t                  m_maxVmvr                      = 128 * 4;            //!< Max VMVR
662     static const uint32_t                  m_mvCostTableOffset            = 52;                 //!< MV cost table offset
663 
664     static const uint8_t                   m_qpAdjustmentDistThresholdMaxFrameThresholdI[m_frameThresholdArraySize];//!< QP adjustment threashold array for I frame
665     static const uint8_t                   m_qpAdjustmentDistThresholdMaxFrameThresholdP[m_frameThresholdArraySize];//!< QP adjustment threashold array for P frame
666     static const uint8_t                   m_qpAdjustmentDistThresholdMaxFrameThresholdB[m_frameThresholdArraySize];//!< QP adjustment threashold array for B frame
667     static const uint8_t                   m_distQpAdjustmentI[m_distQpAdjustmentArraySize];                        //!< QP adjustment array for I frame
668     static const uint8_t                   m_distQpAdjustmentP[m_distQpAdjustmentArraySize];                        //!< QP adjustment array for P frame
669     static const uint8_t                   m_distQpAdjustmentB[m_distQpAdjustmentArraySize];                        //!< QP adjustment array for B frame
670     static const uint8_t                   m_targetUsageToKernelMode[m_targetUsageNum];                             //!< Table for target usage to kernel mode convert
671 
672     static const uint32_t                  m_vmeLutXyP[2];                                      //!< vme LUT XY table for P frame
673     static const uint32_t                  m_vmeLutXyB[2];                                      //!< vme LUT XY table for B frame
674     static const uint32_t                  m_vmeSPathP0[16];                                    //!< vme search path table 0 for P frame
675     static const uint32_t                  m_vmeSPathP1[16];                                    //!< vme search path table 1 for P frame
676     static const uint32_t                  m_vmeSPathB0[16];                                    //!< vme search path table 0 for B frame
677     static const uint32_t                  m_vmeSPathB1[16];                                    //!< vme search path table 1 for B frame
678 
679     CodecEncodeMpeg2SequenceParams         *m_seqParams = nullptr;                              //!< Pointer to sequence parameter
680     CodecEncodeMpeg2VuiParams              *m_vuiParams = nullptr;                              //!< Pointer to vui parameter
681     CodecEncodeMpeg2SliceParmas            *m_sliceParams = nullptr;                            //!< Pointer to slice parameter
682     CodecEncodeMpeg2QmatixParams           *m_qMatrixParams = nullptr;                          //!< Pointer to qmatrix parameter
683     CODEC_PIC_ID                           m_picIdx[CODEC_MAX_NUM_REF_FRAME_NON_AVC];           //!< Picture index
684 
685     uint8_t*                               m_kernelBinary = nullptr;                            //!< Pointer to the kernel binary
686     uint32_t                               m_combinedKernelSize = 0;                            //!< Combined kernel binary size
687 
688     bool                                   m_sliceStateEnable = true;                           //!< Indicate if slice state is enabled
689 
690     // BRC
691     bool                                   m_brcInit = true;                                    //!< Indicate if BRC is initilized
692     bool                                   m_mbEncCurbeSetInBrcUpdate = false;                  //!< Indicatd if Mbenc curbe is set
693     bool                                   m_brcEnabled = false;                                //!< Indicate if BRC is enabled
694     bool                                   m_brcReset = false;                                  //!< Indicate if BRC is reset
695 #if (_DEBUG || _RELEASE_INTERNAL)
696     bool                                   m_brcDistortionBufferSupported = false;              //!< Indicate if BRC distorion buffer is supported
697 #endif
698     uint16_t                               m_avbrAccuracy = 0;                                  //!< AVBR Accuracy
699     uint16_t                               m_avbrConvergence = 0;                               //!< AVBR Convergence
700     uint32_t                               m_picHeaderDataBufferSize = 0;                       //!< Picture header buffer size
701     uint32_t                               m_qScaleTypeByteOffse = 0;                           //!< Offset for QScle
702     uint32_t                               m_vbvDelayOffset = 0;                                //!< Offset for Vbv delay
703     uint32_t                               m_intraDcPrecisionOffset = 0;                        //!< Offset for Intra DC precision
704     MHW_KERNEL_STATE                       m_brcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM];      //!< BRC kernel state
705     EncodeBrcBuffers                       m_brcBuffers;                                        //!< BRC buffers
706     double                                 m_brcInitCurrentTargetBufFullInBits = 0;             //!< BRC init buffer full
707     double                                 m_brcInitResetInputBitsPerFrame = 0;                 //!< BRC init reset input bits per frame
708     double                                 m_brcInitResetBufSizeInBits = 0;                     //!< BRC init reset buffer size
709 
710     // MbEnc
711     bool                                   m_mbQpDataEnabled = false;                           //!< Mb Qp data flag
712     MOS_SURFACE                            m_mbQpDataSurface;                                   //!< MOS_SURFACE of Mb Qp data surface
713     uint32_t                               m_frameNumB     = 0;                                 //!< The num of the successive B frames
714     uint32_t                               m_prevMBCodeIdx = 0;                                 //!< Previous MB Code index                                                                                    // MbEnc
715     uint8_t                                m_mbEncForcePictureCodingType = 0;                   //!< force I, P, or B for MbEnc kernel only
716     MHW_KERNEL_STATE                       m_mbEncKernelStates[mbEncKernelIdxNum];              //!< MbEnc kernel state
717     BindingTableMbEnc                      m_mbEncBindingTable;                                 //!< MbEnc binding table
718 
719     // ME
720     CodechalKernelHme                      *m_hmeKernel = nullptr;                              //!< ME kernel object
721     bool                                   m_hmeEnabled = false;                                //!< HME enable flag
722     MOS_SURFACE                            m_4xMEMVDataBuffer;                                  //!< 4xME mv data buffer
723     MHW_BATCH_BUFFER                       m_batchBufForMEDistBuffer[NUM_ENCODE_BB_TYPE];       //!< ME Distortion batch buffer for ME call
724     uint32_t                               m_memvBottomFieldOffset = 0;                         //!< MEMV bottom filed offset
725     MOS_SURFACE                            m_4xMEDistortionBuffer;                              //!< MOS_SURFACE of ME distortion surface
726     uint32_t                               m_meDistortionBottomFieldOffset = 0;                 //!< ME distortion bottom filed offset
727 
728 private:
729     //!
730     //! \brief    Walker function
731     //!
732     void MBWalker(uint16_t, uint16_t, uint16_t*);
733     void MBWalker45Degree(uint16_t, uint16_t, uint16_t*);
734     void MBWalkerMBAFF(uint16_t, uint16_t, uint16_t*);
735     void MBWalkerRasterScan(uint16_t, uint16_t, uint16_t*);
736     void MBWalkerVerticalScan(uint16_t, uint16_t, uint16_t*);
737 };
738 
739 #endif  // __CODECHAL_ENCODE_MPEG2_H__
740