Index: content/browser/renderer_host/media/video_capture_manager.cc |
diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc |
index bd9a15c0db7e07c0585a0243a11e0664450b3ace..f15869aa2d41ad80802cc7504f3f65fd3423dc32 100644 |
--- a/content/browser/renderer_host/media/video_capture_manager.cc |
+++ b/content/browser/renderer_host/media/video_capture_manager.cc |
@@ -301,7 +301,6 @@ VideoCaptureManager::VideoCaptureManager( |
std::unique_ptr<media::VideoCaptureDeviceFactory> factory, |
scoped_refptr<base::SingleThreadTaskRunner> device_task_runner) |
: device_task_runner_(std::move(device_task_runner)), |
- listener_(nullptr), |
new_capture_session_id_(1), |
video_capture_device_factory_(std::move(factory)) {} |
@@ -325,9 +324,9 @@ void VideoCaptureManager::RemoveAllVideoCaptureObservers() { |
void VideoCaptureManager::RegisterListener( |
MediaStreamProviderListener* listener) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(!listener_); |
+ DCHECK(listener); |
DCHECK(device_task_runner_); |
- listener_ = listener; |
+ listeners_.AddObserver(listener); |
#if defined(OS_ANDROID) |
application_state_has_running_activities_ = true; |
app_status_listener_.reset(new base::android::ApplicationStatusListener( |
@@ -336,10 +335,10 @@ void VideoCaptureManager::RegisterListener( |
#endif |
} |
-void VideoCaptureManager::UnregisterListener() { |
+void VideoCaptureManager::UnregisterListener( |
+ MediaStreamProviderListener* listener) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(listener_); |
- listener_ = nullptr; |
+ listeners_.RemoveObserver(listener); |
} |
void VideoCaptureManager::EnumerateDevices( |
@@ -366,9 +365,9 @@ void VideoCaptureManager::EnumerateDevices( |
devices_enumerated_callback)); |
} |
-int VideoCaptureManager::Open(const StreamDeviceInfo& device_info) { |
+int VideoCaptureManager::Open(const MediaStreamDevice& device) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(listener_); |
+ DCHECK(listeners_.might_have_observers()); |
// Generate a new id for the session being opened. |
const media::VideoCaptureSessionId capture_session_id = |
@@ -378,20 +377,20 @@ int VideoCaptureManager::Open(const StreamDeviceInfo& device_info) { |
DVLOG(1) << "VideoCaptureManager::Open, id " << capture_session_id; |
// We just save the stream info for processing later. |
- sessions_[capture_session_id] = device_info.device; |
+ sessions_[capture_session_id] = device; |
// Notify our listener asynchronously; this ensures that we return |
// |capture_session_id| to the caller of this function before using that same |
// id in a listener event. |
base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&VideoCaptureManager::OnOpened, this, |
- device_info.device.type, capture_session_id)); |
+ FROM_HERE, base::Bind(&VideoCaptureManager::OnOpened, this, device.type, |
+ capture_session_id)); |
return capture_session_id; |
} |
void VideoCaptureManager::Close(int capture_session_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(listener_); |
+ DCHECK(listeners_.might_have_observers()); |
mcasas
2017/03/03 00:21:13
Not your fault, but this function name is inaccura
chfremer
2017/03/03 18:21:13
An issue related to this already exists, see https
|
DVLOG(1) << "VideoCaptureManager::Close, id " << capture_session_id; |
SessionMap::iterator session_it = sessions_.find(capture_session_id); |
@@ -767,7 +766,8 @@ void VideoCaptureManager::StopCaptureForClient( |
LogVideoCaptureEvent(VIDEO_CAPTURE_STOP_CAPTURE_DUE_TO_ERROR); |
for (auto it : sessions_) { |
if (it.second.type == entry->stream_type && it.second.id == entry->id) { |
- listener_->Aborted(it.second.type, it.first); |
+ for (auto& listener : listeners_) |
+ listener.Aborted(it.second.type, it.first); |
// Aborted() call might synchronously destroy |entry|, recheck. |
entry = GetDeviceEntryByController(controller); |
if (!entry) |
@@ -1041,22 +1041,16 @@ void VideoCaptureManager::OnOpened( |
MediaStreamType stream_type, |
media::VideoCaptureSessionId capture_session_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (!listener_) { |
- // Listener has been removed. |
- return; |
- } |
- listener_->Opened(stream_type, capture_session_id); |
+ for (auto& listener : listeners_) |
+ listener.Opened(stream_type, capture_session_id); |
} |
void VideoCaptureManager::OnClosed( |
MediaStreamType stream_type, |
media::VideoCaptureSessionId capture_session_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- if (!listener_) { |
- // Listener has been removed. |
- return; |
- } |
- listener_->Closed(stream_type, capture_session_id); |
+ for (auto& listener : listeners_) |
+ listener.Closed(stream_type, capture_session_id); |
} |
void VideoCaptureManager::OnDevicesInfoEnumerated( |