- add sources.
[platform/framework/web/crosswalk.git] / src / content / renderer / media / rtc_video_capture_delegate.h
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 scoped_refptr<media::VideoFrame>&)>
33       FrameCapturedCallback;
34   typedef base::Callback<void(CaptureState)> StateChangeCallback;
35
36   RtcVideoCaptureDelegate(const media::VideoCaptureSessionId id,
37                           VideoCaptureImplManager* vc_manager);
38
39   void StartCapture(const media::VideoCaptureParams& params,
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 OnFrameReady(
52       media::VideoCapture* capture,
53       const scoped_refptr<media::VideoFrame>& frame) OVERRIDE;
54
55  private:
56   friend class base::RefCountedThreadSafe<RtcVideoCaptureDelegate>;
57
58   virtual ~RtcVideoCaptureDelegate();
59
60   void OnFrameReadyOnCaptureThread(
61       media::VideoCapture* capture,
62       const scoped_refptr<media::VideoFrame>& frame);
63   void OnErrorOnCaptureThread(media::VideoCapture* capture);
64   void OnRemovedOnCaptureThread(media::VideoCapture* capture);
65
66   // The id identifies which video capture device is used for this video
67   // capture session.
68   media::VideoCaptureSessionId session_id_;
69   // The video capture manager handles open/close of video capture devices.
70   scoped_refptr<VideoCaptureImplManager> vc_manager_;
71   media::VideoCapture* capture_engine_;
72
73   // Accessed on the thread where StartCapture is called.
74   bool got_first_frame_;
75   bool error_occured_;
76
77   // |captured_callback_| is provided to this class in StartCapture and must be
78   // valid until StopCapture is called.
79   FrameCapturedCallback captured_callback_;
80   // |state_callback_| is provided to this class in StartCapture and must be
81   // valid until StopCapture is called.
82   StateChangeCallback state_callback_;
83   // Message loop of the caller of StartCapture.
84   scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
85 };
86
87 }  // namespace content
88
89 #endif  // CONTENT_RENDERER_MEDIA_RTC_VIDEO_CAPTURE_DELEGATE_H_