| Index: webrtc/media/base/videocapturer.h
|
| diff --git a/webrtc/media/base/videocapturer.h b/webrtc/media/base/videocapturer.h
|
| index bb25d2a678fc05cb5b07fa9a449bdd166aabb6db..eb868d9877c0fc664b3f7fc0a042c154f74f90b6 100644
|
| --- a/webrtc/media/base/videocapturer.h
|
| +++ b/webrtc/media/base/videocapturer.h
|
| @@ -28,6 +28,7 @@
|
| #include "webrtc/media/base/videoadapter.h"
|
| #include "webrtc/media/base/videobroadcaster.h"
|
| #include "webrtc/media/base/videocommon.h"
|
| +#include "webrtc/media/base/videoframefactory.h"
|
|
|
|
|
| namespace cricket {
|
| @@ -43,6 +44,38 @@
|
| };
|
|
|
| class VideoFrame;
|
| +
|
| +struct CapturedFrame {
|
| + static const uint32_t kFrameHeaderSize = 40; // Size from width to data_size.
|
| + static const uint32_t kUnknownDataSize = 0xFFFFFFFF;
|
| +
|
| + CapturedFrame();
|
| +
|
| + // Get the number of bytes of the frame data. If data_size is known, return
|
| + // it directly. Otherwise, calculate the size based on width, height, and
|
| + // fourcc. Return true if succeeded.
|
| + bool GetDataSize(uint32_t* size) const;
|
| +
|
| + // The width and height of the captured frame could be different from those
|
| + // of VideoFormat. Once the first frame is captured, the width, height,
|
| + // fourcc, pixel_width, and pixel_height should keep the same over frames.
|
| + int width; // in number of pixels
|
| + int height; // in number of pixels
|
| + uint32_t fourcc; // compression
|
| + uint32_t pixel_width; // width of a pixel, default is 1
|
| + uint32_t pixel_height; // height of a pixel, default is 1
|
| + int64_t time_stamp; // timestamp of when the frame was captured, in unix
|
| + // time with nanosecond units.
|
| + uint32_t data_size; // number of bytes of the frame data
|
| +
|
| + webrtc::VideoRotation rotation; // rotation in degrees of the frame.
|
| +
|
| + void* data; // pointer to the frame data. This object allocates the
|
| + // memory or points to an existing memory.
|
| +
|
| + private:
|
| + RTC_DISALLOW_COPY_AND_ASSIGN(CapturedFrame);
|
| +};
|
|
|
| // VideoCapturer is an abstract class that defines the interfaces for video
|
| // capturing. The subclasses implement the video capturer for various types of
|
| @@ -171,6 +204,13 @@
|
| // Signal all capture state changes that are not a direct result of calling
|
| // Start().
|
| sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange;
|
| + // Frame callbacks are multithreaded to allow disconnect and connect to be
|
| + // called concurrently. It also ensures that it is safe to call disconnect
|
| + // at any time which is needed since the signal may be called from an
|
| + // unmarshalled thread owned by the VideoCapturer.
|
| + // Signal the captured frame to downstream.
|
| + sigslot::signal2<VideoCapturer*, const CapturedFrame*,
|
| + sigslot::multi_threaded_local> SignalFrameCaptured;
|
|
|
| // If true, run video adaptation. By default, video adaptation is enabled
|
| // and users must call video_adapter()->OnOutputFormatRequest()
|
| @@ -179,6 +219,9 @@
|
| void set_enable_video_adapter(bool enable_video_adapter) {
|
| enable_video_adapter_ = enable_video_adapter;
|
| }
|
| +
|
| + // Takes ownership.
|
| + void set_frame_factory(VideoFrameFactory* frame_factory);
|
|
|
| bool GetInputSize(int* width, int* height);
|
|
|
| @@ -220,6 +263,10 @@
|
| int* crop_y,
|
| int64_t* translated_camera_time_us);
|
|
|
| + // Callback attached to SignalFrameCaptured where SignalVideoFrames is called.
|
| + void OnFrameCaptured(VideoCapturer* video_capturer,
|
| + const CapturedFrame* captured_frame);
|
| +
|
| // Called when a frame has been captured and converted to a
|
| // VideoFrame. OnFrame can be called directly by an implementation
|
| // that does not use SignalFrameCaptured or OnFrameCaptured. The
|
| @@ -244,6 +291,7 @@
|
| }
|
|
|
| void SetSupportedFormats(const std::vector<VideoFormat>& formats);
|
| + VideoFrameFactory* frame_factory() { return frame_factory_.get(); }
|
|
|
| private:
|
| void Construct();
|
| @@ -253,6 +301,9 @@
|
| int64_t GetFormatDistance(const VideoFormat& desired,
|
| const VideoFormat& supported);
|
|
|
| + // Convert captured frame to readable string for LOG messages.
|
| + std::string ToString(const CapturedFrame* frame) const;
|
| +
|
| // Updates filtered_supported_formats_ so that it contains the formats in
|
| // supported_formats_ that fulfill all applied restrictions.
|
| void UpdateFilteredSupportedFormats();
|
| @@ -264,6 +315,7 @@
|
| rtc::ThreadChecker thread_checker_;
|
| std::string id_;
|
| CaptureState capture_state_;
|
| + std::unique_ptr<VideoFrameFactory> frame_factory_;
|
| std::unique_ptr<VideoFormat> capture_format_;
|
| std::vector<VideoFormat> supported_formats_;
|
| std::unique_ptr<VideoFormat> max_format_;
|
| @@ -283,8 +335,7 @@
|
| int input_width_ GUARDED_BY(frame_stats_crit_);
|
| int input_height_ GUARDED_BY(frame_stats_crit_);
|
|
|
| - // Whether capturer should apply rotation to the frame before
|
| - // passing it on to the registered sinks.
|
| + // Whether capturer should apply rotation to the frame before signaling it.
|
| bool apply_rotation_;
|
|
|
| // State for the timestamp translation.
|
|
|