# AV Render Test Application This is a comprehensive audio-video render test application for **ESP32P4** and **ESP32S3** platforms, showcasing real-time media rendering capabilities. ## Overview The application captures audio and video from hardware sources (camera and microphone) and renders them through an LCD display and I2S audio output, forming a complete end-to-end media pipeline test. ## Architecture ### System Components The test application is divided into two main subsystems: 1. **Capture System** — Acquires media input (camera, microphone) 2. **Render System** — Handles media output (focus of this documentation) ### Render System Components ```c typedef struct { audio_render_handle_t audio_render; // I2S audio renderer video_render_handle_t video_render; // LCD video renderer av_render_handle_t player; // Combined AV renderer } player_system_t; ``` - **Audio Render**: I2S-based audio output, fixed clock mode, 6KB buffer - **Video Render**: LCD-based video output, 500KB buffer, supports MJPEG - **Player (av_render)**: Combines audio and video renderers, manages sync and buffer usage ## Key Functions ### `build_player_system()` Initializes the render system components: ```c static int build_player_system(void) { // Create I2S audio renderer i2s_render_cfg_t i2s_cfg = { .fixed_clock = true, .play_handle = get_playback_handle(), }; player_sys.audio_render = av_render_alloc_i2s_render(&i2s_cfg); // Create LCD video renderer lcd_render_cfg_t lcd_cfg = { .lcd_handle = board_get_lcd_handle(), }; player_sys.video_render = av_render_alloc_lcd_render(&lcd_cfg); // Create combined AV renderer av_render_cfg_t render_cfg = { .audio_render = player_sys.audio_render, .video_render = player_sys.video_render, .audio_raw_fifo_size = 4096, .audio_render_fifo_size = 6 * 1024, .video_raw_fifo_size = 500 * 1024, .allow_drop_data = false, }; player_sys.player = av_render_open(&render_cfg); } ``` ### `test_capture_to_player()` Demonstrates capture-to-render pipeline: - **Audio Flow**: G.711A frames (8kHz, mono) → `av_render_add_audio_data()` → I2S speakers/headphones - **Video Flow**: MJPEG frames → `av_render_add_video_data()` → LCD display ## Render Configuration ### Audio - Codec: G.711A - Sample Rate: 8kHz - Channels: Mono - Buffers: 4KB raw + 6KB render FIFO ### Video - Codec: MJPEG - Resolution: Configurable (`VIDEO_WIDTH`, `VIDEO_HEIGHT`) - Frame Rate: Configurable (`VIDEO_FPS`) - Buffers: 500KB raw FIFO ## Performance Features ### Thread Scheduling ```c static void thread_scheduler(const char *thread_name, media_lib_thread_cfg_t *schedule_cfg) { if (strcmp(thread_name, "venc_0") == 0) { schedule_cfg->priority = 10; #if CONFIG_IDF_TARGET_ESP32S3 schedule_cfg->stack_size = 20 * 1024; #endif } else if (strcmp(thread_name, "AUD_SRC") == 0) { schedule_cfg->priority = 15; // Higher priority for audio } } ``` - Audio prioritized for low latency - Video allocated larger stack for processing ### Buffer Management - **Audio**: Dual-FIFO (raw + render) prevents dropouts - **Video**: 500KB buffer absorbs MJPEG frame variations - **Drop Protection**: `allow_drop_data = false` guarantees frame integrity ## Supported Platforms ### ESP32P4 - Video Input: V4L2 (`/dev/video0`) - Camera: MIPI CSI / DVP - Processing: Hardware-accelerated ### ESP32S3 - Video Input: DVP - Camera: DVP-based - Processing: Software-only ## Usage 1. **Initialization**: `media_sys_buildup()` 2. **Run Test**: `test_capture_to_player()` 3. **Continuous Operation**: real-time capture → decode → render ## Quality Settings Edit `settings.h` to adjust playback quality: - `VIDEO_WIDTH` - `VIDEO_HEIGHT` - `VIDEO_FPS` ## Dependencies - `av_render` — Core rendering library - `esp_capture` — Capture library - `codec_board` — Board-specific codec support - `media_lib_sal` — Media library adaptation layer
To create a project from this example, run:
idf.py create-project-from-example "tempotian/av_render=0.9.1:render_test"