blob: bf3cd588bac1cdf6e2a075de377f5814af0cf309 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaret4bba46d2015-04-29 16:33:38 -04002 * Copyright (C) 2015 by Savoir-Faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "videowidget.h"
20
Edric Milaret627500d2015-03-27 16:41:40 -040021VideoWidget::VideoWidget(QWidget *parent) :
22 QWidget(parent)
23 , previewRenderer_(nullptr)
24 , renderer_(nullptr)
Edric Milaret627500d2015-03-27 16:41:40 -040025{
26 connect(Video::PreviewManager::instance(),
27 SIGNAL(previewStarted(Video::Renderer*)),
Edric Milaret72c406d2015-04-28 13:23:54 -040028 this, SLOT(previewStarted(Video::Renderer*)));
Edric Milaret627500d2015-03-27 16:41:40 -040029 connect(CallModel::instance(),
30 SIGNAL(rendererAdded(Call*,Video::Renderer*)),
31 this, SLOT(callInitiated(Call*, Video::Renderer*)),
32 Qt::ConnectionType::DirectConnection);
Edric Milareta9f937f2015-06-01 17:10:34 -040033
34 QPalette pal(palette());
35 pal.setColor(QPalette::Background, Qt::black);
36 this->setAutoFillBackground(true);
37 this->setPalette(pal);
Edric Milaret627500d2015-03-27 16:41:40 -040038}
39
40VideoWidget::~VideoWidget()
41{}
42
43void
44VideoWidget::previewStarted(Video::Renderer *renderer) {
Edric Milaret1eca0292015-06-29 12:03:36 -040045 if (this->isVisible()) {
46 previewRenderer_ = renderer;
47 connect(previewRenderer_, SIGNAL(frameUpdated()),
48 this, SLOT(frameFromPreview()));
49 connect(previewRenderer_, SIGNAL(stopped()),
50 this, SLOT(previewStopped()));
51 }
Edric Milaret627500d2015-03-27 16:41:40 -040052}
53
54void
Edric Milaret72c406d2015-04-28 13:23:54 -040055VideoWidget::previewStopped() {
Edric Milaret72c406d2015-04-28 13:23:54 -040056 disconnect(previewRenderer_, SIGNAL(frameUpdated()),
Edric Milaret1eca0292015-06-29 12:03:36 -040057 this, SLOT(frameFromPreview()));
Edric Milaret72c406d2015-04-28 13:23:54 -040058 disconnect(previewRenderer_, SIGNAL(stopped()),
Edric Milaret1eca0292015-06-29 12:03:36 -040059 this, SLOT(renderingStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -040060 previewRenderer_ = nullptr;
61}
62
63void
64VideoWidget::frameFromPreview() {
Edric Milaret627500d2015-03-27 16:41:40 -040065 if (previewRenderer_ && previewRenderer_->isRendering()) {
Edric Milaret1eca0292015-06-29 12:03:36 -040066 currentPreviewFrame_ = previewRenderer_->currentSmartFrame();
Edric Milaret72c406d2015-04-28 13:23:54 -040067 update();
Edric Milaret627500d2015-03-27 16:41:40 -040068 }
Edric Milaret627500d2015-03-27 16:41:40 -040069}
70
71void
Edric Milaret1eca0292015-06-29 12:03:36 -040072VideoWidget::paintEvent(QPaintEvent *evt) {
Edric Milaret627500d2015-03-27 16:41:40 -040073 Q_UNUSED(evt)
Edric Milaret627500d2015-03-27 16:41:40 -040074 QPainter painter(this);
Edric Milaret1eca0292015-06-29 12:03:36 -040075 if (renderer_ && currentDistantFrame_) {
76 const QSize imgSize(renderer_->size());
77 QImage distantFrame(currentDistantFrame_.get()->data(),
78 imgSize.width(), imgSize.height(), QImage::Format_RGBA8888);
79 auto scaledDistant = distantFrame.scaled(size(), Qt::KeepAspectRatio);
Edric Milareta9f937f2015-06-01 17:10:34 -040080 auto xDiff = (width() - scaledDistant.width()) / 2;
81 auto yDiff = (height() - scaledDistant.height()) /2;
82 painter.drawImage(QRect(xDiff,yDiff,scaledDistant.width(),scaledDistant.height()), scaledDistant);
83 }
Edric Milaret1eca0292015-06-29 12:03:36 -040084 if (previewRenderer_ && currentPreviewFrame_) {
85 const QSize imgSize(previewRenderer_->size());
86 QImage previewFrame(
87 currentPreviewFrame_.get()->data(),
88 imgSize.width(), imgSize.height(), QImage::Format_RGBA8888);
Edric Milareta9f937f2015-06-01 17:10:34 -040089 auto previewHeight = !renderer_ ? height() : height()/4;
90 auto previewWidth = !renderer_ ? width() : width()/4;
Edric Milaret1eca0292015-06-29 12:03:36 -040091 auto scaledPreview = previewFrame.scaled(previewWidth, previewHeight, Qt::KeepAspectRatio);
Edric Milareta9f937f2015-06-01 17:10:34 -040092 auto xDiff = (previewWidth - scaledPreview.width()) / 2;
93 auto yDiff = (previewHeight - scaledPreview.height()) / 2;
94 auto yPos = !renderer_ ? yDiff : height() - previewHeight - previewMargin_;
95 auto xPos = !renderer_ ? xDiff : width() - scaledPreview.width() - previewMargin_;
96 painter.drawImage(QRect(xPos,yPos,scaledPreview.width(),scaledPreview.height()),
97 scaledPreview);
Edric Milaret627500d2015-03-27 16:41:40 -040098 }
99 painter.end();
100}
101
102void
103VideoWidget::callInitiated(Call* call, Video::Renderer *renderer) {
104 Q_UNUSED(call)
Edric Milaret1eca0292015-06-29 12:03:36 -0400105 if (this->isVisible()) {
106 renderer_ = renderer;
107 connect(renderer_, SIGNAL(frameUpdated()), this, SLOT(frameFromDistant()));
108 connect(renderer_, SIGNAL(stopped()),this, SLOT(renderingStopped()),
109 Qt::ConnectionType::DirectConnection);
110 }
Edric Milaret627500d2015-03-27 16:41:40 -0400111}
112
113void
114VideoWidget::frameFromDistant() {
Edric Milaret1eca0292015-06-29 12:03:36 -0400115 if (renderer_ && renderer_->isRendering()) {
116 currentDistantFrame_ = renderer_->currentSmartFrame();
Edric Milaret72c406d2015-04-28 13:23:54 -0400117 update();
Edric Milaret627500d2015-03-27 16:41:40 -0400118 }
Edric Milaret627500d2015-03-27 16:41:40 -0400119}
120
121void
122VideoWidget::renderingStopped() {
Edric Milaret72c406d2015-04-28 13:23:54 -0400123 disconnect(renderer_, SIGNAL(frameUpdated()), this, SLOT(frameFromDistant()));
124 disconnect(renderer_, SIGNAL(stopped()),this, SLOT(renderingStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -0400125 renderer_ = nullptr;
126}