Per-Title Encoding: How Convex Hull Ladders Cut Bandwidth 30% Without Touching Quality

One-size-fits-all bitrate ladders waste bits on easy content and starve complex scenes. Here's how content-aware per-title encoding fixes both — with the convex hull math explained.

A fixed bitrate ladder treats a slow dialogue scene identically to a chaotic action sequence — which means you’re simultaneously wasting bits on content that doesn’t need them and starving content that does. Per-title encoding fixes this by generating a custom ladder for every asset, derived from that asset’s actual rate-distortion curve.

The Problem with Fixed Ladders

Fixed ladder (industry standard):
1080p @ 6.0 Mbps ── plenty for dialogue, starved for action
 720p @ 3.0 Mbps
 480p @ 1.2 Mbps
 360p @ 0.6 Mbps

Same clip, per-title results:
Simple talking head: 1080p needs only 2.8 Mbps to hit VMAF 95
Fast action scene:   1080p needs 8.5 Mbps to hit VMAF 95

Encoding the talking head at 6Mbps overshoots by 2× — viewers burn data for imperceptible gain. Encoding the action scene at 6Mbps undershoots — visible blocking on a flagship title.

Convex Hull Optimization: The Math in Plain Terms

Per-title systems encode each asset at a dense grid of (resolution × bitrate) candidates, then score every point:

      VMAF
      100 ┤                  ● ← (1080p, 12Mbps)
          │              ●
       95 ┤          ●
          │      ●              ← convex hull frontier
       90 ┤   ●      ○  ○  ○     ← dominated points (worse quality
          │      ○   ○   ○  ○       per bit than hull)
       85 ┤  ●
          └──────────────────────────── bitrate →

Any (resolution, bitrate) point falling inside the hull is dominated — another point exists offering better quality at lower bitrate. The optimal ladder is literally the convex hull boundary, filtered down to a practical rung count.

The Practical Pipeline

Input asset
    │
    ▼
[ Chunked sample encodes: 4 resolutions × 6 bitrates ]
    │
    ▼
[ VMAF scoring per chunk → aggregate RD curve ]
    │
    ▼
[ Convex hull extraction → select 5-7 rungs ]
    │
    ▼
[ Full-length encode at chosen rungs → package ]

The sampling stage is the clever part: encode only 5-10% of the asset (spread across scene changes) to build the curve, so the analysis adds ~15% compute overhead rather than 6× full encodes.

Measured Impact on a Real Catalog

Applying per-title ladders across a mixed-content library:

  • -31% average bytes delivered at matched VMAF
  • +3.2 VMAF points on complex content at matched bitrate
  • -22% rebuffer events — lower rungs are genuinely lower, so ABR downshifts land on watchable quality

Full methodology and ladder templates at Per-Title Encoding & Convex Hull Optimization Guide.

Implementation Notes

  • Keep rung count at 5–7 — more rungs fragment CDN cache efficiency
  • Enforce a floor on the lowest rung (~300kbps video) so audio isn’t the dominant stream size
  • Re-derive ladders on codec upgrades — a hull computed for x264 doesn’t transfer to AV1