From abc0ed06541cd803f3bb15e99607ae449469e574 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 1 Oct 2026 09:33:57 +1000 Subject: [PATCH] [idd] network: finish fragmented video frames Preserve a partially transmitted frame while replacing queued stale frames. Continuous capture can otherwise discard every frame before the client receives its final fragment. --- idd/LGIdd/transport/network/CNetworkVideo.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/idd/LGIdd/transport/network/CNetworkVideo.cpp b/idd/LGIdd/transport/network/CNetworkVideo.cpp index 6e9f77b4..62b77a53 100644 --- a/idd/LGIdd/transport/network/CNetworkVideo.cpp +++ b/idd/LGIdd/transport/network/CNetworkVideo.cpp @@ -1609,8 +1609,21 @@ struct CNetworkVideo::Impl void DropPeerFramesNL(PeerState& peer) { + // Finish a frame once any of its fragments have been accepted. Replacing + // it mid-flight prevents a continuously changing desktop from ever + // delivering a complete frame on a constrained link. + uint64_t activeFrame = 0; + for (const SendItem& item : m_sends) + if (item.frameID && item.encoded && item.fragmentIndex && + SamePeer(item.peer, peer.peer)) + { + activeFrame = item.frameID; + break; + } + for (auto item = m_sends.begin(); item != m_sends.end();) - if (item->frameID && SamePeer(item->peer, peer.peer)) + if (item->frameID && item->frameID != activeFrame && + SamePeer(item->peer, peer.peer)) { ReleaseSendAccountingNL(*item); item = m_sends.erase(item);