mirror of
https://git.videolan.org/git/ffmpeg.git
synced 2024-08-26 03:11:51 +02:00
62 lines
2.1 KiB
Plaintext
62 lines
2.1 KiB
Plaintext
A Quick Description Of Rate Distortion Theory.
|
|
|
|
We want to encode a video, picture or piece of music optimally. What does
|
|
"optimally" really mean? It means that we want to get the best quality at a
|
|
given filesize OR we want to get the smallest filesize at a given quality
|
|
(in practice, these 2 goals are usually the same).
|
|
|
|
Solving this directly is not practical; trying all byte sequences 1
|
|
megabyte in length and selecting the "best looking" sequence will yield
|
|
256^1000000 cases to try.
|
|
|
|
But first, a word about quality, which is also called distortion.
|
|
Distortion can be quantified by almost any quality measurement one chooses.
|
|
Commonly, the sum of squared differences is used but more complex methods
|
|
that consider psychovisual effects can be used as well. It makes no
|
|
difference in this discussion.
|
|
|
|
|
|
First step: that rate distortion factor called lambda...
|
|
Let's consider the problem of minimizing:
|
|
|
|
distortion + lambda*rate
|
|
|
|
rate is the filesize
|
|
distortion is the quality
|
|
lambda is a fixed value chosen as a tradeoff between quality and filesize
|
|
Is this equivalent to finding the best quality for a given max
|
|
filesize? The answer is yes. For each filesize limit there is some lambda
|
|
factor for which minimizing above will get you the best quality (using your
|
|
chosen quality measurement) at the desired (or lower) filesize.
|
|
|
|
|
|
Second step: splitting the problem.
|
|
Directly splitting the problem of finding the best quality at a given
|
|
filesize is hard because we do not know how many bits from the total
|
|
filesize should be allocated to each of the subproblems. But the formula
|
|
from above:
|
|
|
|
distortion + lambda*rate
|
|
|
|
can be trivially split. Consider:
|
|
|
|
(distortion0 + distortion1) + lambda*(rate0 + rate1)
|
|
|
|
This creates a problem made of 2 independent subproblems. The subproblems
|
|
might be 2 16x16 macroblocks in a frame of 32x16 size. To minimize:
|
|
|
|
(distortion0 + distortion1) + lambda*(rate0 + rate1)
|
|
|
|
we just have to minimize:
|
|
|
|
distortion0 + lambda*rate0
|
|
|
|
and
|
|
|
|
distortion1 + lambda*rate1
|
|
|
|
I.e, the 2 problems can be solved independently.
|
|
|
|
Author: Michael Niedermayer
|
|
Copyright: LGPL
|