Files
utun2/src/stream/stream_media.h
T

63 lines
3.0 KiB
C

/* Медиаблок внутри одной FEC-пачки: big-endian, uAV2, fixed header(32),
* video descriptors(32 each), audio descriptors(16 each), video bytes, audio bytes.
* video descriptor: frame_id:8, PTS_us:8, frame_size:4, fragment_offset:4, length:4, flags:1, reserved:3.
* audio descriptor: PTS_us:8, length:4, samples:2, reserved:2. Opus: 48kHz mono/stereo, 960 frames/channel.
* KEY payload: config_length:4BE, codec configuration, access unit. Остальные кадры — access unit.
* Видео меняется по revision; аудиотрек фиксирован на source_epoch. Конфигурация защищена общей подписью/RS.
* first_frame_offset относится к video bytes; UINT32_MAX означает отсутствие начала кадра.
* Parser проверяет весь блок до публикации view, указатели view заимствованы из входного блока.
* Сборка кадров и восстановление после GAP/revision выполняются store/cursor из stream_media_buffer.h. */
#ifndef STREAM_MEDIA_H
#define STREAM_MEDIA_H
#include "stream_proto.h"
#ifdef __cplusplus
extern "C" {
#endif
#define STREAM_MEDIA_HEADER_SIZE 32
#define STREAM_MEDIA_VIDEO_SIZE 32
#define STREAM_MEDIA_AUDIO_SIZE 16
#define STREAM_MEDIA_MAX_ENTRIES 16
#define STREAM_MEDIA_MAX_FRAME (2u * 1024u * 1024u)
#define STREAM_MEDIA_MAX_BLOCK 65536u
#define STREAM_MEDIA_MAX_OPUS 1275u
#define STREAM_MEDIA_KEY 1
#define STREAM_MEDIA_H264 1
#define STREAM_MEDIA_H265 2
#define STREAM_MEDIA_VP9 3
#define STREAM_MEDIA_AV1 4
#define STREAM_MEDIA_H266 5
#define STREAM_MEDIA_MAX_CONFIG 65536u
#define STREAM_MEDIA_OPUS 1
#define STREAM_MEDIA_OPUS_STEREO 2
struct stream_media_format { uint16_t width, height, rotation; uint8_t video_codec, audio_codec; uint32_t revision; };
struct stream_media_video {
uint64_t frame_id, pts_us;
uint32_t frame_size, offset, length;
uint8_t flags;
const uint8_t *data;
};
struct stream_media_audio { uint64_t pts_us; uint32_t length; uint16_t samples; const uint8_t *data; };
struct stream_media_block {
struct stream_media_format format;
uint32_t first_frame_offset;
unsigned video_count, audio_count;
struct stream_media_video video[STREAM_MEDIA_MAX_ENTRIES];
struct stream_media_audio audio[STREAM_MEDIA_MAX_ENTRIES];
};
/* Encode не меняет output/length при отказе; данные не перекрывают output. */
int stream_media_encode(const struct stream_media_block *block, uint8_t *output, size_t capacity, size_t *length);
int stream_media_parse(const uint8_t *data, size_t length, struct stream_media_block *block);
/* Разобрать только полностью собранный KEY; указатели заимствованы из data. */
int stream_media_key_parse(const uint8_t *data, size_t length, const uint8_t **config, size_t *config_length,
const uint8_t **frame, size_t *frame_length);
#ifdef __cplusplus
}
#endif
#endif