47 lines
3.4 KiB
C
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
|