libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

roundtrip_test.sh (5124B)


      1 #!/bin/bash
      2 # Copyright (c) the JPEG XL Project Authors. All rights reserved.
      3 #
      4 # Use of this source code is governed by a BSD-style
      5 # license that can be found in the LICENSE file.
      6 
      7 # End-to-end roundtrip tests for cjxl and djxl tools.
      8 
      9 MYDIR=$(dirname $(realpath "$0"))
     10 JPEGXL_TEST_DATA_PATH="${MYDIR}/../../testdata"
     11 
     12 set -eux
     13 
     14 # Temporary files cleanup hooks.
     15 CLEANUP_FILES=()
     16 cleanup() {
     17   if [[ ${#CLEANUP_FILES[@]} -ne 0 ]]; then
     18     rm -rf "${CLEANUP_FILES[@]}"
     19   fi
     20 }
     21 trap 'retcode=$?; { set +x; } 2>/dev/null; cleanup' INT TERM EXIT
     22 
     23 roundtrip_lossless_pnm_test() {
     24   local infn="${JPEGXL_TEST_DATA_PATH}/$1"
     25   local jxlfn="$(mktemp -p "$tmpdir")"
     26   local outfn="$(mktemp -p "$tmpdir").${infn: -3}"
     27 
     28   "${encoder}" "${infn}" "${jxlfn}" -d 0 -e 1
     29   "${decoder}" "${jxlfn}" "${outfn}"
     30   diff "${infn}" "${outfn}"
     31 }
     32 
     33 roundtrip_test() {
     34   local infn="${JPEGXL_TEST_DATA_PATH}/$1"
     35   local encargs="$2"
     36   local maxdist="$3"
     37   local jxlfn="$(mktemp -p "$tmpdir")"
     38 
     39   "${encoder}" "${infn}" "${jxlfn}" $encargs
     40 
     41   if [ "${infn: -3}" == "jpg" ]; then
     42       local outfn="$(mktemp -p "$tmpdir").jpg"
     43 
     44       # Test losless jpeg reconstruction.
     45       "${decoder}" "${jxlfn}" "${outfn}" --num_reps 2
     46       diff "${infn}" "${outfn}"
     47 
     48       # Test decoding to pixels.
     49       "${decoder}" "${jxlfn}" "${outfn}" --num_reps 2 --pixels_to_jpeg
     50       local dist="$("${comparator}" "${infn}" "${outfn}")"
     51       python3 -c "import sys; sys.exit(not ${dist} > 0.0)"
     52       python3 -c "import sys; sys.exit(not ${dist} < 0.005)"
     53       
     54       # Test decoding to pixels by setting the --jpeg_quality flag.
     55       "${decoder}" "${jxlfn}" "${outfn}" --num_reps 2 --jpeg_quality 100
     56       local dist="$("${comparator}" "${infn}" "${outfn}")"
     57       python3 -c "import sys; sys.exit(not ${dist} > 0.0)"
     58       python3 -c "import sys; sys.exit(not ${dist} < 0.005)"
     59 
     60       # Test decoding to pixels by writing to a png.
     61       outfn="$(mktemp -p "$tmpdir").png"
     62       "${decoder}" "${jxlfn}" "${outfn}" --num_reps 2
     63       local dist="$("${comparator}" "${infn}" "${outfn}")"
     64       python3 -c "import sys; sys.exit(not ${dist} > 0.0)"
     65       python3 -c "import sys; sys.exit(not ${dist} < 0.005)"
     66   else
     67       # Test decoding to png.
     68       local outfn="$(mktemp -p "$tmpdir").png"
     69       "${decoder}" "${jxlfn}" "${outfn}" --num_reps 2
     70       local dist="$("${comparator}" "${infn}" "${outfn}")"
     71       python3 -c "import sys; sys.exit(not ${dist} <= ${maxdist})"
     72 
     73       # Test decoding to 16 bit png.
     74       "${decoder}" "${jxlfn}" "${outfn}" --bits_per_sample 16
     75       local dist="$("${comparator}" "${infn}" "${outfn}")"
     76       python3 -c "import sys; sys.exit(not ${dist} <= ${maxdist})"
     77 
     78       # Test decoding to pfm.
     79       local outfn="$(mktemp -p "$tmpdir").pfm"
     80       "${decoder}" "${jxlfn}" "${outfn}"
     81       local dist="$("${comparator}" "${infn}" "${outfn}")"
     82       python3 -c "import sys; sys.exit(not ${dist} <= ${maxdist} + 0.0005)"
     83 
     84       # Test decoding to ppm.
     85       local outfn="$(mktemp -p "$tmpdir").ppm"
     86       "${decoder}" "${jxlfn}" "${outfn}"
     87       local dist="$("${comparator}" "${infn}" "${outfn}")"
     88       python3 -c "import sys; sys.exit(not ${dist} <= ${maxdist})"
     89 
     90       # Test decoding to 16 bit ppm.
     91       "${decoder}" "${jxlfn}" "${outfn}" --bits_per_sample 16
     92       local dist="$("${comparator}" "${infn}" "${outfn}")"
     93       python3 -c "import sys; sys.exit(not ${dist} <= ${maxdist} + 0.0005)"
     94 
     95       # Test decoding to jpg.
     96       outfn="$(mktemp -p "$tmpdir").jpg"
     97       "${decoder}" "${jxlfn}" "${outfn}" --num_reps 2
     98       local dist="$("${comparator}" "${infn}" "${outfn}")"
     99       python3 -c "import sys; sys.exit(not ${dist} <= ${maxdist} + 0.05)"
    100   fi
    101 }
    102 
    103 main() {
    104   local tmpdir=$(mktemp -d)
    105   CLEANUP_FILES+=("${tmpdir}")
    106 
    107   local build_dir="${1:-}"
    108   if [[ -z "${build_dir}" ]]; then
    109     build_dir=$(realpath "${MYDIR}/../../build")
    110   fi
    111 
    112   local encoder="${build_dir}/tools/cjxl"
    113   local decoder="${build_dir}/tools/djxl"
    114   local comparator="${build_dir}/tools/ssimulacra_main"
    115 
    116   roundtrip_test "jxl/flower/flower_small.rgb.png" "-e 1" 0.02
    117   roundtrip_test "jxl/flower/flower_small.rgb.png" "-e 1 -d 0.0" 0.0
    118   roundtrip_test "jxl/flower/flower_small.rgb.depth8.ppm" \
    119 		 "-e 1 --streaming_input" 0.02
    120   roundtrip_test "jxl/flower/flower_small.rgb.depth8.ppm" \
    121 		 "-e 1 -d 0.0 --streaming_input" 0.0
    122   roundtrip_test "jxl/flower/flower_small.rgb.depth8.ppm" \
    123 		 "-e 1 --streaming_output" 0.02
    124   roundtrip_test "jxl/flower/flower_small.rgb.depth8.ppm" \
    125 		 "-e 1 -d 0.0 --streaming_input --streaming_output" 0.0
    126   roundtrip_test "jxl/flower/flower_cropped.jpg" "-e 1" 0.0
    127 
    128   roundtrip_test "jxl/flower/flower.png" "-e 6" 0.02
    129 
    130   roundtrip_lossless_pnm_test "jxl/flower/flower_small.rgb.depth1.ppm"
    131   roundtrip_lossless_pnm_test "jxl/flower/flower_small.g.depth1.pgm"
    132   for i in `seq 2 16`; do
    133       roundtrip_lossless_pnm_test "jxl/flower/flower_small.rgb.depth$i.ppm"
    134       roundtrip_lossless_pnm_test "jxl/flower/flower_small.g.depth$i.pgm"
    135       roundtrip_lossless_pnm_test "jxl/flower/flower_small.ga.depth$i.pam"
    136       roundtrip_lossless_pnm_test "jxl/flower/flower_small.rgba.depth$i.pam"
    137   done
    138 }
    139 
    140 main "$@"