1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CONTENT_RENDERER_MEDIA_RTC_VIDEO_CAPTURE_DELEGATE_H_ 6 #define CONTENT_RENDERER_MEDIA_RTC_VIDEO_CAPTURE_DELEGATE_H_ 7 8 #include "base/callback.h" 9 #include "base/message_loop/message_loop_proxy.h" 10 #include "content/common/media/video_capture.h" 11 #include "content/renderer/media/video_capture_impl_manager.h" 12 #include "media/video/capture/video_capture.h" 13 14 namespace content { 15 16 // Implements a simple reference counted video capturer that guarantees that 17 // methods in RtcVideoCaptureDelegateEventHandler is only called from when 18 // StartCapture have been called until after StopCapture have been called. 19 // It uses VideoCaptureImplManager to start / stop and receive I420 frames 20 // from Chrome's video capture implementation. 21 class RtcVideoCaptureDelegate 22 : public base::RefCountedThreadSafe<RtcVideoCaptureDelegate>, 23 public media::VideoCapture::EventHandler { 24 public: 25 enum CaptureState { 26 CAPTURE_STOPPED, // The capturer has been stopped or hasn't started yet. 27 CAPTURE_RUNNING, // The capturer has been started successfully and is now 28 // capturing. 29 CAPTURE_FAILED, // The capturer failed to start. 30 }; 31 32 typedef base::Callback<void(const media::VideoCapture::VideoFrameBuffer& buf)> 33 FrameCapturedCallback; 34 typedef base::Callback<void(CaptureState state)> StateChangeCallback; 35 36 RtcVideoCaptureDelegate(const media::VideoCaptureSessionId id, 37 VideoCaptureImplManager* vc_manager); 38 39 void StartCapture(const media::VideoCaptureCapability& capability, 40 const FrameCapturedCallback& captured_callback, 41 const StateChangeCallback& state_callback); 42 void StopCapture(); 43 44 // media::VideoCapture::EventHandler implementation. 45 // These functions are called from a thread owned by |vc_manager_|. 46 virtual void OnStarted(media::VideoCapture* capture) OVERRIDE; 47 virtual void OnStopped(media::VideoCapture* capture) OVERRIDE; 48 virtual void OnPaused(media::VideoCapture* capture) OVERRIDE; 49 virtual void OnError(media::VideoCapture* capture, int error_code) OVERRIDE; 50 virtual void OnRemoved(media::VideoCapture* capture) OVERRIDE; 51 virtual void OnBufferReady( 52 media::VideoCapture* capture, 53 scoped_refptr<media::VideoCapture::VideoFrameBuffer> buf) OVERRIDE; 54 virtual void OnDeviceInfoReceived( 55 media::VideoCapture* capture, 56 const media::VideoCaptureParams& device_info) OVERRIDE; 57 virtual void OnDeviceInfoChanged( 58 media::VideoCapture* capture, 59 const media::VideoCaptureParams& device_info) OVERRIDE; 60 61 private: 62 friend class base::RefCountedThreadSafe<RtcVideoCaptureDelegate>; 63 64 virtual ~RtcVideoCaptureDelegate(); 65 66 void OnBufferReadyOnCaptureThread( 67 media::VideoCapture* capture, 68 scoped_refptr<media::VideoCapture::VideoFrameBuffer> buf); 69 void OnErrorOnCaptureThread(media::VideoCapture* capture); 70 void OnRemovedOnCaptureThread(media::VideoCapture* capture); 71 72 // The id identifies which video capture device is used for this video 73 // capture session. 74 media::VideoCaptureSessionId session_id_; 75 // The video capture manager handles open/close of video capture devices. 76 scoped_refptr<VideoCaptureImplManager> vc_manager_; 77 media::VideoCapture* capture_engine_; 78 79 // Accessed on the thread where StartCapture is called. 80 bool got_first_frame_; 81 bool error_occured_; 82 83 // |captured_callback_| is provided to this class in StartCapture and must be 84 // valid until StopCapture is called. 85 FrameCapturedCallback captured_callback_; 86 // |state_callback_| is provided to this class in StartCapture and must be 87 // valid until StopCapture is called. 88 StateChangeCallback state_callback_; 89 // Message loop of the caller of StartCapture. 90 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 91 }; 92 93 } // namespace content 94 95 #endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_CAPTURE_DELEGATE_H_ 96