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