video_capture_impl_manager.h revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// VideoCaptureImplManager owns VideoCaptureImpl objects. Clients who 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// want access to a video capture device call UseDevice() to get a handle 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// to VideoCaptureImpl. 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// THREADING 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// VideoCaptureImplManager lives only on the render thread. All methods 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// must be called on this thread. 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The handle returned by UseDevice() is thread-safe. It ensures 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction is handled on the render thread. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/linked_ptr.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h" 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/threading/thread_checker.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/video/capture/video_capture.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoCaptureImpl; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VideoCaptureImplManager; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VideoCaptureMessageFilter; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Thread-safe wrapper for a media::VideoCapture object. During 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction |destruction_cb| is called. This mechanism is used 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// by VideoCaptureImplManager to ensure de-initialization and 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// destruction of the media::VideoCapture object happens on the render 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// thread. 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT VideoCaptureHandle : media::VideoCapture { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~VideoCaptureHandle(); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // media::VideoCapture implementations. 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void StartCapture( 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EventHandler* handler, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const media::VideoCaptureParams& params) OVERRIDE; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void StopCapture(EventHandler* handler) OVERRIDE; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool CaptureStarted() OVERRIDE; 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual int CaptureFrameRate() OVERRIDE; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GetDeviceSupportedFormats( 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DeviceFormatsCallback& callback) OVERRIDE; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GetDeviceFormatsInUse( 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DeviceFormatsInUseCallback& callback) OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) friend class VideoCaptureImplManager; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureHandle(media::VideoCapture* impl, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure destruction_cb); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoCapture* impl_; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure destruction_cb_; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoCaptureHandle); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CONTENT_EXPORT VideoCaptureImplManager { 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureImplManager(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~VideoCaptureImplManager(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns a video capture device referenced by |id|. 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<VideoCaptureHandle> UseDevice(media::VideoCaptureSessionId id); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Make all existing VideoCaptureImpl instances stop/resume delivering 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // video frames to their clients, depends on flag |suspend|. 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SuspendDevices(bool suspend); 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VideoCaptureMessageFilter* video_capture_message_filter() const { 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return filter_.get(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Used in tests to inject a mock VideoCaptureImpl. 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual VideoCaptureImpl* CreateVideoCaptureImpl( 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::VideoCaptureSessionId id, 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureMessageFilter* filter) const; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UnrefDevice(media::VideoCaptureSessionId id); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The int is used to count clients of the corresponding VideoCaptureImpl. 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef std::map<media::VideoCaptureSessionId, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::pair<int, linked_ptr<VideoCaptureImpl> > > 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureDeviceMap; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VideoCaptureDeviceMap devices_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<VideoCaptureMessageFilter> filter_; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Bound to the render thread. 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ThreadChecker thread_checker_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Bound to the render thread. 10823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // NOTE: Weak pointers must be invalidated before all other member variables. 10923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::WeakPtrFactory<VideoCaptureImplManager> weak_factory_; 11023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VideoCaptureImplManager); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_MANAGER_H_ 117