Adding support for VTM to rd_collect.sh.
[daala.git] / tools / rd_collect.sh
1 #!/bin/bash
2 set -e
3
4 CODECS="<daala|libaom|libaom-rt|vp8|vp9|x264|x265|libjpeg|mozjpeg|theora|webp|bpg|rav1e|svt-av1|vtm>"
5
6 if [ $# == 0 ]; then
7   echo "usage: DAALA_ROOT=<build_dir> $0 $CODECS *.y4m"
8   exit 1
9 fi
10
11 export CODEC=$1
12 shift
13
14 if [ $# == 0 ] || [[ ! $CODECS =~ [\<\|]$CODEC[\|\>] ]]; then
15   echo "usage: DAALA_ROOT=<build_dir> $0 $CODECS *.y4m"
16   exit 1
17 fi
18
19 if [ -z $DAALA_ROOT ]; then
20   DAALA_ROOT=.
21 fi
22
23 if [ -z $TOOLS_ROOT ]; then
24   TOOLS_ROOT=$DAALA_ROOT
25 fi
26
27 export EXTRA_OPTS=$EXTRA_OPTS
28
29 if [ ! -d $DAALA_ROOT ]; then
30   echo "Please set DAALA_ROOT to the location of your daala git clone"
31   exit 1
32 fi
33
34 case $CODEC in
35   daala)
36     if [ ! -f $DAALA_ROOT/config.h ]; then
37       echo "File not found $DAALA_ROOT/config.h"
38       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
39       exit 1
40     fi
41
42     if [ -z "$ENCODER_EXAMPLE" ]; then
43       export ENCODER_EXAMPLE=$DAALA_ROOT/examples/encoder_example
44     fi
45
46     if [ ! -x "$ENCODER_EXAMPLE" ]; then
47       echo "Executable not found ENCODER_EXAMPLE=$ENCODER_EXAMPLE"
48       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
49       exit 1
50     fi
51
52     if [ -z "$DUMP_VIDEO" ]; then
53       export DUMP_VIDEO=$DAALA_ROOT/examples/dump_video
54     fi
55
56     if [ ! -x "$DUMP_VIDEO" ]; then
57       echo "Executable not found DUMP_VIDEO=$DUMP_VIDEO"
58       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
59       exit 1
60     fi
61
62     if [ -z "$QPS" ]; then
63       QPS="5 7 11 16 25 37 55 81 122 181 270 400"
64     fi
65
66     export RD_COLLECT_SUB=$(dirname "$0")/rd_collect_daala.sh
67     ;;
68   libaom | libaom-rt)
69     if [ -z $AOM_ROOT ] || [ ! -d $AOM_ROOT ]; then
70       echo "Please set AOM_ROOT to the location of your aom git clone"
71       exit 1
72     fi
73
74     if [ -z "$AOMENC" ]; then
75       export AOMENC=$AOM_ROOT/aomenc
76     fi
77
78     if [ -z "$AOMDEC" ]; then
79       export AOMDEC=$AOM_ROOT/aomdec
80     fi
81
82     if [ ! -x "$AOMENC" ]; then
83       echo "Executable not found AOMENC=$AOMENC"
84       echo "Do you have the right AOM_ROOT=$AOM_ROOT"
85       exit 1
86     fi
87
88     if [ ! -x "$AOMDEC" ]; then
89       echo "Executable not found AOMDEC=$AOMDEC"
90       echo "Do you have the right AOM_ROOT=$AOM_ROOT"
91       exit 1
92     fi
93
94     if [ -z "$QPS" ]; then
95       QPS="20 32 43 55 63"
96     fi
97
98     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_libaom.sh
99     ;;
100   vp8)
101     if [ -z $LIBVPX_ROOT ] || [ ! -d $LIBVPX_ROOT ]; then
102       echo "Please set LIBVPX_ROOT to the location of your libvpx git clone"
103       exit 1
104     fi
105
106     if [ -z "$VPXENC" ]; then
107       export VPXENC=$LIBVPX_ROOT/vpxenc
108     fi
109
110     if [ -z "$VPXDEC" ]; then
111       export VPXDEC=$LIBVPX_ROOT/vpxdec
112     fi
113
114     if [ ! -x "$VPXENC" ]; then
115       echo "Executable not found VPXENC=$VPXENC"
116       echo "Do you have the right LIBVPX_ROOT=$LIBVPX_ROOT"
117       exit 1
118     fi
119
120     if [ ! -x "$VPXDEC" ]; then
121       echo "Executable not found VPXDEC=$VPXDEC"
122       echo "Do you have the right LIBVPX_ROOT=$LIBVPX_ROOT"
123       exit 1
124     fi
125
126     if [ -z "$QPS" ]; then
127       QPS=$(seq 12 5 64)
128     fi
129
130     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_libvpx.sh
131     ;;
132   vp9)
133     if [ -z $LIBVPX_ROOT ] || [ ! -d $LIBVPX_ROOT ]; then
134       echo "Please set LIBVPX_ROOT to the location of your libvpx git clone"
135       exit 1
136     fi
137
138     if [ -z "$VPXENC" ]; then
139       export VPXENC=$LIBVPX_ROOT/vpxenc
140     fi
141
142     if [ -z "$VPXDEC" ]; then
143       export VPXDEC=$LIBVPX_ROOT/vpxdec
144     fi
145
146     if [ ! -x "$VPXENC" ]; then
147       echo "Executable not found VPXENC=$VPXENC"
148       echo "Do you have the right LIBVPX_ROOT=$LIBVPX_ROOT"
149       exit 1
150     fi
151
152     if [ ! -x "$VPXDEC" ]; then
153       echo "Executable not found VPXDEC=$VPXDEC"
154       echo "Do you have the right LIBVPX_ROOT=$LIBVPX_ROOT"
155       exit 1
156     fi
157
158     if [ -z "$QPS" ]; then
159       QPS="20 32 43 55 63"
160     fi
161
162     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_libvpx.sh
163     ;;
164   x264)
165     if [ -z $X264_ROOT ] || [ ! -d $X264_ROOT ]; then
166       echo "Please set X264_ROOT to the location of your x264 git clone"
167       exit 1
168     fi
169
170     if [ -z "$X264" ]; then
171       export X264=$X264_ROOT/x264
172     fi
173
174     if [ ! -x "$X264" ]; then
175       echo "Executable not found X264=$X264"
176       echo "Do you have the right X264_ROOT=$X264_ROOT"
177       exit 1
178     fi
179
180     if [ -z "$QPS" ]; then
181       QPS=$(seq 1 51)
182     fi
183
184     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_x264.sh
185     ;;
186   x265)
187     if [ -z $X265_ROOT ] || [ ! -d $X265_ROOT ]; then
188       echo "Please set X265_ROOT to the location of your x265 hg checkout"
189       exit 1
190     fi
191
192     if [ -z "$X265" ]; then
193       export X265=$X265_ROOT/build/linux/x265
194     fi
195
196     if [ ! -x "$X265" ]; then
197       echo "Executable not found X265=$X265"
198       echo "Do you have the right X265_ROOT=$X265_ROOT"
199       exit 1
200     fi
201
202     if [ -z "$QPS" ]; then
203       QPS=$(seq 1 51)
204     fi
205
206     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_x265.sh
207     ;;
208   libjpeg)
209     if [ -z "$YUVJPEG" ]; then
210       export YUVJPEG=$DAALA_ROOT/tools/yuvjpeg
211     fi
212
213     if [ -z "$JPEGYUV" ]; then
214       export JPEGYUV=$DAALA_ROOT/tools/jpegyuv
215     fi
216
217     if [ ! -x "$YUVJPEG" ]; then
218       echo "Executable not found YUVJPEG=$YUVJPEG"
219       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
220       exit 1
221     fi
222
223     if [ ! -x "$JPEGYUV" ]; then
224       echo "Executable not found JPEGYUV=$JPEGYUV"
225       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
226       exit 1
227     fi
228
229     if [ -z "$QPS" ]; then
230       QPS=$(seq 100 -1 0)
231     fi
232
233     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_jpeg.sh
234     ;;
235   mozjpeg)
236     if [ -z $MOZJPEG_ROOT ] || [ ! -d $MOZJPEG_ROOT ]; then
237       echo "Please set MOZJPEG_ROOT to the location of your mozjpeg git clone"
238       exit 1
239     fi
240
241     if [ -z "$YUVJPEG" ]; then
242       export YUVJPEG=$MOZJPEG_ROOT/yuvjpeg
243     fi
244
245     if [ -z "$JPEGYUV" ]; then
246       export JPEGYUV=$MOZJPEG_ROOT/jpegyuv
247     fi
248
249     if [ ! -x "$YUVJPEG" ]; then
250       echo "Executable not found YUVJPEG=$YUVJPEG"
251       echo "Do you have the right MOZJPEG_ROOT=$MOZJPEG_ROOT"
252       exit 1
253     fi
254
255     if [ ! -x "$JPEGYUV" ]; then
256       echo "Executable not found JPEGYUV=$JPEGYUV"
257       echo "Do you have the right MOZJPEG_ROOT=$MOZJPEG_ROOT"
258       exit 1
259     fi
260
261     if [ -z "$QPS" ]; then
262       QPS=$(seq 100 -1 0)
263     fi
264
265     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_jpeg.sh
266     ;;
267   theora)
268     if [ -z $THEORA_ROOT ] || [ ! -d $THEORA_ROOT ]; then
269       echo "Please set THEORA_ROOT to the location of your theora svn checkout"
270       exit 1
271     fi
272
273     if [ -z "$ENCODER_EXAMPLE" ]; then
274       export ENCODER_EXAMPLE=$THEORA_ROOT/examples/encoder_example
275     fi
276
277     if [ -z "$DUMP_VIDEO" ]; then
278       export DUMP_VIDEO=$THEORA_ROOT/examples/dump_video
279     fi
280
281     if [ ! -x "$ENCODER_EXAMPLE" ]; then
282       echo "Executable not found ENCODER_EXAMPLE=$ENCODER_EXAMPLE"
283       echo "Do you have the right THEORA_ROOT=$THEORA_ROOT"
284       exit 1
285     fi
286
287     if [ ! -x "$DUMP_VIDEO" ]; then
288       echo "Executable not found DUMP_VIDEO=$DUMP_VIDEO"
289       echo "Do you have the right THEORA_ROOT=$THEORA_ROOT"
290       exit 1
291     fi
292
293     if [ -z "$QPS" ]; then
294       QPS=$(seq 63 -1 0)
295     fi
296
297     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_theora.sh
298     ;;
299   webp)
300     if [ -z $WEBP_ROOT ] || [ ! -d $WEBP_ROOT ]; then
301       echo "Please set WEBP_ROOT to the location of your webp checkout"
302       exit 1
303     fi
304
305     if [ -z "$CWEBP" ]; then
306       export CWEBP=$WEBP_ROOT/examples/cwebp
307     fi
308
309     if [ -z "$DWEBP" ]; then
310       export DWEBP=$WEBP_ROOT/examples/dwebp
311     fi
312
313     if [ ! -x "$CWEBP" ]; then
314       echo "Executable not found CWEBP=$CWEBP"
315       echo "Do you have the right WEBP_ROOT=$WEBP_ROOT"
316       exit 1
317     fi
318
319     if [ ! -x "$DWEBP" ]; then
320       echo "Executable not found DWEBP=$DWEBP"
321       echo "Do you have the right WEBP_ROOT=$WEBP_ROOT"
322       exit 1
323     fi
324
325     if [ -z "$QPS" ]; then
326       QPS=$(seq 100 -1 0)
327     fi
328
329     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_webp.sh
330     ;;
331   bpg)
332     if [ -z $BPG_ROOT ] || [ ! -d $BPG_ROOT ]; then
333       echo "Please set BPG_ROOT to the location of your libbpg checkout"
334       exit 1
335     fi
336
337     if [ -z "$BPGENC" ]; then
338       export BPGENC=$BPG_ROOT/bpgenc
339     fi
340
341     if [ -z "$BPGDEC" ]; then
342       export BPGDEC=$BPG_ROOT/bpgdec
343     fi
344
345     if [ ! -x "$BPGENC" ]; then
346       echo "Executable not found BPGENC=$BPGENC"
347       echo "Do you have the right BPG_ROOT=$BPG_ROOT"
348       exit 1
349     fi
350
351     if [ ! -x "$BPGDEC" ]; then
352       echo "Executable not found BPGDEC=$BPGDEC"
353       echo "Do you have the right BPG_ROOT=$BPG_ROOT"
354       exit 1
355     fi
356
357     if [ -z "$QPS" ]; then
358       QPS=$(seq 1 51)
359     fi
360
361     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_bpg.sh
362     ;;
363   rav1e)
364     if [ -z $RAV1E_ROOT ] || [ ! -d $RAV1E_ROOT ]; then
365       echo "Please set RAV1E_ROOT to the location of your rav1e git clone"
366       exit 1
367     fi
368
369     if [ -z "$RAV1E" ]; then
370       export RAV1E="$RAV1E_ROOT/target/release/rav1e"
371     fi
372
373     if [ ! -x "$RAV1E" ]; then
374       echo "Executable not found RAV1E=$RAV1E"
375       echo "Do you have the right RAV1E_ROOT=$RAV1E_ROOT"
376       exit 1
377     fi
378
379     if [ -z "$QPS" ]; then
380       QPS="80 128 172 220 252"
381     fi
382
383     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_rav1e.sh
384     ;;
385   svt-av1)
386     if [ -z $SVTAV1_ROOT ] || [ ! -d $SVTAV1_ROOT ]; then
387       echo "Please set SVTAV1_ROOT to the location of your SVT-AV1 git clone"
388       exit 1
389     fi
390
391     if [ -z "$SVTAV1" ]; then
392       export SVTAV1="$SVTAV1_ROOT/Bin/Release/SvtAv1EncApp"
393     fi
394
395     if [ ! -x "$SVTAV1" ]; then
396       echo "Executable not found SVTAV1=$SVTAV1"
397       echo "Do you have the right SVTAV1_ROOT=$SVTAV1_ROOT"
398       exit 1
399     fi
400
401     if [ -z "$QPS" ]; then
402       QPS="20 32 43 55 63"
403     fi
404
405     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_svtav1.sh
406     ;;
407   vtm)
408     if [ -z $VTM_ROOT ] || [ ! -d $VTM_ROOT ]; then
409       echo "Please set VTM_ROOT to the location of your VTM git clone"
410       exit 1
411     fi
412
413     if [ -z "$VTM" ]; then
414       export VTM="$VTM_ROOT/bin/EncoderAppStatic"
415     fi
416
417     if [ ! -x "$VTM" ]; then
418       echo "Executable not found VTM=$VTM"
419       echo "Do you have the right VTM_ROOT=$VTM_ROOT"
420       exit 1
421     fi
422
423     if [ -z "$QPS" ]; then
424       QPS="20 32 43 55 63"
425     fi
426
427     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_vtm.sh
428     ;;
429   *)
430     echo "Unknown codec: $CODEC"
431     exit 1
432 esac
433
434 if [ -z "$PLANE" ]; then
435   export PLANE=0
436 fi
437
438 if [ $PLANE != 0 ] && [ $PLANE != 1 ] && [ $PLANE != 2 ] &&
439   [ $PLANE != -1 ]; then
440   echo "Invalid plane $PLANE. Must be 0, 1, 2, or -1 (all planes)."
441   exit 1
442 fi
443
444 # TODO refactor these out of the daala project into a metrics project
445
446 if [ -z "$YUV2YUV4MPEG" ]; then
447   export YUV2YUV4MPEG=$TOOLS_ROOT/tools/yuv2yuv4mpeg
448 fi
449
450 if [ -z "$Y4M2PNG" ]; then
451   export Y4M2PNG=$TOOLS_ROOT/tools/y4m2png
452 fi
453
454 if [ -z "$Y4M2YUV" ]; then
455   export Y4M2YUV=$TOOLS_ROOT/tools/y4m2yuv
456 fi
457
458 if [ -z "$PNG2Y4M" ]; then
459   export PNG2Y4M=$TOOLS_ROOT/tools/png2y4m
460 fi
461
462 if [ -z "$DUMP_PSNR" ]; then
463   export DUMP_PSNR=$TOOLS_ROOT/tools/dump_psnr
464 fi
465
466 if [ -z "$DUMP_PSNRHVS" ]; then
467   export DUMP_PSNRHVS=$TOOLS_ROOT/tools/dump_psnrhvs
468 fi
469
470 if [ -z "$DUMP_SSIM" ]; then
471   export DUMP_SSIM=$TOOLS_ROOT/tools/dump_ssim
472 fi
473
474 if [ -z "$DUMP_FASTSSIM" ]; then
475   export DUMP_FASTSSIM=$TOOLS_ROOT/tools/dump_fastssim
476 fi
477
478 if [ -z "$DUMP_CIEDE" ]; then
479   export DUMP_CIEDE=$(dirname $0)/dump_ciede2000.py
480 fi
481
482 if [ ! -x "$YUV2YUV4MPEG" ]; then
483   echo "Executable not found YUV2YUV4MPEG=$YUV2YUV4MPEG"
484   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
485   exit 1
486 fi
487
488 if [ ! -x "$Y4M2PNG" ]; then
489   echo "Executable not found Y4M2PNG=$Y4M2PNG"
490   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
491   exit 1
492 fi
493
494 if [ ! -x "$Y4M2YUV" ]; then
495   echo "Executable not found Y4M2YUV=$Y4M2YUV"
496   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
497   exit 1
498 fi
499
500 if [ ! -x "$PNG2Y4M" ]; then
501   echo "Executable not found PNG2Y4M=$PNG2Y4M"
502   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
503   exit 1
504 fi
505
506 if [ ! -x "$DUMP_PSNR" ]; then
507   echo "Executable not found DUMP_PSNR=$DUMP_PSNR"
508   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
509   exit 1
510 fi
511
512 if [ ! -x "$DUMP_PSNRHVS" ]; then
513   echo "Executable not found DUMP_PSNRHVS=$DUMP_PSNRHVS"
514   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
515   exit 1
516 fi
517
518 if [ ! -x "$DUMP_SSIM" ]; then
519   echo "Executable not found DUMP_FASTSSIM=$DUMP_SSIM"
520   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
521   exit 1
522 fi
523
524 if [ ! -x "$DUMP_FASTSSIM" ]; then
525   echo "Executable not found DUMP_FASTSSIM=$DUMP_FASTSSIM"
526   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
527   exit 1
528 fi
529
530 set +e
531 temp=$($DUMP_CIEDE)
532 if [ $? -ne 0 ]; then
533   echo "Warning Python dependencies not found. CIEDE2000 will not be computed."
534   echo "Required Python dependencies are: numpy, skimage and y4m."
535   if [ "$(uname -s)" = "Darwin" ]; then
536     DUMP_CIEDE=/usr/bin/true
537   else
538     DUMP_CIEDE=/bin/true
539   fi
540 fi
541 set -e
542
543 if [ -z "$CORES" ]; then
544   if [ "$(uname -s)" = "Darwin" ]; then
545     CORES=$(sysctl -n hw.ncpu)
546   else
547     CORES=$(grep -i processor /proc/cpuinfo | wc -l)
548   fi
549   #echo "CORES not set, using $CORES"
550 fi
551
552 FILES=$(find -L "$@" -type f -name "*.y4m")
553 for f in $FILES; do for q in $QPS; do printf "%s\0" $f $q; done; done | xargs -0 -n2 -P$CORES $RD_COLLECT_SUB
554 for f in $FILES; do cat $(basename $f)-$CODEC-*.out | sort -n > $(basename $f)-$CODEC.out && rm $(basename $f)-$CODEC-*.out; done