diff options
author | mflodman@chromium.org <mflodman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-18 23:13:46 +0000 |
---|---|---|
committer | mflodman@chromium.org <mflodman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-11-18 23:13:46 +0000 |
commit | 8a2cfaf3212d569c2ef8d210c3be384167044f8d (patch) | |
tree | fc6f322066e14c378ec4f44bb18133de2a31fd20 /content/browser | |
parent | d9b4671306f5390bfbd1f6b298b76c7f1c2107ad (diff) | |
download | chromium_src-8a2cfaf3212d569c2ef8d210c3be384167044f8d.zip chromium_src-8a2cfaf3212d569c2ef8d210c3be384167044f8d.tar.gz chromium_src-8a2cfaf3212d569c2ef8d210c3be384167044f8d.tar.bz2 |
Close video capture devices on the device thread.
Review URL: http://codereview.chromium.org/8589018
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@110780 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser')
-rw-r--r-- | content/browser/renderer_host/media/video_capture_manager.cc | 31 | ||||
-rw-r--r-- | content/browser/renderer_host/media/video_capture_manager.h | 1 |
2 files changed, 24 insertions, 8 deletions
diff --git a/content/browser/renderer_host/media/video_capture_manager.cc b/content/browser/renderer_host/media/video_capture_manager.cc index ce686e6..e65eb9d 100644 --- a/content/browser/renderer_host/media/video_capture_manager.cc +++ b/content/browser/renderer_host/media/video_capture_manager.cc @@ -4,6 +4,8 @@ #include "content/browser/renderer_host/media/video_capture_manager.h" +#include <set> + #include "base/bind.h" #include "base/stl_util.h" #include "content/browser/renderer_host/media/video_capture_controller.h" @@ -45,19 +47,19 @@ VideoCaptureManager::VideoCaptureManager() } VideoCaptureManager::~VideoCaptureManager() { - vc_device_thread_.Stop(); // TODO(mflodman) Remove this temporary solution when shut-down issue is // resolved, i.e. all code below this comment. // Temporary solution: close all open devices and delete them, after the // thread is stopped. DLOG_IF(ERROR, !devices_.empty()) << "VideoCaptureManager: Open devices!"; - for (VideoCaptureDevices::iterator it = devices_.begin(); - it != devices_.end(); - ++it) { - it->second->DeAllocate(); - delete it->second; - } - STLDeleteValues(&controllers_); + listener_ = NULL; + // The devices must be stopped on the device thread to avoid threading issues + // in native device code. + vc_device_thread_.message_loop()->PostTask( + FROM_HERE, + base::Bind(&VideoCaptureManager::TerminateOnDeviceThread, + base::Unretained(this))); + vc_device_thread_.Stop(); } void VideoCaptureManager::Register(MediaStreamProviderListener* listener) { @@ -502,4 +504,17 @@ media::VideoCaptureDevice* VideoCaptureManager::GetDeviceInternal( return NULL; } +void VideoCaptureManager::TerminateOnDeviceThread() { + DCHECK(IsOnCaptureDeviceThread()); + + std::set<media::VideoCaptureDevice*> devices_to_delete; + for (VideoCaptureDevices::iterator it = devices_.begin(); + it != devices_.end(); ++it) { + it->second->DeAllocate(); + devices_to_delete.insert(it->second); + } + STLDeleteElements(&devices_to_delete); + STLDeleteValues(&controllers_); +} + } // namespace media_stream diff --git a/content/browser/renderer_host/media/video_capture_manager.h b/content/browser/renderer_host/media/video_capture_manager.h index dbce623..cd2fda1 100644 --- a/content/browser/renderer_host/media/video_capture_manager.h +++ b/content/browser/renderer_host/media/video_capture_manager.h @@ -123,6 +123,7 @@ class CONTENT_EXPORT VideoCaptureManager : public MediaStreamProvider { const StreamDeviceInfo& device_info); bool IsOnCaptureDeviceThread() const; media::VideoCaptureDevice* GetDeviceInternal(int capture_session_id); + void TerminateOnDeviceThread(); // Thread for all calls to VideoCaptureDevice. base::Thread vc_device_thread_; |