|
|
|
@ -23,6 +23,7 @@ struct Bridge { |
|
|
|
bool wantRead = false, waiting = false, resync = false; |
|
|
|
bool wantRead = false, waiting = false, resync = false; |
|
|
|
int64_t position = -1, videoAhead = STREAM_MEDIA_READ_AHEAD_US, audioAhead = STREAM_MEDIA_READ_AHEAD_US; |
|
|
|
int64_t position = -1, videoAhead = STREAM_MEDIA_READ_AHEAD_US, audioAhead = STREAM_MEDIA_READ_AHEAD_US; |
|
|
|
stream_media_status status{}; |
|
|
|
stream_media_status status{}; |
|
|
|
|
|
|
|
uint64_t statusId = 0; |
|
|
|
Viewer viewer, requested; |
|
|
|
Viewer viewer, requested; |
|
|
|
STREAM_HANDLE* handle = nullptr; |
|
|
|
STREAM_HANDLE* handle = nullptr; |
|
|
|
std::deque<StreamRecord> output; |
|
|
|
std::deque<StreamRecord> output; |
|
|
|
@ -66,7 +67,6 @@ void closeViewer(StreamRecordKind kind, int reason) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void mediaFrame(void*, const stream_media_format* format, const stream_media_video* video, const stream_media_audio* audio) { |
|
|
|
void mediaFrame(void*, const stream_media_format* format, const stream_media_video* video, const stream_media_audio* audio) { |
|
|
|
if (bridge.overflow) return; |
|
|
|
|
|
|
|
StreamRecord record; record.id = bridge.viewer.id; record.format = *format; |
|
|
|
StreamRecord record; record.id = bridge.viewer.id; record.format = *format; |
|
|
|
if (video) { |
|
|
|
if (video) { |
|
|
|
record.kind = StreamRecordKind::Video; record.pts = video->pts_us; record.flags = video->flags; |
|
|
|
record.kind = StreamRecordKind::Video; record.pts = video->pts_us; record.flags = video->flags; |
|
|
|
@ -104,7 +104,7 @@ void process(void*) { |
|
|
|
} |
|
|
|
} |
|
|
|
if (bridge.opening) { |
|
|
|
if (bridge.opening) { |
|
|
|
bridge.opening = false; bridge.viewer = bridge.requested; bridge.requested = {}; |
|
|
|
bridge.opening = false; bridge.viewer = bridge.requested; bridge.requested = {}; |
|
|
|
bridge.status = {}; bridge.position = -1; bridge.waiting = false; |
|
|
|
bridge.status = {}; bridge.statusId = bridge.viewer.id; bridge.position = -1; bridge.waiting = false; |
|
|
|
stream_member_state member{}; |
|
|
|
stream_member_state member{}; |
|
|
|
int reason = STREAM_CLOSE_FAILED; |
|
|
|
int reason = STREAM_CLOSE_FAILED; |
|
|
|
int result = stream_member_load(bridge.inst, bridge.viewer.group, bridge.viewer.source, &member, nullptr); |
|
|
|
int result = stream_member_load(bridge.inst, bridge.viewer.group, bridge.viewer.source, &member, nullptr); |
|
|
|
@ -235,7 +235,7 @@ bool gui_stream_pull(uint64_t id, StreamRecord& record, int64_t position, int64_ |
|
|
|
|
|
|
|
|
|
|
|
bool gui_stream_status(uint64_t id, stream_media_status& status) { |
|
|
|
bool gui_stream_status(uint64_t id, stream_media_status& status) { |
|
|
|
std::lock_guard<std::mutex> guard(bridge.lock); |
|
|
|
std::lock_guard<std::mutex> guard(bridge.lock); |
|
|
|
if (bridge.viewer.id != id && !bridge.status.finished) return false; |
|
|
|
if (bridge.statusId != id) return false; |
|
|
|
status = bridge.status; return true; |
|
|
|
status = bridge.status; return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|