Imported Upstream version 1.4
[deb_x265.git] / doc / reST / lossless.rst
1 Lossless
2 --------
3
4 Lossless Encoding
5 =================
6
7 x265 can encode HEVC bitstreams that are entirely lossless (the
8 reconstructed images are bit-exact to the source images) by using the
9 :option:`--lossless` option. Lossless operation is theoretically
10 simple. Rate control, by definition, is disabled and the encoder
11 disables all quality metrics since they would only waste CPU cycles.
12 Instead, x265 reports only a compression factor at the end of the
13 encode.
14
15 In HEVC, lossless coding means bypassing both the DCT transforms and
16 bypassing quantization (often referred to as transquant bypass). Normal
17 predictions are still allowed, so the encoder will find optimal inter or
18 intra predictions and then losslessly code the residual (with transquant
19 bypass).
20
21 All :option:`--preset` options are capable of generating lossless video
22 streams, but in general the slower the preset the better the compression
23 ratio (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
47 Near-lossless Encoding
48 ======================
49
50 Near-lossless conditions are a quite a bit more interesting. Normal ABR
51 rate control will allow one to scale the bitrate up to the point where
52 quantization is entirely bypassed (QP <= 4), but even at this point
53 there is a lot of SSIM left on the table because of the DCT transforms,
54 which 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
65 For the encoder to get over this quality plateau, one must enable
66 lossless coding at the CU level with :option:`--cu-lossless`. It tells
67 the encoder to evaluate trans-quant bypass as a coding option for each
68 CU, and to pick the option with the best rate-distortion
69 characteristics.
70
71 The :option:`--cu-lossless` option is very expensive, computationally,
72 and it only has a positive effect when the QP is extremely low, allowing
73 RDO to spend a large amount of bits to make small improvements to
74 quality. So this option should only be enabled when you are encoding
75 near-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
92 Enabling 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
95 losslessly coded. Our psy-rd feature is not yet assembly optimized, so
96 this 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
108 presets which perform RDO at more levels and thus may find smaller
109 blocks 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
120 And with psy-rd and a slow preset together, very high SSIMs are
121 possible::
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
133 It's important to note in the end that it is easier (less work) for the
134 encoder to encode the video losslessly than it is to encode it
135 near-losslessly. If the encoder knows up front the encode must be
136 lossless, it does not need to evaluate any lossy coding methods. The
137 encoder only needs to find the most efficient prediction for each block
138 and then entropy code the residual.
139
140 It is not feasible for :option:`--cu-lossless` to turn itself on when
141 the encoder determines it is encoding a near-lossless bitstream (ie:
142 when rate control nearly disables all quantization) because the feature
143 requires a flag to be enabled in the stream headers. At the time the
144 stream 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
146 blocks end up being coded as lossless, then having the feature enabled
147 is a net loss in compression efficiency because it adds a flag that must
148 be coded for every CU. So ignoring even the performance aspects of the
149 feature, it can be a compression loss if enabled without being used. So
150 it is up to the user to only enable this feature when they are coding at
151 near-lossless quality.
152
153 Transform Skip
154 ==============
155
156 A somewhat related feature, :option:`--tskip` tells the encoder to
157 evaluate transform-skip (bypass DCT but with quantization still enabled)
158 when coding small 4x4 transform blocks. This feature is intended to
159 improve the coding efficiency of screen content (aka: text on a screen)
160 and is not really intended for lossless coding. This feature should
161 only be enabled if the content has a lot of very sharp edges in it, and
162 is mostly unrelated to lossless coding.