diff --git a/src/stream/stream_media_buffer.c b/src/stream/stream_media_buffer.c index d5d441d8..01c3043b 100644 --- a/src/stream/stream_media_buffer.c +++ b/src/stream/stream_media_buffer.c @@ -320,7 +320,7 @@ static int cursor_peek(struct stream_media_cursor *c, struct cursor_track *track } track->seq++; track->entry = 0; } - return STREAM_WAIT; + return STREAM_MORE; } /* Сборка одного ближайшего H264 кадра; остальные кадры продолжают храниться только в RS. */ @@ -354,7 +354,7 @@ static int cursor_video(struct stream_media_cursor *c, struct stream_media_packe c->pending_used = 0; c->pending.frame_size = 0; c->key_delivered = 1; *packet = out; return STREAM_OK; } - return STREAM_WAIT; + return STREAM_MORE; } /* Выдача по времени потребителя оставляет накопленный запас в общем кольце. */ @@ -394,5 +394,5 @@ int stream_media_cursor_read(struct stream_media_cursor *c, int64_t position, in return STREAM_OK; } if (video_allowed) return cursor_video(c, packet); - return STREAM_WAIT; + return ar == STREAM_MORE || vr == STREAM_MORE ? STREAM_MORE : STREAM_WAIT; } diff --git a/src/stream/stream_proto.h b/src/stream/stream_proto.h index 549a58a5..0e4fc1ff 100644 --- a/src/stream/stream_proto.h +++ b/src/stream/stream_proto.h @@ -58,6 +58,7 @@ enum stream_result { STREAM_GAP = 3, STREAM_EXPIRED = 4, STREAM_REJECTED = 5, /* Пачка восстановлена, но подпись/подписанные метаданные не прошли проверку. */ + STREAM_MORE = 6, /* Бюджет работы исчерпан; можно продолжить отложенным callback без новых данных. */ STREAM_ERR_ARGUMENT = -1, STREAM_ERR_MEMORY = -2, STREAM_ERR_FORMAT = -3, diff --git a/tools/chatgui/transport/stream_bridge.cpp b/tools/chatgui/transport/stream_bridge.cpp index 17850e1f..0c050489 100644 --- a/tools/chatgui/transport/stream_bridge.cpp +++ b/tools/chatgui/transport/stream_bridge.cpp @@ -153,7 +153,8 @@ void process(void*) { if (packet.kind == STREAM_MEDIA_READ_END) closeViewer(StreamRecordKind::End, 0); else mediaFrame(nullptr, &packet.format, packet.kind == STREAM_MEDIA_READ_VIDEO ? &packet.video : nullptr, packet.kind == STREAM_MEDIA_READ_AUDIO ? &packet.audio : nullptr); - } else if (result == STREAM_WAIT) bridge.waiting = true; + } else if (result == STREAM_MORE) { bridge.wantRead = true; schedule(); } + else if (result == STREAM_WAIT) bridge.waiting = true; else if (result == STREAM_GAP || result == STREAM_EXPIRED) { DEBUG_INFO(DEBUG_CATEGORY_STREAM, "desktop playback resync id=%llu result=%d", (unsigned long long)bridge.viewer.id, result); stream_media_resync(bridge.handle); bridge.position = -1;