Skip to content
Snippets Groups Projects
Commit 723a602f authored by Sébastien Blin's avatar Sébastien Blin
Browse files

avmodel: useAVFrame should lock renderers

This avoid any potential crash. Also do some cleanup

Change-Id: I92acdb6fe1f55b7061fbe73aac06bd60b4d3216e
parent afe0312a
No related branches found
No related tags found
No related merge requests found
......@@ -294,12 +294,12 @@ AVModel::setDeviceSettings(video::Settings& settings)
// If the preview is running, reload it
// doing this during a call will cause re-invite, this is unwanted
if (pimpl_->renderers_[video::PREVIEW_RENDERER_ID]) {
if (pimpl_->renderers_[video::PREVIEW_RENDERER_ID]->isRendering()
&& pimpl_->renderers_.size() == 1) {
stopPreview(video::PREVIEW_RENDERER_ID);
startPreview(video::PREVIEW_RENDERER_ID);
}
std::unique_lock<std::mutex> lk(pimpl_->renderers_mtx_);
auto it = pimpl_->renderers_.find(video::PREVIEW_RENDERER_ID);
if (it->second && it->second->isRendering() && pimpl_->renderers_.size() == 1) {
lk.unlock();
stopPreview(video::PREVIEW_RENDERER_ID);
startPreview(video::PREVIEW_RENDERER_ID);
}
}
......@@ -516,6 +516,7 @@ void
AVModel::useAVFrame(bool useAVFrame)
{
pimpl_->useAVFrame_ = useAVFrame;
std::lock_guard<std::mutex> lk(pimpl_->renderers_mtx_);
for (auto it = pimpl_->renderers_.cbegin(); it != pimpl_->renderers_.cend(); ++it) {
it->second->useAVFrame(pimpl_->useAVFrame_);
}
......@@ -538,10 +539,10 @@ AVModel::getRenderer(const QString& id) const
{
std::lock_guard<std::mutex> lk(pimpl_->renderers_mtx_);
auto search = pimpl_->renderers_.find(id);
if (search == pimpl_->renderers_.end() || !pimpl_->renderers_[id]) {
if (search == pimpl_->renderers_.end() || !search->second) {
throw std::out_of_range("Can't find renderer " + id.toStdString());
}
return *pimpl_->renderers_[id];
return *search->second;
}
#if defined(Q_OS_UNIX) && !defined(__APPLE__)
......@@ -869,28 +870,26 @@ AVModelPimpl::addRenderer(const QString& id, const video::Settings& settings, co
void
AVModelPimpl::removeRenderer(const QString& id)
{
{
std::lock_guard<std::mutex> lk(renderers_mtx_);
auto search = renderers_.find(id);
if (search == renderers_.end()) {
qWarning() << "Cannot remove renderer. " << id << "not found";
return;
}
disconnect(search->second.get(),
&video::Renderer::frameUpdated,
this,
&AVModelPimpl::slotFrameUpdated);
connect(
search->second.get(),
&video::Renderer::stopped,
this,
[this](const QString& id) {
renderers_.erase(id);
emit linked_.rendererStopped(id);
},
Qt::DirectConnection);
search->second.reset();
std::lock_guard<std::mutex> lk(renderers_mtx_);
auto search = renderers_.find(id);
if (search == renderers_.end()) {
qWarning() << "Cannot remove renderer. " << id << "not found";
return;
}
disconnect(search->second.get(),
&video::Renderer::frameUpdated,
this,
&AVModelPimpl::slotFrameUpdated);
connect(
search->second.get(),
&video::Renderer::stopped,
this,
[this](const QString& id) {
renderers_.erase(id);
emit linked_.rendererStopped(id);
},
Qt::DirectConnection);
search->second.reset();
}
void
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment