DSP

H.264 视频编码实验

2019-07-13 18:08发布

 之前装好了mcsdk_video,在Codecs文件夹下有很多音视频编解码的demo,这篇博文主要介绍其中的高性能H.264 视频编码实验,H.264是现今普遍使用的编码方式,这个demo位于CodecsC66x_h264hpvenc_01_00_03_00_ELF 文件夹。 第一步:连接好卡板,no boot 模式,打开CCS,导入已存在项目,找到这个文件夹,导入这个项目。

第二步:编译这个项目,成功的话会显示如下图:成功生成out文件。
失败的话多半是组件位置路径不对,请右击项目选择properties,检查下图中各项中组件名称和位置是否正确:
第三步:将编译好的out文件加载到0核或者多核中(具体视参数配置文件而定),在加载前请注意进行如下图的系统初始化和全局初始化。
第四步:点击运行,控制台输出如下(只进行了两帧编码) [C66xx_0] 
---------------------------------------------------------
Test Case Number : 1
---------------------------------------------------------
Config File   : ......TestTestVecsConfigencoder.cfg
Input YUV     : ......TestTestVecsInputairshow_p352x288.yuv
Output Stream : ......TestTestVecsOutputairshow_p352x288.264

ShmemTab initialized on Core 0 

Algorithm Instance  Creation for the Module DEV.H264HP.E.C6678.01.00.03.00 Done...

Started Reading Frame : 0.......
 
#NA   : IVIDEO_NA_FRAME       : Bits  : 0         

Started Reading Frame : 0.......
 
#NA   : IVIDEO_NA_FRAME       : Bits  : 0         

Started Reading Frame : 0.......
 
#0    : IVIDEO_IDR_FRAME      : Bits  : 107144    

 core 0 ,nalSizes 24
 core 0 ,nalSizes 8
 core 0 ,nalSizes 13361

Started Reading Frame : 1.......
 
#1    : IVIDEO_P_FRAME        : Bits  : 9216      

 core 0 ,nalSizes 1152
 
#2    : IVIDEO_B_FRAME        : Bits  : 2048      

 core 0 ,nalSizes 256
 
#3    : IVIDEO_B_FRAME        : Bits  : 1960      

 core 0 ,nalSizes 245

 Given number of frames are encoded

 ******** Request to END H264 Encoder ******** 

总结:程序开始运行后,首先去CodecsC66x_h264hpvenc_01_00_03_00_ELFpackages isdocodecsh264hpvencAppClientTestTestVecsConfig 下读取了两个配置文件 testcases.txt 和 encoder.cfg 。testcases.txt 只是用来指出 encoder.cfg 的位置和名称,而 encoder.cfg 则给出了所有的编码参数和输入输出文件,以及需要用到的核数。encoder.cfg的内容如下(重要的参数用绿 {MOD}标出): *************************************************************************************************************************************************************************************** #  New Input File Format is as follows
#   = # Comment
#


#############################################################################################
# Files      
#############################################################################################
InputFile       = ......TestTestVecsInputairshow_p352x288.yuv
EncodedFile     = ......TestTestVecsOutputairshow_p352x288.264

#Default reference file in package is generated with 8 core configuration
ReferenceFile   = ......TestTestVecsReferenceairshow_p352x288_ref.264


##########################################################################################
# Multicore Parameters
##########################################################################################
 
ncores                  = 1
CoreTeamMap             = 0

#CoreTeamMap             = 0,1,2,3,4,5,6,7
# ##########################################################################################
#  Encoder Control
# ##########################################################################################
EncodingPreset         = 3 # encoding preset 0: DEFAULT, 1: HIGH_QUALITY, 2: HIGH_SPEED, 3:USER_DEFINED
RateControlPreset     = 5 # 5: IVIDEO_USER_DEFINED, 4: IVIDEO_NONE, 2: IVIDEO_STORAGE, 1: IVIDEO_LOW_DELAY
framesToEncode        = 4 # Total number of frames to encode 
MaxWidth              = 640 # Max Frame width
MaxHeight             = 480 # Max Frame height

MaxInterFrameInterval = 3 # I to P frame distance. 1 indicates no B frames. Value >1 indicates presence of B frames. 
InputChromaFormat     = 1 # 1 => XDM_YUV_420P, Only 1 is supported.
InputContentType       = 0 # Input buffer content type, 0 -> Progressive Type, 1-> Interlaced.
Profile               = 100 # Encoding profile 100 => HP, 77 => MP, 66 => BP.  
Level                 = 40 # Level IDC   (e.g. 20 = level 2.0) 
inputWidth              = 352 # width of image 
inputHeight             = 288 # Height of image 

