diff --git a/src/media/media_recorder.cpp b/src/media/media_recorder.cpp index 58a0c0f8081a07a027dc6d80e1f447c110123736..34c8eada2eaa6ecf578779720fdedb3ac2f02dbe 100644 --- a/src/media/media_recorder.cpp +++ b/src/media/media_recorder.cpp @@ -176,14 +176,11 @@ MediaRecorder::stopRecording() { if (isRecording_) { RING_DBG() << "Stop recording '" << getPath() << "'"; + isRecording_ = false; + loop_.join(); flush(); } - isRecording_ = false; - if (loop_.isRunning()) - loop_.join(); - videoFilter_.reset(); - audioFilter_.reset(); - encoder_.reset(); + resetToDefaults(); } int @@ -215,7 +212,9 @@ MediaRecorder::addStream(bool isVideo, bool fromPeer, MediaStream ms) int MediaRecorder::recordData(AVFrame* frame, bool isVideo, bool fromPeer) { - if (!isRecording_ || !isReady_) + // recorder may be recording, but not ready for the first frames + // return if thread is not running + if (!isRecording_ || !isReady_ || !loop_.isRunning()) return 0; // save a copy of the frame, will be filtered/encoded in another thread @@ -486,15 +485,32 @@ MediaRecorder::flush() return 0; } +void +MediaRecorder::resetToDefaults() +{ + streams_.clear(); + videoIdx_ = audioIdx_ = -1; + nbExpectedStreams_ = 0; + nbReceivedVideoStreams_ = nbReceivedAudioStreams_ = 0; + isRecording_ = false; + isReady_ = false; + audioOnly_ = false; + videoFilter_.reset(); + audioFilter_.reset(); + encoder_.reset(); +} + void MediaRecorder::process() { - if (!loop_.wait_for(FRAME_DEQUEUE_INTERVAL, [this]{ return !frames_.empty(); })) - return; + // wait until frames_ is not empty or until we are no longer recording + loop_.wait([this]{ return !frames_.empty(); }); - if (loop_.isStopping() || !isRecording_ || !isReady_) + // if we exited because we stopped recording, stop our thread + if (loop_.isStopping()) return; + // else encode a frame RecordFrame recframe; { std::lock_guard<std::mutex> q(qLock_); diff --git a/src/media/media_recorder.h b/src/media/media_recorder.h index eee2288e14acb11ea180ba1d32abf237781018c3..87bf1e10875e3a6e7bbbc2bc3946aa03fa911be8 100644 --- a/src/media/media_recorder.h +++ b/src/media/media_recorder.h @@ -84,6 +84,7 @@ class MediaRecorder { void emptyFilterGraph(); int sendToEncoder(AVFrame* frame, int streamIdx); int flush(); + void resetToDefaults(); // clear saved data for next recording std::unique_ptr<MediaEncoder> encoder_; std::unique_ptr<MediaFilter> videoFilter_;