examples/Codec/README.md
This directory contains examples demonstrating the FastLED codec module functionality for JPEG and MPEG1 decoding.
The FastLED codec module provides video and image decoding capabilities optimized for LED display applications through individual codec headers (fl/codec/jpeg.h and fl/codec/mpeg1.h). It supports:
| Platform | JPEG Support | MPEG1 Support | Hardware Acceleration |
|---|---|---|---|
| ESP32 | ✓ (ROM decoder) | ✓ (Software) | ROM TJpgDec |
| ESP32-S3 | ✓ (ROM + PIE) | ✓ (Software) | ROM TJpgDec + PIE |
| ESP32-C3/C6 | ✓ (ROM decoder) | ✓ (Software) | ROM TJpgDec |
| ESP32-P4 | ✓ (Hardware) | ✓ (Software) | Hardware JPEG codec |
| Teensy 4.x | ✓ (Software) | ✓ (Software) | DSP instructions |
| STM32H7 | ✓ (Hardware) | ✓ (Software) | Hardware JPEG + DMA2D |
| STM32F7 | ✓ (Hardware) | ✓ (Software) | Hardware JPEG |
| Other | ✗ | ✗ | None |
JPEG image decoding and display
Hardware Requirements:
Key Features:
MPEG1 video playback on LED matrix
Hardware Requirements:
Key Features:
#include "fl/codec/jpeg.h"
#include "fl/bytestreammemory.h"
// Configure decoder
fl::JpegDecoderConfig config;
config.format = fl::PixelFormat::RGB888;
config.quality = fl::JpegDecoderConfig::Medium;
// Create decoder
auto decoder = fl::Jpeg::createDecoder(config);
// Create stream from data
auto stream = fl::make_shared<fl::ByteStreamMemory>(jpegData, dataSize);
// Decode
if (decoder->begin(stream)) {
if (decoder->decode() == fl::DecodeResult::Success) {
fl::DecodedVideoFrame frame = decoder->getCurrentFrame();
// Use frame data...
}
decoder->end();
}
#include "fl/codec/mpeg1.h"
// Configure for real-time streaming (immediate mode)
fl::Mpeg1Config config;
config.mode = fl::Mpeg1Config::Streaming;
config.targetFps = 25;
config.immediateMode = true; // Default: bypasses frame buffering for minimal latency
// For buffered mode (when you need frame buffering):
// config.immediateMode = false;
// config.bufferFrames = 2;
// Create decoder
auto decoder = fl::mpeg1::createDecoder(config);
// Playback loop
while (decoder->hasMoreFrames()) {
if (decoder->decode() == fl::DecodeResult::Success) {
fl::DecodedVideoFrame frame = decoder->getCurrentFrame();
displayFrame(frame);
}
}
config.immediateMode = trueconfig.immediateMode = falseAll decoders provide comprehensive error reporting:
fl::string error_msg;
auto decoder = fl::Jpeg::createDecoder(config, &error_msg);
if (!decoder) {
Serial.println("Failed to create decoder: " + error_msg);
return;
}
if (decoder->hasError(&error_msg)) {
Serial.println("Decoder error: " + error_msg);
}
useHardwareAcceleration = true"Codec not supported on this platform"
Memory allocation failures
Poor video performance
JPEG decode failures
Enable serial output for debugging:
Serial.begin(115200);
Serial.println("Decoder status: " + (decoder->isReady() ? "Ready" : "Not Ready"));