targetFrameRate         = 30000 # Target frame rate in fps * 1000
targetBitRate           = 1000000 # Target Bit Rate in Bits per second. 

intraFrameInterval     = 15  # Interval between two consecutive intra frames, 0 => Only first frame to be intra coded, 1 => All intra frames, N => One intra frame and N-1 inter frames, where N > 1
interFrameInterval     = 3 # M: Number of (M-1) B frames between two reference frames. 1 indicates no B frame. 
mvAccuracy            = 2 # Pixel accuracy of the motion vector, 0 => integer pel 2=> quarter pel
generateHeader         = 0 # 1: Encode only header, 0: Encode entire access unit, including the headers 
forceFrame             = -1 # -1: IVIDEO_NA_FRAME, 3: IVIDEO_IDR_FRAME
dataLayout             = 0 # input data buffer layout 0=> interleaved, 1=> seprated. Only 0 is supported and applicable only for interlace content.
sampleAspectRatioHeight = 1 # Aspect Ratio Height
sampleAspectRatioWidth  = 1 # Aspect Ratio Width


# ##########################################################################################
#  Rate Control Params
# ##########################################################################################
rateControlParamsPreset = 1 # Preset value for selecting rate control params, 0: default (other parameters in this category will be decided by Codec internally), 1: user defined
rcAlgo                  = 0 # Rate control algorithm used, 0: Variable Bitrate, 1 : Constant bitrate (low dealy), 2: Constrained CBR (No Frame Skips), 3:Constrained CBR (No Frame Skips with no scene change detection)
qpI                     = 25 # Initial QP for I/IDR frames, -1 indicates codec chosen 
qpP                     = 25 # Initial QP for P frames
qpOffsetB               = 4 # Offset of B frames QP from P frames 
qpMaxI                  = 51 # Maximum QP for I/IDR frames 
qpMinI                  = 1 # Minimum QP for I/IDR frames 
qpMaxP                  = 51 # Maximum QP for P frames 
qpMinP                  = 1 # Minimum QP for P frames 
qpMaxB                  = 51 # Maximum QP for B frames 
qpMinB                  = 1 # Minimum QP for B frames 
CbQPIndexOffset         = 0 # Specifies offset to be added to luma QP for addressing QPC values table for Cb components
CrQPIndexOffset         = 0 # Specifies offset to be added to luma QP for addressing QPC values table for Cr components
initialBufferLevel      = 2000000 # Initial Buffer level for HRD compliance, keep same as HRDBufferSize for best quality
HRDBufferSize           = 2000000 # Hypothetical Reference Decoder Buffer Size in bits - 2*bitrate for VBR

enablePRC               = 1 #  Control Flag to enable MB level Perceptual Rate Control, 0 => Disable, 1 => Enable
frameSkipAfterSceneChange = 1 # 0=> no forced skip after scenechange, 1 => force skip frame after coding scene change frame.
scalingMatrixPreset      = 0 # Scaling Matrix selection of encoder, 0: no scaling matrices, 1: normal, 2: noisy, 3 : standard default, 4 : user defined
suppressHighFreqCoeffs  = 0 #0=> No High Freq Suppression #1=>Adaptively enabled only for noise streams when Qp reaches it max & suppression for more than half of the coeffs 2 => Enabled for all streams when Qp reaches it max & suppression for half of the coeffs 3 => Enabled for all streams when Qp reaches it max & suppression for more than half of the coeffs
##########################################################################################
#  InterCoding Control
##########################################################################################


interCodingPreset    = 1 # Inter coding mode preset, 0 => deafult values, 1 => user defined 
MvRangeVerP          = 32  # Vertical Motion Vector Range for P frames in integer pixels, Range supported is 16 to 496 
MvRangeHorP          = 144 # Horizontal Motion Vector Range for P frames in integer pixels, Range supported is 16 to 496
MvRangeVerB          = 32  # Vertical Motion Vector Range for B frames in integer pixels, Range supported is 16 to 496 
MvRangeHorB          = 144 # Horizontal Motion Vector Range for B frames in integer pixels, Range supported is 16 to 496
maxMVperMB           = 4 # Maximum MV per MB (Values of 1 & 4 are valid)


