Opt: skip 8MB raw first-frame in H264 mode; server unlocks on first IDR instead

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
yuanyuanxiang
2026-06-15 19:39:49 +02:00
parent 2765d95950
commit abafd673a2
2 changed files with 14 additions and 0 deletions

View File

@@ -145,10 +145,19 @@ CScreenSpy::~CScreenSpy()
LPBYTE CScreenSpy::GetFirstScreenData(ULONG* ulFirstScreenLength) LPBYTE CScreenSpy::GetFirstScreenData(ULONG* ulFirstScreenLength)
{ {
if (m_hTargetWnd && IsIconic(m_hTargetWnd)) {
*ulFirstScreenLength = 0;
return nullptr;
}
ScanScreen(m_hFullMemDC, m_hDeskTopDC, m_ulFullWidth, m_ulFullHeight); ScanScreen(m_hFullMemDC, m_hDeskTopDC, m_ulFullWidth, m_ulFullHeight);
m_RectBuffer[0] = TOKEN_FIRSTSCREEN; m_RectBuffer[0] = TOKEN_FIRSTSCREEN;
LPBYTE bmp = scaleBitmap(m_BmpZoomBuffer, (LPBYTE)m_BitmapData_Full); LPBYTE bmp = scaleBitmap(m_BmpZoomBuffer, (LPBYTE)m_BitmapData_Full);
memcpy(m_FirstBuffer, bmp, m_BitmapInfor_Send->bmiHeader.biSizeImage); memcpy(m_FirstBuffer, bmp, m_BitmapInfor_Send->bmiHeader.biSizeImage);
// H264/AV1不发原始位图IDR 到达后服务端自行解锁;节省每次切窗口的流量峰值
if (m_bAlgorithm == ALGORITHM_H264) {
*ulFirstScreenLength = 0;
return nullptr;
}
memcpy(1 + m_RectBuffer, bmp, m_BitmapInfor_Send->bmiHeader.biSizeImage); memcpy(1 + m_RectBuffer, bmp, m_BitmapInfor_Send->bmiHeader.biSizeImage);
if (m_bAlgorithm == ALGORITHM_GRAY) { if (m_bAlgorithm == ALGORITHM_GRAY) {
ToGray(1 + m_RectBuffer, 1 + m_RectBuffer, m_BitmapInfor_Send->bmiHeader.biSizeImage); ToGray(1 + m_RectBuffer, 1 + m_RectBuffer, m_BitmapInfor_Send->bmiHeader.biSizeImage);

View File

@@ -1478,6 +1478,11 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(bool keyFrame)
if (!m_bHide) { if (!m_bHide) {
if (Decode((LPBYTE)NextScreenData, NextScreenLength)) { if (Decode((LPBYTE)NextScreenData, NextScreenLength)) {
bChange = TRUE; bChange = TRUE;
// 解码成功即代表 IDR 参考帧已建立(编码器首帧强制 IDR解除门控。
// 不依赖 IsAnyKeyframe某些硬编输出格式或解码器首帧 EAGAIN 延迟会导致
// 关键帧检测误判,进而让 m_bIsFirst 永久为 TRUE"请等待"卡死)。
if (m_bIsFirst)
m_bIsFirst = FALSE;
} }
} }
// Broadcast video frame to web clients (only for Web session dialogs) // Broadcast video frame to web clients (only for Web session dialogs)