# Why FFmpeg Chooses SSSE3 Over AVX for Video Decoding


By [vietha.eth](https://paragraph.com/@vietha) · 2025-12-01

---

When people first learn about modern CPU instruction sets, a common assumption is:

> **“AVX is newer and wider than SSSE3 — so it must be faster, right?”**

In theory, that sounds reasonable.  
In practice, FFmpeg deliberately avoids AVX for many core video decoding paths and still relies heavily on SSSE3 for operations such as:

*   DCT / IDCT
    
*   Dequantization (Unquantization)
    
*   Motion compensation
    
*   Block-based transforms
    

This article explains why SSSE3 often beats AVX in real-world video decoding from the perspectives of:

*   CPU frequency scaling
    
*   Thermal behavior
    
*   Instruction-level parallelism
    
*   Memory access patterns
    
*   Long-term system stability
    

* * *

**1\. What is SIMD?**
---------------------

**SIMD = Single Instruction, Multiple Data**

It means one CPU instruction operates on many values at the same time.

### **Without SIMD (scalar C loop)**

    a[0] *= 2;
    a[1] *= 2;
    a[2] *= 2;
    a[3] *= 2;

### **With SIMD**

    multiply 4 values at once

SIMD is the backbone of:

*   Video decoding
    
*   Audio processing
    
*   Image filters
    
*   Computer vision
    
*   AI inference
    

* * *

**2\. SSSE3 vs AVX: A Quick Comparison**
----------------------------------------

Instruction Set

Year

Register Width

int16 per Instruction

MMX

1997

64-bit

4

SSE / SSSE3

2006

128-bit

8

AVX

2011

256-bit

16

AVX-512

2015

512-bit

32

  

At first glance, AVX is 2× wider than SSSE3.  
In video decoding, this assumption breaks down completely.

At first glance, AVX is 2× wider than SSSE3.  
In video decoding, this assumption breaks down completely.

* * *

**3\. Reason #1: AVX Is Too Wide for 8×8 Video Blocks**
-------------------------------------------------------

Classic codecs such as H.263, MPEG-2, and early H.264 are block-based:

*   Each block contains 8×8 = 64 values
    
*   Most math uses 16-bit integers
    
*   Heavy use of:
    
    *   Shuffles
        
    *   Sign operations
        
    *   Multiplication
        
    *   Clamping
        

SSSE3:

*   8 values per instruction
    
*   64 values → 8 vector ops
    

AVX:

*   16 values per instruction
    
*   64 values → 4 vector ops
    

In practice, memory bandwidth, shuffle pressure, and pipeline dependencies dominate.

Real speedup from SSSE3 → AVX is often only **~1.2×–1.5×**.

* * *

**4\. Reason #2: AVX Forces the CPU to Downclock**
--------------------------------------------------

This is the most critical reason.

When AVX is active:

*   Power consumption spikes
    
*   Heat increases rapidly
    
*   The CPU automatically reduces its clock frequency
    

Typical behavior:

Mode

Frequency

SSSE3

~4.8 GHz

AVX

~3.9 GHz

AVX-512

~3.2 GHz

Even if AVX processes more data per instruction, the CPU runs significantly slower overall.

For continuous workloads like video decoding, this downclocking cancels out most of AVX’s theoretical advantage.

* * *

**5\. Reason #3: Video Decoding Is Not “Pure Math”**
----------------------------------------------------

AVX works best when:

*   Data is continuous
    
*   There are no branches
    
*   Memory access is predictable
    
*   Loops are long and vector-friendly
    

Video decoding contains:

*   Motion compensation
    
*   Edge clipping
    
*   Block prediction
    
*   Many conditionals
    
*   Cache-unfriendly memory access
    

These patterns reduce AVX efficiency severely.

SSSE3 is lighter and integrates better with scalar code.

* * *

**6\. Reason #4: Hardware Compatibility and Stability**
-------------------------------------------------------

FFmpeg must run on:

*   Old laptops
    
*   Office desktops
    
*   Mini PCs
    
*   Virtual machines
    
*   Low-power servers
    

Meanwhile:

*   Many CPUs do not support AVX
    
*   Some BIOS setups disable AVX
    
*   Many virtual machines cannot expose AVX
    
*   Low-TDP systems throttle aggressively under AVX
    

SSSE3:

*   Supported on almost all x86 CPUs since ~2007
    
*   Low power usage
    
*   Minimal thermal impact
    
*   Extremely stable
    

* * *

**7\. Reason #5: AVX ↔ SSE Transitions Are Expensive**
------------------------------------------------------

Switching between AVX and SSE/SSSE3 requires:

*   Vector state flush
    
*   Pipeline synchronization
    
*   Execution stalls
    

These hidden costs often erase AVX’s gains.

Keeping everything in SSE/SSSE3 avoids these penalties.

* * *

**8\. When FFmpeg _Does_ Use AVX**
----------------------------------

FFmpeg uses AVX when the workload is a good fit:

*   Image scaling
    
*   Color space conversion
    
*   Video filters
    
*   HDR tone mapping
    
*   AI-based upscaling
    

But not for:

*   DCT / IDCT
    
*   Block unquantization
    
*   Motion-compensated prediction
    

* * *

**9\. Engineering Conclusion**
------------------------------

SSSE3 sits at the perfect balance of:

*   Performance
    
*   Power efficiency
    
*   Thermal stability
    
*   Hardware compatibility
    

AVX introduces:

*   Thermal throttling
    
*   Frequency downclocking
    
*   Platform incompatibility
    
*   Scheduling complexity
    

For video decoding, consistency beats peak theoretical throughput.

* * *

**10\. One-Sentence Summary**
-----------------------------

FFmpeg avoids AVX for video decoding because AVX causes CPU downclocking, thermal pressure, and poor real-world efficiency for small block-based workloads — while SSSE3 delivers stable, portable performance.

---

*Originally published on [vietha.eth](https://paragraph.com/@vietha/why-ffmpeg-chooses-ssse3-over-avx-for-video-decoding)*
