Files
utun2/src/stream/stream_viewer.h
T

47 lines
3.4 KiB
C

/* Общие viewers desktop/Android: независимый media cursor и один ближайший ответ на session ID.
* create/destroy — uasync вне callbacks; внешний bridge защищает destroy от параллельных callers.
* Остальные API потокобезопасны. Один manager занимает stream event callback ядра.
* stop снимает только своего reader; медленные/остановленные viewers не задерживают остальных.
* pull передаёт владение record вызывающему: освобождать u_free(). Кольца RS остаются общими. */
#ifndef STREAM_VIEWER_H
#define STREAM_VIEWER_H
#include "stream_media_buffer.h"
#ifdef __cplusplus
extern "C" {
#endif
struct UTUN_INSTANCE;
struct stream_viewers;
enum stream_viewer_kind {
STREAM_VIEWER_VIDEO = 1, STREAM_VIEWER_AUDIO, STREAM_VIEWER_GAP,
STREAM_VIEWER_OPENED, STREAM_VIEWER_END, STREAM_VIEWER_CLOSED
};
struct stream_viewer_record {
enum stream_viewer_kind kind;
struct stream_media_format format;
uint64_t pts; /* PTS только этого источника, микросекунды. */
size_t length; /* Длина owned payload после структуры. */
int flags, reason; /* VIDEO: KEY; CLOSED: stream_close_reason. */
uint8_t data[];
};
/* 0 — успех, -1 — ошибка; out заранее NULL. */
int stream_viewers_create(struct stream_viewers **out, struct UTUN_INSTANCE *inst);
void stream_viewers_destroy(struct stream_viewers *viewers);
/* Уникальный ненулевой ID принадлежит caller до stop, включая завершённый/ошибочный сеанс.
* Открытие асинхронно: OPENED/CLOSED возвращается через pull. tracks — VIDEO или VIDEO|AUDIO. */
int stream_viewer_open(struct stream_viewers *viewers, uint64_t id, uint64_t group, uint64_t source, uint64_t epoch, unsigned tracks);
void stream_viewer_stop(struct stream_viewers *viewers, uint64_t id);
/* Один owned ответ или NULL. Выдача ответа погашает demand, включая повторный request до pull.
* NULL сохраняет ожидающий запрос. Следующие данные требуют нового request; idle не копирует кольцо. */
struct stream_viewer_record *stream_viewer_pull(struct stream_viewers *viewers, uint64_t id);
/* Позиция и audio_ahead относятся только к этому reader; повторный demand заменяет прежний.
* 0 — принято, -1 — неизвестный/закрытый ID или ошибка scheduling. */
int stream_viewer_request(struct stream_viewers *viewers, uint64_t id, int64_t position, int video, int64_t audio_ahead);
/* Последний снимок сохраняется после END до stop. 0 — получен, -1 — ID отсутствует. */
int stream_viewer_status(struct stream_viewers *viewers, uint64_t id, struct stream_media_status *status);
/* Очистить ответ и искать ближайший KEY только этого reader. 0 — принято, -1 — отказ. */
int stream_viewer_resync(struct stream_viewers *viewers, uint64_t id);
#ifdef __cplusplus
}
#endif
#endif