forked from JumpingYang001/webrtc
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement handling for MS PowerPoint Presentation Mode.
* Introduce a FullScreenWindowDetector to manage routines for updating the list of sources being application agnostic, inspired by FullScreenChromeWindowDetector. * Introduce a FullScreenApplicationHandler to make a decision about changing window to share in application specific way, inspired by FullScreenChromeWindowDetector. * Remove FullScreenChromeWindowDetector as redundant. * Add FullScreenApplicationHandler for MS PowerPoint and Apple Keynote on MacOS. * Add FullScreenApplicationHandler for MS PowerPoint on Windows. Bug: webrtc:3852 Change-Id: I06507d929308e85b882b2f8210a025afef7f26a9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156020 Commit-Queue: Mirko Bonadei <[email protected]> Reviewed-by: Jamie Walch <[email protected]> Reviewed-by: Justin Uberti <[email protected]> Reviewed-by: Wez <[email protected]> Cr-Commit-Position: refs/heads/master@{#29993}
- Loading branch information
Roman Gaiu
authored and
Commit Bot
committed
Dec 3, 2019
1 parent
831ce5f
commit b588353
Showing
21 changed files
with
797 additions
and
259 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 30 additions & 0 deletions
30
modules/desktop_capture/full_screen_application_handler.cc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* | ||
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. | ||
* | ||
* Use of this source code is governed by a BSD-style license | ||
* that can be found in the LICENSE file in the root of the source | ||
* tree. An additional intellectual property rights grant can be found | ||
* in the file PATENTS. All contributing project authors may | ||
* be found in the AUTHORS file in the root of the source tree. | ||
*/ | ||
|
||
#include "modules/desktop_capture/full_screen_application_handler.h" | ||
#include "rtc_base/logging.h" | ||
|
||
namespace webrtc { | ||
|
||
FullScreenApplicationHandler::FullScreenApplicationHandler( | ||
DesktopCapturer::SourceId sourceId) | ||
: source_id_(sourceId) {} | ||
|
||
DesktopCapturer::SourceId FullScreenApplicationHandler::FindFullScreenWindow( | ||
const DesktopCapturer::SourceList&, | ||
int64_t) const { | ||
return 0; | ||
} | ||
|
||
DesktopCapturer::SourceId FullScreenApplicationHandler::GetSourceId() const { | ||
return source_id_; | ||
} | ||
|
||
} // namespace webrtc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/* | ||
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. | ||
* | ||
* Use of this source code is governed by a BSD-style license | ||
* that can be found in the LICENSE file in the root of the source | ||
* tree. An additional intellectual property rights grant can be found | ||
* in the file PATENTS. All contributing project authors may | ||
* be found in the AUTHORS file in the root of the source tree. | ||
*/ | ||
|
||
#ifndef MODULES_DESKTOP_CAPTURE_FULL_SCREEN_APPLICATION_HANDLER_H_ | ||
#define MODULES_DESKTOP_CAPTURE_FULL_SCREEN_APPLICATION_HANDLER_H_ | ||
|
||
#include <memory> | ||
#include "modules/desktop_capture/desktop_capturer.h" | ||
#include "rtc_base/constructor_magic.h" | ||
|
||
namespace webrtc { | ||
|
||
// Base class for application specific handler to check criteria for switch to | ||
// full-screen mode and find if possible the full-screen window to share. | ||
// Supposed to be created and owned by platform specific | ||
// FullScreenWindowDetector. | ||
class FullScreenApplicationHandler { | ||
public: | ||
virtual ~FullScreenApplicationHandler() {} | ||
|
||
explicit FullScreenApplicationHandler(DesktopCapturer::SourceId sourceId); | ||
|
||
// Returns the full-screen window in place of the original window if all the | ||
// criteria are met, or 0 if no such window found. | ||
virtual DesktopCapturer::SourceId FindFullScreenWindow( | ||
const DesktopCapturer::SourceList& window_list, | ||
int64_t timestamp) const; | ||
|
||
// Returns source id of original window associated with | ||
// FullScreenApplicationHandler | ||
DesktopCapturer::SourceId GetSourceId() const; | ||
|
||
private: | ||
const DesktopCapturer::SourceId source_id_; | ||
|
||
RTC_DISALLOW_COPY_AND_ASSIGN(FullScreenApplicationHandler); | ||
}; | ||
|
||
} // namespace webrtc | ||
|
||
#endif // MODULES_DESKTOP_CAPTURE_FULL_SCREEN_APPLICATION_HANDLER_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* | ||
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. | ||
* | ||
* Use of this source code is governed by a BSD-style license | ||
* that can be found in the LICENSE file in the root of the source | ||
* tree. An additional intellectual property rights grant can be found | ||
* in the file PATENTS. All contributing project authors may | ||
* be found in the AUTHORS file in the root of the source tree. | ||
*/ | ||
|
||
#include "modules/desktop_capture/full_screen_window_detector.h" | ||
#include "modules/desktop_capture/full_screen_application_handler.h" | ||
#include "rtc_base/time_utils.h" | ||
|
||
namespace webrtc { | ||
|
||
FullScreenWindowDetector::FullScreenWindowDetector( | ||
ApplicationHandlerFactory application_handler_factory) | ||
: application_handler_factory_(application_handler_factory), | ||
last_update_time_ms_(0), | ||
previous_source_id_(0), | ||
no_handler_source_id_(0) {} | ||
|
||
DesktopCapturer::SourceId FullScreenWindowDetector::FindFullScreenWindow( | ||
DesktopCapturer::SourceId original_source_id) { | ||
if (app_handler_ == nullptr || | ||
app_handler_->GetSourceId() != original_source_id) { | ||
return 0; | ||
} | ||
return app_handler_->FindFullScreenWindow(window_list_, last_update_time_ms_); | ||
} | ||
|
||
void FullScreenWindowDetector::UpdateWindowListIfNeeded( | ||
DesktopCapturer::SourceId original_source_id, | ||
rtc::FunctionView<bool(DesktopCapturer::SourceList*)> get_sources) { | ||
const bool skip_update = previous_source_id_ != original_source_id; | ||
previous_source_id_ = original_source_id; | ||
|
||
// Here is an attempt to avoid redundant creating application handler in case | ||
// when an instance of WindowCapturer is used to generate a thumbnail to show | ||
// in picker by calling SelectSource and CaptureFrame for every available | ||
// source. | ||
if (skip_update) { | ||
return; | ||
} | ||
|
||
CreateApplicationHandlerIfNeeded(original_source_id); | ||
if (app_handler_ == nullptr) { | ||
// There is no FullScreenApplicationHandler specific for | ||
// current application | ||
return; | ||
} | ||
|
||
constexpr int64_t kUpdateIntervalMs = 500; | ||
|
||
if ((rtc::TimeMillis() - last_update_time_ms_) <= kUpdateIntervalMs) { | ||
return; | ||
} | ||
|
||
DesktopCapturer::SourceList window_list; | ||
if (get_sources(&window_list)) { | ||
last_update_time_ms_ = rtc::TimeMillis(); | ||
window_list_.swap(window_list); | ||
} | ||
} | ||
|
||
void FullScreenWindowDetector::CreateApplicationHandlerIfNeeded( | ||
DesktopCapturer::SourceId source_id) { | ||
if (no_handler_source_id_ == source_id) { | ||
return; | ||
} | ||
|
||
if (app_handler_ == nullptr || app_handler_->GetSourceId() != source_id) { | ||
app_handler_ = application_handler_factory_ | ||
? application_handler_factory_(source_id) | ||
: nullptr; | ||
} | ||
|
||
if (app_handler_ == nullptr) { | ||
no_handler_source_id_ = source_id; | ||
} | ||
} | ||
|
||
} // namespace webrtc |
Oops, something went wrong.