How to Use VP9 Corpus Complexity in libvpx

This article provides a quick guide on how to utilize the corpus complexity feature in a libvpx-vp9 build. You will learn how this feature improves encoding efficiency, how to verify if your library build supports it, and the exact command-line arguments required to apply complexity-guided rate control during video compression.


What is VP9 Corpus Complexity?

The corpus complexity feature in libvpx is designed for multi-pass encoding. It allows the encoder to adjust its rate control algorithm based on a predefined “corpus complexity” metric. This is highly useful when encoding a large library (or corpus) of videos, as it helps the encoder allocate bitrates more intelligently across different types of content, ensuring consistent quality regardless of whether a video is highly dynamic or relatively static.

Step 1: Verify Build Support

Before attempting to use this feature, you must ensure your libvpx build supports it. The corpus complexity flag is available in modern versions of the library but may require verification.

Open your terminal and run the help command for the VP9 encoder:

vpxenc --help

Look through the output or filter it for the word “corpus”:

vpxenc --help | grep "corpus"

If your build supports the feature, you will see the --corpus-complexity flag listed in the options, typically described as a way to input a complexity file or value to guide rate control.

Step 2: Prepare Your Input and Pass Files

The corpus complexity feature is used during two-pass encoding. You will need: 1. Your source video (e.g., input.y4m or raw video). 2. A first-pass log file generated by the encoder. 3. A complexity file (a text file containing complexity values or database coordinates for your video corpus).

Step 3: Run the Two-Pass Encode

To utilize the feature, you must specify the --corpus-complexity flag during the second pass of your vpxenc command.

Pass 1: Generate Stats

First, run the standard first pass to generate the first-pass frame stats:

vpxenc --codec=vp9 --pass=1 --fpf=video_stats.log -o /dev/null input.y4m

Pass 2: Apply Corpus Complexity

Next, run the second pass, pointing the encoder to your first-pass log and your corpus complexity file:

vpxenc --codec=vp9 --pass=2 --fpf=video_stats.log --corpus-complexity=my_corpus_complexity.txt --target-bitrate=1500 -o output.webm input.y4m

In this command: * --pass=2 tells the encoder to perform the final compression pass. * --fpf=video_stats.log imports the frame statistics gathered during Pass 1. * --corpus-complexity=my_corpus_complexity.txt imports the external complexity file to guide the rate control algorithm.

Key Considerations