Files
utun2/src/video/video.h
T

80 lines
3.6 KiB
C

// video.h — пробинг и транскодирование видео (FFmpeg, опционально)
#ifndef VIDEO_H
#define VIDEO_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
struct UASYNC;
/* ── целевой профиль: H.264 в MP4, не более 720p / 2 Mbit ── */
#define VIDEO_TARGET_MAX_WIDTH 1280
#define VIDEO_TARGET_MAX_HEIGHT 720
#define VIDEO_TARGET_MAX_BITRATE 2000000 // 2 Mbit (только видео)
#define VIDEO_TARGET_AUDIO_BITRATE 128000 // AAC 128 kbit
/* ── информация о видеофайле ── */
struct video_info {
int is_video; // 1 = открыт и есть видеопоток
int width;
int height;
int64_t bitrate; // bitrate видеопотока (или контейнера)
int64_t duration_ms;
int has_audio;
char codec[32]; // напр. "h264", "hevc", "mpeg4"
char container[32]; // короткое имя контейнера (ifmt->name)
};
/*
* Быстрый пробинг (читает только заголовок). Вызывается из любого потока
* (в т.ч. из GUI-потока Qt) — thread-safe, не блокирует надолго.
* Возвращает 1 если файл содержит ffmpeg-совместимый видеопоток, иначе 0.
*/
int video_probe(const char* path);
/* Полное чтение метаданных. Заполняет info. Возвращает 0 при успехе. */
int video_get_info(const char* path, struct video_info* out);
/*
* Решает, нужен ли транскод: 0 = уже подходит (слать как есть),
* 1 = нужен транскод. Вызывается из любого потока.
*/
int video_needs_transcode(const struct video_info* info);
/*
* Запуск транскодирования. Вызывается из uasync-потока.
* Создаёт отдельный pthread, который либо перекодирует src->dst в целевой
* профиль, либо (если транскод не нужен) копирует src->dst как есть.
* Прогресс обновляется атомарно, читается через video_transcode_get_progress().
* При возврате 0 done(arg, err) вызывается ровно один раз в uasync-потоке,
* в том числе при отмене owner. Callback может выполниться внутри start.
* При возврате -1 callback не вызывается, arg остаётся у вызывающего.
*/
struct media_async;
int video_transcode_start(struct media_async* owner, struct UASYNC* ua,
const char* src, const char* dst,
void (*done)(void* arg, int err, const struct video_info* info), void* arg);
/* Прогресс активного транскода в промилле 0..1000, -1 если транскода нет. */
int video_transcode_get_progress(void);
/* 1 = транскод выполняется прямо сейчас. */
int video_transcode_is_active(void);
/*
* Извлечь превью: декодирует первый видеокадр, масштабирует до max_w по ширине
* и сохраняет JPEG в jpg_out. Вызывается из любого потока (thread-safe).
* Возвращает 0 при успехе.
*/
int video_extract_thumbnail(const char* src, const char* jpg_out, int max_w);
#ifdef __cplusplus
}
#endif
#endif /* VIDEO_H */