# ##########################################################################################
#  IntraCoding Control
# ##########################################################################################
intraCodingPreset             = 1 # Intra coding mode preset, 0 => deafult values, 1 => user defined  
enableIntraPartition          = 4 # 0 => INTRA_PARTITION_NONE , 1 => INTRA_PARTITION_ISLICES, 2 => INTRA_PARTITION_IPSLICES, 3 => INTRA_PARTITION_IBSLICES, 4 => INTRA_PARTITION_IPBSLICES.
intraRefreshMethod            = 0 # IH264_INTRAREFRESH_NONE  = 0, IH264_INTRAREFRESH_CYCLIC_MBS = 1
intraRefreshRate              = 0 # Rate at which intra MB Refresh is done. e.g. 10 indicates every 10th MB will coded as Intra in inter pictures.
constrainedIntraPredEnable    = 0 # Controls the intra macroblock coding in inter slices


# ##########################################################################################
# Entropy Coding Mode
# ##########################################################################################
entropyCodingMode               = 1 # Enropy coding type, (0 => CAVLC, 1 => CABAC)


# ##########################################################################################
#  Slice Mode Configuration
# ##########################################################################################
sliceCodingPreset            = 0 # Preset value for slice coding mode, 0 => deafult values, 1 => user defined
streamFormat                 = 0 # Type of bitstream to be encoded, 0 => Byte stream format, 1=> NALU format(without start code)
sliceMode                    = 0 # Type of slice coding, 0 => slice coding mode is frame based, 1 => Slices are controlled based upon number of Macroblocks
sliceUnitSize                = 1200 # Number of macroblocks per slice


# ##########################################################################################
#  Loop Filter Control
# ##########################################################################################


loopfilterPreset           = 1 # Preset value for loop filter operation parameters, 0 => default values, 1 => user defined
loopfilterDisableIDC               = 2 # Disable H.264 loop filter, (0=Filter, 1= NoFilter, 2 = No loop filter across slices)
filterOffsetA                      = 0 # Alpha offset for loop filter
filterOffsetB                      = 0 # Beta offset for loop filter
# ##########################################################################################
#  VUI Control Params
# ##########################################################################################


vuiCodingPreset                = 1 # Preset value for VUI Control Params, 0 => deafult values, 1 => user defined
aspectRatioInfoPresentFlag     = 1 # Controls the insertion of aspect ratio information in VUI part of bit-stream 
aspectRatioIdc                 = 1 # Aspect ratio ID 
videoSignalTypePresentFlag     = 0 # controls the insertion of video signal type in VUI part of bit-stream
videoFormat                    = 2 # Video signal type
videoFullRangeFlag             = 0 # Flag to specigy Range of the pixels 
colourDescriptionPresentFlag   = 1 # Specifies whether colour_primaries, transfer_characteristics and matrix_coefficients are present or not.
colourPrimaries         = 5 # chromaticity coordinates of the source primaries(Table E-3 in standard)
transferCharacteristics = 5 # opto-electronic transfer characteristic of the source picture(Table E-4 in standard)
matrixCoefficients       = 5 # matrix coefficients used in deriving Y,Cb,Cr signals from the G,B,R primaries(Table E-5 in standard)
timingInfoPresentFlag          = 1 # Controls the insertion of timing info related parameters in VUI part of bit-stream
##########################################################################################
#  MISC
##########################################################################################


gopStructure               = 0 # GOP structure, 0 => Open or Non uniform(IBBPBBP), 1 => Closed or Uniform (BBIBBPBB) 
log2MaxFNumMinus4          = 0 # sliceParams::frame_num syntax element will be reset after every (1<< (log2MaxFNumMinus4 + 4)) frames
picOrderCountType          = 0  # Picture order count type
IDRFrameInterval           = 0 # Interval b/w two IDR frames  0=>IDR BBP I BBP I,  1=>IDR BBP IDR BBP IDR,  2=>IDR BBP I BBP IDR, 3=>IDR BBP I BBP I BBP IDR
transformBlockSize         = 1  # Tranform type, 0:4x4 only, 1: 8x8 only
topFieldFirstFlag          = 1  # Flag to indicate field order in interlaced content
interlaceCodingType        = 4 # Interlced field coding type selection, 2 => MRF 3=> ARF 4=> SPF
DebugTraceLevel            = 0 # Debug trace Enable 0 - Disable, 1- Level1, 2 - Level2, 3 - Level3,
lastNFramesToLog           = 5 # Last N frames to log into debug trace buffer
****************************************************************************************************************************************************************************************  程序读取到相应参数后,会去读取输入yuv文件(位于 ......TestTestVecsInput,不会一次读完,应该是分帧),然后编码,并将结果返回到PC,输出的码流文件位于 ......TestTestVecsOutput,所有交互都是通过仿真器的串口完成,所以速度很慢,建议大家实验时编码4帧就够了。