From 2264e7aaccfe5ca21bf7fc24967bf7d1157dcb54 Mon Sep 17 00:00:00 2001 From: henrika Date: Thu, 25 May 2023 16:38:52 +0200 Subject: [PATCH] Fixes distortion in WGC screen capture path This is a partial revert of the previously landed CL in https://webrtc-review.googlesource.com/c/src/+/301200. I noticed when I used `getDisplayMedia` on my private Windows laptop in combination with WGC that the captured screen was distorted and did only contain tilted (~35 degrees) lines in all sorts of colors. The issue only happened for one particular screen resolution 3000 x 2000 and 200% scale. Changing to 100% scale instead resolved the issue. I tried many other resolutions but could only trigger for the one above with 200% scaling. Next, I bisected and found [1] which led to [2] which contains my own change in https://webrtc-review.googlesource.com/c/src/+/301200. The only part that could affect the video frame was the part which did `CopyPixelsFrom` so I reverted that part and it solved the issue on my private Windows laptop. I did not dig deeper into why this particular resolution triggered the distortion but deiced to revert to avoid more reports. [1] https://chromium.googlesource.com/chromium/src/+log/b4c2a7fcf591a52c7d07de92808047bf4e2da77d..ff848b7a4337fd22f5c52464bbec164e17b27fa3 [2] https://chromium.googlesource.com/chromium/src/+/a9a2957dbcfd9e2e670fa9a5241269888a0f55d2 Bug: chromium:1428592 Change-Id: I328e77840cd3ca6871254cdf06500bdc616b0c36 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/306600 Commit-Queue: Alexander Cooper Reviewed-by: Alexander Cooper Cr-Commit-Position: refs/heads/main@{#40147} --- modules/desktop_capture/win/wgc_capture_session.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/desktop_capture/win/wgc_capture_session.cc b/modules/desktop_capture/win/wgc_capture_session.cc index 64247d2739..f439e21068 100644 --- a/modules/desktop_capture/win/wgc_capture_session.cc +++ b/modules/desktop_capture/win/wgc_capture_session.cc @@ -430,8 +430,12 @@ HRESULT WgcCaptureSession::ProcessFrame() { // Make a copy of the data pointed to by `map_info.pData` to the preallocated // `current_frame` so we are free to unmap our texture. uint8_t* src_data = static_cast(map_info.pData); - current_frame->CopyPixelsFrom(src_data, current_frame->stride(), - DesktopRect::MakeSize(current_frame->size())); + uint8_t* dst_data = current_frame->data(); + for (int i = 0; i < image_height; i++) { + memcpy(dst_data, src_data, current_frame->stride()); + dst_data += current_frame->stride(); + src_data += map_info.RowPitch; + } d3d_context->Unmap(mapped_texture_.Get(), 0);