Expose demand based audio and video reads on local stream handles
This commit is contained in:
1 parent
866ca0923d
commit
9f37c54a3c
3 files changed
+18
-16
No files matched your search
+6
-5
@@ -784,7 +784,7 @@ int stream_get_info(const struct STREAM_HANDLE *h, struct stream_info *info) {
|
||||
}
|
||||
|
||||
/* Первый frontend создаёт индекс точной эпохи, остальные владельцы используют его без копии RS-кольца. */
|
||||
int stream_media_enable(struct STREAM_HANDLE *h, int reader) {
|
||||
int stream_media_enable(struct STREAM_HANDLE *h, unsigned tracks) {
|
||||
if (!stream_handle_active(h)) { DEBUG_ERROR(DEBUG_CATEGORY_STREAM, "media enable: detached handle"); return STREAM_ERR_STATE; }
|
||||
struct stream_session *s = h->session;
|
||||
if (!s->media) {
|
||||
@@ -796,8 +796,8 @@ int stream_media_enable(struct STREAM_HANDLE *h, int reader) {
|
||||
s->media_seek = s->next_seq - 1; s->media_seeking = 1;
|
||||
}
|
||||
}
|
||||
if (reader && !h->media_cursor) {
|
||||
int result = stream_media_cursor_create(&h->media_cursor, s->media);
|
||||
if (tracks && !h->media_cursor) {
|
||||
int result = stream_media_cursor_create(&h->media_cursor, s->media, tracks);
|
||||
if (result != STREAM_OK) return result;
|
||||
}
|
||||
session_media_schedule(s);
|
||||
@@ -805,13 +805,14 @@ int stream_media_enable(struct STREAM_HANDLE *h, int reader) {
|
||||
}
|
||||
|
||||
/* Чтение изменяет только локальный cursor; live ingest/READY/выдачи продолжают двигаться независимо. */
|
||||
int stream_media_read(struct STREAM_HANDLE *h, int64_t position, int64_t lookahead, struct stream_media_packet *packet) {
|
||||
int stream_media_read(struct STREAM_HANDLE *h, int64_t position, int64_t video_ahead, int64_t audio_ahead,
|
||||
struct stream_media_packet *packet) {
|
||||
if (!stream_handle_active(h) || !h->media_cursor) {
|
||||
DEBUG_WARN(DEBUG_CATEGORY_STREAM, "media read: detached/unconfigured reader"); return STREAM_ERR_STATE;
|
||||
}
|
||||
if (h->session->media_failed) return STREAM_ERR_FORMAT;
|
||||
if (h->session->media_seeking || h->session->media_next < h->session->next_seq) return STREAM_WAIT;
|
||||
return stream_media_cursor_read(h->media_cursor, position, lookahead, packet);
|
||||
return stream_media_cursor_read(h->media_cursor, position, video_ahead, audio_ahead, packet);
|
||||
}
|
||||
|
||||
int stream_media_get_status(struct STREAM_HANDLE *h, struct stream_media_status *status) {
|
||||
|
||||
+4
-3
@@ -88,11 +88,12 @@ int stream_handle_reason(const struct STREAM_HANDLE *handle);
|
||||
int stream_get_info(const struct STREAM_HANDLE *handle, struct stream_info *info);
|
||||
|
||||
/* Медиаплеер использует тот же RS-buffer, но собственные позиции чтения.
|
||||
* reader=0 включает только общий индекс (publisher), reader=1 создаёт cursor этого handle.
|
||||
* tracks=0 включает только общий индекс; VIDEO или VIDEO|AUDIO создаёт cursor этого handle.
|
||||
* Все вызовы — uasync. Заимствованный packet действует до следующего read/close.
|
||||
* LIVE DATA/GAP/END callbacks описывают сетевой прогресс; конец отложенного просмотра получает media_read. */
|
||||
int stream_media_enable(struct STREAM_HANDLE *handle, int reader);
|
||||
int stream_media_read(struct STREAM_HANDLE *handle, int64_t position_us, int64_t lookahead_us, struct stream_media_packet *packet);
|
||||
int stream_media_enable(struct STREAM_HANDLE *handle, unsigned tracks);
|
||||
int stream_media_read(struct STREAM_HANDLE *handle, int64_t position_us, int64_t video_ahead_us, int64_t audio_ahead_us,
|
||||
struct stream_media_packet *packet);
|
||||
int stream_media_get_status(struct STREAM_HANDLE *handle, struct stream_media_status *status);
|
||||
int stream_media_resync(struct STREAM_HANDLE *handle);
|
||||
|
||||
|
||||
Reference in new issue
Block a user