#ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_VIDEO_CAPTURER_SOURCE_H_
#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_VIDEO_CAPTURER_SOURCE_H_
#include "base/callback.h"
#include "base/message_loop/message_loop_proxy.h"
#include "content/common/media/video_capture.h"
#include "content/renderer/media/media_stream_video_source.h"
#include "media/video/capture/video_capture.h"
namespace content {
class VideoCaptureHandle;
class CONTENT_EXPORT VideoCapturerDelegate
: public media::VideoCapture::EventHandler,
public base::RefCountedThreadSafe<VideoCapturerDelegate> {
public:
typedef base::Callback<void(const scoped_refptr<media::VideoFrame>&)>
NewFrameCallback;
typedef base::Callback<void(bool running)> StartedCallback;
typedef base::Callback<void(const media::VideoCaptureFormats& formats)>
SupportedFormatsCallback;
explicit VideoCapturerDelegate(
const StreamDeviceInfo& device_info);
virtual void GetCurrentSupportedFormats(
int max_requested_width,
int max_requested_height,
const SupportedFormatsCallback& callback);
virtual void StartDeliver(
const media::VideoCaptureParams& params,
const NewFrameCallback& new_frame_callback,
const StartedCallback& started_callback);
virtual void StopDeliver();
protected:
virtual void OnStarted(media::VideoCapture* capture) OVERRIDE;
virtual void OnStopped(media::VideoCapture* capture) OVERRIDE;
virtual void OnPaused(media::VideoCapture* capture) OVERRIDE;
virtual void OnError(media::VideoCapture* capture, int error_code) OVERRIDE;
virtual void OnRemoved(media::VideoCapture* capture) OVERRIDE;
virtual void OnFrameReady(
media::VideoCapture* capture,
const scoped_refptr<media::VideoFrame>& frame) OVERRIDE;
private:
friend class base::RefCountedThreadSafe<VideoCapturerDelegate>;
friend class MockVideoCapturerDelegate;
virtual ~VideoCapturerDelegate();
void OnFrameReadyOnRenderThread(
media::VideoCapture* capture,
const scoped_refptr<media::VideoFrame>& frame);
void OnErrorOnRenderThread(media::VideoCapture* capture);
void OnDeviceFormatsInUseReceived(const media::VideoCaptureFormats& formats);
void OnDeviceSupportedFormatsEnumerated(
const media::VideoCaptureFormats& formats);
media::VideoCaptureSessionId session_id_;
scoped_ptr<VideoCaptureHandle> capture_engine_;
bool is_screen_cast_;
bool got_first_frame_;
NewFrameCallback new_frame_callback_;
StartedCallback started_callback_;
scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
SupportedFormatsCallback source_formats_callback_;
DISALLOW_COPY_AND_ASSIGN(VideoCapturerDelegate);
};
class CONTENT_EXPORT MediaStreamVideoCapturerSource
: public MediaStreamVideoSource {
public:
MediaStreamVideoCapturerSource(
const StreamDeviceInfo& device_info,
const SourceStoppedCallback& stop_callback,
const scoped_refptr<VideoCapturerDelegate>& delegate,
MediaStreamDependencyFactory* factory);
virtual ~MediaStreamVideoCapturerSource();
protected:
virtual void GetCurrentSupportedFormats(
int max_requested_width,
int max_requested_height) OVERRIDE;
virtual void StartSourceImpl(
const media::VideoCaptureParams& params) OVERRIDE;
virtual void StopSourceImpl() OVERRIDE;
private:
scoped_refptr<VideoCapturerDelegate> delegate_;
DISALLOW_COPY_AND_ASSIGN(MediaStreamVideoCapturerSource);
};
}
#endif