Bug 1036653 - updates to basic framework for app sharing, r=jesup,gcp

This commit is contained in:
Matthew A. Miller 2014-08-20 16:05:23 -06:00
parent 81f56e0ef8
commit 3e81519438
6 changed files with 109 additions and 78 deletions

View File

@ -2062,7 +2062,8 @@ WindowsHashToArrayFunc (const uint64_t& aId,
nsRefPtr<GetUserMediaCallbackMediaStreamListener> listener =
aData->ElementAt(i);
if (listener->CapturingVideo() || listener->CapturingAudio() ||
listener->CapturingScreen() || listener->CapturingWindow()) {
listener->CapturingScreen() || listener->CapturingWindow() ||
listener->CapturingApplication()) {
capturing = true;
break;
}
@ -2147,7 +2148,8 @@ MediaManager::MediaCaptureWindowStateInternal(nsIDOMWindow* aWindow, bool* aVide
if (listener->CapturingScreen()) {
*aScreenShare = true;
}
if (listener->CapturingWindow()) {
if (listener->CapturingWindow() || listener->CapturingApplication()) {
// treat window and application as the same
*aWindowShare = true;
}
}

View File

@ -130,6 +130,12 @@ public:
return mVideoSource && !mStopped && !mVideoSource->IsAvailable() &&
mVideoSource->GetMediaSource() == MediaSourceType::Window;
}
bool CapturingApplication()
{
NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
return mVideoSource && !mStopped && !mVideoSource->IsAvailable() &&
mVideoSource->GetMediaSource() == MediaSourceType::Application;
}
void SetStopped()
{

View File

@ -103,7 +103,7 @@ void DesktopApplication::setProcessPathName(const char *appPathNameUTF8) {
}
void DesktopApplication::setUniqueIdName(const char *appUniqueIdUTF8) {
SetStringMember(&processPathNameUTF8_, appUniqueIdUTF8);
SetStringMember(&processUniqueIdUTF8_, appUniqueIdUTF8);
}
void DesktopApplication::setProcessAppName(const char *appNameUTF8) {
@ -119,7 +119,7 @@ const char *DesktopApplication::getProcessPathName() {
}
const char *DesktopApplication::getUniqueIdName() {
return applicationNameUTF8_;
return processUniqueIdUTF8_;
}
const char *DesktopApplication::getProcessAppName() {
@ -139,29 +139,7 @@ DesktopDeviceInfoImpl::DesktopDeviceInfoImpl() {
}
DesktopDeviceInfoImpl::~DesktopDeviceInfoImpl() {
std::map<intptr_t,DesktopDisplayDevice*>::iterator iterDevice;
for (iterDevice=desktop_display_list_.begin(); iterDevice!=desktop_display_list_.end(); iterDevice++){
DesktopDisplayDevice * pDesktopDisplayDevice = iterDevice->second;
delete pDesktopDisplayDevice;
iterDevice->second = NULL;
}
desktop_display_list_.clear();
std::map<intptr_t, DesktopDisplayDevice *>::iterator iterWindow;
for (iterWindow = desktop_window_list_.begin(); iterWindow != desktop_window_list_.end(); iterWindow++) {
DesktopDisplayDevice * pWindow = iterWindow->second;
delete pWindow;
iterWindow->second = NULL;
}
desktop_window_list_.clear();
std::map<intptr_t,DesktopApplication*>::iterator iterApp;
for (iterApp=desktop_application_list_.begin(); iterApp!=desktop_application_list_.end(); iterApp++){
DesktopApplication * pDesktopApplication = iterApp->second;
delete pDesktopApplication;
iterApp->second = NULL;
}
desktop_application_list_.clear();
CleanUp();
}
int32_t DesktopDeviceInfoImpl::getDisplayDeviceCount() {
@ -224,7 +202,36 @@ int32_t DesktopDeviceInfoImpl::getApplicationInfo(int32_t nIndex,
return 0;
}
int32_t DesktopDeviceInfoImpl::initializeWindowList() {
void DesktopDeviceInfoImpl::CleanUp() {
CleanUpScreenList();
CleanUpWindowList();
CleanUpApplicationList();
}
int32_t DesktopDeviceInfoImpl::Init() {
InitializeScreenList();
InitializeWindowList();
InitializeApplicationList();
return 0;
}
int32_t DesktopDeviceInfoImpl::Refresh() {
RefreshScreenList();
RefreshWindowList();
RefreshApplicationList();
return 0;
}
void DesktopDeviceInfoImpl::CleanUpWindowList() {
std::map<intptr_t, DesktopDisplayDevice *>::iterator iterWindow;
for (iterWindow = desktop_window_list_.begin(); iterWindow != desktop_window_list_.end(); iterWindow++) {
DesktopDisplayDevice *pWindow = iterWindow->second;
delete pWindow;
iterWindow->second = NULL;
}
desktop_window_list_.clear();
}
void DesktopDeviceInfoImpl::InitializeWindowList() {
scoped_ptr<WindowCapturer> pWinCap(WindowCapturer::Create());
WindowCapturer::WindowList list;
if (pWinCap && pWinCap->GetWindowList(&list)) {
@ -240,29 +247,45 @@ int32_t DesktopDeviceInfoImpl::initializeWindowList() {
char idStr[BUFSIZ];
#if XP_WIN
_snprintf_s(idStr, sizeof(idStr), sizeof(idStr) - 1, "\\win\\%ld", pWinDevice->getScreenId());
_snprintf_s(idStr, sizeof(idStr), sizeof(idStr) - 1, "%ld", pWinDevice->getScreenId());
#else
snprintf(idStr, sizeof(idStr), "\\win\\%ld", pWinDevice->getScreenId());
snprintf(idStr, sizeof(idStr), "%ld", pWinDevice->getScreenId());
#endif
pWinDevice->setUniqueIdName(idStr);
desktop_window_list_[pWinDevice->getScreenId()] = pWinDevice;
}
}
return 0;
}
void DesktopDeviceInfoImpl::RefreshWindowList() {
CleanUpWindowList();
InitializeWindowList();
}
int32_t DesktopDeviceInfoImpl::RefreshWindowList() {
std::map<intptr_t, DesktopDisplayDevice *>::iterator iterWindow;
for (iterWindow = desktop_window_list_.begin(); iterWindow != desktop_window_list_.end(); iterWindow++) {
DesktopDisplayDevice * pWindow = iterWindow->second;
delete pWindow;
iterWindow->second = NULL;
void DesktopDeviceInfoImpl::CleanUpApplicationList() {
std::map<intptr_t,DesktopApplication*>::iterator iterApp;
for (iterApp = desktop_application_list_.begin(); iterApp != desktop_application_list_.end(); iterApp++){
DesktopApplication *pDesktopApplication = iterApp->second;
delete pDesktopApplication;
iterApp->second = NULL;
}
desktop_window_list_.clear();
initializeWindowList();
return 0;
desktop_application_list_.clear();
}
void DesktopDeviceInfoImpl::RefreshApplicationList() {
CleanUpApplicationList();
InitializeApplicationList();
}
void DesktopDeviceInfoImpl::CleanUpScreenList() {
std::map<intptr_t,DesktopDisplayDevice*>::iterator iterDevice;
for (iterDevice=desktop_display_list_.begin(); iterDevice != desktop_display_list_.end(); iterDevice++){
DesktopDisplayDevice *pDesktopDisplayDevice = iterDevice->second;
delete pDesktopDisplayDevice;
iterDevice->second = NULL;
}
desktop_display_list_.clear();
}
void DesktopDeviceInfoImpl::RefreshScreenList() {
CleanUpScreenList();
InitializeScreenList();
}
}

View File

@ -1,6 +1,6 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DEVICE_INFO_H_
#define WEBRTC_MODULES_DESKTOP_CAPTURE_DEVICE_INFO_H_
@ -81,6 +81,8 @@ public:
DesktopDeviceInfoImpl();
~DesktopDeviceInfoImpl();
virtual int32_t Init();
virtual int32_t Refresh();
virtual int32_t getDisplayDeviceCount();
virtual int32_t getDesktopDisplayDeviceInfo(int32_t nIndex,
DesktopDisplayDevice & desktopDisplayDevice);
@ -92,14 +94,24 @@ public:
DesktopApplication & desktopApplication);
static DesktopDeviceInfo * Create();
protected:
DesktopDisplayDeviceList desktop_display_list_;
DesktopDisplayDeviceList desktop_window_list_;
DesktopApplicationList desktop_application_list_;
int32_t initializeWindowList();
int32_t RefreshWindowList();
void CleanUp();
void CleanUpWindowList();
void CleanUpApplicationList();
void CleanUpScreenList();
void InitializeWindowList();
virtual void InitializeApplicationList() = 0;
virtual void InitializeScreenList() = 0;
void RefreshWindowList();
void RefreshApplicationList();
void RefreshScreenList();
};
};

View File

@ -11,8 +11,9 @@ public:
DesktopDeviceInfoNull();
~DesktopDeviceInfoNull();
virtual int32_t Init();
virtual int32_t Refresh();
protected:
virtual void InitializeScreenList();
virtual void InitializeApplicationList();
};
DesktopDeviceInfo * DesktopDeviceInfoImpl::Create() {
@ -30,15 +31,12 @@ DesktopDeviceInfoNull::DesktopDeviceInfoNull() {
DesktopDeviceInfoNull::~DesktopDeviceInfoNull() {
}
int32_t
DesktopDeviceInfoNull::Init() {
initializeWindowList();
return 0;
void
DesktopDeviceInfoNull::InitializeScreenList() {
}
int32_t
DesktopDeviceInfoNull::Refresh() {
return 0;
void
DesktopDeviceInfoNull::InitializeApplicationList() {
}
} //namespace webrtc

View File

@ -361,24 +361,22 @@ int32_t DesktopCaptureImpl::ChangeUniqueId(const int32_t id) {
int32_t DesktopCaptureImpl::Init(const char* uniqueId,
const CaptureDeviceType type) {
DesktopCaptureOptions options = DesktopCaptureOptions::CreateDefault();
// Leave desktop effects enabled during WebRTC captures.
options.set_disable_effects(false);
if (type == Application) {
AppCapturer *pAppCapturer = AppCapturer::Create();
AppCapturer *pAppCapturer = AppCapturer::Create(options);
if (!pAppCapturer) {
return -1;
}
// processid hard-coded until implemented. See Bug 1036653
ProcessId processid = 0;
pAppCapturer->SelectApp(processid);
ProcessId pid = atoi(uniqueId);
pAppCapturer->SelectApp(pid);
MouseCursorMonitor * pMouseCursorMonitor = MouseCursorMonitor::CreateForScreen(webrtc::DesktopCaptureOptions::CreateDefault(), webrtc::kFullDesktopScreenId);
MouseCursorMonitor *pMouseCursorMonitor = MouseCursorMonitor::CreateForScreen(options, webrtc::kFullDesktopScreenId);
desktop_capturer_cursor_composer_.reset(new DesktopAndCursorComposer(pAppCapturer, pMouseCursorMonitor));
} else if (type == Screen) {
DesktopCaptureOptions options = DesktopCaptureOptions::CreateDefault();
// Leave desktop effects enabled during WebRTC captures.
options.set_disable_effects(false);
ScreenCapturer *pScreenCapturer = ScreenCapturer::Create(options);
if (!pScreenCapturer) {
return -1;
@ -388,7 +386,7 @@ int32_t DesktopCaptureImpl::Init(const char* uniqueId,
pScreenCapturer->SelectScreen(screenid);
pScreenCapturer->SetMouseShapeObserver(this);
MouseCursorMonitor * pMouseCursorMonitor = MouseCursorMonitor::CreateForScreen(options, screenid);
MouseCursorMonitor *pMouseCursorMonitor = MouseCursorMonitor::CreateForScreen(options, screenid);
desktop_capturer_cursor_composer_.reset(new DesktopAndCursorComposer(pScreenCapturer, pMouseCursorMonitor));
} else if (type == Window) {
WindowCapturer *pWindowCapturer = WindowCapturer::Create();
@ -396,19 +394,11 @@ int32_t DesktopCaptureImpl::Init(const char* uniqueId,
return -1;
}
std::string idStr(uniqueId);
const std::string prefix("\\win\\");
if (idStr.substr(0, prefix.size()) != prefix) {
delete pWindowCapturer;
// invalid id
return -1;
}
WindowId winId;
winId = atoi(idStr.substr(prefix.size()).c_str());
WindowId winId = atoi(uniqueId);
pWindowCapturer->SelectWindow(winId);
MouseCursorMonitor * pMouseCursorMonitor = MouseCursorMonitor::CreateForWindow(webrtc::DesktopCaptureOptions::CreateDefault(), winId);
desktop_capturer_cursor_composer_.reset(new DesktopAndCursorComposer(pWindowCapturer,pMouseCursorMonitor));
MouseCursorMonitor *pMouseCursorMonitor = MouseCursorMonitor::CreateForWindow(webrtc::DesktopCaptureOptions::CreateDefault(), winId);
desktop_capturer_cursor_composer_.reset(new DesktopAndCursorComposer(pWindowCapturer, pMouseCursorMonitor));
}
return 0;
}