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:
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user