1#!/bin/bash 2#*************************************************************************************************************** 3# Encoder binary comparison test model 4# -- Compared with Benchmark version using SHA-1 string 5# -- Test bit stream under folder openh264/res 6# -- SHA-1 string of Benchmark version for all cases of all bit streams 7# under folder openh264/test/encoder_binary_comparion/SHA1Table 8# -- For more detail,please refer to file AboutTest?¡ê 9#brief: 10# -- Test all cases in SHA1TableFile 11# 1) Generate SHA1 string for each case 12# 2) Compare with benchmark SHA1 string 13# 3) If the SHA1 string are the same with benchmark version, test case is marked as passed 14# 4) Otherwise, test case is marked as unpass! this may caused by: 15# --the design of encoder has been changed and the bit stream also change 16# --there may be some bugs in encoder and bit stream is not right 17# -- Usage: ./run_BinarySHA1Comparison.sh ${TestYUVName} ${AllCaseSHA1TaleFile} 18# 19# date: 10/06/2014 Created 20#*************************************************************************************************************** 21#global variable definition 22#usage runGlobalVariableDef 23runGlobalVariableDef() 24{ 25 #test data space 26 FinalResultPath="" 27 IssueDataPath="" 28 TempDataPath="" 29 #for test sequence info 30 PicW="" 31 PicH="" 32 #xxx.csv 33 AllCasePassStatusFile="" 34 #for encoder command 35 declare -a aEncoderCommandSet 36 declare -a aEncoderCommandName 37 declare -a aEncoderCommandValue 38 #encoder parameters change based on the case info 39 let "EncoderFlag = 0" 40 CaseInfo="" 41 BitStreamFile="" 42 DiffFlag="" 43 #pass number 44 TotalCaseNum="" 45 PassCaseNum="" 46 UnpassCaseNum="" 47} 48#called by runGlobalVariableInitial 49#usage runEncoderCommandInital 50runEncoderCommandInital() 51{ 52 aEncoderCommandSet=( -utype -frms -numl -numtl \ 53 -sw -sh "-dw 0" "-dh 0" "-dw 1" "-dh 1" "-dw 2" "-dh 2" "-dw 3" "-dh 3" \ 54 "-frout 0" "-frout 1" "-frout 2" "-frout 3" \ 55 "-lqp 0" "-lqp 1" "-lqp 2" "-lqp 3" \ 56 -rc -fs -tarb "-ltarb 0" "-ltarb 1" "-ltarb 2" "-ltarb 3" \ 57 "-lmaxb 0" "-lmaxb 1" "-lmaxb 2" "-lmaxb 3" \ 58 "-slcmd 0" "-slcnum 0" "-slcmd 1" "-slcnum 1"\ 59 "-slcmd 2" "-slcnum 2" "-slcmd 3" "-slcnum 3"\ 60 -nalsize \ 61 -iper -thread "-loadbalancing" -ltr \ 62 -db -denois -scene -bgd -aq ) 63 64 aEncoderCommandName=(usagetype frms numl numtl \ 65 sw sh dw0 dh0 dw1 dh1 dw2 dh2 dw3 dh3 \ 66 frout0 frout1 frout2 frout3 \ 67 lqp0 lqp1 lqp2 lqp3 \ 68 rc FrSkip tarb ltarb0 ltarb1 ltarb2 ltarb3 \ 69 lmaxb0 lmaxb1 lmaxb2 lmaxb3 \ 70 slcmd0 slcnum0 slcmd1 slcnum1 \ 71 slcmd2 slcnum2 slcmd3 slcnum3 \ 72 MaxNalSZ \ 73 iper thread loadbalancing ltr \ 74 db denois scene bgd aq ) 75 76 NumParameter=${#aEncoderCommandSet[@]} 77 for ((i=0;i<NumParameter; i++)) 78 do 79 aEncoderCommandValue[$i]=0 80 done 81 82} 83runGlobalVariableInitial() 84{ 85 #TestSpaceDir=../AllTestData CurrentDir=../AllTestData/TestSetXXX/***.264 eg ../AllTestData/TestSetCIF/BA1_MWD.264 86 CurrentDir=`pwd` 87 #test data space 88 FinalResultPath="${CurrentDir}/result" 89 IssueDataPath="${CurrentDir}/issue" 90 TempDataPath="TempData" 91 TestSequencePath="${CurrentDir}" 92 93 #test info output file 94 AllCasePassStatusFile="${FinalResultPath}/${TestYUVName}_AllCaseOutput.csv" 95 UnpassCaseFile="${FinalResultPath}/${TestYUVName}_unpassCaseOutput.csv" 96 UpdateSHA1TableFile="${FinalResultPath}/${TestYUVName}_UpdateSHA1Table.csv" 97 98 HeadLine1="EncoderFlag, DecoderFlag, FPS, BitSreamSHA1, InputYUVSHA1, \ 99 -utype, -frms, -numl, -numtl, -sw, -sh,\ 100 -dw 0, -dh 0, -dw 1, -dh 1, -dw 2, -dh 2, -dw 3, -dh 3,\ 101 -frout 0, -frout 1, -frout 2, -frout 3,\ 102 -lqp 0, -lqp 1, -lqp 2, -lqp 3,\ 103 -rc,-fs, -tarb, -ltarb 0, -ltarb 1, -ltarb 2, -ltarb 3,\ 104 -lmaxb 0, -lmaxb 1, -lmaxb 2, -lmaxb 3,\ 105 -slcmd 0, -slcnum 0, -slcmd 1, -slcnum 1,\ 106 -slcmd 2, -slcnum 2, -slcmd 3, -slcnum 3,\ 107 -nalsize,\ 108 -iper, -thread, -loadbalancing, -ltr, -db, -denois,\ 109 -scene, -bgd , -aq, " 110 111 HeadLine2="BitSreamSHA1, InputYUVSHA1,\ 112 -utype, -frms, -numl, -numtl, -sw, -sh,\ 113 -dw 0, -dh 0, -dw 1, -dh 1,-dw 2, -dh 2, -dw 3, -dh 3,\ 114 -frout 0, -frout 1, -frout 2, -frout 3,\ 115 -lqp 0, -lqp 1, -lqp 2, -lqp 3,\ 116 -rc, -fs, -tarb, -ltarb 0, -ltarb 1, -ltarb 2, -ltarb 3,\ 117 -lmaxb 0, -lmaxb 1, -lmaxb 2, -lmaxb 3,\ 118 -slcmd 0, -slcnum 0, -slcmd 1, -slcnum 1,\ 119 -slcmd 2, -slcnum 2, -slcmd 3, -slcnum 3,\ 120 -nalsize,\ 121 -iper, -thread, -loadbalancing, -ltr, -db, -denois,\ 122 -scene , bgd , -aq " 123 124 echo ${HeadLine1}>${AllCasePassStatusFile} 125 echo ${HeadLine1}>${UnpassCaseFile} 126 echo ${HeadLine2}>${UpdateSHA1TableFile} 127 128 #intial Commandline parameters 129 runEncoderCommandInital 130 let "TotalCaseNum=0" 131 let "PassCaseNum=0" 132 let "UnpassCaseNum=0" 133 EncoderCommand="" 134 EncoderLogFile="${TempDataPath}/Encoder.log" 135 TargetSHA1="" 136 TargetYUVSHA1="" 137 BenchmarkSHA1="" 138 BenchmarkYUVSHA1="" 139 140 RecParam="" 141 for((i=0;i<4;i++)) 142 do 143 RecParam="${RecParam} -drec ${i} ${TempDataPath}/${TestYUVName}_rec${i}.yuv" 144 done 145} 146#*********************************************************** 147#called by runAllCaseTest 148# parse case info --encoder preprocess 149#usage runParseCaseInfo $CaseData 150runParseCaseInfo() 151{ 152 if [ $# -lt 1 ] 153 then 154 echo "no parameter!" 155 return 1 156 fi 157 158 local CaseData=$@ 159 BenchmarkSHA1=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $1} ' ` 160 BenchmarkYUVSHA1=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $2} ' ` 161 aEncoderCommandValue=(`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {for(i=3;i<=NF;i++) printf(" %s",$i)} ' `) 162 BitstreamTarget=${TempDataPath}/${TestYUVName}_codec_target.264 163} 164 165runEncodeOneCase() 166{ 167 EncoderCommand="" 168 BitStreamFile=${BitstreamTarget} 169 170 for ((i=0; i<${NumParameter}; i++)) 171 do 172 EncoderCommand="${EncoderCommand} ${aEncoderCommandSet[$i]} ${aEncoderCommandValue[$i]} " 173 done 174 175 EncoderCommand="./h264enc welsenc.cfg -lconfig 0 layer0.cfg -lconfig 1 layer1.cfg -lconfig 2 layer2.cfg -lconfig 3 layer3.cfg \ 176 -bf ${BitStreamFile} -org ${TestSequencePath}/${TestYUVName} ${RecParam} ${EncoderCommand}" 177 echo -e "\n---------------Encode One Case-------------------------------------------" 178 echo -e "case encode command is : \n ${EncoderCommand} " 179 180 echo -e "\n\n" 181 ${EncoderCommand} 2>${EncoderLogFile} 182 if [ $? -eq 0 ] 183 then 184 let "EncoderFlag=0" 185 else 186 let "EncoderFlag=1" 187 fi 188 189 #delete the core down file as core down files for disk space limitation 190 for file in ./core* 191 do 192 if [ -e ${file} ] 193 then 194 ./run_SafeDelete.sh ${file} 195 fi 196 done 197 return 0 198} 199 200#called by runAllCaseTest 201#usage runJSVMVerify 202runBitStreamVerify() 203{ 204 echo -e "\n******************************************" 205 echo -e "Bit stream SHA1 value comparison.... " 206 #******************************************* 207 TargetSHA1="NULL" 208 TargetYUVSHA1="NULL" 209 210 if [ ${EncoderFlag} -eq 1 ] 211 then 212 let "UnpassCaseNum++" 213 echo "1:unpassed! encoder initial failed or crash!" 214 DiffFlag="1:unpassed! encoder initial failed or crash!" 215 return 1 216 fi 217 218 if [ ! -s ${BitStreamFile} ] 219 then 220 let "UnpassCaseNum++" 221 echo "2:unpassed! 0 bits--bit stream" 222 DiffFlag="2:unpassed! 0 bits--bit stream" 223 return 1 224 fi 225 226 #******************************************* 227 #SHA1 228 TargetSHA1=`openssl sha1 ${BitStreamFile} | awk '{print $2}'` 229 TargetYUVSHA1=`openssl sha1 ${TestSequencePath}/${TestYUVName} | awk '{print $2}'` 230 if [[ "${TargetSHA1}" =~ "${BenchmarkSHA1}" ]] 231 then 232 echo "bitstream pass! SHA1--${TargetSHA1} ----- ${BenchmarkSHA1} YUV--SHA1--info: ${TargetYUVSHA1} ---- ${BenchmarkYUVSHA1}" 233 DiffFlag="0:passed!" 234 let "PassCaseNum++" 235 return 0 236 else 237 echo "!!! SHA1 string not match: ${TargetSHA1} ----- ${BenchmarkSHA1} YUV--SHA1--info: ${TargetYUVSHA1} ---- ${BenchmarkYUVSHA1}" 238 DiffFlag="3:unpassed!" 239 let "UnpassCaseNum++" 240 return 1 241 fi 242} 243 244#called by runAllCaseTest 245#delete temp data files and output single case test result to log file 246#usage runSingleCasePostAction $CaseData 247runSingleCasePostAction() 248{ 249 if [ $# -lt 1 ] 250 then 251 echo "no parameter!" 252 return 1 253 fi 254 local CaseData=$@ 255 #formating for update, keep the same with origin SHA1 table 256 CaseInfo=`echo $CaseData | awk 'BEGIN {FS="[,\r]"} {for(i=3;i<=NF-1;i++) printf("%s,",$i)} '` 257 LastEncCommandOption=`echo $CaseData | awk 'BEGIN {FS="[,\r]"} {print $NF} '` 258 CaseInfo="${CaseInfo}${LastEncCommandOption}" 259 260 PassStatusInfo="${DiffFlag}, ${TargetSHA1}, ${BenchmarkSHA1}, ${TargetYUVSHA1}, ${BenchmarkYUVSHA1}, ${CaseInfo}, ${EncoderCommand} " 261 echo "${PassStatusInfo}">>${AllCasePassStatusFile} 262 if [ "$DiffFlag" != "0:passed!" ] 263 then 264 echo "${PassStatusInfo}">>${UnpassCaseFile} 265 fi 266 267 echo "${TargetSHA1}, ${TargetYUVSHA1},${CaseInfo}">>${UpdateSHA1TableFile} 268 #./run_SafeDelete.sh ${BitstreamTarget} >>${AllCaseConsoleLogFile} 269} 270 271#usage runOutputPassNum 272runOutputPassNum() 273{ 274 # output file locate in ../result 275 echo "" 276 echo "***********************************************************" 277 echo "${TestYUVName}" 278 echo "total case Num is: ${TotalCaseNum}" 279 echo "pass case Num is: ${PassCaseNum}" 280 echo "unpass case Num is: ${UnpassCaseNum}" 281 echo "***********************************************************" 282 echo "" 283} 284 285# run all test case based on XXXcase.csv file 286#usage runAllCaseTest 287runAllCaseTest() 288{ 289 local EncoderLogInfo="" 290 while read CaseData 291 do 292 #get case parameter's value 293 if [[ ! $CaseData =~ "SHA" ]] 294 then 295 echo "" >>${AllCaseConsoleLogFile} 296 echo "" >>${AllCaseConsoleLogFile} 297 echo "" >>${AllCaseConsoleLogFile} 298 echo "********************case index is ${TotalCaseNum}**************************************" >>${AllCaseConsoleLogFile} 299 runParseCaseInfo ${CaseData} >>${AllCaseConsoleLogFile} 300 echo "" >>${AllCaseConsoleLogFile} 301 runEncodeOneCase >>${AllCaseConsoleLogFile} 302 cat ${EncoderLogFile} >>${AllCaseConsoleLogFile} 303 runBitStreamVerify >>${AllCaseConsoleLogFile} 304 let "DisplayFlag=TotalCaseNum%100" 305 if [ ${DisplayFlag} -eq 0 ] 306 then 307 if [ "$DiffFlag" = "0:passed!" ] 308 then 309 echo -e "\033[32m OK! ${TestYUVName} Case Index ${TotalCaseNum}:SHA-1(Current--Benchmark): ${TargetSHA1}-----${BenchmarkSHA1} \033[0m" 310 echo -e "\033[32m ----YUVSHA1: ${TargetYUVSHA1}, ${BenchmarkYUVSHA1} \033[0m" 311 fi 312 fi 313 #****************************************** 314 if [ ! "$DiffFlag" = "0:passed!" ] 315 then 316 echo -e "\033[31m Failed! ${TestYUVName} Case Index ${TotalCaseNum}:SHA-1(Current--Benchmark): ${TargetSHA1}-----${BenchmarkSHA1} \033[0m" 317 echo -e "\033[31m ----YUVSHA1: ${TargetYUVSHA1}, ${BenchmarkYUVSHA1} \033[0m" 318 EncoderLogInfo=`cat ${EncoderLogFile}` 319 echo -e "\033[31m ${EncoderLogInfo} \033[0m" 320 fi 321 runSingleCasePostAction ${CaseData} 322 let "TotalCaseNum++" 323 fi 324 done <$AllCaseFile 325} 326#*********************************************************** 327# usage: runMain $TestYUV $AllCaseFile 328runMain() 329{ 330 runGlobalVariableDef 331 runGlobalVariableInitial 332 TestFolder=`echo $CurrentDir | awk 'BEGIN {FS="/"} { i=NF; print $i}'` 333 AllCaseConsoleLogFile="${FinalResultPath}/${TestYUVName}.TestLog" 334 CaseSummaryFile="${FinalResultPath}/${TestYUVName}.Summary" 335 FlagFile="" 336 337 #run all cases 338 runAllCaseTest 339 340 # output file locate in ./result 341 echo "${TestYUVName}, \ 342 ${PassCaseNum} pass!, \ 343 ${UnpassCaseNum} unpass!,\ 344 detail file located in ../AllTestData/${TestFolder}/result">${CaseSummaryFile} 345 runOutputPassNum 346 347 #generate All case Flag 348 if [ ! ${UnpassCaseNum} -eq 0 ] 349 then 350 echo "" 351 exit 1 352 else 353 echo "" 354 exit 0 355 fi 356} 357#************************************************************************ 358# main entry 359#************************************************************************ 360if [ ! $# -eq 2 ] 361then 362 echo "usage: run_BinarySHA1Comparison.sh \$TestYUV \$AllCaseFile" 363 return 1 364fi 365TestYUVName=$1 366AllCaseFile=$2 367runMain 368 369