| Index: webrtc/media/base/videocapturer.h | 
| diff --git a/webrtc/media/base/videocapturer.h b/webrtc/media/base/videocapturer.h | 
| index b904582d8885bc24ea46616a16f35c98950c7c2b..543af026c04f25423a79d8d309cd7f35a019acd2 100644 | 
| --- a/webrtc/media/base/videocapturer.h | 
| +++ b/webrtc/media/base/videocapturer.h | 
| @@ -20,11 +20,12 @@ | 
| #include "webrtc/base/basictypes.h" | 
| #include "webrtc/base/criticalsection.h" | 
| #include "webrtc/media/base/videosourceinterface.h" | 
| +#include "webrtc/base/messagehandler.h" | 
| #include "webrtc/base/rollingaccumulator.h" | 
| #include "webrtc/base/scoped_ptr.h" | 
| #include "webrtc/base/sigslot.h" | 
| +#include "webrtc/base/thread.h" | 
| #include "webrtc/base/timing.h" | 
| -#include "webrtc/base/thread_checker.h" | 
| #include "webrtc/media/base/mediachannel.h" | 
| #include "webrtc/media/base/videoadapter.h" | 
| #include "webrtc/media/base/videobroadcaster.h" | 
| @@ -36,6 +37,8 @@ | 
| namespace cricket { | 
|  | 
| // Current state of the capturer. | 
| +// TODO(hellner): CS_NO_DEVICE is an error code not a capture state. Separate | 
| +//                error codes and states. | 
| enum CaptureState { | 
| CS_STOPPED,    // The capturer has been stopped or hasn't started yet. | 
| CS_STARTING,   // The capturer is in the process of starting. Note, it may | 
| @@ -44,6 +47,7 @@ | 
| // capturing. | 
| CS_PAUSED,     // The capturer has been paused. | 
| CS_FAILED,     // The capturer failed to start. | 
| +  CS_NO_DEVICE,  // The capturer has no device and consequently failed to start. | 
| }; | 
|  | 
| class VideoFrame; | 
| @@ -87,13 +91,13 @@ | 
| // The captured frames may need to be adapted (for example, cropping). | 
| // Video adaptation is built into and enabled by default. After a frame has | 
| // been captured from the device, it is sent to the video adapter, then out to | 
| -// the sinks. | 
| +// the encoder. | 
| // | 
| // Programming model: | 
| //   Create an object of a subclass of VideoCapturer | 
| //   Initialize | 
| //   SignalStateChange.connect() | 
| -//   AddOrUpdateSink() | 
| +//   SignalFrameCaptured.connect() | 
| //   Find the capture format for Start() by either calling GetSupportedFormats() | 
| //   and selecting one of the supported or calling GetBestCaptureFormat(). | 
| //   video_adapter()->OnOutputFormatRequest(desired_encoding_format) | 
| @@ -107,10 +111,13 @@ | 
| //   thread safe. | 
| // | 
| class VideoCapturer : public sigslot::has_slots<>, | 
| +                      public rtc::MessageHandler, | 
| public rtc::VideoSourceInterface<cricket::VideoFrame> { | 
| public: | 
| +  // All signals are marshalled to |thread| or the creating thread if | 
| +  // none is provided. | 
| VideoCapturer(); | 
| - | 
| +  explicit VideoCapturer(rtc::Thread* thread); | 
| virtual ~VideoCapturer() {} | 
|  | 
| // Gets the id of the underlying device, which is available after the capturer | 
| @@ -156,6 +163,12 @@ | 
| //   CS_FAILED:    if the capturer failes to start.. | 
| //   CS_NO_DEVICE: if the capturer has no device and fails to start. | 
| virtual CaptureState Start(const VideoFormat& capture_format) = 0; | 
| +  // Sets the desired aspect ratio. If the capturer is capturing at another | 
| +  // aspect ratio it will crop the width or the height so that asked for | 
| +  // aspect ratio is acheived. Note that ratio_w and ratio_h do not need to be | 
| +  // relatively prime. | 
| +  void UpdateAspectRatio(int ratio_w, int ratio_h); | 
| +  void ClearAspectRatio(); | 
|  | 
| // Get the current capture format, which is set by the Start() call. | 
| // Note that the width and height of the captured frames may differ from the | 
| @@ -165,10 +178,23 @@ | 
| return capture_format_.get(); | 
| } | 
|  | 
| +  // Pause the video capturer. | 
| +  virtual bool Pause(bool paused); | 
| // Stop the video capturer. | 
| virtual void Stop() = 0; | 
| // Check if the video capturer is running. | 
| virtual bool IsRunning() = 0; | 
| +  // Restart the video capturer with the new |capture_format|. | 
| +  // Default implementation stops and starts the capturer. | 
| +  virtual bool Restart(const VideoFormat& capture_format); | 
| +  // TODO(thorcarpenter): This behavior of keeping the camera open just to emit | 
| +  // black frames is a total hack and should be fixed. | 
| +  // When muting, produce black frames then pause the camera. | 
| +  // When unmuting, start the camera. Camera starts unmuted. | 
| +  virtual bool MuteToBlackThenPause(bool muted); | 
| +  virtual bool IsMuted() const { | 
| +    return muted_; | 
| +  } | 
| CaptureState capture_state() const { | 
| return capture_state_; | 
| } | 
| @@ -191,6 +217,14 @@ | 
| } | 
| bool enable_camera_list() { | 
| return enable_camera_list_; | 
| +  } | 
| + | 
| +  // Enable scaling to ensure square pixels. | 
| +  void set_square_pixel_aspect_ratio(bool square_pixel_aspect_ratio) { | 
| +    square_pixel_aspect_ratio_ = square_pixel_aspect_ratio; | 
| +  } | 
| +  bool square_pixel_aspect_ratio() { | 
| +    return square_pixel_aspect_ratio_; | 
| } | 
|  | 
| // Signal all capture state changes that are not a direct result of calling | 
| @@ -254,6 +288,9 @@ | 
|  | 
| void SetCaptureState(CaptureState state); | 
|  | 
| +  // Marshals SignalStateChange onto thread_. | 
| +  void OnMessage(rtc::Message* message) override; | 
| + | 
| // subclasses override this virtual method to provide a vector of fourccs, in | 
| // order of preference, that are expected by the media engine. | 
| virtual bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) = 0; | 
| @@ -302,7 +339,7 @@ | 
| const rtc::RollingAccumulator<T>& data, | 
| VariableInfo<T>* stats); | 
|  | 
| -  rtc::ThreadChecker thread_checker_; | 
| +  rtc::Thread* thread_; | 
| std::string id_; | 
| CaptureState capture_state_; | 
| rtc::scoped_ptr<VideoFrameFactory> frame_factory_; | 
| @@ -317,6 +354,8 @@ | 
| bool square_pixel_aspect_ratio_;  // Enable scaling to square pixels. | 
| int scaled_width_;  // Current output size from ComputeScale. | 
| int scaled_height_; | 
| +  bool muted_; | 
| +  int black_frame_count_down_; | 
|  | 
| rtc::VideoBroadcaster broadcaster_; | 
| bool enable_video_adapter_; | 
|  |