blob: 337a23fa16a75c36d6b4f2162296cbd38d87963a [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaretbab169d2016-01-07 15:13:33 -05002 * Copyright (C) 2015-2016 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 Milaret80e0b212015-10-16 10:07:43 -040021VideoWidget::VideoWidget(QWidget* parent) :
Edric Milaret627500d2015-03-27 16:41:40 -040022 QWidget(parent)
23 , previewRenderer_(nullptr)
24 , renderer_(nullptr)
Edric Milaret80e0b212015-10-16 10:07:43 -040025 , isPreviewDisplayed_(true)
Edric Milaret0b7fe5d2016-01-27 11:12:43 -050026 , fullPreview_(false)
Edric Milaret627500d2015-03-27 16:41:40 -040027{
Edric Milareta3e47282015-10-23 15:20:30 -040028 connect(&Video::PreviewManager::instance(),
Edric Milaret627500d2015-03-27 16:41:40 -040029 SIGNAL(previewStarted(Video::Renderer*)),
Edric Milaret72c406d2015-04-28 13:23:54 -040030 this, SLOT(previewStarted(Video::Renderer*)));
Edric Milareta9f937f2015-06-01 17:10:34 -040031
32 QPalette pal(palette());
33 pal.setColor(QPalette::Background, Qt::black);
34 this->setAutoFillBackground(true);
35 this->setPalette(pal);
Edric Milaret627500d2015-03-27 16:41:40 -040036}
37
38VideoWidget::~VideoWidget()
39{}
40
41void
Edric Milaret80e0b212015-10-16 10:07:43 -040042VideoWidget::previewStarted(Video::Renderer* renderer) {
Eloi BAILd94e0662015-09-21 13:58:31 -040043 //Enforce that only one videowidget we'll be used at the same time
44 if (not isVisible())
45 return;
Edric Milaret80e0b212015-10-16 10:07:43 -040046 if (previewRenderer_ == renderer)
47 return;
Edric Milaret53971612015-07-15 10:00:04 -040048 previewRenderer_ = renderer;
49 connect(previewRenderer_, SIGNAL(frameUpdated()),
50 this, SLOT(frameFromPreview()));
51 connect(previewRenderer_, SIGNAL(stopped()),
52 this, SLOT(previewStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -040053}
54
55void
Edric Milaret72c406d2015-04-28 13:23:54 -040056VideoWidget::previewStopped() {
Edric Milaret72c406d2015-04-28 13:23:54 -040057 disconnect(previewRenderer_, SIGNAL(frameUpdated()),
Edric Milaret1eca0292015-06-29 12:03:36 -040058 this, SLOT(frameFromPreview()));
Edric Milaret72c406d2015-04-28 13:23:54 -040059 disconnect(previewRenderer_, SIGNAL(stopped()),
Edric Milaret80e0b212015-10-16 10:07:43 -040060 this, SLOT(previewStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -040061 previewRenderer_ = nullptr;
Edric Milaret8f0a9ba2016-02-02 14:40:40 -050062 repaint();
Edric Milaret627500d2015-03-27 16:41:40 -040063}
64
65void
66VideoWidget::frameFromPreview() {
Eloi BAILd94e0662015-09-21 13:58:31 -040067 if (previewRenderer_ && previewRenderer_->isRendering()) {
Edric Milaret37157b32015-10-13 18:00:03 -040068 {
69 QMutexLocker lock(&mutex_);
70 auto tmp = previewRenderer_->currentFrame();
71 if (tmp.storage.size())
72 currentPreviewFrame_ = tmp;
Eloi BAILd94e0662015-09-21 13:58:31 -040073 }
Edric Milaret37157b32015-10-13 18:00:03 -040074 update();
Edric Milaret627500d2015-03-27 16:41:40 -040075 }
Edric Milaret627500d2015-03-27 16:41:40 -040076}
77
78void
Edric Milaret80e0b212015-10-16 10:07:43 -040079VideoWidget::paintEvent(QPaintEvent* evt) {
Edric Milaret627500d2015-03-27 16:41:40 -040080 Q_UNUSED(evt)
Edric Milaret627500d2015-03-27 16:41:40 -040081 QPainter painter(this);
Edric Milaret37157b32015-10-13 18:00:03 -040082
83 if (renderer_) {
84 {
85 QMutexLocker lock(&mutex_);
Edric Milaret571af072015-11-12 16:26:49 -050086 if (currentDistantFrame_.storage.size() != 0
87 && currentDistantFrame_.storage.size() ==
Edric Milaretbf674312016-01-25 10:59:11 -050088 (unsigned int)(renderer_->size().height()*renderer_->size().width()*4)) {
Edric Milaret37157b32015-10-13 18:00:03 -040089 frameDistant_ = std::move(currentDistantFrame_.storage);
90 distantImage_.reset(new QImage((uchar*)frameDistant_.data(),
91 renderer_->size().width(),
92 renderer_->size().height(),
93 QImage::Format_ARGB32_Premultiplied));
94 }
95 }
96 if (distantImage_) {
97 auto scaledDistant = distantImage_->scaled(size(), Qt::KeepAspectRatio);
98 auto xDiff = (width() - scaledDistant.width()) / 2;
99 auto yDiff = (height() - scaledDistant.height()) /2;
100 painter.drawImage(QRect(xDiff,yDiff,scaledDistant.width(),scaledDistant.height()), scaledDistant);
101 }
Edric Milareta9f937f2015-06-01 17:10:34 -0400102 }
Edric Milaret80e0b212015-10-16 10:07:43 -0400103 if (previewRenderer_ && isPreviewDisplayed_) {
Edric Milaret37157b32015-10-13 18:00:03 -0400104 {
105 QMutexLocker lock(&mutex_);
Edric Milaret571af072015-11-12 16:26:49 -0500106 if (currentPreviewFrame_.storage.size() != 0
107 && currentPreviewFrame_.storage.size() ==
Edric Milaretbf674312016-01-25 10:59:11 -0500108 (unsigned int)(previewRenderer_->size().height()*previewRenderer_->size().width()*4)) {
Edric Milaret37157b32015-10-13 18:00:03 -0400109 framePreview_ = std::move(currentPreviewFrame_.storage);
110 previewImage_.reset(new QImage((uchar*)framePreview_.data(),
111 previewRenderer_->size().width(),
112 previewRenderer_->size().height(),
113 QImage::Format_ARGB32_Premultiplied));
114
115 }
116 }
117 if (previewImage_) {
Edric Milaret0b7fe5d2016-01-27 11:12:43 -0500118 auto previewHeight = fullPreview_ ? height() : height()/4;
119 auto previewWidth = fullPreview_ ? width() : width()/4;
Edric Milaret37157b32015-10-13 18:00:03 -0400120 auto scaledPreview = previewImage_->scaled(previewWidth, previewHeight, Qt::KeepAspectRatio);
121 auto xDiff = (previewWidth - scaledPreview.width()) / 2;
122 auto yDiff = (previewHeight - scaledPreview.height()) / 2;
Edric Milaret0b7fe5d2016-01-27 11:12:43 -0500123 auto yPos = fullPreview_ ? yDiff : height() - previewHeight - previewMargin_;
124 auto xPos = fullPreview_ ? xDiff : width() - scaledPreview.width() - previewMargin_;
Edric Milaret37157b32015-10-13 18:00:03 -0400125 painter.drawImage(QRect(xPos,yPos,scaledPreview.width(),scaledPreview.height()),
126 scaledPreview);
127 }
Edric Milaret627500d2015-03-27 16:41:40 -0400128 }
129 painter.end();
130}
131
132void
Edric Milaret80e0b212015-10-16 10:07:43 -0400133VideoWidget::setDistantRenderer(Video::Renderer* renderer) {
134 if (not renderer)
Eloi BAILd94e0662015-09-21 13:58:31 -0400135 return;
Edric Milaret80e0b212015-10-16 10:07:43 -0400136 if (renderer_ != renderer) {
137 renderingStopped();
138 renderer_ = renderer;
139 connect(renderer_, SIGNAL(frameUpdated()), this, SLOT(frameFromDistant()));
140 connect(renderer_, SIGNAL(stopped()),this, SLOT(renderingStopped()));
141 }
Edric Milaret627500d2015-03-27 16:41:40 -0400142}
143
144void
145VideoWidget::frameFromDistant() {
Eloi BAILd94e0662015-09-21 13:58:31 -0400146 if (renderer_ && renderer_->isRendering()) {
Edric Milaret37157b32015-10-13 18:00:03 -0400147 {
148 QMutexLocker lock(&mutex_);
149 auto tmp = renderer_->currentFrame();
150 if (tmp.storage.size())
151 currentDistantFrame_ = tmp;
Eloi BAILd94e0662015-09-21 13:58:31 -0400152 }
Edric Milaret37157b32015-10-13 18:00:03 -0400153 update();
Edric Milaret627500d2015-03-27 16:41:40 -0400154 }
Edric Milaret627500d2015-03-27 16:41:40 -0400155}
156
157void
158VideoWidget::renderingStopped() {
Edric Milaret80e0b212015-10-16 10:07:43 -0400159 if (not renderer_)
160 return;
Edric Milaret72c406d2015-04-28 13:23:54 -0400161 disconnect(renderer_, SIGNAL(frameUpdated()), this, SLOT(frameFromDistant()));
162 disconnect(renderer_, SIGNAL(stopped()),this, SLOT(renderingStopped()));
Edric Milaret627500d2015-03-27 16:41:40 -0400163 renderer_ = nullptr;
Edric Milaret8f0a9ba2016-02-02 14:40:40 -0500164 repaint();
Edric Milaret627500d2015-03-27 16:41:40 -0400165}
Edric Milaret80e0b212015-10-16 10:07:43 -0400166
167void
168VideoWidget::setPreviewDisplay(bool display) {
169 isPreviewDisplayed_ = display;
170}
Edric Milaret0b7fe5d2016-01-27 11:12:43 -0500171
172void
173VideoWidget::setIsFullPreview(bool full) {
174 fullPreview_ = full;
175}