Present desktop video sequentially through GUI paint acknowledgement

This commit is contained in:
evgeny committed 2026-10-19 17:23:58 +02:00
1 parent 0eb743d627
commit 4e9cce8a01
3 files changed
+47 -14

No files matched your search

+16 -2
View File
@@ -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) {