x264 Quality

Use SSIM or PSNR to gauge differences between encoding settings.

SSIM

When comparing two values, here is the formula to discern what percentage amount something has improved.

First of all, let's look at a two-pass encode of a file:

x264 -o movie.264 --ssim --tune ssim --profile high --level 3.1 --bitrate 1024 --preset medium --keyint 30 --pass 1 movie.y4m
x264 -o movie.264 --ssim --tune ssim --profile high --level 3.1 --bitrate 1024 --preset medium --keyint 30 --pass 2 movie.y4m

Find this value in the output, and use the Y variable.

x264 [info]: SSIM Mean Y:0.9613678 (14.131db)

Run the same tests, against a 2048k bitrate instead of a 1024k one:

x264 -o movie.264 --ssim --tune ssim --profile high --level 3.1 --bitrate 1024 --preset medium --keyint 30 --pass 1 movie.y4m
x264 -o movie.264 --ssim --tune ssim --profile high --level 3.1 --bitrate 1024 --preset medium --keyint 30 --pass 2 movie.y4m

With separate SSIM output:

x264 [info]: SSIM Mean Y:0.9751283 (16.043db)

Here's the formula:

(((1 - old) / (1 - new)) - 1) * 100

Here's a simpler visualization:

1 - 0.9613678 = 0.0386322
1 - 0.9751283 = 0.0248717
0.0386322 / 0.0248717 = 1.55325932686547361057
1.55325932686547361057 - 1 = 0.55325932686547361057
0.55325932686547361057 * 100 = 55.325932686547361057

Rounding it out to an integer, would be 55, for a result of 55%. So when encoding this particular video at double the bitrate, the SSIM increases by 55%. Not bad!

Here's a PHP function to do the same thing:

function ssim_improvement($old_ssim, $new_ssim) {

        $a = 1 - $old_ssim;
        $b = 1 - $new_ssim;

        $c = $a / $b;

        $d = $c - 1;

        $e = $d * 100;

        return $e;

}

PSNR

Using the doom9 forum post as a reference, the equation is:

(new - old) / 0.05 = % improvement

Navigation