Initial commit
[renesas/vsp-tests.git] / scripts / vsp-lib.sh
1 #!/bin/sh
2
3 mediactl='media-ctl'
4 yavta='yavta'
5
6 # ------------------------------------------------------------------------------
7 # Miscellaneous
8 #
9
10 vsp1_device() {
11         $mediactl -d $mdev -p | grep 'bus info' | sed 's/.*platform://'
12 }
13
14 vsp1_has_feature() {
15         feature=$1
16
17         $mediactl -d $mdev -p | grep -q -- "- entity.*$feature"
18 }
19
20 vsp1_count_rpfs() {
21         $mediactl -d $mdev -p | grep -- '- entity.*rpf.[0-9] [^i]' | wc -l
22 }
23
24 vsp1_count_wpfs() {
25         $mediactl -d $mdev -p | grep -- '- entity.*wpf.[0-9] [^o]' | wc -l
26 }
27
28 vsp1_count_bru_inputs() {
29         num_pads=`media-ctl -p | grep 'entity.*bru' | sed 's/.*(\([0-9]\) pads.*/\1/'`
30         echo $((num_pads-1))
31 }
32
33 vsp1_entity_get_size() {
34         entity=$1
35         pad=$2
36
37         $mediactl -d $mdev --get-v4l2 "'$dev $entity':$pad" | grep fmt | \
38               sed 's/.*\/\([0-9x]*\).*/\1/'
39 }
40
41 # ------------------------------------------------------------------------------
42 # Image and histogram comparison
43 #
44
45 #
46 # Compare the two frames for exact match.
47 #
48 compare_frame_exact() {
49         img_a=$3
50         img_b=$4
51
52         match='fail'
53         diff -q $img_a $img_b > /dev/null && match='pass'
54
55         echo "Compared $img_a and $img_b: $match" | ./logger.sh check >> $logfile
56
57         if [ $match = 'pass' ] ; then
58                 return 0
59         else
60                 return 1
61         fi
62 }
63
64 #
65 # Compare the two frames using a fuzzy match algorithm to account for errors
66 # introduced by the YUV packing. Accept a maximum 1% mean average error over
67 # the whole frame with no more than 5% of the pixels differing.
68 #
69 compare_frame_fuzzy() {
70         fmt=$(echo $1 | sed 's/M$//')
71         size=$2
72         img_a=$3
73         img_b=$4
74
75         png_a=${img_a/bin/png}
76         png_b=${img_b/bin/png}
77
78         raw2rgbpnm -f $fmt -s $size $img_a $png_a > /dev/null
79         raw2rgbpnm -f $fmt -s $size $img_b $png_b > /dev/null
80
81         ae=$(compare -metric ae $png_a $png_b /dev/null 2>&1)
82         mae=$(compare -metric mae $png_a $png_b /dev/null 2>&1 | sed 's/.*(\(.*\))/\1/')
83
84         rm $png_a
85         rm $png_b
86
87         width=$(echo $size | cut -d 'x' -f 1)
88         height=$(echo $size | cut -d 'x' -f 2)
89
90         ae_match=$(echo $ae $width $height | awk '{ if ($1 / $2 / $3 < 0.05) { print "pass" } else { print "fail" } }')
91         mae_match=$(echo $mae | awk '{ if ($1 < 0.01) { print "pass" } else { print "fail" } }')
92
93         echo "Compared $img_a and $img_b: ae $ae ($ae_match) mae $mae ($mae_match)" | ./logger.sh check >> $logfile
94
95         if [ $ae_match = 'pass' -a $mae_match = 'pass' ] ; then
96                 return 0
97         else
98                 return 1
99         fi
100 }
101
102 compare_frames() {
103         method=$1
104         reftype=$2
105         format=$3
106         wpf=$4
107
108         fmt=$(echo $format | tr '[:upper:]' '[:lower:]')
109         size=$(vsp1_entity_get_size wpf.$wpf 1)
110
111         case $format in
112         ARGB555)
113                 reference="frame-$reftype-$fmt-$size-alpha255.bin"
114                 ;;
115         ABGR32 | ARGB32)
116                 reference="frame-$reftype-$fmt-$size-alpha200.bin"
117                 ;;
118         XRGB555)
119                 # XRGB555 has the X bit hardcoded to 0
120                 reference="frame-$reftype-$fmt-$size-alpha0.bin"
121                 ;;
122         XBGR32 | XRGB32)
123                 # The X bits are configurable with a default value of 255
124                 reference="frame-$reftype-$fmt-$size-alpha255.bin"
125                 ;;
126         *)
127                 reference="frame-$reftype-$fmt-$size.bin"
128                 ;;
129         esac
130
131         result="pass"
132         for frame in frame-*.bin ; do
133                 (compare_frame_$method $format $size $frame frames/$reference) || {
134                         mv $frame ${0/.sh/}-${frame/.bin/-$reftype-$fmt-$size.bin} ;
135                         result="fail"
136                 }
137         done
138
139         echo $result
140 }
141
142 compare_histogram() {
143         histo_a=$1
144         histo_b=$2
145
146         match='fail'
147         diff -q $histo_a $histo_b > /dev/null && match='pass'
148
149         echo "Compared $histo_a and $histo_b: $match" | ./logger.sh check >> $logfile
150
151         if [ $match = 'pass' ] ; then
152                 return 0
153         else
154                 return 1
155         fi
156 }
157
158 compare_histograms() {
159         format=$1
160         wpf=$2
161
162         fmt=$(echo $format | tr '[:upper:]' '[:lower:]')
163         size=$(vsp1_entity_get_size wpf.$wpf 1)
164         reference="histo-reference-$fmt-$size.bin"
165
166         result="pass"
167         for histo in histo-*.bin ; do
168                 (compare_histogram $histo frames/$reference) || {
169                         mv $histo ${0/.sh/}-${histo/.bin/-$fmt.bin} ;
170                         result="fail"
171                 }
172         done
173
174         echo $result
175 }
176
177 # ------------------------------------------------------------------------------
178 # Pipeline configuration
179 #
180
181 pipe_none() {
182         # Nothing to be done
183         return
184 }
185
186 pipe_rpf_bru() {
187         ninputs=$1
188
189         bru_output=$(vsp1_count_bru_inputs)
190
191         for input in `seq 0 1 $((ninputs-1))` ; do
192                 $mediactl -d $mdev -l "'$dev rpf.$input':1 -> '$dev bru':$input [1]"
193         done
194         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
195         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
196 }
197
198 pipe_rpf_bru_uds() {
199         bru_output=$(vsp1_count_bru_inputs)
200
201         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev bru':0 [1]"
202         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev uds.0':0 [1]"
203         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
204         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
205 }
206
207 pipe_rpf_hgo() {
208         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev wpf.0':0 [1]"
209         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev hgo':0 [1]"
210         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
211 }
212
213 pipe_rpf_uds() {
214         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
215         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
216         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
217 }
218
219 pipe_rpf_uds_bru() {
220         bru_output=$(vsp1_count_bru_inputs)
221
222         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
223         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev bru':0 [1]"
224         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
225         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
226 }
227
228 pipe_rpf_wpf() {
229         rpf=$1
230         wpf=$2
231
232         $mediactl -d $mdev -l "'$dev rpf.$rpf':1 -> '$dev wpf.$wpf':0 [1]"
233         $mediactl -d $mdev -l "'$dev wpf.$wpf':1 -> '$dev wpf.$wpf output':0 [1]"
234 }
235
236 pipe_reset() {
237         $mediactl -d $mdev -r
238 }
239
240 pipe_configure() {
241         pipe=${1//-/_}
242         shift 1
243
244         pipe_reset
245         pipe_$pipe $*
246 }
247
248 # ------------------------------------------------------------------------------
249 # Format Configuration
250 #
251
252 format_v4l2_to_mbus() {
253         case $1 in
254         RGB332 | ARGB555 | XRGB555 | RGB565 | BGR24 | RGB24 | XBGR32 | XRGB32 | ABGR32 | ARGB32)
255                 echo "ARGB32";
256                 ;;
257
258         NV12M | NV16M | NV21M | NV61M | UYVY | VYUY | YUV420M | YUYV | YVYU)
259                 echo "AYUV32"
260                 ;;
261
262         *)
263                 echo "Invalid format $1" >&2
264                 echo -e "Valid formats are
265 \tRGB332, ARGB555, XRGB555, RGB565, BGR24, RGB24,
266 \tXBGR32, XRGB32, ABGR32, ARGB32,
267 \tNV12M, NV16M, NV21M, NV61M, UYVY, VYUY, YUV420M, YUYV, YVYU" >&2
268                 exit 1
269         esac
270 }
271
272 format_rpf() {
273         format=$(format_v4l2_to_mbus $1)
274         size=$2
275         rpf=$3
276
277         $mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$format/$size]"
278 }
279
280 format_rpf_bru() {
281         format=$(format_v4l2_to_mbus $1)
282         size=$2
283         ninputs=$3
284         offset=0
285
286         bru_output=$(vsp1_count_bru_inputs)
287
288         for input in `seq 0 1 $((ninputs-1))` ; do
289                 offset=$((offset+50))
290                 $mediactl -d $mdev -V "'$dev rpf.$input':0 [fmt:$format/$size]"
291                 $mediactl -d $mdev -V "'$dev bru':$input   [fmt:$format/$size compose:($offset,$offset)/$size]"
292         done
293
294         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$format/$size]"
295         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
296         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
297 }
298
299 format_rpf_bru_uds() {
300         infmt=$(format_v4l2_to_mbus $1)
301         insize=$2
302         outfmt=$(format_v4l2_to_mbus $3)
303         outsize=$4
304
305         bru_output=$(vsp1_count_bru_inputs)
306
307         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
308         $mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$insize]"
309         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$insize]"
310         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
311         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
312         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
313         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
314 }
315
316 format_rpf_hgo() {
317         format=$(format_v4l2_to_mbus $1)
318         size=$2
319         crop=${3:+crop:$3}
320         compose=${4:+compose:$4}
321
322         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
323         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
324         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
325         $mediactl -d $mdev -V "'$dev hgo':0   [fmt:$format/$size $crop $compose]"
326 }
327
328 format_rpf_uds() {
329         infmt=$(format_v4l2_to_mbus $1)
330         insize=$2
331         outfmt=$(format_v4l2_to_mbus $3)
332         outsize=$4
333
334         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
335         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
336         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
337         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
338         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
339 }
340
341 format_rpf_uds_bru() {
342         infmt=$(format_v4l2_to_mbus $1)
343         insize=$2
344         outfmt=$(format_v4l2_to_mbus $3)
345         outsize=$4
346
347         bru_output=$(vsp1_count_bru_inputs)
348
349         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
350         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
351         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
352         $mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$outsize]"
353         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$outsize]"
354         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
355         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
356 }
357
358 format_rpf_wpf() {
359         rpf=$1
360         wpf=$2
361         infmt=$(format_v4l2_to_mbus $3)
362         size=$4
363         outfmt=$(format_v4l2_to_mbus $5)
364         crop=$6
365
366         if [ x$crop != 'x' ] ; then
367                 crop="crop:$crop"
368                 outsize=$(echo $crop | sed 's/.*\///')
369         else
370                 outsize=$size
371         fi
372
373         $mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$infmt/$size]"
374         $mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$infmt/$size $crop]"
375         $mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$outfmt/$outsize]"
376 }
377
378 format_wpf() {
379         format=$(format_v4l2_to_mbus $1)
380         size=$2
381         wpf=$3
382
383         $mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$format/$size]"
384         $mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$format/$size]"
385 }
386
387 format_configure() {
388         pipe=${1//-/_}
389         shift 1
390
391         format_$pipe $*
392 }
393
394 # ------------------------------------------------------------------------------
395 # Test run
396 #
397
398 test_init() {
399         logfile=${1/sh/log}
400         features=$2
401
402         rm -f $logfile
403         rm -f *.bin
404
405         for mdev in /dev/media* ; do
406                 match='true'
407                 for feature in $features ; do
408                         $(vsp1_has_feature $feature) || {
409                                 match='false';
410                                 break;
411                         }
412                 done
413
414                 if [ $match == 'true' ] ; then
415                         break
416                 fi
417         done
418
419         if [ $match == 'false' ] ; then
420                 echo "No device found with feature set $features" | ./logger.sh config >> $logfile
421                 exit 1
422         fi
423
424         dev=$(vsp1_device $mdev)
425         echo "Using device $mdev ($dev)" | ./logger.sh config >> $logfile
426
427         vsp_runner=./vsp-runner.sh
428 }
429
430 test_start() {
431         echo "Testing $1" | ./logger.sh >> $logfile
432         echo -n "Testing $1: " >&2
433 }
434
435 test_complete() {
436         echo "Done: $1" | ./logger.sh >> $logfile
437         echo $1 >&2
438
439         rm -f frame-*.bin
440         rm -f histo-*.bin
441 }