mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00
Make CroppedWindowCapturer more resilient
Bug: chromium:1245272 Change-Id: I276c98ad0aea3dd0e614b935b9a7566c77d5026a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/233720 Reviewed-by: Joe Downing <joedow@chromium.org> Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35132}
This commit is contained in:
parent
985310ea3b
commit
db94869ca3
3 changed files with 22 additions and 8 deletions
|
@ -36,7 +36,9 @@ std::unique_ptr<DesktopFrame> CreateCroppedDesktopFrame(
|
|||
const DesktopRect& rect) {
|
||||
RTC_DCHECK(frame);
|
||||
|
||||
if (!DesktopRect::MakeSize(frame->size()).ContainsRect(rect)) {
|
||||
DesktopRect intersection = DesktopRect::MakeSize(frame->size());
|
||||
intersection.IntersectWith(rect);
|
||||
if (intersection.is_empty()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -45,7 +47,7 @@ std::unique_ptr<DesktopFrame> CreateCroppedDesktopFrame(
|
|||
}
|
||||
|
||||
return std::unique_ptr<DesktopFrame>(
|
||||
new CroppedDesktopFrame(std::move(frame), rect));
|
||||
new CroppedDesktopFrame(std::move(frame), intersection));
|
||||
}
|
||||
|
||||
CroppedDesktopFrame::CroppedDesktopFrame(std::unique_ptr<DesktopFrame> frame,
|
||||
|
|
|
@ -32,9 +32,14 @@ TEST(CroppedDesktopFrameTest, DoNotCreateWrapperIfSizeIsNotChanged) {
|
|||
ASSERT_EQ(cropped.get(), raw_original);
|
||||
}
|
||||
|
||||
TEST(CroppedDesktopFrameTest, ReturnNullptrIfSizeIsNotSufficient) {
|
||||
ASSERT_EQ(nullptr, CreateCroppedDesktopFrame(CreateTestFrame(),
|
||||
DesktopRect::MakeWH(11, 10)));
|
||||
TEST(CroppedDesktopFrameTest, CropWhenPartiallyOutOfBounds) {
|
||||
std::unique_ptr<DesktopFrame> cropped =
|
||||
CreateCroppedDesktopFrame(CreateTestFrame(), DesktopRect::MakeWH(11, 10));
|
||||
ASSERT_NE(nullptr, cropped);
|
||||
ASSERT_EQ(cropped->size().width(), 10);
|
||||
ASSERT_EQ(cropped->size().height(), 10);
|
||||
ASSERT_EQ(cropped->top_left().x(), 0);
|
||||
ASSERT_EQ(cropped->top_left().y(), 0);
|
||||
}
|
||||
|
||||
TEST(CroppedDesktopFrameTest, ReturnNullIfCropRegionIsOutOfBounds) {
|
||||
|
|
|
@ -99,9 +99,16 @@ void CroppingWindowCapturer::OnCaptureResult(
|
|||
return;
|
||||
}
|
||||
|
||||
callback_->OnCaptureResult(
|
||||
Result::SUCCESS,
|
||||
CreateCroppedDesktopFrame(std::move(screen_frame), window_rect));
|
||||
std::unique_ptr<DesktopFrame> cropped_frame =
|
||||
CreateCroppedDesktopFrame(std::move(screen_frame), window_rect);
|
||||
|
||||
if (!cropped_frame) {
|
||||
RTC_LOG(LS_WARNING) << "Window is outside of the captured display";
|
||||
callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
callback_->OnCaptureResult(Result::SUCCESS, std::move(cropped_frame));
|
||||
}
|
||||
|
||||
bool CroppingWindowCapturer::IsOccluded(const DesktopVector& pos) {
|
||||
|
|
Loading…
Reference in a new issue