之前裝好了mcsdk_video,在Codecs檔案夾下有很多音視訊編解碼的demo,這篇博文主要介紹其中的高性能H.264 視訊編碼實驗,H.264是現今普遍使用的編碼方式,這個demo位于Codecs\C66x_h264hpvenc_01_00_03_00_ELF 檔案夾。
第一步:連接配接好卡闆,no boot 模式,打開CCS,導入已存在項目,找到這個檔案夾,導入這個項目。

第二步:編譯這個項目,成功的話會顯示如下圖:成功生成out檔案。
失敗的話多半是元件位置路徑不對,請右擊項目選擇properties,檢查下圖中各項中元件名稱和位置是否正确:
第三步:将編譯好的out檔案加載到0核或者多核中(具體視參數配置檔案而定),在加載前請注意進行如下圖的系統初始化和全局初始化。
第四步:點選運作,控制台輸出如下(隻進行了兩幀編碼)
[C66xx_0]
---------------------------------------------------------
Test Case Number : 1
---------------------------------------------------------
Config File : ..\..\..\Test\TestVecs\Config\encoder.cfg
Input YUV : ..\..\..\Test\TestVecs\Input\airshow_p352x288.yuv
Output Stream : ..\..\..\Test\TestVecs\Output\airshow_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 ********
總結:程式開始運作後,首先去Codecs\C66x_h264hpvenc_01_00_03_00_ELF\packages\ti\sdo\codecs\h264hpvenc\App\Client\Test\TestVecs\Config 下讀取了兩個配置檔案 testcases.txt 和 encoder.cfg 。testcases.txt 隻是用來指出 encoder.cfg 的位置和名稱,而 encoder.cfg 則給出了所有的編碼參數和輸入輸出檔案,以及需要用到的核數。encoder.cfg的内容如下(重要的參數用綠色标出):
***************************************************************************************************************************************************************************************
# New Input File Format is as follows
# <ParameterName> = <ParameterValue> # Comment
#
#############################################################################################
# Files
#############################################################################################
InputFile = ..\..\..\Test\TestVecs\Input\airshow_p352x288.yuv
EncodedFile = ..\..\..\Test\TestVecs\Output\airshow_p352x288.264
#Default reference file in package is generated with 8 core configuration
ReferenceFile = ..\..\..\Test\TestVecs\Reference\airshow_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檔案(位于 ..\..\..\Test\TestVecs\Input,不會一次讀完,應該是分幀),然後編碼,并将結果傳回到PC,輸出的碼流檔案位于 ..\..\..\Test\TestVecs\Output,所有互動都是通過仿真器的序列槽完成,是以速度很慢,建議大家實驗時編碼4幀就夠了。