rtsp: fix deadlock when finishing stream

This commit is contained in:
Kamil Trzcinski 2023-03-08 19:14:41 +01:00
parent 42dbdb7345
commit 538955ee30

View File

@ -47,21 +47,21 @@ public:
void doGetNextFrame() void doGetNextFrame()
{ {
{ if (!fHaveStartedReading) {
std::unique_lock streams_lock(rtsp_streams_lock); std::unique_lock lk(rtsp_streams_lock);
if (!fHaveStartedReading) { rtsp_streams.insert(this);
rtsp_streams.insert(this); fHaveStartedReading = True;
fHaveStartedReading = True;
}
} }
send_buffer(); if (send_buffer()) {
afterGetting(this);
}
} }
void doStopGettingFrames() void doStopGettingFrames()
{ {
{ if (fHaveStartedReading) {
std::unique_lock streams_lock(rtsp_streams_lock); std::unique_lock lk(rtsp_streams_lock);
rtsp_streams.erase(this); rtsp_streams.erase(this);
fHaveStartedReading = false; fHaveStartedReading = false;
} }
@ -144,8 +144,6 @@ public:
rtsp_options->truncated++; rtsp_options->truncated++;
set_buffer(NULL); set_buffer(NULL);
} }
afterGetting(this);
return true; return true;
} }
@ -236,7 +234,9 @@ static void rtsp_frame_finish()
{ {
std::unique_lock lk(rtsp_streams_lock); std::unique_lock lk(rtsp_streams_lock);
for (auto *stream : rtsp_streams) { for (auto *stream : rtsp_streams) {
stream->send_buffer(); if (stream->send_buffer()) {
stream->afterGetting(stream);
}
} }
if (rtsp_options) { if (rtsp_options) {
rtsp_options->clients = rtsp_streams.size(); rtsp_options->clients = rtsp_streams.size();