ab_compare_jpeg.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/bin/bash
  2. set -e
  3. while getopts 's:d:J:j:Y:y:n:' OPTIONS; do
  4. case $OPTIONS in
  5. s) SIZE="$OPTARG";;
  6. d) DAALA_ROOT="$OPTARG";;
  7. J) YUVJPEG="$OPTARG";;
  8. j) JPEGYUV="$OPTARG";;
  9. Y) Y4M2PNG="$OPTARG";;
  10. y) YUV2YUV4MPEG="$OPTARG";;
  11. n) FRAMES="$OPTARG";;
  12. esac
  13. done
  14. shift $(($OPTIND - 1))
  15. if [ -z "$SIZE" ]; then
  16. echo "No file size given."
  17. exit 1
  18. fi
  19. if [ -z $DAALA_ROOT ]; then
  20. DAALA_ROOT=.
  21. fi
  22. if [ -z "$YUVJPEG" ]; then
  23. YUVJPEG=$DAALA_ROOT/tools/yuvjpeg
  24. fi
  25. if [ -z "$JPEGYUV" ]; then
  26. JPEGYUV=$DAALA_ROOT/tools/jpegyuv
  27. fi
  28. if [ -z "$YUV2YUV4MPEG" ]; then
  29. YUV2YUV4MPEG=$DAALA_ROOT/tools/yuv2yuv4mpeg
  30. fi
  31. if [ -z "$Y4M2PNG" ]; then
  32. Y4M2PNG=$DAALA_ROOT/tools/y4m2png
  33. fi
  34. if [ ! -x "$YUVJPEG" ]; then
  35. echo "YUVJPEG not found at '$YUVJPEG'."
  36. # exit 1
  37. fi
  38. if [ ! -x "$JPEGYUV" ]; then
  39. echo "JPEGYUV not found at '$JPEGYUV'."
  40. exit 1
  41. fi
  42. if [ ! -x "$YUV2YUV4MPEG" ]; then
  43. echo "YUV2YUV4MPEG not found at '$YUV2YUV4MPEG'."
  44. exit 1
  45. fi
  46. if [ ! -x "$Y4M2PNG" ]; then
  47. echo "Y4M2PNG not found at '$Y4M2PNG'."
  48. exit 1
  49. fi
  50. if [ -z "$FRAMES" ]; then
  51. FRAMES=1
  52. fi
  53. if [ $FRAMES -gt 1 ]; then
  54. echo "JPEG can't encode videos, only still pictures."
  55. exit 1
  56. fi
  57. FILE=$1
  58. echo $FILE
  59. BASENAME=$(basename $FILE)
  60. tail -n+3 $FILE > $BASENAME-in.yuv
  61. WIDTH=$(head -1 $FILE | cut -d\ -f 2 | tr -d 'W')
  62. HEIGHT=$(head -1 $FILE | cut -d\ -f 3 | tr -d 'H')
  63. # With JPEG, the highest quality number creates the best-looking image.
  64. MAX_QUALITY=100
  65. MIN_QUALITY=0
  66. while (( $MAX_QUALITY - $MIN_QUALITY > 1 )); do
  67. QUALITY=$(( ($MIN_QUALITY + $MAX_QUALITY) / 2 ))
  68. JPEG_FILE=$BASENAME-$QUALITY.jpeg.tmp
  69. $YUVJPEG $QUALITY "$WIDTH"x$HEIGHT $BASENAME-in.yuv $JPEG_FILE
  70. JPEG_SIZE=$(wc -c $JPEG_FILE | awk '{ print $1 }')
  71. if (($JPEG_SIZE > $SIZE)); then
  72. MAX_QUALITY=$QUALITY
  73. MAX_QUALITY_SIZE=$JPEG_SIZE
  74. else
  75. MIN_QUALITY=$QUALITY
  76. MIN_QUALITY_SIZE=$JPEG_SIZE
  77. fi
  78. done
  79. if [ $MIN_QUALITY -eq 0 ]; then
  80. $YUVJPEG $MIN_QUALITY "$WIDTH"x$HEIGHT $BASENAME-in.yuv $BASENAME-$MIN_QUALITY.jpeg.tmp
  81. MIN_QUALITY_SIZE=$(stat -c %s $BASENAME-$MIN_QUALITY.jpeg.tmp)
  82. fi
  83. if [ $MAX_QUALITY -eq 100 ]; then
  84. $YUVJPEG $MAX_QUALITY "$WIDTH"x$HEIGHT $BASENAME-in.yuv $BASENAME-$MAX_QUALITY.jpeg.tmp
  85. MAX_QUALITY_SIZE=$(stat -c %s $BASENAME-$MAX_QUALITY.jpeg.tmp)
  86. fi
  87. if (( $MAX_QUALITY_SIZE - $SIZE < $SIZE - $MIN_QUALITY_SIZE )); then
  88. BEST_QUALITY=$MAX_QUALITY
  89. else
  90. BEST_QUALITY=$MIN_QUALITY
  91. fi
  92. BEST_FILE=$BASENAME-$BEST_QUALITY.jpeg
  93. mv $BEST_FILE.tmp $BEST_FILE
  94. $JPEGYUV $BEST_FILE $BEST_FILE.yuv
  95. $YUV2YUV4MPEG $BEST_FILE -w$WIDTH -h$HEIGHT -an0 -ad0 -c420mpeg2
  96. $Y4M2PNG -o $BEST_FILE.png $BEST_FILE.y4m
  97. rm $BASENAME-in.yuv $BASENAME-*.jpeg.tmp
  98. rm $BEST_FILE.yuv $BEST_FILE.y4m