| @@ -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 | |