Revert "Wait for frames to arrive in WgcCapturer instead of returning nothing."
This reverts commit 93bb3051490253d56dc1cdab4701b91138a151c3.
Reason for revert: It breaks a test while rolling into Chromium,
see https://webrtc-review.googlesource.com/c/src/+/261780/21#message-4a96e33bfb475f19a618be82bbe72951b23085ef for details.
Original change's description:
> Wait for frames to arrive in WgcCapturer instead of returning nothing.
>
> We're seeing a high instance of "first capture failed" in Chromium when
> using WGC. We can reduce this by waiting for frames to arrive if there
> are none in the frame pool instead of returning a temporary error.
>
> I've set the maximum time to wait for a frame to 50ms. If no frame
> arrives before 50ms has elapsed, we will return a temporary error.
> Added a new test, FirstCaptureSucceeds, to verify that this is working
> as expected.
>
> As part of this I updated the name of the `kCreateFreeThreadedFailed`
> enum value to `kCreateFramePoolFailed`. The value remains the same
> since they both report failures in frame pool creation.
>
> I also increased `kNumBuffers` from 1 to 2, so that the frame pool can
> store two frames. This should prevent us from having to wait on the
> event as frequently. This will increase the latency between capture
> and display, however. High frame rate applications should not be
> noticeably affected.
>
> Additionally, we uncovered a bug in the OS that prevents window capture
> when there are displays attached, but none of them are active. Added
> a new check to `IsWgcSupported` to cover this scenario.
>
> Finally, some issues with other WGC tests blocked moving the TryBots
> to a newer version of Windows. This CL fixes those issues and updates
> the TryBot configuration.
>
> bug: chromium:1314868
> Change-Id: Id9c4d5ee98621e682ef04864c3848d50e761cdb7
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261780
> Reviewed-by: Alexander Cooper <alcooper@chromium.org>
> Reviewed-by: Jeremy Leconte <jleconte@webrtc.org>
> Commit-Queue: Austin Orion <auorion@microsoft.com>
> Reviewed-by: Jeremy Leconte <jleconte@google.com>
> Cr-Commit-Position: refs/heads/main@{#37404}
Change-Id: If237df4826fe20b6fe2ca4b57253623321bf33c5
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/267460
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Owners-Override: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Auto-Submit: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37408}
diff --git a/infra/specs/client.webrtc.json b/infra/specs/client.webrtc.json
index 9b5c568..8f884ab 100644
--- a/infra/specs/client.webrtc.json
+++ b/infra/specs/client.webrtc.json
@@ -8436,7 +8436,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -8464,7 +8464,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8485,7 +8485,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8506,7 +8506,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8527,7 +8527,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8551,7 +8551,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8572,7 +8572,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 2
@@ -8594,7 +8594,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -8616,7 +8616,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -8638,7 +8638,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8659,7 +8659,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8680,7 +8680,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8701,7 +8701,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -8723,7 +8723,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8744,7 +8744,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8765,7 +8765,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8786,7 +8786,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8807,7 +8807,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8850,7 +8850,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -8872,7 +8872,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8893,7 +8893,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -8918,7 +8918,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -8939,7 +8939,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -8960,7 +8960,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -8981,7 +8981,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9005,7 +9005,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9026,7 +9026,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 2
@@ -9048,7 +9048,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 6
@@ -9070,7 +9070,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 4
@@ -9092,7 +9092,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9113,7 +9113,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9134,7 +9134,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9155,7 +9155,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 6
@@ -9177,7 +9177,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9198,7 +9198,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9219,7 +9219,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9240,7 +9240,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9261,7 +9261,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9282,7 +9282,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 4
@@ -9304,7 +9304,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -9325,7 +9325,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
diff --git a/infra/specs/mixins.pyl b/infra/specs/mixins.pyl
index 4ba0430..2201698 100644
--- a/infra/specs/mixins.pyl
+++ b/infra/specs/mixins.pyl
@@ -322,10 +322,17 @@
}
}
},
- 'win10': {
+ 'win10-1703': {
'swarming': {
'dimensions': {
- 'os': 'Windows-10-19042'
+ 'os': 'Windows-10-15063'
+ }
+ }
+ },
+ 'win7': {
+ 'swarming': {
+ 'dimensions': {
+ 'os': 'Windows-7-SP1'
}
}
},
diff --git a/infra/specs/mixins_webrtc.pyl b/infra/specs/mixins_webrtc.pyl
index 833cbcf..e972b5f 100644
--- a/infra/specs/mixins_webrtc.pyl
+++ b/infra/specs/mixins_webrtc.pyl
@@ -259,5 +259,12 @@
'os': 'Windows'
}
}
- }
+ },
+ 'win10-1703': {
+ 'swarming': {
+ 'dimensions': {
+ 'os': 'Windows-10-15063',
+ },
+ },
+ },
}
diff --git a/infra/specs/test_suites.pyl b/infra/specs/test_suites.pyl
index 00a699b..b954bb3 100644
--- a/infra/specs/test_suites.pyl
+++ b/infra/specs/test_suites.pyl
@@ -220,11 +220,13 @@
},
'win_video_capture_tests': {
'video_capture_tests': {
+ 'remove_mixins': ['win7'],
'mixins': ['win', 'baremetal-pool'],
}
},
'win_video_capture_tests_tryserver': {
'video_capture_tests': {
+ 'remove_mixins': ['win7'],
'mixins': ['win', 'baremetal-try-pool'],
}
},
diff --git a/infra/specs/tryserver.webrtc.json b/infra/specs/tryserver.webrtc.json
index b035be4..549fb76 100644
--- a/infra/specs/tryserver.webrtc.json
+++ b/infra/specs/tryserver.webrtc.json
@@ -12364,7 +12364,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12385,7 +12385,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12406,7 +12406,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12427,7 +12427,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12451,7 +12451,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12472,7 +12472,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 2
@@ -12494,7 +12494,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 6
@@ -12516,7 +12516,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 4
@@ -12538,7 +12538,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12559,7 +12559,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12580,7 +12580,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12601,7 +12601,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 6
@@ -12623,7 +12623,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12644,7 +12644,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12665,7 +12665,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12686,7 +12686,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12707,7 +12707,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12728,7 +12728,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 4
@@ -12750,7 +12750,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12771,7 +12771,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -12800,7 +12800,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -12821,7 +12821,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -12842,7 +12842,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -12863,7 +12863,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -12887,7 +12887,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -12908,7 +12908,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 2
@@ -12930,7 +12930,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -12952,7 +12952,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -12974,7 +12974,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -12995,7 +12995,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13016,7 +13016,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13037,7 +13037,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -13059,7 +13059,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13080,7 +13080,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13101,7 +13101,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13122,7 +13122,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13143,7 +13143,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13164,7 +13164,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -13186,7 +13186,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13207,7 +13207,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13232,7 +13232,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13253,7 +13253,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13274,7 +13274,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13295,7 +13295,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13319,7 +13319,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13340,7 +13340,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 2
@@ -13362,7 +13362,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 6
@@ -13384,7 +13384,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 4
@@ -13406,7 +13406,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13427,7 +13427,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13448,7 +13448,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13469,7 +13469,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 6
@@ -13491,7 +13491,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13512,7 +13512,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13533,7 +13533,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13554,7 +13554,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13575,7 +13575,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13596,7 +13596,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
],
"shards": 4
@@ -13618,7 +13618,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13639,7 +13639,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-10-15063"
}
]
},
@@ -13664,7 +13664,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13685,7 +13685,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13706,7 +13706,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13727,7 +13727,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13751,7 +13751,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13772,7 +13772,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 2
@@ -13794,7 +13794,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -13816,7 +13816,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -13838,7 +13838,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13859,7 +13859,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13880,7 +13880,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13901,7 +13901,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -13923,7 +13923,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13944,7 +13944,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13965,7 +13965,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -13986,7 +13986,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14007,7 +14007,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14028,7 +14028,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -14050,7 +14050,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14071,7 +14071,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14096,7 +14096,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14117,7 +14117,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14138,7 +14138,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14159,7 +14159,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14183,7 +14183,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14204,7 +14204,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 2
@@ -14226,7 +14226,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -14248,7 +14248,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -14270,7 +14270,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14291,7 +14291,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14312,7 +14312,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14333,7 +14333,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -14355,7 +14355,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14376,7 +14376,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14397,7 +14397,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14418,7 +14418,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14439,7 +14439,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14460,7 +14460,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -14482,7 +14482,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14503,7 +14503,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14528,7 +14528,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14549,7 +14549,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14570,7 +14570,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14591,7 +14591,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14615,7 +14615,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14636,7 +14636,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 2
@@ -14658,7 +14658,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -14680,7 +14680,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -14702,7 +14702,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14723,7 +14723,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14744,7 +14744,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14765,7 +14765,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 6
@@ -14787,7 +14787,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14808,7 +14808,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14829,7 +14829,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14850,7 +14850,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14871,7 +14871,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14914,7 +14914,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
@@ -14936,7 +14936,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14957,7 +14957,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -14984,7 +14984,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
]
},
@@ -15009,7 +15009,7 @@
"dimension_sets": [
{
"cpu": "x86-64",
- "os": "Windows-10-19042"
+ "os": "Windows-7-SP1"
}
],
"shards": 4
diff --git a/infra/specs/waterfalls.pyl b/infra/specs/waterfalls.pyl
index 73c8e9a..062a81c 100644
--- a/infra/specs/waterfalls.pyl
+++ b/infra/specs/waterfalls.pyl
@@ -179,7 +179,7 @@
'MacArm64 Builder': {},
'Win (more configs)': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'more_configs_tests',
},
@@ -188,14 +188,14 @@
'Win32 Debug (Clang)': {},
'Win32 Release (Clang)': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'win_tests',
},
},
'Win64 ASan': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win10-1703', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'desktop_tests',
},
@@ -581,7 +581,7 @@
},
'win_asan': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win10-1703', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'desktop_tests',
},
@@ -592,42 +592,42 @@
'win_compile_x86_clang_rel': {},
'win_x64_clang_dbg': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'desktop_tests',
},
},
'win_x64_clang_dbg_win10': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win10-1703', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'desktop_tests',
},
},
'win_x64_clang_rel': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'desktop_tests',
},
},
'win_x86_clang_dbg': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'desktop_tests',
},
},
'win_x86_clang_rel': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'win_tests_tryserver',
},
},
'win_x86_more_configs': {
'os_type': 'win',
- 'mixins': ['win10', 'x86-64', 'resultdb-json-format'],
+ 'mixins': ['win7', 'x86-64', 'resultdb-json-format'],
'test_suites': {
'isolated_scripts': 'more_configs_tests',
},
diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn
index 6b3a5f5..3cc5c07 100644
--- a/modules/desktop_capture/BUILD.gn
+++ b/modules/desktop_capture/BUILD.gn
@@ -635,14 +635,8 @@
"win/wgc_desktop_frame.cc",
"win/wgc_desktop_frame.h",
]
- libs += [
- "dwmapi.lib",
- "CoreMessaging.lib",
- ]
- deps += [
- "../../rtc_base:rtc_event",
- "../../rtc_base/win:hstring",
- ]
+ libs += [ "dwmapi.lib" ]
+ deps += [ "../../rtc_base/win:hstring" ]
}
}
diff --git a/modules/desktop_capture/win/wgc_capture_session.cc b/modules/desktop_capture/win/wgc_capture_session.cc
index 0ff2db2..f894573 100644
--- a/modules/desktop_capture/win/wgc_capture_session.cc
+++ b/modules/desktop_capture/win/wgc_capture_session.cc
@@ -10,7 +10,6 @@
#include "modules/desktop_capture/win/wgc_capture_session.h"
-#include <DispatcherQueue.h>
#include <windows.graphics.capture.interop.h>
#include <windows.graphics.directX.direct3d11.interop.h>
#include <windows.graphics.h>
@@ -37,13 +36,13 @@
// We must use a BGRA pixel format that has 4 bytes per pixel, as required by
// the DesktopFrame interface.
-constexpr auto kPixelFormat = ABI::Windows::Graphics::DirectX::
- DirectXPixelFormat::DirectXPixelFormat_B8G8R8A8UIntNormalized;
+const auto kPixelFormat = ABI::Windows::Graphics::DirectX::DirectXPixelFormat::
+ DirectXPixelFormat_B8G8R8A8UIntNormalized;
-// The maximum time `GetFrame` will wait for a frame to arrive, if we don't have
-// any in the pool.
-constexpr int kMaxWaitForFrameMs = 50;
-constexpr int kMaxWaitForFirstFrameMs = 500;
+// We only want 1 buffer in our frame pool to reduce latency. If we had more,
+// they would sit in the pool for longer and be stale by the time we are asked
+// for a new frame.
+const int kNumBuffers = 1;
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
@@ -55,9 +54,9 @@
kD3dDelayLoadFailed = 4,
kD3dDeviceCreationFailed = 5,
kFramePoolActivationFailed = 6,
- // kFramePoolCastFailed = 7, (deprecated)
- // kGetItemSizeFailed = 8, (deprecated)
- kCreateFramePoolFailed = 9,
+ kFramePoolCastFailed = 7,
+ kGetItemSizeFailed = 8,
+ kCreateFreeThreadedFailed = 9,
kCreateCaptureSessionFailed = 10,
kStartCaptureFailed = 11,
kMaxValue = kStartCaptureFailed
@@ -101,9 +100,7 @@
: d3d11_device_(std::move(d3d11_device)),
item_(std::move(item)),
size_(size) {}
-WgcCaptureSession::~WgcCaptureSession() {
- RemoveEventHandlers();
-}
+WgcCaptureSession::~WgcCaptureSession() = default;
HRESULT WgcCaptureSession::StartCapture() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
@@ -121,13 +118,12 @@
// Listen for the Closed event, to detect if the source we are capturing is
// closed (e.g. application window is closed or monitor is disconnected). If
// it is, we should abort the capture.
- item_closed_token_ = std::make_unique<EventRegistrationToken>();
auto closed_handler =
Microsoft::WRL::Callback<ABI::Windows::Foundation::ITypedEventHandler<
WGC::GraphicsCaptureItem*, IInspectable*>>(
this, &WgcCaptureSession::OnItemClosed);
- HRESULT hr =
- item_->add_Closed(closed_handler.Get(), item_closed_token_.get());
+ EventRegistrationToken item_closed_token;
+ HRESULT hr = item_->add_Closed(closed_handler.Get(), &item_closed_token);
if (FAILED(hr)) {
RecordStartCaptureResult(StartCaptureResult::kAddClosedFailed);
return hr;
@@ -161,25 +157,22 @@
return hr;
}
- hr = frame_pool_statics->Create(direct3d_device_.Get(), kPixelFormat,
- kNumBuffers, size_, &frame_pool_);
+ // Cast to FramePoolStatics2 so we can use CreateFreeThreaded and avoid the
+ // need to have a DispatcherQueue. We don't listen for the FrameArrived event,
+ // so there's no difference.
+ ComPtr<WGC::IDirect3D11CaptureFramePoolStatics2> frame_pool_statics2;
+ hr = frame_pool_statics->QueryInterface(IID_PPV_ARGS(&frame_pool_statics2));
if (FAILED(hr)) {
- RecordStartCaptureResult(StartCaptureResult::kCreateFramePoolFailed);
+ RecordStartCaptureResult(StartCaptureResult::kFramePoolCastFailed);
return hr;
}
- frames_in_pool_ = 0;
-
- // Because `WgcCapturerWin` created a `DispatcherQueue`, and we created
- // `frame_pool_` via `Create`, the `FrameArrived` event will be delivered on
- // the current thread.
- frame_arrived_token_ = std::make_unique<EventRegistrationToken>();
- auto frame_arrived_handler =
- Microsoft::WRL::Callback<ABI::Windows::Foundation::ITypedEventHandler<
- WGC::Direct3D11CaptureFramePool*, IInspectable*>>(
- this, &WgcCaptureSession::OnFrameArrived);
- hr = frame_pool_->add_FrameArrived(frame_arrived_handler.Get(),
- frame_arrived_token_.get());
+ hr = frame_pool_statics2->CreateFreeThreaded(
+ direct3d_device_.Get(), kPixelFormat, kNumBuffers, size_, &frame_pool_);
+ if (FAILED(hr)) {
+ RecordStartCaptureResult(StartCaptureResult::kCreateFreeThreadedFailed);
+ return hr;
+ }
hr = frame_pool_->CreateCaptureSession(item_.Get(), &session_);
if (FAILED(hr)) {
@@ -212,10 +205,6 @@
RTC_DCHECK(is_capture_started_);
- if (frames_in_pool_ < 1)
- wait_for_frame_event_.Wait(first_frame_ ? kMaxWaitForFirstFrameMs
- : kMaxWaitForFrameMs);
-
ComPtr<WGC::IDirect3D11CaptureFrame> capture_frame;
HRESULT hr = frame_pool_->TryGetNextFrame(&capture_frame);
if (FAILED(hr)) {
@@ -229,9 +218,6 @@
return hr;
}
- first_frame_ = false;
- --frames_in_pool_;
-
// We need to get `capture_frame` as an `ID3D11Texture2D` so that we can get
// the raw image data in the format required by the `DesktopFrame` interface.
ComPtr<ABI::Windows::Graphics::DirectX::Direct3D11::IDirect3DSurface>
@@ -372,16 +358,6 @@
return d3d11_device_->CreateTexture2D(&map_desc, nullptr, &mapped_texture_);
}
-HRESULT WgcCaptureSession::OnFrameArrived(
- WGC::IDirect3D11CaptureFramePool* sender,
- IInspectable* event_args) {
- RTC_DCHECK_RUN_ON(&sequence_checker_);
- RTC_DCHECK_LT(frames_in_pool_, kNumBuffers);
- ++frames_in_pool_;
- wait_for_frame_event_.Set();
- return S_OK;
-}
-
HRESULT WgcCaptureSession::OnItemClosed(WGC::IGraphicsCaptureItem* sender,
IInspectable* event_args) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
@@ -390,8 +366,6 @@
item_closed_ = true;
is_capture_started_ = false;
- RemoveEventHandlers();
-
mapped_texture_ = nullptr;
session_ = nullptr;
frame_pool_ = nullptr;
@@ -402,22 +376,4 @@
return S_OK;
}
-void WgcCaptureSession::RemoveEventHandlers() {
- HRESULT hr;
- if (frame_pool_ && frame_arrived_token_) {
- hr = frame_pool_->remove_FrameArrived(*frame_arrived_token_);
- frame_arrived_token_.reset();
- if (FAILED(hr)) {
- RTC_LOG(LS_WARNING) << "Failed to remove FrameArrived event handler: "
- << hr;
- }
- }
- if (item_ && item_closed_token_) {
- hr = item_->remove_Closed(*item_closed_token_);
- item_closed_token_.reset();
- if (FAILED(hr))
- RTC_LOG(LS_WARNING) << "Failed to remove Closed event handler: " << hr;
- }
-}
-
} // namespace webrtc
diff --git a/modules/desktop_capture/win/wgc_capture_session.h b/modules/desktop_capture/win/wgc_capture_session.h
index 27d412b..0b9d082 100644
--- a/modules/desktop_capture/win/wgc_capture_session.h
+++ b/modules/desktop_capture/win/wgc_capture_session.h
@@ -21,7 +21,6 @@
#include "api/sequence_checker.h"
#include "modules/desktop_capture/desktop_capture_options.h"
#include "modules/desktop_capture/win/wgc_capture_source.h"
-#include "rtc_base/event.h"
namespace webrtc {
@@ -49,12 +48,6 @@
return is_capture_started_;
}
- // We keep 2 buffers in the frame pool to balance the staleness of the frame
- // with having to wait for frames to arrive too frequently. Too many buffers
- // will lead to a high latency, and too few will lead to poor performance.
- // We make this public for tests.
- static constexpr int kNumBuffers = 2;
-
private:
// Initializes `mapped_texture_` with the properties of the `src_texture`,
// overrides the values of some necessary properties like the
@@ -71,24 +64,6 @@
ABI::Windows::Graphics::Capture::IGraphicsCaptureItem* sender,
IInspectable* event_args);
- // Event handler for `frame_pool_`'s FrameArrived event.
- HRESULT OnFrameArrived(
- ABI::Windows::Graphics::Capture::IDirect3D11CaptureFramePool* sender,
- IInspectable* event_args);
-
- void RemoveEventHandlers();
-
- // We wait on this event in `GetFrame` if there are no frames in the pool.
- // `OnFrameArrived` will set the event so we can proceed.
- rtc::Event wait_for_frame_event_;
- int frames_in_pool_;
-
- // We're willing to wait for a frame a little longer if it's the first one.
- bool first_frame_ = true;
-
- std::unique_ptr<EventRegistrationToken> frame_arrived_token_;
- std::unique_ptr<EventRegistrationToken> item_closed_token_;
-
// A Direct3D11 Device provided by the caller. We use this to create an
// IDirect3DDevice, and also to create textures that will hold the image data.
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
diff --git a/modules/desktop_capture/win/wgc_capturer_win.cc b/modules/desktop_capture/win/wgc_capturer_win.cc
index 3f44dd5..eacaa89 100644
--- a/modules/desktop_capture/win/wgc_capturer_win.cc
+++ b/modules/desktop_capture/win/wgc_capturer_win.cc
@@ -10,7 +10,6 @@
#include "modules/desktop_capture/win/wgc_capturer_win.h"
-#include <DispatcherQueue.h>
#include <windows.foundation.metadata.h>
#include <windows.graphics.capture.h>
@@ -46,8 +45,7 @@
kSessionStartFailure = 4,
kGetFrameFailure = 5,
kFrameDropped = 6,
- kCreateDispatcherQueueFailure = 7,
- kMaxValue = kCreateDispatcherQueueFailure
+ kMaxValue = kFrameDropped
};
void RecordWgcCapturerResult(WgcCapturerResult error) {
@@ -59,34 +57,20 @@
} // namespace
bool IsWgcSupported(CaptureType capture_type) {
- if (!HasActiveDisplay()) {
- // There is a bug in `CreateForMonitor` that causes a crash if there are no
- // active displays. The crash was fixed in Win11, but we are still unable
- // to capture screens without an active display.
- if (capture_type == CaptureType::kScreen)
+ if (capture_type == CaptureType::kScreen) {
+ // A bug in the WGC API `CreateForMonitor` was fixed in 20H1.
+ if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_WIN10_20H1)
return false;
- // There is a bug in the DWM (Desktop Window Manager) that prevents it from
- // providing image data if there are no displays attached. This was fixed in
- // Windows 11.
- if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_WIN11)
+ // There is another bug in `CreateForMonitor` that causes a crash if there
+ // are no active displays.
+ if (!HasActiveDisplay())
return false;
}
- // A bug in the WGC API `CreateForMonitor` prevents capturing the entire
- // virtual screen (all monitors simultaneously), this was fixed in 20H1. Since
- // we can't assert that we won't be asked to capture the entire virtual
- // screen, we report unsupported so we can fallback to another capturer.
- if (capture_type == CaptureType::kScreen &&
- rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_WIN10_20H1) {
- return false;
- }
-
if (!ResolveCoreWinRTDelayload())
return false;
- // We need to check if the WGC APIs are presesnt on the system. Certain SKUs
- // of Windows ship without these APIs.
ComPtr<ABI::Windows::Foundation::Metadata::IApiInformationStatics>
api_info_statics;
HRESULT hr = GetActivationFactory<
@@ -120,7 +104,6 @@
if (FAILED(hr) || !is_type_present)
return false;
- // If the APIs are present, we need to check that they are supported.
ComPtr<WGC::IGraphicsCaptureSessionStatics> capture_session_statics;
hr = GetActivationFactory<
WGC::IGraphicsCaptureSessionStatics,
@@ -241,32 +224,9 @@
return;
}
- HRESULT hr;
- if (!dispatcher_queue_created_) {
- // Set the apartment type to NONE because this thread should already be COM
- // initialized.
- DispatcherQueueOptions options{
- sizeof(DispatcherQueueOptions),
- DISPATCHERQUEUE_THREAD_TYPE::DQTYPE_THREAD_CURRENT,
- DISPATCHERQUEUE_THREAD_APARTMENTTYPE::DQTAT_COM_NONE};
- ComPtr<ABI::Windows::System::IDispatcherQueueController> queue_controller;
- hr = CreateDispatcherQueueController(options, &queue_controller);
-
- // If there is already a DispatcherQueue on this thread, that is fine. Its
- // lifetime is tied to the thread's, and as long as the thread has one, even
- // if we didn't create it, the capture session's events will be delivered on
- // this thread.
- if (FAILED(hr) && hr != RPC_E_WRONG_THREAD) {
- RecordWgcCapturerResult(WgcCapturerResult::kCreateDispatcherQueueFailure);
- callback_->OnCaptureResult(DesktopCapturer::Result::ERROR_PERMANENT,
- /*frame=*/nullptr);
- } else {
- dispatcher_queue_created_ = true;
- }
- }
-
int64_t capture_start_time_nanos = rtc::TimeNanos();
+ HRESULT hr;
WgcCaptureSession* capture_session = nullptr;
std::map<SourceId, WgcCaptureSession>::iterator session_iter =
ongoing_captures_.find(capture_source_->GetSourceId());
diff --git a/modules/desktop_capture/win/wgc_capturer_win.h b/modules/desktop_capture/win/wgc_capturer_win.h
index f1f8f97..ba212b6 100644
--- a/modules/desktop_capture/win/wgc_capturer_win.h
+++ b/modules/desktop_capture/win/wgc_capturer_win.h
@@ -11,7 +11,6 @@
#ifndef MODULES_DESKTOP_CAPTURE_WIN_WGC_CAPTURER_WIN_H_
#define MODULES_DESKTOP_CAPTURE_WIN_WGC_CAPTURER_WIN_H_
-#include <DispatcherQueue.h>
#include <d3d11.h>
#include <wrl/client.h>
@@ -110,13 +109,6 @@
bool IsSourceBeingCaptured(SourceId id);
private:
- // We need to either create or ensure that someone else created a
- // `DispatcherQueue` on the current thread so that events will be delivered
- // on the current thread rather than an arbitrary thread. A
- // `DispatcherQueue`'s lifetime is tied to the thread's, and we don't post
- // any work to it, so we don't need to hold a reference.
- bool dispatcher_queue_created_ = false;
-
// Factory to create a WgcCaptureSource for us whenever SelectSource is
// called. Initialized at construction with a source-specific implementation.
std::unique_ptr<WgcCaptureSourceFactory> source_factory_;
diff --git a/modules/desktop_capture/win/wgc_capturer_win_unittest.cc b/modules/desktop_capture/win/wgc_capturer_win_unittest.cc
index 9339526..b83266c 100644
--- a/modules/desktop_capture/win/wgc_capturer_win_unittest.cc
+++ b/modules/desktop_capture/win/wgc_capturer_win_unittest.cc
@@ -18,14 +18,12 @@
#include "modules/desktop_capture/desktop_capture_types.h"
#include "modules/desktop_capture/desktop_capturer.h"
#include "modules/desktop_capture/win/test_support/test_window.h"
-#include "modules/desktop_capture/win/wgc_capture_session.h"
#include "modules/desktop_capture/win/window_capture_utils.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/thread.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/win/scoped_com_initializer.h"
-#include "rtc_base/win/windows_version.h"
#include "system_wrappers/include/metrics.h"
#include "system_wrappers/include/sleep.h"
#include "test/gtest.h"
@@ -33,54 +31,40 @@
namespace webrtc {
namespace {
-constexpr char kWindowThreadName[] = "wgc_capturer_test_window_thread";
-constexpr WCHAR kWindowTitle[] = L"WGC Capturer Test Window";
+const char kWindowThreadName[] = "wgc_capturer_test_window_thread";
+const WCHAR kWindowTitle[] = L"WGC Capturer Test Window";
-constexpr char kCapturerImplHistogram[] =
+const char kCapturerImplHistogram[] =
"WebRTC.DesktopCapture.Win.DesktopCapturerImpl";
-constexpr char kCapturerResultHistogram[] =
+const char kCapturerResultHistogram[] =
"WebRTC.DesktopCapture.Win.WgcCapturerResult";
-constexpr int kSuccess = 0;
-constexpr int kSessionStartFailure = 4;
+const int kSuccess = 0;
+const int kSessionStartFailure = 4;
-constexpr char kCaptureSessionResultHistogram[] =
+const char kCaptureSessionResultHistogram[] =
"WebRTC.DesktopCapture.Win.WgcCaptureSessionStartResult";
-constexpr int kSourceClosed = 1;
+const int kSourceClosed = 1;
-constexpr char kCaptureTimeHistogram[] =
+const char kCaptureTimeHistogram[] =
"WebRTC.DesktopCapture.Win.WgcCapturerFrameTime";
-// The capturer keeps `kNumBuffers` in its frame pool, so we need to request
-// that many frames to clear those out. The next frame will have the new size
-// (if the size has changed) so we will resize the frame pool at this point.
-// Then, we need to clear any frames that may have delivered to the frame pool
-// before the resize. Finally, the next frame will be guaranteed to be the new
-// size.
-constexpr int kNumCapturesToFlushBuffers =
- WgcCaptureSession::kNumBuffers * 2 + 1;
-
-constexpr int kSmallWindowWidth = 200;
-constexpr int kSmallWindowHeight = 100;
-constexpr int kMediumWindowWidth = 300;
-constexpr int kMediumWindowHeight = 200;
-constexpr int kLargeWindowWidth = 400;
-constexpr int kLargeWindowHeight = 500;
+const int kSmallWindowWidth = 200;
+const int kSmallWindowHeight = 100;
+const int kMediumWindowWidth = 300;
+const int kMediumWindowHeight = 200;
+const int kLargeWindowWidth = 400;
+const int kLargeWindowHeight = 500;
// The size of the image we capture is slightly smaller than the actual size of
// the window.
-constexpr int kWindowWidthSubtrahend = 14;
-constexpr int kWindowHeightSubtrahend = 7;
+const int kWindowWidthSubtrahend = 14;
+const int kWindowHeightSubtrahend = 7;
-// Custom message constants so we can direct our thread to close windows and
-// quit running.
-constexpr UINT kDestroyWindow = WM_APP;
-constexpr UINT kQuitRunning = WM_APP + 1;
-
-// When testing changes to real windows, sometimes the effects (close or resize)
-// don't happen immediately, we want to keep trying until we see the effect but
-// only for a reasonable amount of time.
-constexpr int kMaxTries = 50;
+// Custom message constants so we can direct our thread to close windows
+// and quit running.
+const UINT kDestroyWindow = WM_APP;
+const UINT kQuitRunning = WM_APP + 1;
} // namespace
@@ -201,26 +185,20 @@
return sources[0].id;
}
- void DoCapture(int num_captures = 1) {
- // Capture the requested number of frames. We expect the first capture to
- // always succeed. If we're asked for multiple frames, we do expect to see a
- // a couple dropped frames due to resizing the window.
- const int max_tries = num_captures == 1 ? 1 : kMaxTries;
- int success_count = 0;
- for (int i = 0; success_count < num_captures && i < max_tries; i++) {
+ void DoCapture() {
+ // Sometimes the first few frames are empty becaues the capture engine is
+ // still starting up. We also may drop a few frames when the window is
+ // resized or un-minimized.
+ do {
capturer_->CaptureFrame();
- if (result_ == DesktopCapturer::Result::ERROR_PERMANENT)
- break;
- if (result_ == DesktopCapturer::Result::SUCCESS)
- success_count++;
- }
+ } while (result_ == DesktopCapturer::Result::ERROR_TEMPORARY);
- total_successful_captures_ += success_count;
- EXPECT_EQ(success_count, num_captures);
EXPECT_EQ(result_, DesktopCapturer::Result::SUCCESS);
EXPECT_TRUE(frame_);
- EXPECT_GE(metrics::NumEvents(kCapturerResultHistogram, kSuccess),
- total_successful_captures_);
+
+ EXPECT_GT(metrics::NumEvents(kCapturerResultHistogram, kSuccess),
+ successful_captures_);
+ ++successful_captures_;
}
void ValidateFrame(int expected_width, int expected_height) {
@@ -228,7 +206,8 @@
EXPECT_EQ(frame_->size().height(),
expected_height - kWindowHeightSubtrahend);
- // Verify the buffer contains as much data as it should.
+ // Verify the buffer contains as much data as it should, and that the right
+ // colors are found.
int data_length = frame_->stride() * frame_->size().height();
// The first and last pixel should have the same color because they will be
@@ -240,7 +219,7 @@
EXPECT_EQ(first_pixel, last_pixel);
// Let's also check a pixel from the middle of the content area, which the
- // test window will paint a consistent color for us to verify.
+ // TestWindow will paint a consistent color for us to verify.
uint8_t* middle_pixel = frame_->data() + (data_length / 2);
int sub_pixel_offset = DesktopFrame::kBytesPerPixel / 4;
@@ -272,7 +251,7 @@
intptr_t source_id_;
bool window_open_ = false;
DesktopCapturer::Result result_;
- int total_successful_captures_ = 0;
+ int successful_captures_ = 0;
std::unique_ptr<DesktopFrame> frame_;
std::unique_ptr<DesktopCapturer> capturer_;
};
@@ -331,12 +310,13 @@
capturer_->Start(this);
int64_t start_time;
- start_time = rtc::TimeNanos();
- capturer_->CaptureFrame();
+ do {
+ start_time = rtc::TimeNanos();
+ capturer_->CaptureFrame();
+ } while (result_ == DesktopCapturer::Result::ERROR_TEMPORARY);
int capture_time_ms =
(rtc::TimeNanos() - start_time) / rtc::kNumNanosecsPerMillisec;
- EXPECT_EQ(result_, DesktopCapturer::Result::SUCCESS);
EXPECT_TRUE(frame_);
// The test may measure the time slightly differently than the capturer. So we
@@ -352,8 +332,6 @@
CaptureType::kScreen));
TEST(WgcCapturerNoMonitorTest, NoMonitors) {
- ScopedCOMInitializer com_initializer(ScopedCOMInitializer::kMTA);
- EXPECT_TRUE(com_initializer.Succeeded());
if (HasActiveDisplay()) {
RTC_LOG(LS_INFO) << "Skip WgcCapturerWinTest designed specifically for "
"systems with no monitors";
@@ -363,13 +341,6 @@
// A bug in `CreateForMonitor` prevents screen capture when no displays are
// attached.
EXPECT_FALSE(IsWgcSupported(CaptureType::kScreen));
-
- // A bug in the DWM (Desktop Window Manager) prevents it from providing image
- // data if there are no displays attached. This was fixed in Windows 11.
- if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_WIN11)
- EXPECT_FALSE(IsWgcSupported(CaptureType::kWindow));
- else
- EXPECT_TRUE(IsWgcSupported(CaptureType::kWindow));
}
class WgcCapturerMonitorTest : public WgcCapturerWinTest {
@@ -481,11 +452,15 @@
ValidateFrame(kSmallWindowWidth, kSmallWindowHeight);
ResizeTestWindow(window_info_.hwnd, kSmallWindowWidth, kMediumWindowHeight);
- DoCapture(kNumCapturesToFlushBuffers);
+ DoCapture();
+ // We don't expect to see the new size until the next capture, as the frame
+ // pool hadn't had a chance to resize yet to fit the new, larger image.
+ DoCapture();
ValidateFrame(kSmallWindowWidth, kMediumWindowHeight);
ResizeTestWindow(window_info_.hwnd, kLargeWindowWidth, kMediumWindowHeight);
- DoCapture(kNumCapturesToFlushBuffers);
+ DoCapture();
+ DoCapture();
ValidateFrame(kLargeWindowWidth, kMediumWindowHeight);
}
@@ -498,11 +473,13 @@
ValidateFrame(kLargeWindowWidth, kLargeWindowHeight);
ResizeTestWindow(window_info_.hwnd, kLargeWindowWidth, kMediumWindowHeight);
- DoCapture(kNumCapturesToFlushBuffers);
+ // We expect to see the new size immediately because the image data has shrunk
+ // and will fit in the existing buffer.
+ DoCapture();
ValidateFrame(kLargeWindowWidth, kMediumWindowHeight);
ResizeTestWindow(window_info_.hwnd, kSmallWindowWidth, kMediumWindowHeight);
- DoCapture(kNumCapturesToFlushBuffers);
+ DoCapture();
ValidateFrame(kSmallWindowWidth, kMediumWindowHeight);
}
@@ -514,7 +491,7 @@
// Minmize the window and capture should continue but return temporary errors.
MinimizeTestWindow(window_info_.hwnd);
- for (int i = 0; i < 5; ++i) {
+ for (int i = 0; i < 10; ++i) {
capturer_->CaptureFrame();
EXPECT_EQ(result_, DesktopCapturer::Result::ERROR_TEMPORARY);
}
@@ -543,24 +520,19 @@
// stops.
auto* wgc_capturer = static_cast<WgcCapturerWin*>(capturer_.get());
MSG msg;
- for (int i = 0;
- wgc_capturer->IsSourceBeingCaptured(source_id_) && i < kMaxTries; ++i) {
+ while (wgc_capturer->IsSourceBeingCaptured(source_id_)) {
// Unlike GetMessage, PeekMessage will not hang if there are no messages in
// the queue.
PeekMessage(&msg, 0, 0, 0, PM_REMOVE);
SleepMs(1);
}
- EXPECT_FALSE(wgc_capturer->IsSourceBeingCaptured(source_id_));
-
- // The frame pool can buffer `kNumBuffers` frames. We must consume these
- // and then make one more call to CaptureFrame before we expect to see the
- // failure.
- int num_tries = 0;
- do {
+ // Occasionally, one last frame will have made it into the frame pool before
+ // the window closed. The first call will consume it, and in that case we need
+ // to make one more call to CaptureFrame.
+ capturer_->CaptureFrame();
+ if (result_ == DesktopCapturer::Result::SUCCESS)
capturer_->CaptureFrame();
- } while (result_ == DesktopCapturer::Result::SUCCESS &&
- ++num_tries <= WgcCaptureSession::kNumBuffers);
EXPECT_GE(metrics::NumEvents(kCapturerResultHistogram, kSessionStartFailure),
1);