| @@ -0,0 +1,408 @@ |
| 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 | +# |
| 10 | +#brief: |
| 11 | +# -- Test all cases in SHA1TableFile |
| 12 | +# 1) Generate SHA1 string for each case |
| 13 | +# 2) Compare with benchmark SHA1 string |
| 14 | +# 3) If the SHA1 string are the same with benchmark version, test case is marked as passed |
| 15 | +# 4) Otherwise, test case is marked as unpass! this may caused by: |
| 16 | +# --the design of encoder has been changed and the bit stream also change |
| 17 | +# --there may be some bugs in encoder and bit stream is not right |
| 18 | +# -- Usage: ./run_BinarySHA1Comparison.sh ${TestYUVName} ${AllCaseSHA1TaleFile} |
| 19 | +# |
| 20 | +# date: 10/06/2014 Created |
| 21 | +#******************************************************************************* |
| 22 | +#global variable definition |
| 23 | +#usage runGlobalVariableDef |
| 24 | +runGlobalVariableDef() |
| 25 | +{ |
| 26 | + WorkingDirDir="" |
| 27 | + #test data space |
| 28 | + FinalResultPath="" |
| 29 | + IssueDataPath="" |
| 30 | + TempDataPath="" |
| 31 | + #for test sequence info |
| 32 | + TestSequenceName="" |
| 33 | + PicW="" |
| 34 | + PicH="" |
| 35 | + #test cfg file and test info output file |
| 36 | + ConfigureFile="" |
| 37 | + AllCaseFile="" |
| 38 | + #xxx.csv |
| 39 | + AllCasePassStatusFile="" |
| 40 | + #for encoder command |
| 41 | + declare -a EncoderCommandSet |
| 42 | + declare -a EncoderCommandName |
| 43 | + declare -a EncoderCommandValue |
| 44 | + #encoder parameters change based on the case info |
| 45 | + CaseInfo="" |
| 46 | + BitStreamFile="" |
| 47 | + DiffFlag="" |
| 48 | + #pass number |
| 49 | + TotalCaseNum="" |
| 50 | + PassCaseNum="" |
| 51 | + UnpassCaseNum="" |
| 52 | +} |
| 53 | +#called by runGlobalVariableInitial |
| 54 | +#usage runEncoderCommandInital |
| 55 | +runEncoderCommandInital() |
| 56 | +{ |
| 57 | + EncoderCommandSet=(-frms \ |
| 58 | + -numtl \ |
| 59 | + -scrsig \ |
| 60 | + -rc \ |
| 61 | + -tarb \ |
| 62 | + "-lqp 0" \ |
| 63 | + -iper \ |
| 64 | + "-slcmd 0" \ |
| 65 | + "-slcnum 0" \ |
| 66 | + -thread \ |
| 67 | + -ltr \ |
| 68 | + -db \ |
| 69 | + -nalsize \ |
| 70 | + -denois \ |
| 71 | + -scene \ |
| 72 | + -bgd \ |
| 73 | + -aq) |
| 74 | + EncoderCommandName=(FrEcoded \ |
| 75 | + NumTempLayer \ |
| 76 | + ContentSig \ |
| 77 | + RC \ |
| 78 | + BitRate \ |
| 79 | + QP \ |
| 80 | + IntraPeriod \ |
| 81 | + SlcMd \ |
| 82 | + SlcMum \ |
| 83 | + ThrMum \ |
| 84 | + LTR \ |
| 85 | + LFilterIDC \ |
| 86 | + MacNalSize \ |
| 87 | + DenoiseFlag \ |
| 88 | + SceneChangeFlag \ |
| 89 | + BackgroundFlag \ |
| 90 | + AQFlag) |
| 91 | + EncoderCommandValue=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) |
| 92 | + NumParameter=${#EncoderCommandSet[@]} |
| 93 | +} |
| 94 | +runGlobalVariableInitial() |
| 95 | +{ |
| 96 | + #TestSpaceDir=../AllTestData CurrentDir=../AllTestData/TestSetXXX/***.264 eg ../AllTestData/TestSetCIF/BA1_MWD.264 |
| 97 | + CurrentDir=`pwd` |
| 98 | + #test data space |
| 99 | + FinalResultPath="${CurrentDir}/result" |
| 100 | + IssueDataPath="${CurrentDir}/issue" |
| 101 | + TempDataPath="TempData" |
| 102 | + TestSequencePath="${CurrentDir}" |
| 103 | + #get YUV detail info $picW $picH $FPS |
| 104 | + declare -a aYUVInfo |
| 105 | + aYUVInfo=(`./run_ParseYUVInfo.sh ${TestSequenceName}`) |
| 106 | + PicW=${aYUVInfo[0]} |
| 107 | + PicH=${aYUVInfo[1]} |
| 108 | + #test cfg file and test info output file |
| 109 | + ConfigureFile=welsenc.cfg |
| 110 | + AllCasePassStatusFile="${FinalResultPath}/${TestSequenceName}_AllCaseOutput.csv" |
| 111 | + UnpassCaseFile="${FinalResultPath}/${TestSequenceName}_unpassCaseOutput.csv" |
| 112 | + UpdateSHA1TableFile="${FinalResultPath}/${TestSequenceName}_UpdateSHA1Table.csv" |
| 113 | + echo "BitMatched Status, \ |
| 114 | + SHA-1-Target, SHA-1-Benchmark, \ |
| 115 | + MD5-Target, MD5-Benchmark, \ |
| 116 | + Bitstream-Target,Bitstream-Benchmark, \ |
| 117 | + YUV-Target,YUV-Benchmark, \ |
| 118 | + -frms, -numtl, -scrsig, -rc, \ |
| 119 | + -tarb, -lqp 0, -iper, \ |
| 120 | + -slcmd 0,-slcnum 0, -thread, \ |
| 121 | + -ltr, -db, -nalsize,-denois, \ |
| 122 | + -scene, -bgd, -aq">${AllCasePassStatusFile} |
| 123 | + |
| 124 | + echo "BitMatched Status, \ |
| 125 | + SHA-1-Target, SHA-1-Benchmark, \ |
| 126 | + MD5-Target, MD5-Benchmark, \ |
| 127 | + Bitstream-Target,Bitstream-Benchmark,\ |
| 128 | + YUV-Target,YUV-Benchmark, \ |
| 129 | + -frms, -numtl, -scrsig, -rc, \ |
| 130 | + -tarb, -lqp 0, -iper, \ |
| 131 | + -slcmd 0,-slcnum 0, -thread, \ |
| 132 | + -ltr, -db, -nalsize,-denois, \ |
| 133 | + -scene, -bgd, -aq">${UnpassCaseFile} |
| 134 | + |
| 135 | + echo "SHA-1 Value, \ |
| 136 | + MD5String, BitStreamSize, YUVSize, \ |
| 137 | + -frms, -numtl, -scrsig, -rc, \ |
| 138 | + -tarb, -lqp 0, -iper, \ |
| 139 | + -slcmd 0,-slcnum 0, -thread, \ |
| 140 | + -ltr, -db, -MaxNalSize,-denois, \ |
| 141 | + -scene, -bgd, -aq">${UpdateSHA1TableFile} |
| 142 | + #intial Commandline parameters |
| 143 | + runEncoderCommandInital |
| 144 | + let "TotalCaseNum=0" |
| 145 | + let "PassCaseNum=0" |
| 146 | + let "UnpassCaseNum=0" |
| 147 | + EncoderCommand="" |
| 148 | + EncoderLogFile="${TempDataPath}/Encoder.log" |
| 149 | + TargetSHA1="" |
| 150 | + TargetMD5="" |
| 151 | + TargetYUVSize="" |
| 152 | + TargetBitstreamSize="" |
| 153 | + BenchmarkSHA1="" |
| 154 | + BenchmarkMD5="" |
| 155 | + BenchmarkYUVSize="" |
| 156 | + BenchmarkBitstreamSize="" |
| 157 | +} |
| 158 | +#*********************************************************** |
| 159 | +#called by runAllCaseTest |
| 160 | +# parse case info --encoder preprocess |
| 161 | +#usage runParseCaseInfo $CaseData |
| 162 | +runParseCaseInfo() |
| 163 | +{ |
| 164 | + if [ $# -lt 1 ] |
| 165 | + then |
| 166 | + echo "runParseCaseInfo \$CaseData" |
| 167 | + return 1 |
| 168 | + fi |
| 169 | + local TempData="" |
| 170 | + local BitstreamPrefix="" |
| 171 | + local CaseData=$@ |
| 172 | + BenchmarkSHA1=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $1} ' ` |
| 173 | + BenchmarkMD5=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $2} ' ` |
| 174 | + BenchmarkYUVSize=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $4} ' ` |
| 175 | + BenchmarkBitstreamSize=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $3} ' ` |
| 176 | + TempData=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {for(i=5;i<=NF;i++) printf(" %s",$i)} ' ` |
| 177 | + EncoderCommandValue=(${TempData}) |
| 178 | + for((i=0; i<$NumParameter; i++)) |
| 179 | + do |
| 180 | + BitstreamPrefix=${BitstreamPrefix}_${EncoderCommandName[$i]}_${EncoderCommandValue[$i]} |
| 181 | + done |
| 182 | + BitstreamTarget=${TempDataPath}/${TestSequenceName}_${BitstreamPrefix}_codec_target.264 |
| 183 | + echo "" |
| 184 | + echo "BitstreamPrefix is ${BitstreamPrefix}" |
| 185 | + echo "" |
| 186 | +} |
| 187 | +#called by runAllCaseTest |
| 188 | +#usage runEncodeOneCase |
| 189 | +runEncodeOneCase() |
| 190 | +{ |
| 191 | + BitStreamFile=${BitstreamTarget} |
| 192 | + CaseCommand=" ${ConfigureFile} \ |
| 193 | + -numl 1 \ |
| 194 | + -lconfig 0 layer2.cfg \ |
| 195 | + -sw ${PicW} -sh ${PicH} \ |
| 196 | + -dw 0 ${PicW} -dh 0 ${PicH} \ |
| 197 | + -frout 0 30 \ |
| 198 | + -ltarb 0 ${EncoderCommandValue[4]} \ |
| 199 | + ${EncoderCommandSet[0]} ${EncoderCommandValue[0]} \ |
| 200 | + ${EncoderCommandSet[1]} ${EncoderCommandValue[1]} \ |
| 201 | + ${EncoderCommandSet[2]} ${EncoderCommandValue[2]} \ |
| 202 | + ${EncoderCommandSet[3]} ${EncoderCommandValue[3]} \ |
| 203 | + ${EncoderCommandSet[4]} ${EncoderCommandValue[4]} \ |
| 204 | + ${EncoderCommandSet[5]} ${EncoderCommandValue[5]} \ |
| 205 | + ${EncoderCommandSet[6]} ${EncoderCommandValue[6]} \ |
| 206 | + ${EncoderCommandSet[7]} ${EncoderCommandValue[7]} \ |
| 207 | + ${EncoderCommandSet[8]} ${EncoderCommandValue[8]} \ |
| 208 | + ${EncoderCommandSet[9]} ${EncoderCommandValue[9]} \ |
| 209 | + ${EncoderCommandSet[10]} ${EncoderCommandValue[10]} \ |
| 210 | + ${EncoderCommandSet[11]} ${EncoderCommandValue[11]} \ |
| 211 | + ${EncoderCommandSet[12]} ${EncoderCommandValue[12]} \ |
| 212 | + ${EncoderCommandSet[13]} ${EncoderCommandValue[13]} \ |
| 213 | + ${EncoderCommandSet[14]} ${EncoderCommandValue[14]} \ |
| 214 | + ${EncoderCommandSet[15]} ${EncoderCommandValue[15]} \ |
| 215 | + ${EncoderCommandSet[16]} ${EncoderCommandValue[16]}" |
| 216 | + echo ${EncoderCommandSet[@]} |
| 217 | + echo ${EncoderCommandValue[@]} |
| 218 | + echo ${EncoderCommandSet[11]} |
| 219 | + echo ${EncoderCommandValue[11]} |
| 220 | + echo ${EncoderCommandSet[12]} |
| 221 | + echo ${EncoderCommandValue[12]} |
| 222 | + EncoderCommand="./h264enc ${CaseCommand} -bf ${BitStreamFile} -org ${TestSequencePath}/${TestSequenceName} " |
| 223 | + echo "" |
| 224 | + echo "case line is :" |
| 225 | + echo " ${EncoderCommand}" |
| 226 | + echo -e "\n\n" |
| 227 | + ./h264enc ${CaseCommand} \ |
| 228 | + -bf ${BitStreamFile} \ |
| 229 | + -org ${TestSequencePath}/${TestSequenceName} 2>${EncoderLogFile} |
| 230 | +} |
| 231 | +#usage? runGetFileSize $FileName |
| 232 | +runGetFileSize() |
| 233 | +{ |
| 234 | + if [ $# -lt 1 ] |
| 235 | + then |
| 236 | + echo "usage runGetFileSize $FileName!" |
| 237 | + return 1 |
| 238 | + fi |
| 239 | + local FileName=$1 |
| 240 | + local FileSize="" |
| 241 | + local TempInfo="" |
| 242 | + TempInfo=`ls -l $FileName` |
| 243 | + FileSize=`echo $TempInfo | awk '{print $5}'` |
| 244 | + echo $FileSize |
| 245 | +} |
| 246 | +#called by runAllCaseTest |
| 247 | +#usage runJSVMVerify |
| 248 | +runBitStreamVerify() |
| 249 | +{ |
| 250 | + echo "" |
| 251 | + echo "******************************************" |
| 252 | + echo "Bit streamSHA1 value comparison.... " |
| 253 | + #******************************************* |
| 254 | + if [ ! -s ${BitStreamFile} ] |
| 255 | + then |
| 256 | + let "UnpassCaseNum++" |
| 257 | + DiffFlag="2:unpassed! 0 bits--bit stream" |
| 258 | + return 1 |
| 259 | + fi |
| 260 | + #******************************************* |
| 261 | + #******************************************* |
| 262 | + #SHA1(run_Test.sh)= fde74d9e8194d0cf28991a0481c7158a033ec920 |
| 263 | + TargetSHA1=`openssl sha1 ${BitStreamFile}` |
| 264 | + TargetSHA1=`echo ${TargetSHA1} | awk '{print $2}' ` |
| 265 | + TargetMD5=`openssl md5 ${BitStreamFile}` |
| 266 | + TargetMD5=`echo ${TargetMD5} | awk '{print $2}' ` |
| 267 | + TargetYUVSize=`runGetFileSize ${TestSequencePath}/${TestSequenceName} ` |
| 268 | + TargetBitstreamSize=`runGetFileSize ${BitStreamFile}` |
| 269 | + if [[ "${TargetSHA1}" =~ "${BenchmarkSHA1}" ]] |
| 270 | + then |
| 271 | + echo "bitstream pass! SHA1--${TargetSHA1} ----- ${BenchmarkSHA1}" |
| 272 | + echo "bitstream pass! MD5-- ${TargetMD5} ----- ${BenchmarkMD5}" |
| 273 | + echo "YUV size pass! size--${TargetYUVSize}--${BenchmarkYUVSize} " |
| 274 | + echo "BitStreamSize pass! size--${TargetBitstreamSize}--${BenchmarkBitstreamSize}" |
| 275 | + DiffFlag="0:passed!" |
| 276 | + let "PassCaseNum++" |
| 277 | + return 0 |
| 278 | + else |
| 279 | + echo "!!! SHA1 string not match: ${TargetSHA1} ----- ${BenchmarkSHA1} " |
| 280 | + echo "bitstream pass! MD5-- ${TargetMD5} ----- ${BenchmarkMD5}" |
| 281 | + echo "YUV size pass! size--${TargetYUVSize}--${BenchmarkYUVSize} " |
| 282 | + echo "BitStreamSize pass! size--${TargetBitstreamSize}--${BenchmarkBitstreamSize}" |
| 283 | + DiffFlag="1:unpassed!" |
| 284 | + let "UnpassCaseNum++" |
| 285 | + return 1 |
| 286 | + fi |
| 287 | +} |
| 288 | +#called by runAllCaseTest |
| 289 | +#delete temp data files and output single case test result to log file |
| 290 | +#usage runSingleCasePostAction $CaseData |
| 291 | +runSingleCasePostAction() |
| 292 | +{ |
| 293 | + if [ $# -lt 1 ] |
| 294 | + then |
| 295 | + echo "no parameter!" |
| 296 | + return 1 |
| 297 | + fi |
| 298 | + local CaseData=$@ |
| 299 | + CaseInfo=`echo $CaseData | awk 'BEGIN {FS="[,\r]"} {for(i=5;i<=NF;i++) printf(" %s,",$i)} '` |
| 300 | + echo "${DiffFlag}, ${TargetSHA1}, ${BenchmarkSHA1}, {TargetMD5}, ${BenchmarkMD5}, \ |
| 301 | + ${TargetBitstreamSize} , ${BenchmarkBitstreamSize},\ |
| 302 | + ${TargetYUVSize}, ${BenchmarkYUVSize},\ |
| 303 | + ${CaseInfo}, ${EncoderCommand} " >>${AllCasePassStatusFile} |
| 304 | + |
| 305 | + echo "${TargetSHA1}, ${TargetMD5},${TargetBitstreamSize}, ${TargetYUVSize},${CaseInfo}">>${UpdateSHA1TableFile} |
| 306 | + |
| 307 | + ./run_SafeDelete.sh ${BitstreamTarget} >>${AllCaseConsoleLogFile} |
| 308 | +} |
| 309 | +#usage runOutputPassNum |
| 310 | +runOutputPassNum() |
| 311 | +{ |
| 312 | + # output file locate in ../result |
| 313 | + echo "" |
| 314 | + echo "***********************************************************" |
| 315 | + echo "${TestSequenceName}" |
| 316 | + echo "total case Num is : ${TotalCaseNum}" |
| 317 | + echo "pass case Num is : ${PassCaseNum}" |
| 318 | + echo "unpass case Num is : ${UnpassCaseNum} " |
| 319 | + echo "***********************************************************" |
| 320 | + echo "" |
| 321 | +} |
| 322 | +# run all test case based on XXXcase.csv file |
| 323 | +#usage runAllCaseTest |
| 324 | +runAllCaseTest() |
| 325 | +{ |
| 326 | + local EncoderLogInfo="" |
| 327 | + while read CaseData |
| 328 | + do |
| 329 | + #get case parameter's value |
| 330 | + if [[ ! $CaseData =~ "SHA" ]] |
| 331 | + then |
| 332 | + echo "" >>${AllCaseConsoleLogFile} |
| 333 | + echo "" >>${AllCaseConsoleLogFile} |
| 334 | + echo "" >>${AllCaseConsoleLogFile} |
| 335 | + echo "********************case index is ${TotalCaseNum}**************************************" >>${AllCaseConsoleLogFile} |
| 336 | + runParseCaseInfo ${CaseData} >>${AllCaseConsoleLogFile} |
| 337 | + echo "" >>${AllCaseConsoleLogFile} |
| 338 | + runEncodeOneCase >>${AllCaseConsoleLogFile} |
| 339 | + cat ${EncoderLogFile}>>${AllCaseConsoleLogFile} |
| 340 | + runBitStreamVerify >>${AllCaseConsoleLogFile} |
| 341 | + let "DisplayFlag=TotalCaseNum%100" |
| 342 | + if [ ${DisplayFlag} -eq 0 ] |
| 343 | + then |
| 344 | + if [ "$DiffFlag" = "0:passed!" ] |
| 345 | + then |
| 346 | + echo -e "\033[32m OK! ${TestSequenceName} Case Index ${TotalCaseNum}:SHA-1(Current--Benchmark): ${TargetSHA1} ----- ${BenchmarkSHA1} \033[0m" |
| 347 | + echo -e "\033[32m ----MD5 (Current--Benchmark): ${TargetMD5}, ${BenchmarkMD5} \033[0m" |
| 348 | + echo -e "\033[32m ----BitstreamSize: ${TargetBitstreamSize}, ${BenchmarkBitstreamSize} YUVSize: ${TargetYUVSize}, ${BenchmarkYUVSize} \033[0m" |
| 349 | + fi |
| 350 | + fi |
| 351 | + #****************************************** |
| 352 | + if [ ! "$DiffFlag" = "0:passed!" ] |
| 353 | + then |
| 354 | + echo -e "\033[31m Failed! ${TestSequenceName} Case Index ${TotalCaseNum}:SHA-1(Current--Benchmark): ${TargetSHA1} ----- ${BenchmarkSHA1} \033[0m" |
| 355 | + echo -e "\033[31m ----MD5 (Current--Benchmark): ${TargetMD5}, ${BenchmarkMD5} \033[0m" |
| 356 | + echo -e "\033[31m ----BitstreamSize: ${TargetBitstreamSize}, ${BenchmarkBitstreamSize} YUVSize: ${TargetYUVSize}, ${BenchmarkYUVSize} \033[0m" |
| 357 | + EncoderLogInfo=`cat ${EncoderLogFile}` |
| 358 | + echo -e "\033[31m ${EncoderLogInfo} \033[0m" |
| 359 | + echo "${DiffFlag}, ${TargetSHA1}, ${BenchmarkSHA1}, ${TargetMD5}, ${BenchmarkMD5}, \ |
| 360 | + ${TargetBitstreamSize} , ${BenchmarkBitstreamSize}, \ |
| 361 | + ${TargetYUVSize}, ${BenchmarkYUVSize}, \ |
| 362 | + ${CaseInfo}, ${EncoderCommand} ">>${UnpassCaseFile} |
| 363 | + fi |
| 364 | + runSingleCasePostAction ${CaseData} |
| 365 | + let "TotalCaseNum++" |
| 366 | + fi |
| 367 | + done <$AllCaseFile |
| 368 | +} |
| 369 | +#*********************************************************** |
| 370 | +# usage: runMain $TestYUV $AllCaseFile |
| 371 | +runMain() |
| 372 | +{ |
| 373 | + if [ ! $# -eq 2 ] |
| 374 | + then |
| 375 | + echo "usage: run_BinarySHA1Comparison.sh \$TestYUV \$AllCaseFile" |
| 376 | + return 1 |
| 377 | + fi |
| 378 | + runGlobalVariableDef |
| 379 | + #for test sequence info |
| 380 | + TestSequenceName=$1 |
| 381 | + AllCaseFile=$2 |
| 382 | + runGlobalVariableInitial |
| 383 | + TestFolder=`echo $CurrentDir | awk 'BEGIN {FS="/"} { i=NF; print $i}'` |
| 384 | + AllCaseConsoleLogFile="${FinalResultPath}/${TestSequenceName}.TestLog" |
| 385 | + CaseSummaryFile="${FinalResultPath}/${TestSequenceName}.Summary" |
| 386 | + FlagFile="" |
| 387 | + #run all cases |
| 388 | + runAllCaseTest |
| 389 | + # output file locate in ./result |
| 390 | + echo "${TestSequenceName}, \ |
| 391 | + ${PassCaseNum} pass!, \ |
| 392 | + ${UnpassCaseNum} unpass!,\ |
| 393 | + detail file located in ../AllTestData/${TestFolder}/result">${CaseSummaryFile} |
| 394 | + runOutputPassNum |
| 395 | + #generate All case Flag |
| 396 | + if [ ! ${UnpassCaseNum} -eq 0 ] |
| 397 | + then |
| 398 | + echo "" |
| 399 | + exit 1 |
| 400 | + else |
| 401 | + echo "" |
| 402 | + exit 0 |
| 403 | + fi |
| 404 | +} |
| 405 | +TestYUVName=$1 |
| 406 | +AllCaseFile=$2 |
| 407 | +runMain ${TestYUVName} ${AllCaseFile} |
| 408 | + |