Imported Upstream version 1.4
[deb_x265.git] / doc / reST / lossless.rst
CommitLineData
72b9787e
JB
1Lossless
2--------
3
4Lossless Encoding
5=================
6
7x265 can encode HEVC bitstreams that are entirely lossless (the
8reconstructed images are bit-exact to the source images) by using the
9:option:`--lossless` option. Lossless operation is theoretically
10simple. Rate control, by definition, is disabled and the encoder
11disables all quality metrics since they would only waste CPU cycles.
12Instead, x265 reports only a compression factor at the end of the
13encode.
14
15In HEVC, lossless coding means bypassing both the DCT transforms and
16bypassing quantization (often referred to as transquant bypass). Normal
17predictions are still allowed, so the encoder will find optimal inter or
18intra predictions and then losslessly code the residual (with transquant
19bypass).
20
21All :option:`--preset` options are capable of generating lossless video
22streams, but in general the slower the preset the better the compression
23ratio (and the slower the encode). Here are some examples::
24
25 ./x265 ../test-720p.y4m o.bin --preset ultrafast --lossless
26 ... <snip> ...
27 encoded 721 frames in 238.38s (3.02 fps), 57457.94 kb/s
28
29 ./x265 ../test-720p.y4m o.bin --preset faster --lossless
30 ... <snip> ...
31 x265 [info]: lossless compression ratio 3.11::1
32 encoded 721 frames in 258.46s (2.79 fps), 56787.65 kb/s
33
34 ./x265 ../test-720p.y4m o.bin --preset slow --lossless
35 ... <snip> ...
36 x265 [info]: lossless compression ratio 3.36::1
37 encoded 721 frames in 576.73s (1.25 fps), 52668.25 kb/s
38
39 ./x265 ../test-720p.y4m o.bin --preset veryslow --lossless
40 x265 [info]: lossless compression ratio 3.76::1
41 encoded 721 frames in 6298.22s (0.11 fps), 47008.65 kb/s
42
43.. Note::
44 In HEVC, only QP=4 is truly lossless quantization, and thus when
45 encoding losslesly x265 uses QP=4 internally in its RDO decisions.
46
47Near-lossless Encoding
48======================
49
50Near-lossless conditions are a quite a bit more interesting. Normal ABR
51rate control will allow one to scale the bitrate up to the point where
52quantization is entirely bypassed (QP <= 4), but even at this point
53there is a lot of SSIM left on the table because of the DCT transforms,
54which are not lossless::
55
56 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 40000 --ssim
57 encoded 721 frames in 326.62s (2.21 fps), 39750.56 kb/s, SSIM Mean Y: 0.9990703 (30.317 dB)
58
59 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 50000 --ssim
60 encoded 721 frames in 349.27s (2.06 fps), 44326.84 kb/s, SSIM Mean Y: 0.9994134 (32.316 dB)
61
62 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 60000 --ssim
63 encoded 721 frames in 360.04s (2.00 fps), 45394.50 kb/s, SSIM Mean Y: 0.9994823 (32.859 dB)
64
65For the encoder to get over this quality plateau, one must enable
66lossless coding at the CU level with :option:`--cu-lossless`. It tells
67the encoder to evaluate trans-quant bypass as a coding option for each
68CU, and to pick the option with the best rate-distortion
69characteristics.
70
71The :option:`--cu-lossless` option is very expensive, computationally,
72and it only has a positive effect when the QP is extremely low, allowing
73RDO to spend a large amount of bits to make small improvements to
74quality. So this option should only be enabled when you are encoding
75near-lossless bitstreams::
76
77 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 40000 --ssim --cu-lossless
78 encoded 721 frames in 500.51s (1.44 fps), 40017.10 kb/s, SSIM Mean Y: 0.9997790 (36.557 dB)
79
80 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 50000 --ssim --cu-lossless
81 encoded 721 frames in 524.60s (1.37 fps), 46083.37 kb/s, SSIM Mean Y: 0.9999432 (42.456 dB)
82
83 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 60000 --ssim --cu-lossless
84 encoded 721 frames in 523.63s (1.38 fps), 46552.92 kb/s, SSIM Mean Y: 0.9999489 (42.917 dB)
85
86.. Note::
87 It is not unusual for bitrate to drop as you increase lossless coding.
88 Having "perfectly coded" reference blocks reduces residual in later
89 frames. It is quite possible for a near-lossless encode to spend
90 more bits than a lossless encode.
91
92Enabling psycho-visual rate distortion will improve lossless coding.
93:option:`--psy-rd` influences the RDO decisions in favor of energy
94(detail) preservation over bit cost and results in more blocks being
95losslessly coded. Our psy-rd feature is not yet assembly optimized, so
96this makes the encodes run even slower::
97
98 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 40000 --ssim --cu-lossless --psy-rd 1.0
99 encoded 721 frames in 581.83s (1.24 fps), 40112.15 kb/s, SSIM Mean Y: 0.9998632 (38.638 dB)
100
101 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 50000 --ssim --cu-lossless --psy-rd 1.0
102 encoded 721 frames in 587.54s (1.23 fps), 46284.55 kb/s, SSIM Mean Y: 0.9999663 (44.721 dB)
103
104 ./x265 ../test-720p.y4m o.bin --preset medium --bitrate 60000 --ssim --cu-lossless --psy-rd 1.0
105 encoded 721 frames in 592.93s (1.22 fps), 46839.51 kb/s, SSIM Mean Y: 0.9999707 (45.334 dB)
106
107:option:`--cu-lossless` will also be more effective at slower
108presets which perform RDO at more levels and thus may find smaller
109blocks that would benefit from lossless coding::
110
111 ./x265 ../test-720p.y4m o.bin --preset veryslow --bitrate 40000 --ssim --cu-lossless
112 encoded 721 frames in 12969.25s (0.06 fps), 37331.96 kb/s, SSIM Mean Y: 0.9998108 (37.231 dB)
113
114 ./x265 ../test-720p.y4m o.bin --preset veryslow --bitrate 50000 --ssim --cu-lossless
115 encoded 721 frames in 46217.84s (0.05 fps), 42976.28 kb/s, SSIM Mean Y: 0.9999482 (42.856 dB)
116
117 ./x265 ../test-720p.y4m o.bin --preset veryslow --bitrate 60000 --ssim --cu-lossless
118 encoded 721 frames in 13738.17s (0.05 fps), 43864.21 kb/s, SSIM Mean Y: 0.9999633 (44.348 dB)
119
120And with psy-rd and a slow preset together, very high SSIMs are
121possible::
122
123 ./x265 ../test-720p.y4m o.bin --preset veryslow --bitrate 40000 --ssim --cu-lossless --psy-rd 1.0
124 encoded 721 frames in 11675.81s (0.06 fps), 37819.45 kb/s, SSIM Mean Y: 0.9999181 (40.867 dB)
125
126 ./x265 ../test-720p.y4m o.bin --preset veryslow --bitrate 50000 --ssim --cu-lossless --psy-rd 1.0
127 encoded 721 frames in 12414.56s (0.06 fps), 42815.75 kb/s, SSIM Mean Y: 0.9999758 (46.168 dB)
128
129 ./x265 ../test-720p.y4m o.bin --preset veryslow --bitrate 60000 --ssim --cu-lossless --psy-rd 1.0
130 encoded 721 frames in 11684.89s (0.06 fps), 43324.48 kb/s, SSIM Mean Y: 0.9999793 (46.835 dB)
131
132
133It's important to note in the end that it is easier (less work) for the
134encoder to encode the video losslessly than it is to encode it
135near-losslessly. If the encoder knows up front the encode must be
136lossless, it does not need to evaluate any lossy coding methods. The
137encoder only needs to find the most efficient prediction for each block
138and then entropy code the residual.
139
140It is not feasible for :option:`--cu-lossless` to turn itself on when
141the encoder determines it is encoding a near-lossless bitstream (ie:
142when rate control nearly disables all quantization) because the feature
143requires a flag to be enabled in the stream headers. At the time the
144stream headers are being coded we do not know whether
145:option:`--cu-lossless` would be a help or a hinder. If very few or no
146blocks end up being coded as lossless, then having the feature enabled
147is a net loss in compression efficiency because it adds a flag that must
148be coded for every CU. So ignoring even the performance aspects of the
149feature, it can be a compression loss if enabled without being used. So
150it is up to the user to only enable this feature when they are coding at
151near-lossless quality.
152
153Transform Skip
154==============
155
156A somewhat related feature, :option:`--tskip` tells the encoder to
157evaluate transform-skip (bypass DCT but with quantization still enabled)
158when coding small 4x4 transform blocks. This feature is intended to
159improve the coding efficiency of screen content (aka: text on a screen)
160and is not really intended for lossless coding. This feature should
161only be enabled if the content has a lot of very sharp edges in it, and
162is mostly unrelated to lossless coding.