// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // VideoCaptureImpl represents a capture device in renderer process. It provides // interfaces for clients to Start/Stop capture. It also communicates to clients // when buffer is ready, state of capture device is changed. #ifndef CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_ #define CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_ #include #include #include "content/renderer/video_capture_message_filter.h" #include "media/base/callback.h" #include "media/video/capture/video_capture.h" #include "ui/gfx/surface/transport_dib.h" namespace base { class MessageLoopProxy; } class VideoCaptureImpl : public media::VideoCapture, public VideoCaptureMessageFilter::Delegate { public: // media::VideoCapture interface. virtual void StartCapture(media::VideoCapture::EventHandler* handler, const VideoCaptureCapability& capability); virtual void StopCapture(media::VideoCapture::EventHandler* handler); virtual bool CaptureStarted(); virtual int CaptureWidth(); virtual int CaptureHeight(); virtual int CaptureFrameRate(); // VideoCaptureMessageFilter::Delegate interface. virtual void OnBufferReceived(TransportDIB::Handle handle, base::Time timestamp); virtual void OnStateChanged(const media::VideoCapture::State& state); virtual void OnDeviceInfoReceived( const media::VideoCaptureParams& device_info); virtual void OnDelegateAdded(int32 device_id); bool pending_start() { return (new_width_ > 0 && new_height_ > 0); } private: friend class VideoCaptureImplManager; friend class VideoCaptureImplTest; enum State { kStarted, kStopping, kStopped }; struct DIBBuffer { public: DIBBuffer(TransportDIB* d, media::VideoCapture::VideoFrameBuffer* ptr); ~DIBBuffer(); TransportDIB* dib; scoped_refptr mapped_memory; }; VideoCaptureImpl(media::VideoCaptureSessionId id, scoped_refptr ml_proxy, VideoCaptureMessageFilter* filter); virtual ~VideoCaptureImpl(); void Init(); void DeInit(Task* task); void StopDevice(); void RestartCapture(); void StartCaptureInternal(); void AddDelegateOnIOThread(); void RemoveDelegateOnIOThread(Task* task); scoped_refptr message_filter_; media::VideoCaptureSessionId session_id_; scoped_refptr ml_proxy_; int device_id_; // Pool of DIBs. typedef std::list CachedDIB; CachedDIB cached_dibs_; typedef std::map ClientInfo; ClientInfo clients_; std::list master_clients_; ClientInfo pending_clients_; int width_; int height_; int frame_rate_; media::VideoFrame::Format video_type_; int new_width_; int new_height_; State state_; DISALLOW_COPY_AND_ASSIGN(VideoCaptureImpl); }; DISABLE_RUNNABLE_METHOD_REFCOUNT(VideoCaptureImpl); #endif // CONTENT_RENDERER_MEDIA_VIDEO_CAPTURE_IMPL_H_