Most devices (and sometimes, software decoders) support a "maximum" level. When the video's specifications exceed that level's constraints, the decoder won't be able to decode the video properly (it may simply refuse to play the file).
HandBrake's H.264 encoder, x264, sets the appropriate level automatically based on all the other settings. To make sure your video doesn't exceed a specific level, you simply have to make sure the other parameters fit within the constraints imposed by the level.
Note: the HandBrake nightly builds now support setting the H.264 level explicitly via a dedicated widget.
In real-world scenarios, 3 parameters matter:
- Storage resolution
- Reference frames
Storage resolution is what HandBrake refers to as the "Output" resolution, rather than the "Anamorphic" resolution (I'm using MacGUI terminology here).
The framerate is the number of frames per second in the video (set in the Video panel).
When it's set to "Same as source", the source's average framerate is what matters. It can be found in the Activity Log, for example:
Code: Select all
[02:08:57] scan: 30 previews, 720x576, 25.000 fps, autocrop = 74/76/0/0, aspect 16:9, PAR 64:45
If it's unchecked, then you get a constant framerate with the specified value.
The nightly builds let you explicitly choose between peak or constant framerate (instead of a PFR checkbox).
First of all, let's look at a macroblock. Basically, it's a block of 16 by 16 pixels. You can calculate the number of macroblocks per frame from the storage resolution:
- For 1280x720, there are 1280/16 = 80 by 720/16 = 45, i.e. 80*45 = 3600 macroblocks per frame
- For 1920x1080, there are 1920/16 = 120 by 1088/16 = 68, i.e. 120*68 = 8160 macroblocks per frame
An easy way to calculate the number of macroblocks per frame is to multiply the rounded width and height and divide the result by 256. Example:
1910x706 -> 1920*720/256 = 5400 macroblocks per frame.
Calculating the number of macroblocks is required for the next step.
Now, let's look at resolution and framerate. Each level has a maximum number of macroblocks per frame, and a maximum number of macroblocks per second.
For example, level 3.0 -> max. macroblocks per frame: 1620, per second: 40500
This means that 720x576, with 1620 macroblocks, is within level 3.0 constraints, if the framerate doesn't exceed 40500/1620 = 25 fps.
Similarly, 720x480, with 1350 macroblocks, is within level 3.0 constraints, if the framerate doesn't exceed 40500/1350 = 30 fps.
However, 720x592, with 1665 macroblocks, exceeds level 3.0 constraints regardless of framerate.
To sum up, for level 3.0:
- 720x576 @ 25 fps: OK
- 720x480 @ 30 fps: OK
- 720x576 @ 30 fps: not OK
- 720x480 @ 60 fps: not OK
- 720x592 @ 1 fps: not OK
2. Decoded picture buffer (DPB), reference frames
The number of reference frames is controlled by x264's ref option. It's the number of frames in the Decoded Picture Buffer.
Note: there is a minimum DPB size which depends on b-frame settings.
- b-frames enabled and b-pyramid normal -> 4
- b-frames enabled and b-pyramid strict -> 3
- b-frames enabled and b-pyramid none -> 2
- b-frames disabled -> 1
If you request a lower ref value, there will still be that many frames in the DPB (e.g. as reported by MediaInfo).
As I understand it, however, x264 will not place more references than requested in the DPB.
Each level has a maximum number of macroblocks in the DPB, independent from the framerate. For level 3.0, it's 8100. The maximum number of reference frames is the max. number of macroblocks in the DPB divided by the number of macroblocks per frame. Example:
- 720x576, 1620 macroblocks per frame. Level 3.0, up to 8100 macroblocks in the DPB. Max. reference frames: 8100/1620 = 5.
- 720x480, 1350 macroblocks per frame. Level 3.0, up to 8100 macroblocks in the DPB. Max. reference frames: 8100/1350 = 6.
http://en.wikipedia.org/wiki/H.264/MPEG ... _buffering
Here's a summary of limits for common levels and resolutions:
3. The Video Buffer Verifier (VBV):
If you're encoding standard definition content or target a software player on a computer, there's usually no need for any vbv settings, so you can skip this part.
Hardware H.264 decoders store the frames in a VBV buffer. A frame must be fully stored in the buffer before it can be decoded. This buffer has a maximum capacity (the bufsize) and a maximum refill rate (the maxrate). If you know the characteristics of your playback device's buffer, x264 can constrain the output bitrate to ensure that it doesn't cause buffer overflows and/or underflows. This is controlled via the vbv-bufsize and vbv-maxrate options (note: you must set both options, otherwise the maxrate will be ignored).
Why is this relevant here? Each H.264 level specifies a maximum buffer size and a maximum refill rate (a max maxrate):
Values are in kilobits (1000 bits/second). Example x264 usage (in HandBrake's advanced panel):
Code: Select all
Note that when the vbv-maxrate matches the requested average bitrate (set in the Video tab), x264 will use CBR (constant bitrate) rate control.
http://mewiki.project357.com/wiki/X264_ ... bv-bufsize
http://mewiki.project357.com/wiki/X264_ ... bv-maxrate
http://mewiki.project357.com/wiki/X264_ ... V_Encoding
Feel free to point out any error to me via PM.