| 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_;
|
|
|