ab_compare_x264.sh 2.9 KB

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