Add QP parallelization to rd_collect for daala.
[daala.git] / tools / rd_collect.sh
1 #!/bin/bash
2 set -e
3
4 CODECS="<daala|av1|av1-rt|vp8|vp9|x264|x265|libjpeg|mozjpeg|theora|webp|bpg|rav1e|svt-av1>"
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   av1 | av1-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     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_aom.sh
95     ;;
96   vp8 | vp9)
97     if [ -z $LIBVPX_ROOT ] || [ ! -d $LIBVPX_ROOT ]; then
98       echo "Please set LIBVPX_ROOT to the location of your libvpx git clone"
99       exit 1
100     fi
101
102     if [ -z "$VPXENC" ]; then
103       export VPXENC=$LIBVPX_ROOT/vpxenc
104     fi
105
106     if [ -z "$VPXDEC" ]; then
107       export VPXDEC=$LIBVPX_ROOT/vpxdec
108     fi
109
110     if [ ! -x "$VPXENC" ]; then
111       echo "Executable not found VPXENC=$VPXENC"
112       echo "Do you have the right LIBVPX_ROOT=$LIBVPX_ROOT"
113       exit 1
114     fi
115
116     if [ ! -x "$VPXDEC" ]; then
117       echo "Executable not found VPXDEC=$VPXDEC"
118       echo "Do you have the right LIBVPX_ROOT=$LIBVPX_ROOT"
119       exit 1
120     fi
121
122     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_libvpx.sh
123     ;;
124   x264)
125     if [ -z $X264_ROOT ] || [ ! -d $X264_ROOT ]; then
126       echo "Please set X264_ROOT to the location of your x264 git clone"
127       exit 1
128     fi
129
130     if [ -z "$X264" ]; then
131       export X264=$X264_ROOT/x264
132     fi
133
134     if [ ! -x "$X264" ]; then
135       echo "Executable not found X264=$X264"
136       echo "Do you have the right X264_ROOT=$X264_ROOT"
137       exit 1
138     fi
139
140     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_x264.sh
141     ;;
142   x265)
143     if [ -z $X265_ROOT ] || [ ! -d $X265_ROOT ]; then
144       echo "Please set X265_ROOT to the location of your x265 hg checkout"
145       exit 1
146     fi
147
148     if [ -z "$X265" ]; then
149       export X265=$X265_ROOT/build/linux/x265
150     fi
151
152     if [ ! -x "$X265" ]; then
153       echo "Executable not found X265=$X265"
154       echo "Do you have the right X265_ROOT=$X265_ROOT"
155       exit 1
156     fi
157
158     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_x265.sh
159     ;;
160   libjpeg)
161     if [ -z "$YUVJPEG" ]; then
162       export YUVJPEG=$DAALA_ROOT/tools/yuvjpeg
163     fi
164
165     if [ -z "$JPEGYUV" ]; then
166       export JPEGYUV=$DAALA_ROOT/tools/jpegyuv
167     fi
168
169     if [ ! -x "$YUVJPEG" ]; then
170       echo "Executable not found YUVJPEG=$YUVJPEG"
171       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
172       exit 1
173     fi
174
175     if [ ! -x "$JPEGYUV" ]; then
176       echo "Executable not found JPEGYUV=$JPEGYUV"
177       echo "Do you have the right DAALA_ROOT=$DAALA_ROOT"
178       exit 1
179     fi
180
181     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_jpeg.sh
182     ;;
183   mozjpeg)
184     if [ -z $MOZJPEG_ROOT ] || [ ! -d $MOZJPEG_ROOT ]; then
185       echo "Please set MOZJPEG_ROOT to the location of your mozjpeg git clone"
186       exit 1
187     fi
188
189     if [ -z "$YUVJPEG" ]; then
190       export YUVJPEG=$MOZJPEG_ROOT/yuvjpeg
191     fi
192
193     if [ -z "$JPEGYUV" ]; then
194       export JPEGYUV=$MOZJPEG_ROOT/jpegyuv
195     fi
196
197     if [ ! -x "$YUVJPEG" ]; then
198       echo "Executable not found YUVJPEG=$YUVJPEG"
199       echo "Do you have the right MOZJPEG_ROOT=$MOZJPEG_ROOT"
200       exit 1
201     fi
202
203     if [ ! -x "$JPEGYUV" ]; then
204       echo "Executable not found JPEGYUV=$JPEGYUV"
205       echo "Do you have the right MOZJPEG_ROOT=$MOZJPEG_ROOT"
206       exit 1
207     fi
208
209     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_jpeg.sh
210     ;;
211   theora)
212     if [ -z $THEORA_ROOT ] || [ ! -d $THEORA_ROOT ]; then
213       echo "Please set THEORA_ROOT to the location of your theora svn checkout"
214       exit 1
215     fi
216
217     if [ -z "$ENCODER_EXAMPLE" ]; then
218       export ENCODER_EXAMPLE=$THEORA_ROOT/examples/encoder_example
219     fi
220
221     if [ -z "$DUMP_VIDEO" ]; then
222       export DUMP_VIDEO=$THEORA_ROOT/examples/dump_video
223     fi
224
225     if [ ! -x "$ENCODER_EXAMPLE" ]; then
226       echo "Executable not found ENCODER_EXAMPLE=$ENCODER_EXAMPLE"
227       echo "Do you have the right THEORA_ROOT=$THEORA_ROOT"
228       exit 1
229     fi
230
231     if [ ! -x "$DUMP_VIDEO" ]; then
232       echo "Executable not found DUMP_VIDEO=$DUMP_VIDEO"
233       echo "Do you have the right THEORA_ROOT=$THEORA_ROOT"
234       exit 1
235     fi
236
237     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_theora.sh
238     ;;
239   webp)
240     if [ -z $WEBP_ROOT ] || [ ! -d $WEBP_ROOT ]; then
241       echo "Please set WEBP_ROOT to the location of your webp checkout"
242       exit 1
243     fi
244
245     if [ -z "$CWEBP" ]; then
246       export CWEBP=$WEBP_ROOT/examples/cwebp
247     fi
248
249     if [ -z "$DWEBP" ]; then
250       export DWEBP=$WEBP_ROOT/examples/dwebp
251     fi
252
253     if [ ! -x "$CWEBP" ]; then
254       echo "Executable not found CWEBP=$CWEBP"
255       echo "Do you have the right WEBP_ROOT=$WEBP_ROOT"
256       exit 1
257     fi
258
259     if [ ! -x "$DWEBP" ]; then
260       echo "Executable not found DWEBP=$DWEBP"
261       echo "Do you have the right WEBP_ROOT=$WEBP_ROOT"
262       exit 1
263     fi
264
265     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_webp.sh
266     ;;
267   bpg)
268     if [ -z $BPG_ROOT ] || [ ! -d $BPG_ROOT ]; then
269       echo "Please set BPG_ROOT to the location of your libbpg checkout"
270       exit 1
271     fi
272
273     if [ -z "$BPGENC" ]; then
274       export BPGENC=$BPG_ROOT/bpgenc
275     fi
276
277     if [ -z "$BPGDEC" ]; then
278       export BPGDEC=$BPG_ROOT/bpgdec
279     fi
280
281     if [ ! -x "$BPGENC" ]; then
282       echo "Executable not found BPGENC=$BPGENC"
283       echo "Do you have the right BPG_ROOT=$BPG_ROOT"
284       exit 1
285     fi
286
287     if [ ! -x "$BPGDEC" ]; then
288       echo "Executable not found BPGDEC=$BPGDEC"
289       echo "Do you have the right BPG_ROOT=$BPG_ROOT"
290       exit 1
291     fi
292
293     export CORES=1
294     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_bpg.sh
295     ;;
296   rav1e)
297     if [ -z $RAV1E_ROOT ] || [ ! -d $RAV1E_ROOT ]; then
298       echo "Please set RAV1E_ROOT to the location of your rav1e git clone"
299       exit 1
300     fi
301
302     if [ -z "$RAV1E" ]; then
303       export RAV1E="$RAV1E_ROOT/target/release/rav1e"
304     fi
305
306     if [ ! -x "$RAV1E" ]; then
307       echo "Executable not found RAV1E=$RAV1E"
308       echo "Do you have the right RAV1E_ROOT=$RAV1E_ROOT"
309       exit 1
310     fi
311
312     if [ -z "$QPS" ]; then
313       QPS="80 128 172 220 252"
314     fi
315
316     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_rav1e.sh
317     ;;
318   svt-av1)
319     if [ -z $SVTAV1_ROOT ] || [ ! -d $SVTAV1_ROOT ]; then
320       echo "Please set SVTAV1_ROOT to the location of your SVT-AV1 git clone"
321       exit 1
322     fi
323
324     if [ -z "$SVTAV1" ]; then
325       export SVTAV1="$SVTAV1_ROOT/Bin/Release/SvtAv1EncApp"
326     fi
327
328     if [ ! -x "$SVTAV1" ]; then
329       echo "Executable not found SVTAV1=$SVTAV1"
330       echo "Do you have the right SVTAV1_ROOT=$SVTAV1_ROOT"
331       exit 1
332     fi
333
334     export RD_COLLECT_SUB=$(dirname $0)/rd_collect_svtav1.sh
335     ;;
336   *)
337     echo "Unknown codec: $CODEC"
338     exit 1
339 esac
340
341 if [ -z "$PLANE" ]; then
342   export PLANE=0
343 fi
344
345 if [ $PLANE != 0 ] && [ $PLANE != 1 ] && [ $PLANE != 2 ] &&
346   [ $PLANE != -1 ]; then
347   echo "Invalid plane $PLANE. Must be 0, 1, 2, or -1 (all planes)."
348   exit 1
349 fi
350
351 # TODO refactor these out of the daala project into a metrics project
352
353 if [ -z "$YUV2YUV4MPEG" ]; then
354   export YUV2YUV4MPEG=$TOOLS_ROOT/tools/yuv2yuv4mpeg
355 fi
356
357 if [ -z "$Y4M2PNG" ]; then
358   export Y4M2PNG=$TOOLS_ROOT/tools/y4m2png
359 fi
360
361 if [ -z "$PNG2Y4M" ]; then
362   export PNG2Y4M=$TOOLS_ROOT/tools/png2y4m
363 fi
364
365 if [ -z "$DUMP_PSNR" ]; then
366   export DUMP_PSNR=$TOOLS_ROOT/tools/dump_psnr
367 fi
368
369 if [ -z "$DUMP_PSNRHVS" ]; then
370   export DUMP_PSNRHVS=$TOOLS_ROOT/tools/dump_psnrhvs
371 fi
372
373 if [ -z "$DUMP_SSIM" ]; then
374   export DUMP_SSIM=$TOOLS_ROOT/tools/dump_ssim
375 fi
376
377 if [ -z "$DUMP_FASTSSIM" ]; then
378   export DUMP_FASTSSIM=$TOOLS_ROOT/tools/dump_fastssim
379 fi
380
381 if [ -z "$DUMP_CIEDE" ]; then
382   export DUMP_CIEDE=$(dirname $0)/dump_ciede2000.py
383 fi
384
385 if [ ! -x "$YUV2YUV4MPEG" ]; then
386   echo "Executable not found YUV2YUV4MPEG=$YUV2YUV4MPEG"
387   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
388   exit 1
389 fi
390
391 if [ ! -x "$Y4M2PNG" ]; then
392   echo "Executable not found Y4M2PNG=$Y4M2PNG"
393   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
394   exit 1
395 fi
396
397 if [ ! -x "$PNG2Y4M" ]; then
398   echo "Executable not found PNG2Y4M=$PNG2Y4M"
399   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
400   exit 1
401 fi
402
403 if [ ! -x "$DUMP_PSNR" ]; then
404   echo "Executable not found DUMP_PSNR=$DUMP_PSNR"
405   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
406   exit 1
407 fi
408
409 if [ ! -x "$DUMP_PSNRHVS" ]; then
410   echo "Executable not found DUMP_PSNRHVS=$DUMP_PSNRHVS"
411   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
412   exit 1
413 fi
414
415 if [ ! -x "$DUMP_SSIM" ]; then
416   echo "Executable not found DUMP_FASTSSIM=$DUMP_SSIM"
417   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
418   exit 1
419 fi
420
421 if [ ! -x "$DUMP_FASTSSIM" ]; then
422   echo "Executable not found DUMP_FASTSSIM=$DUMP_FASTSSIM"
423   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
424   exit 1
425 fi
426
427 set +e
428 temp=$($DUMP_CIEDE)
429 if [ $? -ne 0 ]; then
430   echo "Warning Python dependencies not found. CIEDE2000 will not be computed."
431   echo "Required Python dependencies are: numpy, skimage and y4m."
432   if [ "$(uname -s)" = "Darwin" ]; then
433     DUMP_CIEDE=/usr/bin/true
434   else
435     DUMP_CIEDE=/bin/true
436   fi
437 fi
438 set -e
439
440 if [ -z "$CORES" ]; then
441   if [ "$(uname -s)" = "Darwin" ]; then
442     CORES=$(sysctl -n hw.ncpu)
443   else
444     CORES=$(grep -i processor /proc/cpuinfo | wc -l)
445   fi
446   #echo "CORES not set, using $CORES"
447 fi
448
449 case $CODEC in
450   daala | rav1e)
451     FILES=$(find -L "$@" -type f -name "*.y4m")
452     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
453     for f in $FILES; do cat $(basename $f)-*.out | sort -n > $(basename $f)-$CODEC.out && rm $(basename $f)-$CODEC-*.out; done
454     ;;
455   *)
456     find -L "$@" -type f -name "*.y4m" -print0 | xargs -0 -n1 -P$CORES $RD_COLLECT_SUB
457 esac