From 7293b8b9dd482568daf240af97ce32e74ed31cfe Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Tue, 30 Mar 2021 19:03:33 +0200 Subject: [PATCH] BugFix: clean interrupt stream when ending abruptly --- Streamer.cpp | 28 +++++++++++++++++++++++++++- Streamer.h | 3 +++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Streamer.cpp b/Streamer.cpp index 880aa50..e3ff263 100644 --- a/Streamer.cpp +++ b/Streamer.cpp @@ -187,6 +187,28 @@ void Streaming::removeStreams(const std::string &clientname) streamers_lock_.unlock(); } +void Streaming::removeStream(const VideoStreamer *vs) +{ + if ( vs!= nullptr && streamers_lock_.try_lock()) { + + std::vector::const_iterator sit = streamers_.begin(); + while ( sit != streamers_.end() ){ + if ( *(sit) == vs) { +#ifdef STREAMER_DEBUG + NetworkToolkit::StreamConfig config = vs->config_; + Log::Info("Ending streaming to %s:%d", config.client_address.c_str(), config.port); +#endif + // remove from list + streamers_.erase(sit); + break; + } + else + sit++; + } + streamers_lock_.unlock(); + } +} + void Streaming::refuseStream(const std::string &sender, int reply_to) { // get ip of client @@ -263,7 +285,7 @@ void Streaming::addStream(const std::string &sender, int reply_to, const std::st } -VideoStreamer::VideoStreamer(NetworkToolkit::StreamConfig conf): FrameGrabber(), config_(conf) +VideoStreamer::VideoStreamer(NetworkToolkit::StreamConfig conf): FrameGrabber(), config_(conf), stopped_(false) { } @@ -386,6 +408,10 @@ void VideoStreamer::stop () // stop recording FrameGrabber::stop (); + // inform streaming manager to remove myself + // NB: will not be effective if called inside a locked streamers_lock_ + Streaming::manager().removeStream(this); + // force finished finished_ = true; } diff --git a/Streamer.h b/Streamer.h index 94c29b4..2975135 100644 --- a/Streamer.h +++ b/Streamer.h @@ -46,6 +46,7 @@ public: inline bool enabled() const { return enabled_; } void removeStreams(const std::string &clientname); void removeStream(const std::string &sender, int port); + void removeStream(const VideoStreamer *vs); bool busy(); std::vector listStreams(); @@ -74,10 +75,12 @@ class VideoStreamer : public FrameGrabber // connection information NetworkToolkit::StreamConfig config_; + std::atomic stopped_; public: VideoStreamer(NetworkToolkit::StreamConfig conf); + virtual ~VideoStreamer() {} std::string info() const override; };