63 lines
3.0 KiB
C
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
|