Add gen-image tool
[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         pnm_a=${img_a/bin/pnm}
76         pnm_b=${img_b/bin/pnm}
77
78         raw2rgbpnm -f $fmt -s $size $img_a $pnm_a > /dev/null
79         raw2rgbpnm -f $fmt -s $size $img_b $pnm_b > /dev/null
80
81         ae=$(compare -metric ae $pnm_a $pnm_b /dev/null 2>&1)
82         mae=$(compare -metric mae $pnm_a $pnm_b /dev/null 2>&1 | sed 's/.*(\(.*\))/\1/')
83
84         rm $pnm_a
85         rm $pnm_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         rm -f frames/$reference
140
141         echo $result
142 }
143
144 compare_histogram() {
145         histo_a=$1
146         histo_b=$2
147
148         match='fail'
149         diff -q $histo_a $histo_b > /dev/null && match='pass'
150
151         echo "Compared $histo_a and $histo_b: $match" | ./logger.sh check >> $logfile
152
153         if [ $match = 'pass' ] ; then
154                 return 0
155         else
156                 return 1
157         fi
158 }
159
160 compare_histograms() {
161         format=$1
162         wpf=$2
163
164         fmt=$(echo $format | tr '[:upper:]' '[:lower:]')
165         size=$(vsp1_entity_get_size wpf.$wpf 1)
166         reference="histo-reference-$fmt-$size.bin"
167
168         result="pass"
169         for histo in histo-*.bin ; do
170                 (compare_histogram $histo frames/$reference) || {
171                         mv $histo ${0/.sh/}-${histo/.bin/-$fmt.bin} ;
172                         result="fail"
173                 }
174         done
175
176         echo $result
177 }
178
179 # ------------------------------------------------------------------------------
180 # Pipeline configuration
181 #
182
183 pipe_none() {
184         # Nothing to be done
185         return
186 }
187
188 pipe_rpf_bru() {
189         ninputs=$1
190
191         bru_output=$(vsp1_count_bru_inputs)
192
193         for input in `seq 0 1 $((ninputs-1))` ; do
194                 $mediactl -d $mdev -l "'$dev rpf.$input':1 -> '$dev bru':$input [1]"
195         done
196         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
197         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
198 }
199
200 pipe_rpf_bru_uds() {
201         bru_output=$(vsp1_count_bru_inputs)
202
203         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev bru':0 [1]"
204         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev uds.0':0 [1]"
205         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
206         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
207 }
208
209 pipe_rpf_hgo() {
210         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev wpf.0':0 [1]"
211         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev hgo':0 [1]"
212         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
213 }
214
215 pipe_rpf_uds() {
216         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
217         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
218         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
219 }
220
221 pipe_rpf_uds_bru() {
222         bru_output=$(vsp1_count_bru_inputs)
223
224         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
225         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev bru':0 [1]"
226         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
227         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
228 }
229
230 pipe_rpf_wpf() {
231         rpf=$1
232         wpf=$2
233
234         $mediactl -d $mdev -l "'$dev rpf.$rpf':1 -> '$dev wpf.$wpf':0 [1]"
235         $mediactl -d $mdev -l "'$dev wpf.$wpf':1 -> '$dev wpf.$wpf output':0 [1]"
236 }
237
238 pipe_reset() {
239         $mediactl -d $mdev -r
240 }
241
242 pipe_configure() {
243         pipe=${1//-/_}
244         shift 1
245
246         pipe_reset
247         pipe_$pipe $*
248 }
249
250 # ------------------------------------------------------------------------------
251 # Format Configuration
252 #
253
254 format_v4l2_to_mbus() {
255         case $1 in
256         RGB332 | ARGB555 | XRGB555 | RGB565 | BGR24 | RGB24 | XBGR32 | XRGB32 | ABGR32 | ARGB32)
257                 echo "ARGB32";
258                 ;;
259
260         NV12M | NV16M | NV21M | NV61M | UYVY | VYUY | YUV420M | YUYV | YVYU)
261                 echo "AYUV32"
262                 ;;
263
264         *)
265                 echo "Invalid format $1" >&2
266                 echo -e "Valid formats are
267 \tRGB332, ARGB555, XRGB555, RGB565, BGR24, RGB24,
268 \tXBGR32, XRGB32, ABGR32, ARGB32,
269 \tNV12M, NV16M, NV21M, NV61M, UYVY, VYUY, YUV420M, YUYV, YVYU" >&2
270                 exit 1
271         esac
272 }
273
274 format_rpf() {
275         format=$(format_v4l2_to_mbus $1)
276         size=$2
277         rpf=$3
278
279         $mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$format/$size]"
280 }
281
282 format_rpf_bru() {
283         format=$(format_v4l2_to_mbus $1)
284         size=$2
285         ninputs=$3
286         offset=0
287
288         bru_output=$(vsp1_count_bru_inputs)
289
290         for input in `seq 0 1 $((ninputs-1))` ; do
291                 offset=$((offset+50))
292                 $mediactl -d $mdev -V "'$dev rpf.$input':0 [fmt:$format/$size]"
293                 $mediactl -d $mdev -V "'$dev bru':$input   [fmt:$format/$size compose:($offset,$offset)/$size]"
294         done
295
296         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$format/$size]"
297         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
298         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
299 }
300
301 format_rpf_bru_uds() {
302         infmt=$(format_v4l2_to_mbus $1)
303         insize=$2
304         outfmt=$(format_v4l2_to_mbus $3)
305         outsize=$4
306
307         bru_output=$(vsp1_count_bru_inputs)
308
309         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
310         $mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$insize]"
311         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$insize]"
312         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
313         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
314         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
315         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
316 }
317
318 format_rpf_hgo() {
319         format=$(format_v4l2_to_mbus $1)
320         size=$2
321         crop=${3:+crop:$3}
322         compose=${4:+compose:$4}
323
324         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
325         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
326         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
327         $mediactl -d $mdev -V "'$dev hgo':0   [fmt:$format/$size $crop $compose]"
328 }
329
330 format_rpf_uds() {
331         infmt=$(format_v4l2_to_mbus $1)
332         insize=$2
333         outfmt=$(format_v4l2_to_mbus $3)
334         outsize=$4
335
336         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
337         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
338         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
339         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
340         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
341 }
342
343 format_rpf_uds_bru() {
344         infmt=$(format_v4l2_to_mbus $1)
345         insize=$2
346         outfmt=$(format_v4l2_to_mbus $3)
347         outsize=$4
348
349         bru_output=$(vsp1_count_bru_inputs)
350
351         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
352         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
353         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
354         $mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$outsize]"
355         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$outsize]"
356         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
357         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
358 }
359
360 format_rpf_wpf() {
361         rpf=$1
362         wpf=$2
363         infmt=$(format_v4l2_to_mbus $3)
364         size=$4
365         outfmt=$(format_v4l2_to_mbus $5)
366         crop=$6
367
368         if [ x$crop != 'x' ] ; then
369                 crop="crop:$crop"
370                 outsize=$(echo $crop | sed 's/.*\///')
371         else
372                 outsize=$size
373         fi
374
375         $mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$infmt/$size]"
376         $mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$infmt/$size $crop]"
377         $mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$outfmt/$outsize]"
378 }
379
380 format_wpf() {
381         format=$(format_v4l2_to_mbus $1)
382         size=$2
383         wpf=$3
384
385         $mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$format/$size]"
386         $mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$format/$size]"
387 }
388
389 format_configure() {
390         pipe=${1//-/_}
391         shift 1
392
393         format_$pipe $*
394 }
395
396 # ------------------------------------------------------------------------------
397 # Test run
398 #
399
400 test_init() {
401         logfile=${1/sh/log}
402         features=$2
403
404         rm -f $logfile
405         rm -f *.bin
406
407         for mdev in /dev/media* ; do
408                 match='true'
409                 for feature in $features ; do
410                         $(vsp1_has_feature $feature) || {
411                                 match='false';
412                                 break;
413                         }
414                 done
415
416                 if [ $match == 'true' ] ; then
417                         break
418                 fi
419         done
420
421         if [ $match == 'false' ] ; then
422                 echo "No device found with feature set $features" | ./logger.sh config >> $logfile
423                 exit 1
424         fi
425
426         dev=$(vsp1_device $mdev)
427         echo "Using device $mdev ($dev)" | ./logger.sh config >> $logfile
428
429         vsp_runner=./vsp-runner.sh
430 }
431
432 test_start() {
433         echo "Testing $1" | ./logger.sh >> $logfile
434         echo -n "Testing $1: " >&2
435 }
436
437 test_complete() {
438         echo "Done: $1" | ./logger.sh >> $logfile
439         echo $1 >&2
440
441         rm -f frame-*.bin
442         rm -f histo-*.bin
443 }