view media_processor/README.md @ 217:7ef4c9d2a72d hg-web

[DO NOT PUSH] Random values.
author MrJuneJune <me@mrjunejune.com>
date Sun, 25 Jan 2026 10:44:04 -0800
parents
children
line wrap: on
line source

# media_processor

Reusable media processing library for images and videos.

## Features

- **Image Processing**: Convert images to WebP format with quality/size options
- **Video Processing**: Convert videos to HLS format for streaming
- **Auto-detection**: Automatically detects media type from file extension
- **Thumbnail Generation**: Creates thumbnails for videos
- **Original Preservation**: Keeps original files alongside processed versions

## Usage

```c
#include "media_processor/media_processor.h"

// Process any media file (auto-detects type)
MediaProcessorOpts opts = media_processor_opts_default("./output");
opts.image_quality = 85;
opts.video_max_width = 1920;

char* id = media_generate_id();
MediaResult* result = media_process_file("upload.mp4", id, &opts);

if (result->status == MEDIA_STATUS_COMPLETED) {
    printf("HLS playlist: %s\n", result->hls_playlist);
    printf("Thumbnail: %s\n", result->thumbnail_path);
}

media_result_free(result);
free(id);
```

## Output Structure

For images:
```
output/
└── {id}/
    ├── original.jpg    # Original file
    └── image.webp      # Converted WebP
```

For videos:
```
output/
└── {id}/
    ├── original.mp4    # Original file
    ├── video.m3u8      # HLS playlist
    ├── video_000.ts    # HLS segments
    ├── video_001.ts
    └── video_thumb.jpg # Thumbnail
```

## Options

### Image Options

| Option | Default | Description |
|--------|---------|-------------|
| `image_quality` | 80 | WebP quality (0-100) |
| `image_max_width` | 0 | Max width (0 = no limit) |
| `image_max_height` | 0 | Max height (0 = no limit) |

### Video Options

| Option | Default | Description |
|--------|---------|-------------|
| `video_segment_duration` | 6 | HLS segment length in seconds |
| `video_bitrate` | 0 | Video bitrate in kbps (0 = auto) |
| `video_max_width` | 0 | Max width (0 = no limit) |
| `video_max_height` | 0 | Max height (0 = no limit) |
| `generate_thumbnail` | true | Generate video thumbnail |

## Building

```bash
bazel build //media_processor:media_processor
```

## Dependencies

- `//third_party/ffmpeg:ffmpeg_cli` - FFmpeg CLI wrapper
- `//dowa:dowa` - Memory and string utilities