Present desktop video sequentially through GUI paint acknowledgement
This commit is contained in:
1 parent
0eb743d627
commit
4e9cce8a01
3 files changed
+47
-14
No files matched your search
@@ -44,7 +44,14 @@ public:
|
||||
resize(qMin(1100, available.width() * 9 / 10), qMin(800, available.height() * 9 / 10));
|
||||
}
|
||||
QImage remote, local;
|
||||
CallVideoEngine* engine = nullptr;
|
||||
quint64 serial = 0;
|
||||
protected:
|
||||
void hideEvent(QHideEvent* event) override { presented(); QWidget::hideEvent(event); }
|
||||
void changeEvent(QEvent* event) override {
|
||||
QWidget::changeEvent(event);
|
||||
if (isMinimized()) presented();
|
||||
}
|
||||
void closeEvent(QCloseEvent* event) override {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_CALL, "call video window closed; call continues"); event->accept();
|
||||
}
|
||||
@@ -69,8 +76,12 @@ protected:
|
||||
QRect target(QPoint(videoRect.right() - preview.width() - 12, videoRect.top() + 12), preview);
|
||||
painter.setPen(QPen(Qt::white, 2)); painter.drawRect(target.adjusted(-1, -1, 1, 1)); painter.drawImage(target, local);
|
||||
}
|
||||
painter.end(); presented();
|
||||
}
|
||||
private:
|
||||
void presented() {
|
||||
if (engine && serial) { engine->imagePresented(serial); serial = 0; }
|
||||
}
|
||||
void toggleFullScreen() {
|
||||
if (isFullScreen()) { showNormal(); if (!m_geometry.isEmpty()) restoreGeometry(m_geometry); }
|
||||
else { m_geometry = saveGeometry(); showFullScreen(); }
|
||||
@@ -271,6 +282,7 @@ CallWindow::CallWindow(QWidget* parent)
|
||||
lay->addWidget(m_bgpPathLabel);
|
||||
lay->addWidget(m_statsLabel);
|
||||
m_video = new CallVideoEngine(this);
|
||||
m_video->setPresentationDriven(true); m_videoWindow->engine = m_video;
|
||||
m_localPreview = new QLabel(this); m_localPreview->setAlignment(Qt::AlignCenter); m_localPreview->hide();
|
||||
lay->addWidget(m_localPreview, 0, Qt::AlignHCenter);
|
||||
m_videoStatus = new QLabel(this); m_videoStatus->setWordWrap(true); lay->addWidget(m_videoStatus);
|
||||
@@ -317,10 +329,12 @@ CallWindow::CallWindow(QWidget* parent)
|
||||
connect(m_video, &CallVideoEngine::statusChanged, this, [this](const QString& text) {
|
||||
m_videoStatus->setText(text); m_videoStatus->setVisible(m_state == Active && !text.isEmpty());
|
||||
});
|
||||
connect(m_video, &CallVideoEngine::imageChanged, this, [this](const QImage& image) {
|
||||
connect(m_video, &CallVideoEngine::imageChanged, this, [this](const QImage& image, quint64 serial) {
|
||||
bool changed = m_remoteImage.isNull() != image.isNull(); m_remoteImage = image;
|
||||
m_videoWindow->remote = image; m_videoWindow->update();
|
||||
m_videoWindow->remote = image; m_videoWindow->serial = serial; m_videoWindow->update();
|
||||
if (changed) updateVideoPresentation();
|
||||
// Скрытое окно продолжает принимать поток, не ждёт невозможного paintEvent.
|
||||
if (!m_videoWindow->isVisible() || m_videoWindow->isMinimized()) m_video->imagePresented(serial);
|
||||
update();
|
||||
});
|
||||
connect(m_video, &CallVideoEngine::localImageChanged, this, [this](const QImage& image) {
|
||||
|
||||
Reference in new issue
Block a user