From 3d11366c0fb2111ecf5efbf6ed4dada4185b37c1 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 29 Apr 2021 06:38:42 -0400 Subject: [PATCH] restart stream when RTSP stream name changes --- src/zm_rtsp_server.cpp | 45 +++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/zm_rtsp_server.cpp b/src/zm_rtsp_server.cpp index 773ada3c6..7b561898c 100644 --- a/src/zm_rtsp_server.cpp +++ b/src/zm_rtsp_server.cpp @@ -176,7 +176,11 @@ int main(int argc, char *argv[]) { std::vector> new_monitors = Monitor::LoadMonitors(where, Monitor::QUERY); for (const auto &monitor : new_monitors) { - if (old_monitors.find(monitor->Id()) != old_monitors.end()) { + if ( + (old_monitors.find(monitor->Id()) != old_monitors.end()) + and + (old_monitors[monitor->Id()]->GetRTSPStreamName() == monitor->GetRTSPStreamName()) + ) { Debug(1, "Found monitor in oldmonitors, clearing it"); old_monitors.erase(monitor->Id()); } else { @@ -191,19 +195,19 @@ int main(int argc, char *argv[]) { Debug(1, "Removing %d %s from monitors", monitor->Id(), monitor->Name()); monitors.erase(mid); if (sessions.find(mid) != sessions.end()) { + if (video_sources.find(monitor->Id()) != video_sources.end()) { + delete video_sources[monitor->Id()]; + video_sources.erase(monitor->Id()); + } + if (audio_sources.find(monitor->Id()) != audio_sources.end()) { + delete audio_sources[monitor->Id()]; + audio_sources.erase(monitor->Id()); + } rtspServer->RemoveSession(sessions[mid]->GetMediaSessionId()); //Debug(1, "Deleting session"); //delete sessions[mid]; sessions.erase(mid); } - if (video_sources.find(monitor->Id()) != video_sources.end()) { - delete video_sources[monitor->Id()]; - video_sources.erase(monitor->Id()); - } - if (audio_sources.find(monitor->Id()) != audio_sources.end()) { - delete audio_sources[monitor->Id()]; - audio_sources.erase(monitor->Id()); - } } for (auto it = monitors.begin(); it != monitors.end(); ++it) { @@ -215,21 +219,22 @@ int main(int argc, char *argv[]) { if (!monitor->connect()) { Warning("Couldn't connect to monitor %d", monitor->Id()); if (sessions.find(monitor->Id()) != sessions.end()) { + if (video_sources.find(monitor->Id()) != video_sources.end()) { + video_sources.erase(monitor->Id()); + } + if (audio_sources.find(monitor->Id()) != audio_sources.end()) { + audio_sources.erase(monitor->Id()); + } rtspServer->RemoveSession(sessions[monitor->Id()]->GetMediaSessionId()); delete sessions[monitor->Id()]; sessions.erase(monitor->Id()); } - if (video_sources.find(monitor->Id()) != video_sources.end()) { - video_sources.erase(monitor->Id()); - } - if (audio_sources.find(monitor->Id()) != audio_sources.end()) { - audio_sources.erase(monitor->Id()); - } continue; } } + if (sessions.end() == sessions.find(monitor->Id())) { Debug(1, "Monitor not found in sessions, opening it"); std::string videoFifoPath = monitor->GetVideoFifoPath(); @@ -237,8 +242,8 @@ int main(int argc, char *argv[]) { Debug(1, "video fifo is empty. Skipping."); continue; } - std::string streamname = monitor->GetRTSPStreamName(); + std::string streamname = monitor->GetRTSPStreamName(); xop::MediaSession *session = sessions[monitor->Id()] = xop::MediaSession::CreateNew(streamname); if (!session) { Error("Unable to create session for %s", streamname.c_str()); @@ -325,16 +330,16 @@ int main(int argc, char *argv[]) { } // end while !zm_terminate Info("RTSP Server shutting down"); - for (auto it = sessions.begin(); it != sessions.end(); ++it) { + for (auto it = monitors.begin(); it != monitors.end(); ++it) { auto &monitor = it->second; unsigned int i = it->first; + if (video_sources.find(i) != video_sources.end()) delete video_sources[i]; + if (audio_sources.find(i) != audio_sources.end()) delete audio_sources[i]; if (sessions.find(i) != sessions.end()) { Debug(1, "Removing session for %s", monitors[i]->Name()); rtspServer->RemoveSession(sessions[i]->GetMediaSessionId()); - sessions[i] = nullptr; + sessions.erase(i); } - if (video_sources.find(i) != video_sources.end()) delete video_sources[i]; - if (audio_sources.find(i) != audio_sources.end()) delete audio_sources[i]; } // end foreach monitor rtspServer->Stop();