ab_compare_x265.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/bin/bash
  2. set -e
  3. while getopts 's:k:r:d:Y:n:' OPTIONS; do
  4. case $OPTIONS in
  5. s) SIZE="$OPTARG";;
  6. k) KEYINT="$OPTARG";;
  7. r) X265_ROOT="$OPTARG";;
  8. d) DAALA_ROOT="$OPTARG";;
  9. Y) Y4M2PNG="$OPTARG";;
  10. n) FRAMES="$OPTARG";;
  11. esac
  12. done
  13. shift $(($OPTIND - 1))
  14. if [ -z $DAALA_ROOT ]; then
  15. DAALA_ROOT=.
  16. fi
  17. if [ -z $X265_ROOT ] || [ ! -d $X265_ROOT ]; then
  18. echo "Please set X265_ROOT to the location of your x265 hg checkout"
  19. exit 1
  20. fi
  21. if [ -z "$X265" ]; then
  22. export X265=$X265_ROOT/build/linux/x265
  23. fi
  24. if [ -z "$Y4M2PNG" ]; then
  25. Y4M2PNG=$DAALA_ROOT/tools/y4m2png
  26. fi
  27. if [ ! -x "$X265" ]; then
  28. echo "x265 encoder not found at '$X265'."
  29. exit 1
  30. fi
  31. if [ ! -x "$Y4M2PNG" ]; then
  32. echo "Y4M2PNG not found at '$Y4M2PNG'."
  33. exit 1
  34. fi
  35. if [ -z "$FRAMES" ]; then
  36. FRAMES=1
  37. fi
  38. if [ -z "$KEYINT" ]; then
  39. KEYINT=256
  40. fi
  41. FILE=$1
  42. echo $FILE
  43. BASENAME=$(basename $FILE)
  44. WIDTH=$(head -1 $FILE | cut -d\ -f 2 | tr -d 'W')
  45. HEIGHT=$(head -1 $FILE | cut -d\ -f 3 | tr -d 'H')
  46. QSTR="--crf=\$x"
  47. # With x265, the lowest quantizer number yields the highest quality and vice
  48. # versa. Here, MAX_QUALITY produces the best looking image, so it's the
  49. # lowest number.
  50. MAX_QUALITY=1
  51. MIN_QUALITY=51
  52. while (( $MIN_QUALITY - $MAX_QUALITY > 1 )); do
  53. QUALITY=$(( ($MIN_QUALITY + $MAX_QUALITY) / 2 ))
  54. X265_FILE=$BASENAME-$QUALITY.x265.tmp
  55. $X265 -r $X265_FILE.y4m $(echo $QSTR | sed 's/\$x/'$QUALITY'/g') --keyint $KEYINT -o $X265_FILE $FILE 2> /dev/null > /dev/null
  56. X265_SIZE=$(wc -c $X265_FILE | awk '{ print $1 }')
  57. if (($X265_SIZE > $SIZE)); then
  58. MAX_QUALITY=$QUALITY
  59. MAX_QUALITY_SIZE=$X265_SIZE
  60. else
  61. MIN_QUALITY=$QUALITY
  62. MIN_QUALITY_SIZE=$X265_SIZE
  63. fi
  64. done
  65. if [ $MIN_QUALITY -eq 51 ]; then
  66. X265_FILE="$BASENAME-$MIN_QUALITY.x265.tmp"
  67. $X265 -r "$X265_FILE.y4m" $(echo $QSTR | sed 's/\$x/'$MIN_QUALITY'/g') --keyint $KEYINT -o "$X265_FILE" $FILE 2> /dev/null > /dev/null
  68. MIN_QUALITY_SIZE=$(stat -c %s "$X265_FILE")
  69. fi
  70. if [ $MAX_QUALITY -eq 1 ]; then
  71. X265_FILE="$BASENAME-$MAX_QUALITY.x265.tmp"
  72. $X265 -r "$X265_FILE.y4m" $(echo $QSTR | sed 's/\$x/'$MAX_QUALITY'/g') --keyint $KEYINT -o "$X265_FILE" $FILE 2> /dev/null > /dev/null
  73. MAX_QUALITY_SIZE=$(stat -c %s "$X265_FILE")
  74. fi
  75. if (( $MAX_QUALITY_SIZE - $SIZE < $SIZE - $MIN_QUALITY_SIZE )); then
  76. BEST_QUALITY=$MAX_QUALITY
  77. else
  78. BEST_QUALITY=$MIN_QUALITY
  79. fi
  80. mv $BASENAME-$BEST_QUALITY.x265.tmp $BASENAME-$BEST_QUALITY.x265
  81. if [ $FRAMES -eq 1 ]; then
  82. $Y4M2PNG -o $BASENAME-$BEST_QUALITY.x265.png $BASENAME-$BEST_QUALITY.x265.tmp.y4m
  83. else
  84. mv $BASENAME-$BEST_QUALITY.x265.tmp.y4m $BASENAME-$BEST_QUALITY.x265.y4m
  85. fi
  86. rm $BASENAME-*.x265.tmp $BASENAME-*.x265.tmp.y4m