diff --git a/src/plugins/screencast/screencaststream.cpp b/src/plugins/screencast/screencaststream.cpp index 023a2fe5b8..921740796d 100644 --- a/src/plugins/screencast/screencaststream.cpp +++ b/src/plugins/screencast/screencaststream.cpp @@ -76,6 +76,7 @@ void ScreenCastStream::onStreamStateChanged(void *data, pw_stream_state old, pw_ ScreenCastStream *pw = static_cast(data); qCDebug(KWIN_SCREENCAST) << "state changed" << pw_stream_state_as_string(old) << " -> " << pw_stream_state_as_string(state) << error_message; + pw->m_streaming = false; switch (state) { case PW_STREAM_STATE_ERROR: qCWarning(KWIN_SCREENCAST) << "Stream error: " << error_message; @@ -87,7 +88,11 @@ void ScreenCastStream::onStreamStateChanged(void *data, pw_stream_state old, pw_ } break; case PW_STREAM_STATE_STREAMING: + pw->m_streaming = true; Q_EMIT pw->startStreaming(); + if (pw->m_pendingBuffer) { + pw->tryEnqueue(pw->m_pendingBuffer); + } break; case PW_STREAM_STATE_CONNECTING: break; @@ -297,6 +302,7 @@ void ScreenCastStream::onStreamRenegotiateFormat(void *data, uint64_t) { ScreenCastStream *stream = static_cast(data); + stream->m_streaming = false; // pause streaming as we wait for the renegotiation char buffer[2048]; auto params = stream->buildFormats(stream->m_dmabufParams.has_value(), buffer); pw_stream_update_params(stream->pwStream, params.data(), params.count()); @@ -430,6 +436,11 @@ void ScreenCastStream::recordFrame(const QRegion &_damagedRegion) QRegion damagedRegion = _damagedRegion; Q_ASSERT(!m_stopped); + if (!m_streaming) { + m_pendingDamages |= damagedRegion; + return; + } + if (videoFormat.max_framerate.num != 0 && !m_lastSent.isNull()) { auto frameInterval = (1000. * videoFormat.max_framerate.denom / videoFormat.max_framerate.num); auto lastSentAgo = m_lastSent.msecsTo(QDateTime::currentDateTimeUtc()); @@ -616,6 +627,9 @@ void ScreenCastStream::addDamage(spa_buffer *spaBuffer, const QRegion &damagedRe void ScreenCastStream::recordCursor() { Q_ASSERT(!m_stopped); + if (!m_streaming) { + return; + } if (m_pendingBuffer) { qCWarning(KWIN_SCREENCAST) << "Dropping a screencast cursor update because the compositor is slow"; @@ -687,6 +701,9 @@ void ScreenCastStream::enqueue() m_pendingFence.reset(); m_pendingNotifier.reset(); + if (!m_streaming) { + return; + } pw_stream_queue_buffer(pwStream, m_pendingBuffer); if (m_pendingBuffer->buffer->datas[0].chunk->flags != SPA_CHUNK_FLAG_CORRUPTED) { diff --git a/src/plugins/screencast/screencaststream.h b/src/plugins/screencast/screencaststream.h index c751c04d00..b9aae163d4 100644 --- a/src/plugins/screencast/screencaststream.h +++ b/src/plugins/screencast/screencaststream.h @@ -104,6 +104,7 @@ private: QSize m_resolution; bool m_stopped = false; + bool m_streaming = false; spa_video_info_raw videoFormat; QString m_error;