Skip to content
Snippets Groups Projects
Commit 1b5bbb0d authored by Philippe Gorley's avatar Philippe Gorley
Browse files

recorder: fix threadloop management

Also fixes a regression where recorder instance couldn't be used more
than once per call.

Change-Id: Ia883e77a93ae3fcab7ead04f6001ddba1c1396ea
parent f5186193
No related branches found
No related tags found
No related merge requests found
...@@ -176,14 +176,11 @@ MediaRecorder::stopRecording() ...@@ -176,14 +176,11 @@ MediaRecorder::stopRecording()
{ {
if (isRecording_) { if (isRecording_) {
RING_DBG() << "Stop recording '" << getPath() << "'"; RING_DBG() << "Stop recording '" << getPath() << "'";
flush();
}
isRecording_ = false; isRecording_ = false;
if (loop_.isRunning())
loop_.join(); loop_.join();
videoFilter_.reset(); flush();
audioFilter_.reset(); }
encoder_.reset(); resetToDefaults();
} }
int int
...@@ -215,7 +212,9 @@ MediaRecorder::addStream(bool isVideo, bool fromPeer, MediaStream ms) ...@@ -215,7 +212,9 @@ MediaRecorder::addStream(bool isVideo, bool fromPeer, MediaStream ms)
int int
MediaRecorder::recordData(AVFrame* frame, bool isVideo, bool fromPeer) 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; return 0;
// save a copy of the frame, will be filtered/encoded in another thread // save a copy of the frame, will be filtered/encoded in another thread
...@@ -486,15 +485,32 @@ MediaRecorder::flush() ...@@ -486,15 +485,32 @@ MediaRecorder::flush()
return 0; 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 void
MediaRecorder::process() MediaRecorder::process()
{ {
if (!loop_.wait_for(FRAME_DEQUEUE_INTERVAL, [this]{ return !frames_.empty(); })) // wait until frames_ is not empty or until we are no longer recording
return; 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; return;
// else encode a frame
RecordFrame recframe; RecordFrame recframe;
{ {
std::lock_guard<std::mutex> q(qLock_); std::lock_guard<std::mutex> q(qLock_);
......
...@@ -84,6 +84,7 @@ class MediaRecorder { ...@@ -84,6 +84,7 @@ class MediaRecorder {
void emptyFilterGraph(); void emptyFilterGraph();
int sendToEncoder(AVFrame* frame, int streamIdx); int sendToEncoder(AVFrame* frame, int streamIdx);
int flush(); int flush();
void resetToDefaults(); // clear saved data for next recording
std::unique_ptr<MediaEncoder> encoder_; std::unique_ptr<MediaEncoder> encoder_;
std::unique_ptr<MediaFilter> videoFilter_; std::unique_ptr<MediaFilter> videoFilter_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment