vsp-lib: Filter non-filesystem regular characters
[renesas/vsp-tests.git] / scripts / vsp-lib.sh
1 #!/bin/sh
2
3 genimage='./gen-image'
4 mediactl='media-ctl'
5 yavta='yavta'
6 frames_dir=/tmp/
7
8 # ------------------------------------------------------------------------------
9 # Miscellaneous
10 #
11
12 vsp1_device() {
13         $mediactl -d $mdev -p | grep 'bus info' | sed 's/.*platform://'
14 }
15
16 vsp1_model() {
17         $mediactl -d $mdev -p | grep 'model' | sed 's/.* //'
18 }
19
20 vsp1_generation() {
21         echo $(vsp1_model) | sed 's/-.*//'
22 }
23
24 vsp1_has_feature() {
25         local feature=$1
26         local entity_name=$(echo $feature | sed 's/\[.*//')
27
28         ($mediactl -d $mdev -p | grep -q -- "- entity.*$entity_name") || return
29
30         local option=$(echo $feature | cut -d '[' -f 2 -s | cut -d ']' -f 1)
31
32         [ -z $option ] && return
33
34         local key=$(echo $option | sed 's/:.*//')
35         local value=$(echo $option | sed "s/.*:'\(.*\)'/\1/")
36
37         case $key in
38         control)
39                 vsp1_has_control $entity_name "$value"
40                 return
41                 ;;
42         *)
43                 return 1
44                 ;;
45         esac
46 }
47
48 vsp1_count_rpfs() {
49         $mediactl -d $mdev -p | grep -- '- entity.*rpf.[0-9] [^i]' | wc -l
50 }
51
52 vsp1_count_wpfs() {
53         $mediactl -d $mdev -p | grep -- '- entity.*wpf.[0-9] [^o]' | wc -l
54 }
55
56 vsp1_count_bru_inputs() {
57         local num_pads=`media-ctl -p | grep 'entity.*bru' | sed 's/.*(\([0-9]\) pads.*/\1/'`
58         echo $((num_pads-1))
59 }
60
61 vsp1_entity_subdev() {
62         $mediactl -d $mdev -e "$dev $1"
63 }
64
65 vsp1_entity_get_size() {
66         local entity=$1
67         local pad=$2
68
69         $mediactl -d $mdev --get-v4l2 "'$dev $entity':$pad" | grep fmt | \
70               sed 's/.*\/\([0-9x]*\).*/\1/'
71 }
72
73 vsp1_has_control() {
74         local subdev=$(vsp1_entity_subdev $1)
75         local control_name=$(echo $2 | tr '+' ' ')
76
77         $yavta --no-query -l $subdev | grep -q -- "$control_name"
78 }
79
80 vsp1_set_control() {
81         local entity=$1
82         local control_name=$(echo $2 | tr '+' ' ')
83         local value=$3
84
85         local subdev=$(vsp1_entity_subdev $entity)
86         local control=$($yavta --no-query -l $subdev | grep -- "$control_name" | cut -d ' ' -f 2)
87
88         echo "Setting control $control_name ($control) to $value" | ./logger.sh "$entity" >> $logfile
89         $yavta --no-query -w "$control $value" $subdev | ./logger.sh "$entity" >> $logfile
90 }
91
92 # -----------------------------------------------------------------------------
93 # Referance frame generation
94 #
95
96 reference_frame() {
97         local file=$1
98         local in_format=$2
99         local out_format=$3
100         local size=$4
101         shift 4
102
103         local alpha=
104         local options=
105
106         # Start with the input format to compute the alpha value being used by
107         # the RPF after unpacking. Keep in sync with generate_input_frame.
108         case $in_format in
109         ARGB555)
110                 # The 1-bit alpha value is expanded to 8 bits by copying the
111                 # high order bits, resulting in value of 255 after unpacking.
112                 alpha=255
113                 ;;
114         ABGR32 | ARGB32)
115                 # 8-bit alpha value, hardcoded to 200.
116                 alpha=200
117                 ;;
118         *)
119                 # In all other cases the alpha value is set through a control
120                 # whose default value is 255.
121                 alpha=255
122                 ;;
123         esac
124
125         # Convert the input alpha value based on the output format.
126         case $out_format in
127         ARGB555 | ABGR32 | ARGB32)
128                 # Pass the 8-bit alpha value unchanged to the image generator.
129                 ;;
130         XRGB555)
131                 # The format has the X bit hardcoded to 0.
132                 alpha=0
133                 ;;
134         *)
135                 # In all other cases the alpha value is set through a control
136                 # whose default value is 255.
137                 alpha=255
138                 ;;
139         esac
140
141         local arg
142         for arg in $* ; do
143                 local name=$(echo $arg | cut -d '=' -f 1)
144                 local value=$(echo $arg | cut -d '=' -f 2)
145
146                 case $name in
147                 clu)
148                         options="$options --clu $value"
149                         ;;
150                 hflip)
151                         [ x$value = x1 ] && options="$options --hflip"
152                         ;;
153                 lut)
154                         options="$options --lut $value"
155                         ;;
156                 rotate)
157                         [ x$value = x90 ] && {
158                                 options="$options --rotate" ;
159                                 __vsp_pixel_perfect=false ;
160                         }
161                         ;;
162                 vflip)
163                         [ x$value = x1 ] && options="$options --vflip"
164                         ;;
165                 esac
166         done
167
168         [ x$__vsp_bru_inputs != x ] && options="$options -c $__vsp_bru_inputs"
169
170         $genimage -i $in_format -f $out_format -s $size -a $alpha $options -o $file \
171                 frames/frame-reference-1024x768.pnm
172 }
173
174 reference_histogram() {
175         local file=$1
176         local format=$2
177         local size=$3
178
179         $genimage -i $format -f $format -s $size -H $file \
180                 frames/frame-reference-1024x768.pnm
181 }
182
183 # ------------------------------------------------------------------------------
184 # Image and histogram comparison
185 #
186
187 #
188 # Compare the two frames for exact match.
189 #
190 compare_frame_exact() {
191         local img_a=$3
192         local img_b=$4
193
194         local match='fail'
195         diff -q $img_a $img_b > /dev/null && match='pass'
196
197         echo "Compared $img_a and $img_b: $match" | ./logger.sh check >> $logfile
198
199         if [ $match = 'pass' ] ; then
200                 return 0
201         else
202                 return 1
203         fi
204 }
205
206 #
207 # Compare the two frames using a fuzzy match algorithm to account for errors
208 # introduced by the YUV packing. Accept a maximum 1% mean average error over
209 # the whole frame with no more than 5% of the pixels differing.
210 #
211 compare_frame_fuzzy() {
212         local fmt=$(echo $1 | sed 's/M$/P/')
213         local size=$2
214         local img_a=$3
215         local img_b=$4
216
217         local pnm_a=${img_a/bin/pnm}
218         local pnm_b=${img_b/bin/pnm}
219
220         raw2rgbpnm -f $fmt -s $size $img_a $pnm_a > /dev/null
221         raw2rgbpnm -f $fmt -s $size $img_b $pnm_b > /dev/null
222
223         local ae=$(compare -metric ae $pnm_a $pnm_b /dev/null 2>&1)
224         local mae=$(compare -metric mae $pnm_a $pnm_b /dev/null 2>&1 | sed 's/.*(\(.*\))/\1/')
225
226         rm $pnm_a
227         rm $pnm_b
228
229         local width=$(echo $size | cut -d 'x' -f 1)
230         local height=$(echo $size | cut -d 'x' -f 2)
231
232         local ae_match=$(echo $ae $width $height | awk '{ if ($1 / $2 / $3 < 0.05) { print "pass" } else { print "fail" } }')
233         local mae_match=$(echo $mae | awk '{ if ($1 < 0.01) { print "pass" } else { print "fail" } }')
234
235         echo "Compared $img_a and $img_b: ae $ae ($ae_match) mae $mae ($mae_match)" | ./logger.sh check >> $logfile
236
237         if [ $ae_match = 'pass' -a $mae_match = 'pass' ] ; then
238                 return 0
239         else
240                 return 1
241         fi
242 }
243
244 compare_frames() {
245         local args=$*
246         local in_format=$__vsp_rpf_format
247         local out_format=$__vsp_wpf_format
248         local wpf=$__vsp_wpf_index
249
250         local in_fmt=$(echo $in_format | tr '[:upper:]' '[:lower:]')
251         local out_fmt=$(echo $out_format | tr '[:upper:]' '[:lower:]')
252         local size=$(vsp1_entity_get_size wpf.$wpf 1)
253
254         reference_frame ${frames_dir}ref-frame.bin $in_format $out_format $size $args
255
256         local method=exact
257         local result="pass"
258         local params=${args// /-}
259         params=${params:+-$params}
260         params=${params//\//_}
261         params=${params//=/_}
262         params=${params//(/_}
263         params=${params//)/_}
264         params=$in_fmt-$out_fmt-$size$params
265
266         if [ x$__vsp_pixel_perfect != xtrue ] ; then
267                 method=fuzzy
268         fi
269
270         for frame in ${frames_dir}frame-*.bin ; do
271                 local match="true"
272
273                 (compare_frame_$method $out_format $size $frame ${frames_dir}ref-frame.bin) ||  {
274                         match="false" ;
275                         result="fail" ;
276                 }
277
278                 if [ $match = "false" -o x$VSP_KEEP_FRAMES = x1 ] ; then
279                         mv $frame ${0/.sh/}-$params-$(basename ${frame})
280                 fi
281         done
282
283         if [ x$VSP_KEEP_FRAMES = x1 -o $result = "fail" ] ; then
284                 mv ${frames_dir}ref-frame.bin ${0/.sh/}-$params-ref-frame.bin
285         else
286                 rm -f ${frames_dir}ref-frame.bin
287                 rm -f ${frames_dir}frame-*.bin
288         fi
289
290         echo $result
291 }
292
293 compare_histogram() {
294         local histo_a=$1
295         local histo_b=$2
296
297         local match='fail'
298         diff -q $histo_a $histo_b > /dev/null && match='pass'
299
300         echo "Compared $histo_a and $histo_b: $match" | ./logger.sh check >> $logfile
301
302         if [ $match = 'pass' ] ; then
303                 return 0
304         else
305                 return 1
306         fi
307 }
308
309 compare_histograms() {
310         local format=$__vsp_wpf_format
311         local wpf=$__vsp_wpf_index
312
313         local fmt=$(echo $format | tr '[:upper:]' '[:lower:]')
314         local size=$(vsp1_entity_get_size wpf.$wpf 1)
315
316         reference_histogram ${frames_dir}ref-histogram.bin $format $size
317
318         local result="pass"
319         for histo in ${frames_dir}histo-*.bin ; do
320                 (compare_histogram $histo ${frames_dir}ref-histogram.bin) || {
321                         mv $histo ${0/.sh/}-$(basename ${histo/.bin/-$fmt.bin}) ;
322                         result="fail"
323                 }
324         done
325
326         if [ $result = "fail" ] ; then
327                 mv ${frames_dir}ref-histogram.bin ${0/.sh/}-ref-histogram-$fmt.bin
328         else
329                 rm -f ${frames_dir}ref-histogram.bin
330                 rm -f ${frames_dir}histo-*.bin
331         fi
332
333         echo $result
334 }
335
336 # ------------------------------------------------------------------------------
337 # Pipeline configuration
338 #
339
340 pipe_none() {
341         # Nothing to be done
342         return
343 }
344
345 pipe_rpf_bru() {
346         local ninputs=$1
347
348         local bru_output=$(vsp1_count_bru_inputs)
349
350         for input in `seq 0 1 $((ninputs-1))` ; do
351                 $mediactl -d $mdev -l "'$dev rpf.$input':1 -> '$dev bru':$input [1]"
352         done
353         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
354         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
355
356         __vsp_bru_inputs=$ninputs
357         __vsp_wpf_index=0
358 }
359
360 pipe_rpf_bru_uds() {
361         local bru_output=$(vsp1_count_bru_inputs)
362
363         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev bru':0 [1]"
364         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev uds.0':0 [1]"
365         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
366         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
367
368         __vsp_wpf_index=0
369 }
370
371 pipe_rpf_clu() {
372         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev clu':0 [1]"
373         $mediactl -d $mdev -l "'$dev clu':1 -> '$dev wpf.0':0 [1]"
374         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
375
376         __vsp_wpf_index=0
377 }
378
379 pipe_rpf_hgo() {
380         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev wpf.0':0 [1]"
381         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev hgo':0 [1]"
382         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
383
384         __vsp_wpf_index=0
385 }
386
387 pipe_rpf_hst() {
388         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev hst':0 [1]"
389         $mediactl -d $mdev -l "'$dev hst':1 -> '$dev wpf.0':0 [1]"
390         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
391
392         __vsp_wpf_index=0
393 }
394
395 pipe_rpf_lut() {
396         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev lut':0 [1]"
397         $mediactl -d $mdev -l "'$dev lut':1 -> '$dev wpf.0':0 [1]"
398         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
399
400         __vsp_wpf_index=0
401 }
402
403 pipe_rpf_uds() {
404         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
405         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev wpf.0':0 [1]"
406         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
407
408         __vsp_wpf_index=0
409 }
410
411 pipe_rpf_uds_bru() {
412         local bru_output=$(vsp1_count_bru_inputs)
413
414         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev uds.0':0 [1]"
415         $mediactl -d $mdev -l "'$dev uds.0':1 -> '$dev bru':0 [1]"
416         $mediactl -d $mdev -l "'$dev bru':$bru_output -> '$dev wpf.0':0 [1]"
417         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
418
419         __vsp_wpf_index=0
420 }
421
422 pipe_rpf_sru() {
423         $mediactl -d $mdev -l "'$dev rpf.0':1 -> '$dev sru':0 [1]"
424         $mediactl -d $mdev -l "'$dev sru':1 -> '$dev wpf.0':0 [1]"
425         $mediactl -d $mdev -l "'$dev wpf.0':1 -> '$dev wpf.0 output':0 [1]"
426
427         __vsp_wpf_index=0
428 }
429
430 pipe_rpf_wpf() {
431         local rpf=$1
432         local wpf=$2
433
434         $mediactl -d $mdev -l "'$dev rpf.$rpf':1 -> '$dev wpf.$wpf':0 [1]"
435         $mediactl -d $mdev -l "'$dev wpf.$wpf':1 -> '$dev wpf.$wpf output':0 [1]"
436
437         __vsp_wpf_index=$wpf
438 }
439
440 pipe_reset() {
441         $mediactl -d $mdev -r
442
443         __vsp_bru_inputs=
444         __vsp_rpf_format=
445         __vsp_wpf_index=
446         __vsp_wpf_format=
447         __vsp_pixel_perfect=true
448 }
449
450 pipe_configure() {
451         local pipe=${1//-/_}
452         shift 1
453
454         pipe_reset
455         pipe_$pipe $*
456 }
457
458 # ------------------------------------------------------------------------------
459 # Format Configuration
460 #
461
462 format_v4l2_to_mbus() {
463         case $1 in
464         RGB332 | ARGB555 | XRGB555 | RGB565 | BGR24 | RGB24 | XBGR32 | XRGB32 | ABGR32 | ARGB32)
465                 echo "ARGB32";
466                 ;;
467
468         HSV24 | HSV32)
469                 echo "AHSV8888_1X32";
470                 ;;
471
472         UYVY | VYUY | YUYV | YVYU | NV12M | NV16M | NV21M | NV61M | YUV420M | YUV422M | YUV444M | YVU420M | YVU422M | YVU444M)
473                 echo "AYUV32"
474                 ;;
475
476         *)
477                 echo "Invalid format $1" >&2
478                 echo -e "Valid formats are
479 \tRGB332, ARGB555, XRGB555, RGB565, BGR24, RGB24,
480 \tXBGR32, XRGB32, ABGR32, ARGB32, HSV24, HSV32
481 \tUYVY, VYUY, YUYV, YVYU,
482 \tNV12M, NV16M, NV21M, NV61M,
483 \tYUV420M, YUV422M, YUV444M,
484 \tYVU420M, YVU422M, YVU444M" >&2
485                 exit 1
486         esac
487 }
488
489 format_v4l2_is_yuv() {
490         local format=$(format_v4l2_to_mbus $1)
491         [ $format = 'AYUV32' ]
492 }
493
494 format_rpf() {
495         local format=$(format_v4l2_to_mbus $1)
496         local size=$2
497         local rpf=$3
498
499         $mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$format/$size]"
500
501         __vsp_rpf_format=$1
502 }
503
504 format_rpf_bru() {
505         local format=$(format_v4l2_to_mbus $1)
506         local size=$2
507         local ninputs=$3
508         local offset=0
509
510         local bru_output=$(vsp1_count_bru_inputs)
511
512         for input in `seq 0 1 $((ninputs-1))` ; do
513                 offset=$((offset+50))
514                 $mediactl -d $mdev -V "'$dev rpf.$input':0 [fmt:$format/$size]"
515                 $mediactl -d $mdev -V "'$dev bru':$input   [fmt:$format/$size compose:($offset,$offset)/$size]"
516         done
517
518         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$format/$size]"
519         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
520         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
521
522         __vsp_rpf_format=$1
523         __vsp_wpf_format=$1
524 }
525
526 format_rpf_bru_uds() {
527         local infmt=$(format_v4l2_to_mbus $1)
528         local insize=$2
529         local outfmt=$(format_v4l2_to_mbus $3)
530         local outsize=$4
531
532         local bru_output=$(vsp1_count_bru_inputs)
533
534         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
535         $mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$insize]"
536         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$insize]"
537         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
538         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
539         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
540         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
541
542         [ $insize != $outsize ] && __vsp_pixel_perfect=false
543         __vsp_rpf_format=$1
544         __vsp_wpf_format=$3
545 }
546
547 format_rpf_clu() {
548         local format=$(format_v4l2_to_mbus $1)
549         local size=$2
550
551         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
552         $mediactl -d $mdev -V "'$dev clu':0 [fmt:$format/$size]"
553         $mediactl -d $mdev -V "'$dev clu':1 [fmt:$format/$size]"
554         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
555         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
556
557         __vsp_rpf_format=$1
558         __vsp_wpf_format=$1
559 }
560
561 format_rpf_hst() {
562         local format=$(format_v4l2_to_mbus $1)
563         local size=$2
564
565         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
566         $mediactl -d $mdev -V "'$dev hst':0 [fmt:$format/$size]"
567         $mediactl -d $mdev -V "'$dev hst':1 [fmt:AHSV8888_1X32/$size]"
568         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:AHSV8888_1X32/$size]"
569         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:AHSV8888_1X32/$size]"
570
571         __vsp_rpf_format=$1
572         __vsp_wpf_format=$3
573 }
574
575 format_rpf_hgo() {
576         local format=$(format_v4l2_to_mbus $1)
577         local size=$2
578         local crop=${3:+crop:$3}
579         local compose=${4:+compose:$4}
580
581         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
582         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
583         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
584         $mediactl -d $mdev -V "'$dev hgo':0   [fmt:$format/$size $crop $compose]"
585
586         __vsp_rpf_format=$1
587         __vsp_wpf_format=$1
588 }
589
590 format_rpf_lut() {
591         local format=$(format_v4l2_to_mbus $1)
592         local size=$2
593
594         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$format/$size]"
595         $mediactl -d $mdev -V "'$dev lut':0 [fmt:$format/$size]"
596         $mediactl -d $mdev -V "'$dev lut':1 [fmt:$format/$size]"
597         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$format/$size]"
598         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$format/$size]"
599
600         __vsp_rpf_format=$1
601         __vsp_wpf_format=$1
602 }
603
604 format_rpf_uds() {
605         local infmt=$(format_v4l2_to_mbus $1)
606         local insize=$2
607         local outfmt=$(format_v4l2_to_mbus $3)
608         local outsize=$4
609
610         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
611         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
612         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
613         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
614         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
615
616         [ $insize != $outsize ] && __vsp_pixel_perfect=false
617         __vsp_rpf_format=$1
618         __vsp_wpf_format=$3
619 }
620
621 format_rpf_uds_bru() {
622         local infmt=$(format_v4l2_to_mbus $1)
623         local insize=$2
624         local outfmt=$(format_v4l2_to_mbus $3)
625         local outsize=$4
626
627         local bru_output=$(vsp1_count_bru_inputs)
628
629         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
630         $mediactl -d $mdev -V "'$dev uds.0':0 [fmt:$infmt/$insize]"
631         $mediactl -d $mdev -V "'$dev uds.0':1 [fmt:$infmt/$outsize]"
632         $mediactl -d $mdev -V "'$dev bru':0 [fmt:$infmt/$outsize]"
633         $mediactl -d $mdev -V "'$dev bru':$bru_output [fmt:$infmt/$outsize]"
634         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
635         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
636
637         [ $insize != $outsize ] && __vsp_pixel_perfect=false
638         __vsp_rpf_format=$1
639         __vsp_wpf_format=$3
640 }
641
642 format_rpf_sru() {
643         local infmt=$(format_v4l2_to_mbus $1)
644         local insize=$2
645         local outfmt=$(format_v4l2_to_mbus $3)
646         local outsize=$4
647
648         $mediactl -d $mdev -V "'$dev rpf.0':0 [fmt:$infmt/$insize]"
649         $mediactl -d $mdev -V "'$dev sru':0 [fmt:$infmt/$insize]"
650         $mediactl -d $mdev -V "'$dev sru':1 [fmt:$infmt/$outsize]"
651         $mediactl -d $mdev -V "'$dev wpf.0':0 [fmt:$infmt/$outsize]"
652         $mediactl -d $mdev -V "'$dev wpf.0':1 [fmt:$outfmt/$outsize]"
653
654         __vsp_pixel_perfect=false
655         __vsp_rpf_format=$1
656         __vsp_wpf_format=$3
657 }
658
659 format_rpf_wpf() {
660         local rpf=$1
661         local wpf=$2
662         local infmt=$(format_v4l2_to_mbus $3)
663         local size=$4
664         local outfmt=$(format_v4l2_to_mbus $5)
665         local crop=$6
666         local outsize=
667
668         if [ x$crop != 'x' ] ; then
669                 crop="crop:$crop"
670                 outsize=$(echo $crop | sed 's/.*\///')
671         else
672                 outsize=$size
673         fi
674
675         $mediactl -d $mdev -V "'$dev rpf.$rpf':0 [fmt:$infmt/$size]"
676         $mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$infmt/$size $crop]"
677         $mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$outfmt/$outsize]"
678
679         __vsp_rpf_format=$3
680         __vsp_wpf_format=$5
681 }
682
683 format_wpf() {
684         local format=$(format_v4l2_to_mbus $1)
685         local size=$2
686         local wpf=$3
687
688         $mediactl -d $mdev -V "'$dev wpf.$wpf':0 [fmt:$format/$size]"
689         $mediactl -d $mdev -V "'$dev wpf.$wpf':1 [fmt:$format/$size]"
690
691         __vsp_wpf_format=$1
692 }
693
694 format_configure() {
695         local pipe=${1//-/_}
696         shift 1
697
698         format_$pipe $*
699 }
700
701 # ------------------------------------------------------------------------------
702 # Frame capture and output
703 #
704
705 generate_input_frame() {
706         local file=$1
707         local format=$2
708         local size=$3
709
710         local alpha=
711         local options=
712
713         case $format in
714         ARGB555)
715                 alpha=255
716                 ;;
717         ABGR32 | ARGB32)
718                 alpha=200
719                 ;;
720         XRGB555 | XBGR32 | XRGB32)
721                 alpha=0
722                 ;;
723         *)
724                 alpha=255
725                 ;;
726         esac
727
728         $(format_v4l2_is_yuv $format) && options="$options -C -i YUV444M"
729
730         $genimage -f $format -s $size -a $alpha $options -o $file \
731                 frames/frame-reference-1024x768.pnm
732 }
733
734 vsp_runner() {
735         local entity=$1
736         shift
737
738         local option
739         local buffers=4
740         local count=10
741         local pause=
742         local skip=7
743
744         for option in $* ; do
745                 case $option in
746                 --buffers=*)
747                         buffers=${option/--buffers=/}
748                         ;;
749
750                 --count=*)
751                         count=${option/--count=/}
752                         ;;
753
754                 --pause=*)
755                         pause=${option/--pause=/}
756                         ;;
757
758                 --skip=*)
759                         skip=${option/--skip=/}
760                         ;;
761
762                 *)
763                         return 1
764                         ;;
765                 esac
766         done
767
768         local file
769         local videodev
770         local format
771         local size
772
773         case $entity in
774         hgo)
775                 videodev=$(vsp1_entity_subdev "hgo histo")
776                 file="${frames_dir}histo-#.bin"
777                 buffers=10
778                 ;;
779
780         rpf.*)
781                 videodev=$(vsp1_entity_subdev "$entity input")
782                 format=$__vsp_rpf_format
783                 size=$(vsp1_entity_get_size $entity 0)
784                 file=${frames_dir}${entity}.bin
785                 generate_input_frame $file $format $size
786                 ;;
787
788         wpf.*)
789                 videodev=$(vsp1_entity_subdev "$entity output")
790                 format=$__vsp_wpf_format
791                 size=$(vsp1_entity_get_size $entity 1)
792                 file="${frames_dir}frame-#.bin"
793                 ;;
794         esac
795
796         $yavta -c$count -n $buffers ${format:+-f $format} ${size:+-s $size} \
797                 ${skip:+--skip $skip} ${file:+--file=$file} ${pause:+-p$pause} \
798                 $videodev | ./logger.sh $entity >> $logfile
799 }
800
801 vsp_runner_find() {
802         local entity=$1
803         local videodev
804
805         case $entity in
806         hgo)
807                 videodev=$(vsp1_entity_subdev "hgo histo")
808                 ;;
809
810         rpf.*)
811                 videodev=$(vsp1_entity_subdev "$entity input")
812                 ;;
813
814         wpf.*)
815                 videodev=$(vsp1_entity_subdev "$entity output")
816                 ;;
817         esac
818
819         local pid
820
821         for pid in $(pidof yavta) ; do
822                 (ls -l /proc/$pid/fd/ | grep -q "$videodev$") && {
823                         echo $pid ;
824                         break
825                 }
826         done
827 }
828
829 vsp_runner_wait() {
830         local timeout=5
831         local pid
832
833         while [ $timeout != 0 ] ; do
834                 pid=$(vsp_runner_find $1)
835                 [ x$pid != x ] && break
836                 sleep 1
837                 timeout=$((timeout-1))
838         done
839
840         [ x$pid != x ] || return
841
842         while [ ! -f .yavta.wait.$pid ] ; do
843                 sleep 1
844         done
845 }
846
847 vsp_runner_resume() {
848         local pid=$(vsp_runner_find $1)
849
850         [ x$pid != x ] && kill -USR1 $pid
851 }
852
853 # ------------------------------------------------------------------------------
854 # Test run
855 #
856
857 test_init() {
858         export logfile=${1/sh/log}
859         local features=$2
860         local optional_features=$3
861
862         rm -f $logfile
863         rm -f ${1/.sh/}*.bin
864
865         local best_features_count=0
866         local best_mdev=
867
868         for mdev in /dev/media* ; do
869                 dev=$(vsp1_device $mdev)
870
871                 local match='true'
872                 for feature in $features ; do
873                         $(vsp1_has_feature "$feature") || {
874                                 match='false';
875                                 break;
876                         }
877                 done
878
879                 if [ $match == 'false' ] ; then
880                         continue
881                 fi
882
883                 if [ -z "$optional_features" ] ; then
884                         best_mdev=$mdev
885                         break
886                 fi
887
888                 local features_count=0
889                 for feature in $optional_features ; do
890                         $(vsp1_has_feature "$feature") && {
891                                 features_count=$((features_count+1))
892                                 match='false';
893                                 break;
894                         }
895                 done
896
897                 if [ $features_count -ge $best_features_count ] ; then
898                         best_mdev=$mdev
899                         best_features_count=$features_count
900                 fi
901         done
902
903         if [ -z $best_mdev ] ; then
904                 echo "No device found with feature set \`$features'" | ./logger.sh config >> $logfile
905                 echo "Test requires unavailable feature set \`$features': skipped" >&2
906                 exit 1
907         fi
908
909         mdev=$best_mdev
910         dev=$(vsp1_device $mdev)
911         echo "Using device $mdev ($dev)" | ./logger.sh config >> $logfile
912
913         vsp_runner=./vsp-runner.sh
914 }
915
916 test_start() {
917         echo "Testing $1" | ./logger.sh >> $logfile
918         echo -n "Testing $1: " >&2
919 }
920
921 test_complete() {
922         echo "Done: $1" | ./logger.sh >> $logfile
923         echo $1 >&2
924
925         rm -f ${frames_dir}frame-*.bin
926         rm -f ${frames_dir}histo-*.bin
927         rm -f ${frames_dir}rpf.*.bin
928 }
929
930 test_run() {
931         test_main | ./logger.sh error >> $logfile
932 }