Browse Source

Continue bounded media assembly without waiting for new network data

master
evgeny 7 days ago
parent
commit
5c75487446
  1. 6
      src/stream/stream_media_buffer.c
  2. 1
      src/stream/stream_proto.h
  3. 3
      tools/chatgui/transport/stream_bridge.cpp

6
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;
}

1
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,

3
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;

Loading…
Cancel
Save