openh264/test/encoder_binary_comparison/Scripts/run_BinarySHA1Comparison.sh
2014-07-08 13:15:57 -04:00

409 lines
15 KiB
Bash
Executable File

#!/bin/bash
#*******************************************************************************
# Encoder binary comparison test model
# -- Compared with Benchmark version using SHA-1 string
# -- Test bit stream under folder openh264/res
# -- SHA-1 string of Benchmark version for all cases of all bit streams
# under folder openh264/test/encoder_binary_comparion/SHA1Table
# -- For more detail,please refer to file AboutTest¡£
#
#brief:
# -- Test all cases in SHA1TableFile
# 1) Generate SHA1 string for each case
# 2) Compare with benchmark SHA1 string
# 3) If the SHA1 string are the same with benchmark version, test case is marked as passed
# 4) Otherwise, test case is marked as unpass! this may caused by:
# --the design of encoder has been changed and the bit stream also change
# --there may be some bugs in encoder and bit stream is not right
# -- Usage: ./run_BinarySHA1Comparison.sh ${TestYUVName} ${AllCaseSHA1TaleFile}
#
# date: 10/06/2014 Created
#*******************************************************************************
#global variable definition
#usage runGlobalVariableDef
runGlobalVariableDef()
{
WorkingDirDir=""
#test data space
FinalResultPath=""
IssueDataPath=""
TempDataPath=""
#for test sequence info
TestSequenceName=""
PicW=""
PicH=""
#test cfg file and test info output file
ConfigureFile=""
AllCaseFile=""
#xxx.csv
AllCasePassStatusFile=""
#for encoder command
declare -a EncoderCommandSet
declare -a EncoderCommandName
declare -a EncoderCommandValue
#encoder parameters change based on the case info
CaseInfo=""
BitStreamFile=""
DiffFlag=""
#pass number
TotalCaseNum=""
PassCaseNum=""
UnpassCaseNum=""
}
#called by runGlobalVariableInitial
#usage runEncoderCommandInital
runEncoderCommandInital()
{
EncoderCommandSet=(-frms \
-numtl \
-scrsig \
-rc \
-tarb \
"-lqp 0" \
-iper \
"-slcmd 0" \
"-slcnum 0" \
-thread \
-ltr \
-db \
-nalsize \
-denois \
-scene \
-bgd \
-aq)
EncoderCommandName=(FrEcoded \
NumTempLayer \
ContentSig \
RC \
BitRate \
QP \
IntraPeriod \
SlcMd \
SlcMum \
ThrMum \
LTR \
LFilterIDC \
MacNalSize \
DenoiseFlag \
SceneChangeFlag \
BackgroundFlag \
AQFlag)
EncoderCommandValue=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
NumParameter=${#EncoderCommandSet[@]}
}
runGlobalVariableInitial()
{
#TestSpaceDir=../AllTestData CurrentDir=../AllTestData/TestSetXXX/***.264 eg ../AllTestData/TestSetCIF/BA1_MWD.264
CurrentDir=`pwd`
#test data space
FinalResultPath="${CurrentDir}/result"
IssueDataPath="${CurrentDir}/issue"
TempDataPath="TempData"
TestSequencePath="${CurrentDir}"
#get YUV detail info $picW $picH $FPS
declare -a aYUVInfo
aYUVInfo=(`./run_ParseYUVInfo.sh ${TestSequenceName}`)
PicW=${aYUVInfo[0]}
PicH=${aYUVInfo[1]}
#test cfg file and test info output file
ConfigureFile=welsenc.cfg
AllCasePassStatusFile="${FinalResultPath}/${TestSequenceName}_AllCaseOutput.csv"
UnpassCaseFile="${FinalResultPath}/${TestSequenceName}_unpassCaseOutput.csv"
UpdateSHA1TableFile="${FinalResultPath}/${TestSequenceName}_UpdateSHA1Table.csv"
echo "BitMatched Status, \
SHA-1-Target, SHA-1-Benchmark, \
MD5-Target, MD5-Benchmark, \
Bitstream-Target,Bitstream-Benchmark, \
YUV-Target,YUV-Benchmark, \
-frms, -numtl, -scrsig, -rc, \
-tarb, -lqp 0, -iper, \
-slcmd 0,-slcnum 0, -thread, \
-ltr, -db, -nalsize,-denois, \
-scene, -bgd, -aq">${AllCasePassStatusFile}
echo "BitMatched Status, \
SHA-1-Target, SHA-1-Benchmark, \
MD5-Target, MD5-Benchmark, \
Bitstream-Target,Bitstream-Benchmark,\
YUV-Target,YUV-Benchmark, \
-frms, -numtl, -scrsig, -rc, \
-tarb, -lqp 0, -iper, \
-slcmd 0,-slcnum 0, -thread, \
-ltr, -db, -nalsize,-denois, \
-scene, -bgd, -aq">${UnpassCaseFile}
echo "SHA-1 Value, \
MD5String, BitStreamSize, YUVSize, \
-frms, -numtl, -scrsig, -rc, \
-tarb, -lqp 0, -iper, \
-slcmd 0,-slcnum 0, -thread, \
-ltr, -db, -MaxNalSize,-denois, \
-scene, -bgd, -aq">${UpdateSHA1TableFile}
#intial Commandline parameters
runEncoderCommandInital
let "TotalCaseNum=0"
let "PassCaseNum=0"
let "UnpassCaseNum=0"
EncoderCommand=""
EncoderLogFile="${TempDataPath}/Encoder.log"
TargetSHA1=""
TargetMD5=""
TargetYUVSize=""
TargetBitstreamSize=""
BenchmarkSHA1=""
BenchmarkMD5=""
BenchmarkYUVSize=""
BenchmarkBitstreamSize=""
}
#***********************************************************
#called by runAllCaseTest
# parse case info --encoder preprocess
#usage runParseCaseInfo $CaseData
runParseCaseInfo()
{
if [ $# -lt 1 ]
then
echo "runParseCaseInfo \$CaseData"
return 1
fi
local TempData=""
local BitstreamPrefix=""
local CaseData=$@
BenchmarkSHA1=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $1} ' `
BenchmarkMD5=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $2} ' `
BenchmarkYUVSize=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $4} ' `
BenchmarkBitstreamSize=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {print $3} ' `
TempData=`echo $CaseData |awk 'BEGIN {FS="[,\r]"} {for(i=5;i<=NF;i++) printf(" %s",$i)} ' `
EncoderCommandValue=(${TempData})
for((i=0; i<$NumParameter; i++))
do
BitstreamPrefix=${BitstreamPrefix}_${EncoderCommandName[$i]}_${EncoderCommandValue[$i]}
done
BitstreamTarget=${TempDataPath}/${TestSequenceName}_${BitstreamPrefix}_codec_target.264
echo ""
echo "BitstreamPrefix is ${BitstreamPrefix}"
echo ""
}
#called by runAllCaseTest
#usage runEncodeOneCase
runEncodeOneCase()
{
BitStreamFile=${BitstreamTarget}
CaseCommand=" ${ConfigureFile} \
-numl 1 \
-lconfig 0 layer2.cfg \
-sw ${PicW} -sh ${PicH} \
-dw 0 ${PicW} -dh 0 ${PicH} \
-frout 0 30 \
-ltarb 0 ${EncoderCommandValue[4]} \
${EncoderCommandSet[0]} ${EncoderCommandValue[0]} \
${EncoderCommandSet[1]} ${EncoderCommandValue[1]} \
${EncoderCommandSet[2]} ${EncoderCommandValue[2]} \
${EncoderCommandSet[3]} ${EncoderCommandValue[3]} \
${EncoderCommandSet[4]} ${EncoderCommandValue[4]} \
${EncoderCommandSet[5]} ${EncoderCommandValue[5]} \
${EncoderCommandSet[6]} ${EncoderCommandValue[6]} \
${EncoderCommandSet[7]} ${EncoderCommandValue[7]} \
${EncoderCommandSet[8]} ${EncoderCommandValue[8]} \
${EncoderCommandSet[9]} ${EncoderCommandValue[9]} \
${EncoderCommandSet[10]} ${EncoderCommandValue[10]} \
${EncoderCommandSet[11]} ${EncoderCommandValue[11]} \
${EncoderCommandSet[12]} ${EncoderCommandValue[12]} \
${EncoderCommandSet[13]} ${EncoderCommandValue[13]} \
${EncoderCommandSet[14]} ${EncoderCommandValue[14]} \
${EncoderCommandSet[15]} ${EncoderCommandValue[15]} \
${EncoderCommandSet[16]} ${EncoderCommandValue[16]}"
echo ${EncoderCommandSet[@]}
echo ${EncoderCommandValue[@]}
echo ${EncoderCommandSet[11]}
echo ${EncoderCommandValue[11]}
echo ${EncoderCommandSet[12]}
echo ${EncoderCommandValue[12]}
EncoderCommand="./h264enc ${CaseCommand} -bf ${BitStreamFile} -org ${TestSequencePath}/${TestSequenceName} "
echo ""
echo "case line is :"
echo " ${EncoderCommand}"
echo -e "\n\n"
./h264enc ${CaseCommand} \
-bf ${BitStreamFile} \
-org ${TestSequencePath}/${TestSequenceName} 2>${EncoderLogFile}
}
#usage? runGetFileSize $FileName
runGetFileSize()
{
if [ $# -lt 1 ]
then
echo "usage runGetFileSize $FileName!"
return 1
fi
local FileName=$1
local FileSize=""
local TempInfo=""
TempInfo=`ls -l $FileName`
FileSize=`echo $TempInfo | awk '{print $5}'`
echo $FileSize
}
#called by runAllCaseTest
#usage runJSVMVerify
runBitStreamVerify()
{
echo ""
echo "******************************************"
echo "Bit streamSHA1 value comparison.... "
#*******************************************
if [ ! -s ${BitStreamFile} ]
then
let "UnpassCaseNum++"
DiffFlag="2:unpassed! 0 bits--bit stream"
return 1
fi
#*******************************************
#*******************************************
#SHA1(run_Test.sh)= fde74d9e8194d0cf28991a0481c7158a033ec920
TargetSHA1=`openssl sha1 ${BitStreamFile}`
TargetSHA1=`echo ${TargetSHA1} | awk '{print $2}' `
TargetMD5=`openssl md5 ${BitStreamFile}`
TargetMD5=`echo ${TargetMD5} | awk '{print $2}' `
TargetYUVSize=`runGetFileSize ${TestSequencePath}/${TestSequenceName} `
TargetBitstreamSize=`runGetFileSize ${BitStreamFile}`
if [[ "${TargetSHA1}" =~ "${BenchmarkSHA1}" ]]
then
echo "bitstream pass! SHA1--${TargetSHA1} ----- ${BenchmarkSHA1}"
echo "bitstream pass! MD5-- ${TargetMD5} ----- ${BenchmarkMD5}"
echo "YUV size pass! size--${TargetYUVSize}--${BenchmarkYUVSize} "
echo "BitStreamSize pass! size--${TargetBitstreamSize}--${BenchmarkBitstreamSize}"
DiffFlag="0:passed!"
let "PassCaseNum++"
return 0
else
echo "!!! SHA1 string not match: ${TargetSHA1} ----- ${BenchmarkSHA1} "
echo "bitstream pass! MD5-- ${TargetMD5} ----- ${BenchmarkMD5}"
echo "YUV size pass! size--${TargetYUVSize}--${BenchmarkYUVSize} "
echo "BitStreamSize pass! size--${TargetBitstreamSize}--${BenchmarkBitstreamSize}"
DiffFlag="1:unpassed!"
let "UnpassCaseNum++"
return 1
fi
}
#called by runAllCaseTest
#delete temp data files and output single case test result to log file
#usage runSingleCasePostAction $CaseData
runSingleCasePostAction()
{
if [ $# -lt 1 ]
then
echo "no parameter!"
return 1
fi
local CaseData=$@
CaseInfo=`echo $CaseData | awk 'BEGIN {FS="[,\r]"} {for(i=5;i<=NF;i++) printf(" %s,",$i)} '`
echo "${DiffFlag}, ${TargetSHA1}, ${BenchmarkSHA1}, {TargetMD5}, ${BenchmarkMD5}, \
${TargetBitstreamSize} , ${BenchmarkBitstreamSize},\
${TargetYUVSize}, ${BenchmarkYUVSize},\
${CaseInfo}, ${EncoderCommand} " >>${AllCasePassStatusFile}
echo "${TargetSHA1}, ${TargetMD5},${TargetBitstreamSize}, ${TargetYUVSize},${CaseInfo}">>${UpdateSHA1TableFile}
./run_SafeDelete.sh ${BitstreamTarget} >>${AllCaseConsoleLogFile}
}
#usage runOutputPassNum
runOutputPassNum()
{
# output file locate in ../result
echo ""
echo "***********************************************************"
echo "${TestSequenceName}"
echo "total case Num is : ${TotalCaseNum}"
echo "pass case Num is : ${PassCaseNum}"
echo "unpass case Num is : ${UnpassCaseNum} "
echo "***********************************************************"
echo ""
}
# run all test case based on XXXcase.csv file
#usage runAllCaseTest
runAllCaseTest()
{
local EncoderLogInfo=""
while read CaseData
do
#get case parameter's value
if [[ ! $CaseData =~ "SHA" ]]
then
echo "" >>${AllCaseConsoleLogFile}
echo "" >>${AllCaseConsoleLogFile}
echo "" >>${AllCaseConsoleLogFile}
echo "********************case index is ${TotalCaseNum}**************************************" >>${AllCaseConsoleLogFile}
runParseCaseInfo ${CaseData} >>${AllCaseConsoleLogFile}
echo "" >>${AllCaseConsoleLogFile}
runEncodeOneCase >>${AllCaseConsoleLogFile}
cat ${EncoderLogFile}>>${AllCaseConsoleLogFile}
runBitStreamVerify >>${AllCaseConsoleLogFile}
let "DisplayFlag=TotalCaseNum%100"
if [ ${DisplayFlag} -eq 0 ]
then
if [ "$DiffFlag" = "0:passed!" ]
then
echo -e "\033[32m OK! ${TestSequenceName} Case Index ${TotalCaseNum}:SHA-1(Current--Benchmark): ${TargetSHA1} ----- ${BenchmarkSHA1} \033[0m"
echo -e "\033[32m ----MD5 (Current--Benchmark): ${TargetMD5}, ${BenchmarkMD5} \033[0m"
echo -e "\033[32m ----BitstreamSize: ${TargetBitstreamSize}, ${BenchmarkBitstreamSize} YUVSize: ${TargetYUVSize}, ${BenchmarkYUVSize} \033[0m"
fi
fi
#******************************************
if [ ! "$DiffFlag" = "0:passed!" ]
then
echo -e "\033[31m Failed! ${TestSequenceName} Case Index ${TotalCaseNum}:SHA-1(Current--Benchmark): ${TargetSHA1} ----- ${BenchmarkSHA1} \033[0m"
echo -e "\033[31m ----MD5 (Current--Benchmark): ${TargetMD5}, ${BenchmarkMD5} \033[0m"
echo -e "\033[31m ----BitstreamSize: ${TargetBitstreamSize}, ${BenchmarkBitstreamSize} YUVSize: ${TargetYUVSize}, ${BenchmarkYUVSize} \033[0m"
EncoderLogInfo=`cat ${EncoderLogFile}`
echo -e "\033[31m ${EncoderLogInfo} \033[0m"
echo "${DiffFlag}, ${TargetSHA1}, ${BenchmarkSHA1}, ${TargetMD5}, ${BenchmarkMD5}, \
${TargetBitstreamSize} , ${BenchmarkBitstreamSize}, \
${TargetYUVSize}, ${BenchmarkYUVSize}, \
${CaseInfo}, ${EncoderCommand} ">>${UnpassCaseFile}
fi
runSingleCasePostAction ${CaseData}
let "TotalCaseNum++"
fi
done <$AllCaseFile
}
#***********************************************************
# usage: runMain $TestYUV $AllCaseFile
runMain()
{
if [ ! $# -eq 2 ]
then
echo "usage: run_BinarySHA1Comparison.sh \$TestYUV \$AllCaseFile"
return 1
fi
runGlobalVariableDef
#for test sequence info
TestSequenceName=$1
AllCaseFile=$2
runGlobalVariableInitial
TestFolder=`echo $CurrentDir | awk 'BEGIN {FS="/"} { i=NF; print $i}'`
AllCaseConsoleLogFile="${FinalResultPath}/${TestSequenceName}.TestLog"
CaseSummaryFile="${FinalResultPath}/${TestSequenceName}.Summary"
FlagFile=""
#run all cases
runAllCaseTest
# output file locate in ./result
echo "${TestSequenceName}, \
${PassCaseNum} pass!, \
${UnpassCaseNum} unpass!,\
detail file located in ../AllTestData/${TestFolder}/result">${CaseSummaryFile}
runOutputPassNum
#generate All case Flag
if [ ! ${UnpassCaseNum} -eq 0 ]
then
echo ""
exit 1
else
echo ""
exit 0
fi
}
TestYUVName=$1
AllCaseFile=$2
runMain ${TestYUVName} ${AllCaseFile}