ref: 74d73ac7ec8fb15b2aa15535a6ba771c07ff09f9
parent: 04bfacd7e1b2aee3219a270d052415122a227487
author: huade <huashi@cisco.com>
date: Thu Dec 17 11:22:55 EST 2015
add scripts for multi-encoder comparision
--- /dev/null
+++ b/autotest/codec_comparision/run_MultiCodecComparision.sh
@@ -1,0 +1,429 @@
+#!/bin/bash
+#*******************************************************************
+# brief: multi-encoders comparision for openh264
+# (one given sequence only)
+# comparision almong encoders in \$TestEncoderList
+#
+# more detail, please refer to runUsage() and runBrief()
+#
+# date: 2015-12-16
+#*******************************************************************
+
+runUsage()
+{+ echo -e "\033[32m ********************************************************************* \033[0m"
+ echo " Usage: "
+ echo " --$0 \$TestPicW \$TestPicH \$TestEncoderList"
+ echo ""
+ echo " --example:"
+ echo " $0 1280 720 h264enc_master h264enc_target1 h264enc_target2 "
+ echo ""
+ echo " Pre-test:"
+ echo " --1) copy welsenc.cfg from ./openh264/testbin/"
+ echo " --2) set test YUV path in welsenc.cfg "
+ echo " --3) copy layer0.cfg from ./openh264/testbin/layer2.cfg"
+ echo " --4) copy layer1.cfg from ./openh264/testbin/layer2.cfg"
+ echo " --5) copy layer2.cfg from ./openh264/testbin/layer2.cfg"
+ echo " --6) copy layer3.cfg from ./openh264/testbin/layer2.cfg"
+ echo " layer0.cfg~layer3.cfg are used for multi-layers test cases"
+ echo ""
+ echo " --7) generate at least one encoder, "
+ echo " eg. h264enc_master----master branch as benchmark codec"
+ echo " h264enc_target----your branch CodecChanged as target codec"
+ echo ""
+ echo " --8) copy all tests codec to folder ./Encoder"
+ echo " --9) run below command line:"
+ echo " $0 \$TestPicW \$TestPicH \$TestEncoderList"
+ echo ""
+ echo " Post-test:"
+ echo " --1) temp cases log will be output in ./Trace-AllTestData"
+ echo " --2) all comparision data parsed from log files will be output to "
+ echo " related .csv file under ./Trace-AllTestData "
+ echo ""
+ echo " example:"
+ echo " --comparison almong h264enc_master h264enc_target1 h264enc_target2"
+ echo " for Zhuling_1280x720.yuv"
+ echo ""
+ echo " --run command as below:"
+ echo " $0 1280 720 h264enc_master h264enc_target1 h264enc_target2 "
+ echo ""
+ echo " --get final result files(.csv) under ./Trace-AllTestData"
+ echo ""
+ echo -e "\033[32m ********************************************************************* \033[0m"
+}
+
+runBrief()
+{+ echo -e "\033[32m ********************************************************************* \033[0m"
+ echo " brief:"
+ echo ""
+ echo " encoder veision comparision "
+ echo " --comparision almong encoders in \$TestEncoderList"
+ echo " --please generate at least one encoder and copy to folder ./Encoder"
+ echo " --script will run all test cases for each test encoder"
+ echo " and generate related trace log files for each encoder"
+ echo " --script will parse and extact data based on keyword from trace log file"
+ echo " and output to related .csv files for all encoder"
+ echo " --the test outout file will be put under ./Trace-AllTestData"
+ echo ""
+ echo " test cases:"
+ echo " --add more cases in function runGlogbleInit()"
+ echo " --add new argument with for loop like rc. etc in function "
+ echo " runAllEncodeCasesAndGenerateLog()"
+ echo ""
+ echo " new data:"
+ echo " --currently only memory usage, you can add new data for your comparision"
+ echo " --need to add related data parse in function runParseTraceLog()"
+ echo ""
+ echo -e "\033[32m ********************************************************************* \033[0m"
+}
+
+runPrompt()
+{+ echo -e "\033[32m ********************************************************************* \033[0m"
+ echo ""
+ echo " ------Test completed!--------"
+ echo ""
+ echo -e "\033[32m ********************************************************************* \033[0m"
+ echo " "
+ echo " --Total ${iTotalCaseNum} cases run for encoders: ${aEncoderList[@]}"+ echo ""
+ echo " --Statistic files for comparision are list as below:"
+ echo " ${MemoryUsageStatic}"+ echo ""
+ echo " --trace log files can be found under:"
+ echo " ${LogDir}"+ echo ""
+ echo -e "\033[32m ********************************************************************* \033[0m"
+}
+
+runGlogbleInit()
+{+ CurrenDir=`pwd`
+ LogDir="${CurrenDir}/Trace-AllTestData"+ EncoderDir="${CurrenDir}/Encoder"+
+ if [ ! -d ${LogDir} ]+ then
+ mkdir ${LogDir}+ fi
+
+
+ LogFile="Log_EncTraceInfo.log"
+ MemoryUsageStatic="${LogDir}/MemoryUsage.csv"+ TempEncoderList=""
+ for((i=0; i<${#aEncoderList[@]}; i++))+ do
+ if [ -z "${TempEncoderList}" ]+ then
+ TempEncoderList="${aEncoderList[$i]},"+ else
+ TempEncoderList="${TempEncoderList} ${aEncoderList[$i]},"+ fi
+ done
+
+ let "iTotalCaseNum=0"
+ let "MemoryUsage = 0"
+ echo "LogDir is ${LogDir}"+ echo "MemoryUsageStatic file is ${MemoryUsageStatic}"+ echo "SpatialLayerNum, ThreadNum, SliceMode, SliceNum, SlicMbNum, ${TempEncoderList}" >${MemoryUsageStatic}+
+ echo "LogDir is ${LogDir}"+ echo "MemoryUsageStatic file is ${MemoryUsageStatic}"+
+
+ let "iTraceLevel=4"
+ let "iMaxNalSize=0"
+ #you can add more test case like rc, gop size, et.
+ #and add "for loop" in function runAllEncodeCasesAndGenerateLog()
+ aSpatialLayerNum=(1 2 3 4 )
+ aThreadIdc=(1 4)
+ aSliceMode=(0 1 2 3)
+ aSliceNum=(0 8 16 32)
+ aSliceMbNum=(0 960)
+
+ Encoder=""
+ sEncoderCommand=""
+}
+
+runCheck()
+{+ if [ ! -d ${EncoderDir} ]+ then
+ echo "encoder folder does not exist, please following below command to copy encoder to test folder--./Encoder"
+ echo " mkdir Encoder"
+ echo " cp \${AllVersionEncoders} ./Encoder "+ exit 1
+ fi
+
+ let "bEncoderFlag = 0"
+ echo "aEncoderList is ${aEncoderList[@]} "+ for file in ${aEncoderList[@]}+ do
+ if [ -x ${EncoderDir}/${file} ]+ then
+ let "bEncoderFlag = 1"
+ fi
+ done
+
+ if [ ${bEncoderFlag} -eq 0 ]+ then
+ echo "no encoder under test folder, please following below command to copy encoder to test folder--./Encoder"
+ echo " cp \${AllVersionEncoders} ./Encoder "+ echo " chmod u+x ./Encoder/* "
+ exit 1
+ fi
+}
+
+
+runGenerateSpatialLayerResolution()
+{+ SpatialLayerNum=$1
+ if [ -z "${SpatialLayerNum}" ]+ then
+ let "SpatialLayerNum =1"
+ fi
+
+ let "PicW_L0= PicW / 8"
+ let "PicW_L1= PicW / 4"
+ let "PicW_L2= PicW / 2"
+ let "PicW_L3= PicW"
+
+ let "PicH_L0= PicH / 8"
+ let "PicH_L1= PicH / 4"
+ let "PicH_L2= PicH / 2"
+ let "PicH_L3= PicH"
+
+ if [ ${SpatialLayerNum} -eq 1 ]+ then
+ aPicW=( ${PicW_L3} 0 0 0 )+ aPicH=( ${PicH_L3} 0 0 0 )+
+ elif [ ${SpatialLayerNum} -eq 2 ]+ then
+ aPicW=( ${PicW_L2} ${PicW_L3} 0 0 )+ aPicH=( ${PicH_L2} ${PicH_L3} 0 0 )+
+ elif [ ${SpatialLayerNum} -eq 3 ]+ then
+ aPicW=( ${PicW_L1} ${PicW_L2} ${PicW_L3} 0 )+ aPicH=( ${PicH_L1} ${PicH_L2} ${PicH_L3} 0 )+
+ elif [ ${SpatialLayerNum} -eq 4 ]+ then
+ aPicW=( ${PicW_L0} ${PicW_L1} ${PicW_L2} ${PicW_L3} )+ aPicH=( ${PicH_L0} ${PicH_L1} ${PicH_L2} ${PicH_L3} )+ fi
+
+ echo "*************************************************************************"
+ echo " ${SpatialLayerNum} layers spactial resolution for ${PicW}x${PicH} are:"+ echo ""
+ echo " aPicW is ${aPicW[@]}"+ echo " aPicH is ${aPicH[@]}"+ echo "*************************************************************************"
+
+}
+
+#parse data from encoder trace log
+#you can add more key word to extract data from log file
+runParseTraceLog()
+{+ TempLogFile=$1
+ let "MemoryUsage = 0"
+
+ echo "*****************************************"
+ echo "parsing trace log file"
+ echo "log file name is ${TempLogFile}"+ echo "*****************************************"
+
+ if [ ! -e ${TempLogFile} ]+ then
+ echo "LogFile ${TempLogFile} does not exist, please double check!"+ return 1
+ fi
+
+ MemUsageInLog=""
+ while read line
+ do
+ if [[ "${line}" =~ "overall memory usage" ]]+ then
+ #[OpenH264] this = 0x0x7fa4d2c04c30, Info:WelsInitEncoderExt() exit, overall memory usage: 40907254 bytes
+ MemUsageInLog=(`echo $line | awk 'BEGIN {FS="usage:"} {print $2}' `)+ fi
+
+ # you can add more key word to extract data from log file
+ # e.g.: bit rate, fps, encoder time, psnr etc.
+ # add script block like:
+ # ****************************************************
+ # if [[ "${line}" =~ "KeyWordYouWantToSearch" ]]+ # then
+ # $line in log file which contain data you want
+ # DataYouWant=(`echo $line | awk 'BEGIN {FS="keywordYourSearch"} {print $2}' `)+ # fi
+ # ****************************************************
+
+ done < ${TempLogFile}+
+ let "MemoryUsage = ${MemUsageInLog}"+ echo "MemoryUsage is ${MemoryUsage}"+}
+
+runEncodeOneCase()
+{+ #encoding process
+ echo "------------------------------------------------------"
+ echo "${Encoder} welsenc.cfg ${sEncoderCommand}" >${LogFile}+ ${Encoder} welsenc.cfg ${sEncoderCommand} 2>>${LogFile}+ ${Encoder} welsenc.cfg ${sEncoderCommand} >>${LogFile}+ echo "------------------------------------------------------"
+}
+
+runAllEncodeCasesAndGenerateLog()
+{+
+ echo "aSpatialLayerNum is ${aSpatialLayerNum[@]}"+ echo "aThreadIdc is ${aThreadIdc[@]}"+ echo "aSliceMode is ${aSliceMode[@]}"+ echo "aSliceNum is ${aSliceNum[@]}"+ echo "aSliceMbNum is ${aSliceMbNum[@]}"+
+ sEncoderCommand1="-lconfig 0 layer0.cfg -lconfig 1 layer1.cfg -lconfig 2 layer2.cfg -lconfig 3 layer3.cfg"
+ TempMemoryUsage=""
+ TempTestCase=""
+ let "CaseNum=1"
+ for iSLayerNum in ${aSpatialLayerNum[@]}+ do
+ for iThreadNum in ${aThreadIdc[@]}+ do
+ for iSliceMode in ${aSliceMode[@]}+ do
+ for iSliceNum in ${aSliceNum[@]}+ do
+ #raster slice mb mode, slice-mb-num =0, switch to row-mb-mode
+ if [ ${iSliceMode} -eq 2 ]+ then
+ aSliceMbNum=(0 960)
+ else
+ aSliceMbNum=(960)
+ fi
+
+ for iSlicMbNum in ${aSliceMbNum[@]}+ do
+ TempMemoryUsage=""
+ #for cases output to statistic file
+ TempTestCase="${iSLayerNum}, ${iThreadNum}, ${iSliceMode}, ${iSliceNum}, ${iSlicMbNum}"+
+ for eEncoder in ${aEncoderList[@]}+ do
+ Encoder=${EncoderDir}/${eEncoder}+ if [ -x ${Encoder} ]+ then
+
+ if [ ${iSliceMode} -eq 3 ]+ then
+ iMaxNalSize=1000
+ else
+ iMaxNalSize=0
+ fi
+
+ runGenerateSpatialLayerResolution ${iSLayerNum}+
+ sEncoderCommand2="-slcmd 0 ${iSliceMode} -slcmd 1 ${iSliceMode} -slcmd 2 ${iSliceMode} -slcmd 3 ${iSliceMode}"+ sEncoderCommand3="-slcnum 0 ${iSliceNum} -slcnum 1 ${iSliceNum} -slcnum 2 ${iSliceNum} -slcnum 3 ${iSliceNum}"+ sEncoderCommand4="-slcmbnum 0 ${iSlicMbNum} -slcmbnum 1 ${iSlicMbNum} -slcmbnum 2 ${iSlicMbNum} -slcmbnum 3 ${iSlicMbNum} "+
+ sEncoderCommand5="-trace ${iTraceLevel} -numl ${iSLayerNum} -thread ${iThreadNum} -nalsize ${iMaxNalSize}"+
+ sEncoderCommand6="-dw 0 ${aPicW[0]} -dw 1 ${aPicW[1]} -dw 2 ${aPicW[2]} -dw 3 ${aPicW[3]}"+ sEncoderCommand7="-dh 0 ${aPicH[0]} -dh 1 ${aPicH[1]} -dh 2 ${aPicH[2]} -dh 3 ${aPicH[3]}"+
+ sEncoderCommand="${sEncoderCommand1} ${sEncoderCommand2} ${sEncoderCommand3} ${sEncoderCommand4} ${sEncoderCommand5} ${sEncoderCommand6} ${sEncoderCommand7}"+
+ LogFile="${LogDir}/${CaseNum}_LogInfo_iSLNum_${iSLayerNum}_ThrNum_${iThreadNum}_SlcM_${iSliceMode}_SlcN_${iSliceNum}_${eEncoder}.log"+
+ echo "Encode command is: "
+ echo "${Encoder} welsenc.cfg ${sEncoderCommand}"+ echo ""
+ echo "log file is ${LogFile}"+
+ #encode one case
+ runEncodeOneCase
+
+ #parse trace log
+ runParseTraceLog ${LogFile}+
+ #data extracted from log
+ #you can add new data here like rc, fps , etc.
+ echo "memory usage is ${MemoryUsage}"+ if [ -z ${TempMemoryUsage} ]+ then
+ TempMemoryUsage="${MemoryUsage},"+ else
+ TempMemoryUsage="${TempMemoryUsage} ${MemoryUsage},"+ fi
+ echo "TempMemoryUsage is ${TempMemoryUsage}"+ fi
+ done
+
+ #output memory usage for all encoders
+ echo "${TempTestCase}, ${TempMemoryUsage}" >>${MemoryUsageStatic}+ let " CaseNum ++"
+ let "iTotalCaseNum ++"
+
+ done
+
+ done
+
+ done
+
+ done
+
+ done
+
+}
+
+
+runMain()
+{+ runGlogbleInit
+ runCheck
+ runAllEncodeCasesAndGenerateLog
+ runPrompt
+}
+
+#*************************************************************
+if [ $# -lt 3 ]
+then
+ runUsage
+ runBrief
+ exit 1
+fi
+
+declare -a aEncoderList
+declare -a aParamList
+
+aParamList=( $@ )
+ParamNum=$#
+
+PicW=${aParamList[0]}+PicH=${aParamList[1]}+
+for((i=2;i<$#;i++))
+do
+ echo "encoder is ${aParamList[$i]}"+ aEncoderList="${aEncoderList} ${aParamList[$i]}"+done
+aEncoderList=(${aEncoderList})+
+
+echo -e "\033[32m ********************************* \033[0m"
+echo ""
+echo " --num parameters is ${ParamNum} "+echo " --input parameters are:"
+echo " $0 $@"
+echo ""
+echo -e "\033[32m ********************************* \033[0m"
+
+runMain
+#*************************************************************
+
--
⑨