/* * Copyright (c) 2017, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ //! //! \file codechal_encode_mpeg2.h //! \brief Defines base class for MPEG2 dual-pipe encoder. //! #ifndef __CODECHAL_ENCODE_MPEG2_H__ #define __CODECHAL_ENCODE_MPEG2_H__ #include "codechal_encoder_base.h" class CodechalKernelHme; //! //! \class CodechalEncodeMpeg2 //! \brief MPEG2 dual-pipe encoder base class //! \details This class defines the base class for MPEG2 dual-pipe encoder, it includes //! common member fields, functions, interfaces etc shared by all GENs. //! Gen specific definitions, features should be put into their corresponding classes. //! To create a MPEG2 dual-pipe encoder instance, client needs to new the instance in media interfaces //! class CodechalEncodeMpeg2 : public CodechalEncoderState { public: //! //! \brief Copy construtor //! CodechalEncodeMpeg2(const CodechalEncodeMpeg2&) = delete; //! //! \brief Copy assignment construtor //! CodechalEncodeMpeg2& operator=(const CodechalEncodeMpeg2&) = delete; //! //! \brief Destructor //! virtual ~CodechalEncodeMpeg2(); //! //! \brief Allocate resources for encoder instance //! \details It is invoked when initializing encoder instance and it would call #AllocateEncResources(), #AllocateBrcResources() //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS AllocateResources() override; //! //! \brief Free encoder resources //! \details It is invoked when destorying encoder instance and it would call #FreeEncResources(), #FreeBrcResources() //! and FreePakResources() //! //! \return void //! void FreeResources() override; //! //! \brief Initialize encoder at picture level //! //! \param [in] params //! Picture encoding parameters //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS InitializePicture(const EncoderParams& params) override; //! //! \brief Encode kernel functions //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS ExecuteKernelFunctions() override; //! //! \brief Encode command at picture level //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS ExecutePictureLevel() override; //! //! \brief Encode command at slice level //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS ExecuteSliceLevel() override; //! //! \brief Copy skip frame //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS EncodeCopySkipFrame() override; //! //! \brief Initialize encoder instance //! \details When GEN specific derived class implements this function to do its own initialization, // it is required that the derived class calls #CodechalEncodeMpeg2::Initialize() first // which would do common initialization for all GENs //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS Initialize(CodechalSetting * codecHalSettings) override; //! //! \brief Inserts the generic prologue command for a command buffer //! \param [in] cmdBuffer //! Command buffer //! \param [in] frameTracking //! Indicate if frame tracking requested //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS SendPrologWithFrameTracking( PMOS_COMMAND_BUFFER cmdBuffer, bool frameTracking, MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override; //! //! \brief Initialize MMC state //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success //! virtual MOS_STATUS InitMmcState(); CodecEncodeMpeg2PictureParams *m_picParams = nullptr; //!< Pointer to picture parameter PCODEC_REF_LIST m_refList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_MPEG2]; //!< Pointer to reference list // Codec to define its own GetStatusReport MOS_STATUS GetStatusReport( EncodeStatus *encodeStatus, EncodeStatusReport *encodeStatusReport) override { return MOS_STATUS_SUCCESS; } MOS_STATUS AddMediaVfeCmd( PMOS_COMMAND_BUFFER cmdBuffer, SendKernelCmdsParams *params) override; protected: //! //! \brief Constructor //! CodechalEncodeMpeg2( CodechalHwInterface* hwInterface, CodechalDebugInterface* debugInterface, PCODECHAL_STANDARD_INFO standardInfo); //! //! \brief Help function to allocate a 1D buffer //! //! \param [in,out] buffer //! Pointer to allocated buffer //! \param [in] bufSize //! Buffer size //! \param [in] name //! Buffer name //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS AllocateBuffer( PMOS_RESOURCE buffer, uint32_t bufSize, PCCHAR name); //! //! \brief Help function to allocate a generic 2D surface //! //! \param [in,out] surface //! Pointer to allocated surface //! \param [in] surfWidth //! Surface width //! \param [in] surfHeight //! Surface height //! \param [in] name //! Surface name //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS AllocateBuffer2D( PMOS_SURFACE surface, uint32_t surfWidth, uint32_t surfHeight, PCCHAR name); //! //! \brief Help function to allocate a 1D buffer //! //! \param [in,out] batchBuffer //! Pointer to allocated batch buffer //! \param [in] bufSize //! Buffer size //! \param [in] name //! Batch buffer name //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS AllocateBatchBuffer( PMHW_BATCH_BUFFER batchBuffer, uint32_t bufSize, PCCHAR name); //! //! \brief Allocate resources for ENC //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS AllocateEncResources(); //! //! \brief Allocate BRC resources //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS AllocateBrcResources(); //! //! \brief Free BRC resources //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS FreeBrcResources(); //! //! \brief Free ENC resources //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS FreeEncResources(); //! //! \brief Check profile and level //! \details Check if the required profile and level are supported by driver //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS CheckProfileAndLevel(); //! //! \brief Setup/configure encoder based on sequence parameter set //! \details It is invoked when the encoder receives a new sequence parameter set and it would //! set up and configure the encoder state that used for the sequence //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SetSequenceStructs(); //! //! \brief Setup/configure encoder based on picture parameter set //! \details It is invoked for every picture and it would set up and configure the // encoder state that used for current picture //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SetPictureStructs(); //! //! \brief Setup/configure Slice Group //! \details It is invoked for every picture and it would set up and configure the // encoder state that used for current picture //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SetSliceGroups(); //! //! \brief Get current byte offset //! \details Get current byte offset for the bit stream buffer //! \param bsBuffer //! [in] Bit stream buffer //! \return uint32_t //! Byte offset //! uint32_t GetCurByteOffset(BSBuffer* bsBuffer); //! //! \brief Pack display sequence extension //! \details Pack display sequence extension, MPEG2 Spec 6.2.2.4 //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackDisplaySeqExtension(); //! //! \brief Pack sequence extension //! \details Pack sequence extension, MPEG2 Spec 6.2.2.3 //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackSeqExtension(); //! //! \brief Pack sequence header //! \details Pack sequence extension //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackSeqHeader(); //! //! \brief Pack sequence parameters //! \details Pack sequence parameters //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackSequenceParams(); //! //! \brief Pack picture coding extension //! \details Pack picture coding extension, MPEG2 Spec 6.2.3.1 //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackPicCodingExtension(); //! //! \brief Pack picture user data //! \details Pack picture user data //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackPicUserData(); //! //! \brief Pack picture header //! \details Pack picture header, MPEG2 Spec 6.2.3 //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackPicHeader(); //! //! \brief Pack group of pictures header //! \details Pack group of pictures header, MPEG2 Spec 6.2.2.6 //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackGroupOfPicHeader(); //! //! \brief Pack picture paramters //! \details Pack icture paramters //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackPictureParams(); //! //! \brief Pack Picture Header //! \details Function to Pack Picture Header //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackPictureHeader(); //! //! \brief Pack skip slice data //! \details Function to pack skip slice data //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackSkipSliceData(); //! //! \brief Pack skipped MB //! \details Function to pack skipped MB //! \param [in] mbIncrement //! Number MBs for slice //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason MOS_STATUS PackSkippedMB(uint32_t mbIncrement); //! //! \brief Invoke ME kernel //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS EncodeMeKernel(); //! //! \brief Calculate frame rate value //! //! \param [in] frameRateCode //! Frame rate code //! \param [in] factor //! factor //! //! \return uint32_t //! Frame rate value //! uint32_t CalcFrameRateValue(uint16_t frameRateCode, uint32_t factor); //! //! \brief Setup Curbe for BRC Init/Reset kernel //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SetCurbeBrcInitReset(); //! //! \brief Send surfaces BRC Init/Reset kernel //! //! \param [in] cmdBuffer //! Pointer to command buffer //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SendBrcInitResetSurfaces(PMOS_COMMAND_BUFFER cmdBuffer); //! //! \brief Invoke BRC Init/Reset kernel //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS EncodeBrcInitResetKernel(); //! //! \brief Top level function for invoking MBenc kernel //! //! \param [in] mbEncIFrameDistEnabled //! Indicate if MbEnc I-Frame distortion is enabled //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS EncodeMbEncKernel(bool mbEncIFrameDistEnabled); //! //! \brief Send surfaces for BRC Update kernel //! //! \param [in] cmdBuffer //! Pointer to command buffer //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SendBrcUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer); //! //! \brief Setup Curbe for BRC Update kernel //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SetCurbeBrcUpdate(); //! //! \brief Initialize for BRC constant buffer //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS InitBrcConstantBuffer(); //! //! \brief Invoke BRC update kernel //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS EncodeBrcUpdateKernel(); //! //! \brief Send Slice parameters //! //! \param [in] cmdBuffer //! Pointer to command buffer //! \param [in] params //! Pointer to PMHW_VDBOX_MPEG2_SLICE_STATE //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! MOS_STATUS SendSliceParams( PMOS_COMMAND_BUFFER cmdBuffer, PMHW_VDBOX_MPEG2_SLICE_STATE params); //! //! \brief Send Surfaces for MbEnc kernel //! //! \param [in] cmdBuffer //! Pointer to command buffer //! \param [in] mbEncIFrameDistEnabled //! Indicate if MbEnc I-Frame distortion is enabled //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS SendMbEncSurfaces( PMOS_COMMAND_BUFFER cmdBuffer, bool mbEncIFrameDistEnabled); //! //! \brief Initialize kernel state //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS InitKernelState() = 0; //! //! \brief Get maximum BT count //! //! \return uint32_t //! Maximum BT count //! virtual uint32_t GetMaxBtCount(); //! //! \brief Prepare the Curbe for ME kernel //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS SetCurbeMe() { // No operations when m_hmeKernel exists return MOS_STATUS_SUCCESS; } //! //! \brief Send surfaces to the ME kernel //! //! \param [in] cmdBuffer //! Pointer to command buffer //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer) { // No operations when m_hmeKernel exists return MOS_STATUS_SUCCESS; } //! //! \brief Setup Curbe for MbEnc Kernels //! //! \param [in] mbEncIFrameDistEnabled //! Indicate if MbEnc I-Frame distortion is enabled //! \param [in] mbQpDataEnabled //! Indicate if MB QP data is enabled //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS SetCurbeMbEnc( bool mbEncIFrameDistEnabled, bool mbQpDataEnabled) = 0; //! //! \brief Initialize BRC kernel state //! //! \return MOS_STATUS //! MOS_STATUS_SUCCESS if success, else fail reason //! virtual MOS_STATUS InitKernelStateBrc(); //! //! \brief Update the slice count according to the DymanicSliceShutdown policy //! virtual void UpdateSSDSliceCount(); #if USE_CODECHAL_DEBUG_TOOL MOS_STATUS DumpSeqParams( CodecEncodeMpeg2SequenceParams *seqParams); MOS_STATUS DumpPicParams( CodecEncodeMpeg2PictureParams *picParams); MOS_STATUS DumpSliceParams( CodecEncodeMpeg2SliceParmas *sliceParams); MOS_STATUS DumpVuiParams( CodecEncodeMpeg2VuiParams *vuiParams); #endif //! //! \enum MbEncKernelStateIdx //! \brief MbEnc kernel index //! enum MbEncKernelStateIdx { mbEncKernelIdxI = 0, mbEncKernelIdxP, mbEncKernelIdxB, mbEncKernelIdxNum, }; //! //! \struct BindingTableMbEnc //! \brief MbEnc binding table r structure //! struct BindingTableMbEnc { uint32_t m_mbEncPakObj; uint32_t m_mbEncPakObjPrev; uint32_t m_mbEncCurrentY; uint32_t m_mbEncBrcDistortionSurface; uint32_t m_mbEncCurrentPic; uint32_t m_mbEncForwardPic; uint32_t m_mbEncBackwardPic; uint32_t m_mbEncInterlaceFrameCurrentPic; uint32_t m_mbEncInterlaceFrameBackwardPic; uint32_t m_mbEncMbControl; uint32_t m_mbEncScoreboard; }; static const uint32_t m_numSyncTags = 36; //!< Number of kernels: per frame & kernel workload static const uint32_t m_initDshSize = MHW_PAGE_SIZE * 2; //!< Perfomance tuning might be needed depending on curbe size static const uint32_t m_frameRateDenom = 100; //!< Frame rate denom static const uint32_t m_frameThresholdArraySize = 64; //!< Frame threadold array size static const uint32_t m_distQpAdjustmentArraySize = 96; //!< QP adjustemnt array size static const uint32_t m_brcConstantSurfaceWidth = 64; //!< BRC constant surface width static const uint32_t m_brcPicHeaderSurfaceSize = 1024; //!< BRC picture header surface size static const uint32_t m_brcHistoryBufferSize = 576; //!< BRC history buffer size static const uint32_t m_targetUsageNum = 8; //!< Target usage number static const uint32_t m_maxVmvr = 128 * 4; //!< Max VMVR static const uint32_t m_mvCostTableOffset = 52; //!< MV cost table offset static const uint8_t m_qpAdjustmentDistThresholdMaxFrameThresholdI[m_frameThresholdArraySize];//!< QP adjustment threashold array for I frame static const uint8_t m_qpAdjustmentDistThresholdMaxFrameThresholdP[m_frameThresholdArraySize];//!< QP adjustment threashold array for P frame static const uint8_t m_qpAdjustmentDistThresholdMaxFrameThresholdB[m_frameThresholdArraySize];//!< QP adjustment threashold array for B frame static const uint8_t m_distQpAdjustmentI[m_distQpAdjustmentArraySize]; //!< QP adjustment array for I frame static const uint8_t m_distQpAdjustmentP[m_distQpAdjustmentArraySize]; //!< QP adjustment array for P frame static const uint8_t m_distQpAdjustmentB[m_distQpAdjustmentArraySize]; //!< QP adjustment array for B frame static const uint8_t m_targetUsageToKernelMode[m_targetUsageNum]; //!< Table for target usage to kernel mode convert static const uint32_t m_vmeLutXyP[2]; //!< vme LUT XY table for P frame static const uint32_t m_vmeLutXyB[2]; //!< vme LUT XY table for B frame static const uint32_t m_vmeSPathP0[16]; //!< vme search path table 0 for P frame static const uint32_t m_vmeSPathP1[16]; //!< vme search path table 1 for P frame static const uint32_t m_vmeSPathB0[16]; //!< vme search path table 0 for B frame static const uint32_t m_vmeSPathB1[16]; //!< vme search path table 1 for B frame CodecEncodeMpeg2SequenceParams *m_seqParams = nullptr; //!< Pointer to sequence parameter CodecEncodeMpeg2VuiParams *m_vuiParams = nullptr; //!< Pointer to vui parameter CodecEncodeMpeg2SliceParmas *m_sliceParams = nullptr; //!< Pointer to slice parameter CodecEncodeMpeg2QmatixParams *m_qMatrixParams = nullptr; //!< Pointer to qmatrix parameter CODEC_PIC_ID m_picIdx[CODEC_MAX_NUM_REF_FRAME_NON_AVC]; //!< Picture index uint8_t* m_kernelBinary = nullptr; //!< Pointer to the kernel binary uint32_t m_combinedKernelSize = 0; //!< Combined kernel binary size bool m_sliceStateEnable = true; //!< Indicate if slice state is enabled // BRC bool m_brcInit = true; //!< Indicate if BRC is initilized bool m_mbEncCurbeSetInBrcUpdate = false; //!< Indicatd if Mbenc curbe is set bool m_brcEnabled = false; //!< Indicate if BRC is enabled bool m_brcReset = false; //!< Indicate if BRC is reset #if (_DEBUG || _RELEASE_INTERNAL) bool m_brcDistortionBufferSupported = false; //!< Indicate if BRC distorion buffer is supported #endif uint16_t m_avbrAccuracy = 0; //!< AVBR Accuracy uint16_t m_avbrConvergence = 0; //!< AVBR Convergence uint32_t m_picHeaderDataBufferSize = 0; //!< Picture header buffer size uint32_t m_qScaleTypeByteOffse = 0; //!< Offset for QScle uint32_t m_vbvDelayOffset = 0; //!< Offset for Vbv delay uint32_t m_intraDcPrecisionOffset = 0; //!< Offset for Intra DC precision MHW_KERNEL_STATE m_brcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM]; //!< BRC kernel state EncodeBrcBuffers m_brcBuffers; //!< BRC buffers double m_brcInitCurrentTargetBufFullInBits = 0; //!< BRC init buffer full double m_brcInitResetInputBitsPerFrame = 0; //!< BRC init reset input bits per frame double m_brcInitResetBufSizeInBits = 0; //!< BRC init reset buffer size // MbEnc bool m_mbQpDataEnabled = false; //!< Mb Qp data flag MOS_SURFACE m_mbQpDataSurface; //!< MOS_SURFACE of Mb Qp data surface uint32_t m_frameNumB = 0; //!< The num of the successive B frames uint32_t m_prevMBCodeIdx = 0; //!< Previous MB Code index // MbEnc uint8_t m_mbEncForcePictureCodingType = 0; //!< force I, P, or B for MbEnc kernel only MHW_KERNEL_STATE m_mbEncKernelStates[mbEncKernelIdxNum]; //!< MbEnc kernel state BindingTableMbEnc m_mbEncBindingTable; //!< MbEnc binding table // ME CodechalKernelHme *m_hmeKernel = nullptr; //!< ME kernel object bool m_hmeEnabled = false; //!< HME enable flag MOS_SURFACE m_4xMEMVDataBuffer; //!< 4xME mv data buffer MHW_BATCH_BUFFER m_batchBufForMEDistBuffer[NUM_ENCODE_BB_TYPE]; //!< ME Distortion batch buffer for ME call uint32_t m_memvBottomFieldOffset = 0; //!< MEMV bottom filed offset MOS_SURFACE m_4xMEDistortionBuffer; //!< MOS_SURFACE of ME distortion surface uint32_t m_meDistortionBottomFieldOffset = 0; //!< ME distortion bottom filed offset private: //! //! \brief Walker function //! void MBWalker(uint16_t, uint16_t, uint16_t*); void MBWalker45Degree(uint16_t, uint16_t, uint16_t*); void MBWalkerMBAFF(uint16_t, uint16_t, uint16_t*); void MBWalkerRasterScan(uint16_t, uint16_t, uint16_t*); void MBWalkerVerticalScan(uint16_t, uint16_t, uint16_t*); }; #endif // __CODECHAL_ENCODE_MPEG2_H__