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()
{
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_);
......
......@@ -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_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment