Index: webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc |
diff --git a/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc b/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc |
index 13087cc9285daa71fcdc992c714144f36f0d4e0d..f7a873016ffaf1d8ee6d135fbaf1c0c5211ab33e 100644 |
--- a/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc |
+++ b/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc |
@@ -288,20 +288,35 @@ bool DxgiOutputDuplicator::DoDetectUpdatedRegion( |
dirty_rects_count = buff_size / sizeof(RECT); |
while (move_rects_count > 0) { |
- updated_region->AddRect( |
- RotateRect(DesktopRect::MakeXYWH(move_rects->SourcePoint.x, |
- move_rects->SourcePoint.y, |
- move_rects->DestinationRect.right - |
- move_rects->DestinationRect.left, |
- move_rects->DestinationRect.bottom - |
- move_rects->DestinationRect.top), |
- unrotated_size_, rotation_)); |
- updated_region->AddRect( |
- RotateRect(DesktopRect::MakeLTRB(move_rects->DestinationRect.left, |
- move_rects->DestinationRect.top, |
- move_rects->DestinationRect.right, |
- move_rects->DestinationRect.bottom), |
- unrotated_size_, rotation_)); |
+ // DirectX capturer API may randomly return unmoved move_rects, which should |
+ // be skipped to avoid unnecessary wasting of differing and encoding |
+ // resources. |
+ // By using testing application it2me_standalone_host_main, this check |
+ // reduces average capture time by 0.375% (4.07 -> 4.055), and average |
+ // encode time by 0.313% (8.042 -> 8.016) without other impacts. |
+ if (move_rects->SourcePoint.x != move_rects->DestinationRect.left || |
+ move_rects->SourcePoint.y != move_rects->DestinationRect.top) { |
+ updated_region->AddRect( |
+ RotateRect(DesktopRect::MakeXYWH(move_rects->SourcePoint.x, |
+ move_rects->SourcePoint.y, |
+ move_rects->DestinationRect.right - |
+ move_rects->DestinationRect.left, |
+ move_rects->DestinationRect.bottom - |
+ move_rects->DestinationRect.top), |
+ unrotated_size_, rotation_)); |
+ updated_region->AddRect( |
+ RotateRect(DesktopRect::MakeLTRB(move_rects->DestinationRect.left, |
+ move_rects->DestinationRect.top, |
+ move_rects->DestinationRect.right, |
+ move_rects->DestinationRect.bottom), |
+ unrotated_size_, rotation_)); |
+ } else { |
+ LOG(LS_INFO) << "Unmoved move_rect detected, [" |
+ << move_rects->DestinationRect.left << ", " |
+ << move_rects->DestinationRect.top << "] - [" |
+ << move_rects->DestinationRect.right << ", " |
+ << move_rects->DestinationRect.bottom << "]."; |
+ } |
move_rects++; |
move_rects_count--; |
} |