Skip to main content

VP8/VP9 Encoders

This guide provides comprehensive documentation for implementing VP8 and VP9 video encoding in VisioForge .NET SDKs. The SDK offers multiple encoder implementations to suit different needs and platforms.

Available Encoders

The SDK provides several encoder implementations:

Windows-only Engines

  • Software VP8 and VP9 encoders (configured via WebMOutput class)

Cross-platform X-engines

Bitrate Control Modes

All VPx encoders support multiple bitrate control strategies. The appropriate mode depends on your specific use case:

1. Constant Bitrate (CBR)

CBR maintains a steady bitrate throughout the encoding process. This mode is ideal for:

  • Live streaming with bandwidth constraints
  • Scenarios requiring predictable file sizes
  • Real-time communication applications

Here's how to implement CBR with different encoder types:

Using WebMOutput (Windows-only):

var webmOutput = new WebMOutput();
webmOutput.Video_EndUsage = VP8EndUsageMode.CBR;
webmOutput.Video_Encoder = WebMVideoEncoder.VP8;
webmOutput.Video_Bitrate = 2000; // 2 Mbps

Using VP8EncoderSettings:

var vp8 = new VP8EncoderSettings();
vp8.RateControl = VPXRateControl.CBR;
vp8.TargetBitrate = 2000; // 2 Mbps

Using VP9EncoderSettings:

var vp9 = new VP9EncoderSettings();
vp9.RateControl = VPXRateControl.CBR;
vp9.TargetBitrate = 2000; // 2 Mbps

Using QSVVP9EncoderSettings:

var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.CBR;
vp9qsv.Bitrate = 2000; // 2 Mbps

2. Variable Bitrate (VBR)

VBR adjusts the bitrate based on content complexity. This mode is recommended for:

  • Non-live video encoding
  • Scenarios where visual quality is more important than consistent file size
  • Content with varying complexity

Implementation examples:

Using WebMOutput (Windows-only):

var webmOutput = new WebMOutput();
webmOutput.Video_EndUsage = VP8EndUsageMode.VBR;
webmOutput.Video_Encoder = WebMVideoEncoder.VP8;
webmOutput.Video_Bitrate = 3000; // 3 Mbps target

Using VP8EncoderSettings:

var vp8 = new VP8EncoderSettings();
vp8.RateControl = VPXRateControl.VBR;
vp8.TargetBitrate = 3000;

Using VP9EncoderSettings:

var vp9 = new VP9EncoderSettings();
vp9.RateControl = VPXRateControl.VBR;
vp9.TargetBitrate = 3000;

Using QSVVP9EncoderSettings:

var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.VBR;
vp9qsv.Bitrate = 3000;

3. Quality-based Modes

These modes focus on maintaining consistent quality rather than targeting specific bitrates:

Constant Quality (CQ)

Available for VP8 and VP9 software encoders:

Using VP8EncoderSettings.

var vp8 = new VP8EncoderSettings();
vp8.RateControl = VPXRateControl.CQ;
vp8.CQLevel = 20; // Quality level (0-63, lower is better)

Using VP9EncoderSettings.

var vp9 = new VP9EncoderSettings();
vp9.RateControl = VPXRateControl.CQ;
vp9.CQLevel = 20;

Intel QSV Quality Modes

For Intel QSV VP9 encoder, two quality-focused modes are available:

  1. ICQ (Intelligent Constant Quality):
var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.ICQ;
vp9qsv.ICQQuality = 25; // 20-27 recommended for balanced quality
  1. CQP (Constant Quantization Parameter):
var vp9qsv = new QSVVP9EncoderSettings();
vp9qsv.RateControl = QSVVP9EncRateControl.CQP;
vp9qsv.QPI = 26; // I-frame QP
vp9qsv.QPP = 28; // P-frame QP

Advanced Features

VP9-specific Features

VP9 encoders support additional features for optimization:

  1. Adaptive Quantization:
var vp9 = new VP9EncoderSettings();
vp9.AQMode = VPXAdaptiveQuantizationMode.Variance; // Enable variance-based AQ
  1. Parallel Processing:
var vp9 = new VP9EncoderSettings();
vp9.FrameParallelDecoding = true; // Enable parallel frame processing
vp9.RowMultithread = true; // Enable row-based multithreading
vp9.TileColumns = 6; // Set number of tile columns (log2)
vp9.TileRows = 0; // Set number of tile rows (log2)

Error Resilience

Both VP8 and VP9 support error resilience features for robust streaming:

Using WebMOutput (Windows-only):

var webmOutput = new WebMOutput();
webmOutput.Video_ErrorResilient = true; // Enable error resilience

Using VP8EncoderSettings or VP9EncoderSettings:

var vpx = new VP8EncoderSettings();  // or VP9EncoderSettings
vpx.ErrorResilient = VPXErrorResilientFlags.Default | VPXErrorResilientFlags.Partitions;

Performance Optimization

Several settings are available for performance tuning:

var vpx = new VP8EncoderSettings();  // or VP9EncoderSettings
vpx.CPUUsed = 0; // -16 to 16, higher values trade quality for speed
vpx.NumOfThreads = 4; // Number of encoding threads
vpx.TokenPartitions = VPXTokenPartitions.Eight; // Parallel token processing

Best Practices

  1. Rate Control Selection:

    • Use CBR for live streaming and real-time communication
    • Use VBR for offline encoding where quality is priority
    • Use quality-based modes for highest possible quality regardless of bitrate
  2. Performance Optimization:

    • Adjust CPUUsed based on your quality/speed requirements
    • Enable multithreading for better performance on multi-core systems
    • Use tile-based parallelism in VP9 for better hardware utilization
  3. Error Resilience:

    • Enable error resilience for streaming over unreliable networks
    • Use appropriate token partitioning for better error recovery
  4. Quality Optimization:

    • Use adaptive quantization in VP9 for better quality distribution
    • Consider two-pass encoding for better quality in non-real-time scenarios
    • Adjust quantizer ranges based on content type and quality requirements