• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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