Feed publisher CPU frames and decouple FIN from capture teardown

This commit is contained in:
evgeny committed 2026-11-01 20:06:56 +01:00
1 parent 5256dfa8c5
commit eed07cb358
5 files changed
+106 -447

No files matched your search

+7 -7
View File
@@ -62,7 +62,7 @@ void StreamGridWindow::createTile(Tile& tile) {
tile.title->setToolTip(tile.name); layout->addWidget(tile.title);
tile.status = new QLabel(text("Connecting…"), tile.widget); layout->addWidget(tile.status);
#ifdef HAVE_STREAM_CAPTURE
auto* preview = new QVideoWidget(tile.widget); preview->setAspectRatioMode(Qt::KeepAspectRatio);
auto* preview = new VideoRenderWidget(tile.widget);
tile.video = preview;
#else
tile.video = new QLabel(text("Video capture requires Qt Multimedia and FFmpeg"), tile.widget);
@@ -82,7 +82,7 @@ void StreamGridWindow::createTile(Tile& tile) {
for (auto* child : tile.video->findChildren<QWidget*>()) child->installEventFilter(this);
}
/* QVariant хранит shared QVideoFrame; оба окна читают последний захваченный кадр без перекодирования. */
/* QVariant хранит CPU QImage; очистка локального preview не затрагивает capture-процесс. */
void StreamGridWindow::setLocalPreview(uint64_t group, const QVariant& frame) {
if (m_closed || group != m_group) return;
m_preview = frame;
@@ -91,13 +91,13 @@ void StreamGridWindow::setLocalPreview(uint64_t group, const QVariant& frame) {
void StreamGridWindow::updatePreview(Tile& tile) {
#ifdef HAVE_STREAM_CAPTURE
auto frame = m_preview.value<QVideoFrame>();
static_cast<QVideoWidget*>(tile.video)->videoSink()->setVideoFrame(frame);
tile.status->setText(text(frame.isValid() ? "Live" : "Connecting…"));
if (frame.isValid() && !tile.previewPresented)
auto frame = m_preview.value<QImage>();
static_cast<VideoRenderWidget*>(tile.video)->setFrame(frame);
tile.status->setText(text(!frame.isNull() ? "Live" : "Connecting…"));
if (!frame.isNull() && !tile.previewPresented)
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "desktop multiview first local frame source=%llx size=%dx%d decoder=0 audio=0",
(unsigned long long)tile.source, frame.width(), frame.height());
tile.previewPresented = frame.isValid();
tile.previewPresented = !frame.isNull();
#else
Q_UNUSED(tile);
#endif