render_test

Example of the component tempotian/av_render v0.9.1
# 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"

or download archive (~7.25 KB)