blob: c8f2f77793b537cd261a46fa946dc0e0a3ce67d3 [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
21#include <QDebug>
22
23VideoWidget::VideoWidget(QWidget *parent) :
24 QWidget(parent)
25 , previewRenderer_(nullptr)
26 , renderer_(nullptr)
27 , previewFrame_(nullptr)
28 , distantFrame_(nullptr)
29{
30 connect(Video::PreviewManager::instance(),
31 SIGNAL(previewStarted(Video::Renderer*)),
Edric Milaret72c406d2015-04-28 13:23:54 -040032 this, SLOT(previewStarted(Video::Renderer*)));
Edric Milaret627500d2015-03-27 16:41:40 -040033 connect(CallModel::instance(),
34 SIGNAL(rendererAdded(Call*,Video::Renderer*)),
35 this, SLOT(callInitiated(Call*, Video::Renderer*)),
36 Qt::ConnectionType::DirectConnection);
37}
38
39VideoWidget::~VideoWidget()
40{}
41
42void
43VideoWidget::previewStarted(Video::Renderer *renderer) {
Edric Milaret627500d2015-03-27 16:41:40 -040044 previewRenderer_ = renderer;
45 connect(previewRenderer_, SIGNAL(frameUpdated()),
46 this, SLOT(frameFromPreview()));
47 connect(previewRenderer_, SIGNAL(stopped()),
Edric Milaret72c406d2015-04-28 13:23:54 -040048 this, SLOT(previewStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -040049}
50
51void
Edric Milaret72c406d2015-04-28 13:23:54 -040052VideoWidget::previewStopped() {
53 QMutexLocker {&lock_};
54 disconnect(previewRenderer_, SIGNAL(frameUpdated()),
55 this, SLOT(frameFromPreview()));
56 disconnect(previewRenderer_, SIGNAL(stopped()),
57 this, SLOT(renderingStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -040058 previewRenderer_ = nullptr;
59}
60
61void
62VideoWidget::frameFromPreview() {
63 if (previewFrame_) {
64 delete previewFrame_;
65 previewFrame_ = nullptr;
66 }
67 if (previewRenderer_ && previewRenderer_->isRendering()) {
68 const QSize size(previewRenderer_->size());
69 previewFrame_ = new QImage(
70 (const uchar*)previewRenderer_->currentFrame().constData(),
71 size.width(), size.height(), QImage::Format_RGBA8888);
Edric Milaret72c406d2015-04-28 13:23:54 -040072 update();
Edric Milaret627500d2015-03-27 16:41:40 -040073 }
Edric Milaret627500d2015-03-27 16:41:40 -040074}
75
76void
77VideoWidget::paintEvent(QPaintEvent* evt) {
78 Q_UNUSED(evt)
79 QMutexLocker {&lock_};
80 QPainter painter(this);
81 //painter.drawRoundedRect(0,5,width()-5, height()-7,3,3);
82 if (distantFrame_ && renderer_ && renderer_->isRendering())
83 painter.drawImage(QRect(0,0,width(),height()),*(distantFrame_));
84 if (previewFrame_ && previewRenderer_ && previewRenderer_->isRendering()) {
85 int previewHeight = !renderer_ ? height() : height()/4;
86 int previewWidth = !renderer_ ? width() : width()/4;
87 int yPos = !renderer_ ? 0 : height() - previewHeight;
88 int xPos = !renderer_ ? 0 : width() - previewWidth;
89 painter.drawImage(QRect(xPos,yPos,previewWidth,previewHeight),
90 *(previewFrame_));
91 }
92 painter.end();
93}
94
95void
96VideoWidget::callInitiated(Call* call, Video::Renderer *renderer) {
97 Q_UNUSED(call)
98 renderer_ = renderer;
99 connect(renderer_, SIGNAL(frameUpdated()), this, SLOT(frameFromDistant()));
100 connect(renderer_, SIGNAL(stopped()),this, SLOT(renderingStopped()),
101 Qt::ConnectionType::DirectConnection);
102}
103
104void
105VideoWidget::frameFromDistant() {
Edric Milaret627500d2015-03-27 16:41:40 -0400106 if (distantFrame_) {
107 delete distantFrame_;
108 distantFrame_ = nullptr;
109 }
110 if (renderer_) {
111 const QSize size(renderer_->size());
112 distantFrame_ = new QImage(
113 (const uchar*) renderer_->currentFrame().constData(),
114 size.width(), size.height(), QImage::Format_RGBA8888);
Edric Milaret72c406d2015-04-28 13:23:54 -0400115 update();
Edric Milaret627500d2015-03-27 16:41:40 -0400116 }
Edric Milaret627500d2015-03-27 16:41:40 -0400117}
118
119void
120VideoWidget::renderingStopped() {
121 QMutexLocker {&lock_};
122 if (distantFrame_) {
123 delete distantFrame_;
124 distantFrame_ = nullptr;
125 }
Edric Milaret72c406d2015-04-28 13:23:54 -0400126 disconnect(renderer_, SIGNAL(frameUpdated()), this, SLOT(frameFromDistant()));
127 disconnect(renderer_, SIGNAL(stopped()),this, SLOT(renderingStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -0400128 renderer_ = nullptr;
129}