| Index: content/renderer/media/media_stream_constraints_util.h
|
| diff --git a/content/renderer/media/media_stream_constraints_util.h b/content/renderer/media/media_stream_constraints_util.h
|
| index a3f75a6e65bf3a19fd1fdeb5b6d9b99d141f7ae0..424e84baafa47e4fa1425a5ae97f1679a2b75d67 100644
|
| --- a/content/renderer/media/media_stream_constraints_util.h
|
| +++ b/content/renderer/media/media_stream_constraints_util.h
|
| @@ -7,12 +7,132 @@
|
|
|
| #include <string>
|
|
|
| +#include "base/logging.h"
|
| #include "content/common/content_export.h"
|
| +#include "content/common/media/media_devices.mojom.h"
|
| +#include "content/renderer/media/video_track_adapter.h"
|
| +#include "media/capture/video_capture_types.h"
|
| #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
|
| #include "third_party/webrtc/base/optional.h"
|
|
|
| namespace content {
|
|
|
| +class ResolutionSet;
|
| +template <typename T>
|
| +class NumericRangeSet;
|
| +
|
| +// This class represents the output the SelectSettings algorithm for video
|
| +// constraints (see https://w3c.github.io/mediacapture-main/#dfn-selectsettings)
|
| +// The input to SelectSettings is a user-supplied constraints object, and its
|
| +// output is a set of implementation-specific settings that are used to
|
| +// configure other Chromium objects such as sources, tracks and sinks so that
|
| +// they work in the way indicated by the specification. VideoCaptureSettings may
|
| +// also be used to implement other constraints-related functionality, such as
|
| +// the getSettings() function.
|
| +// The following fields are used to control MediaStreamVideoSource objects:
|
| +// * device_id: used for device selection and obtained from the deviceId
|
| +// * capture_params: used to initialize video capture. Its values are obtained
|
| +// from the width, height, aspectRatio, frame_rate, googPowerLineFrequency,
|
| +// and googNoiseReduction constraints.
|
| +// The following fields are used to control MediaStreamVideoTrack objects:
|
| +// * track_adapter_settings: All track objects use a VideoTrackAdapter object
|
| +// that may perform cropping and frame-rate adjustment. This field contains
|
| +// the adapter settings suitable for the track the constraints are being
|
| +// to. These settings are derived from the width, height, aspectRatio and
|
| +// frameRate constraints.
|
| +// Some MediaStreamVideoSink objects (e.g. MediaStreamVideoWebRtcSink) require
|
| +// configuration derived from constraints that cannot be obtained from the
|
| +// source and track settings indicated above. The following fields are used
|
| +// to configure sinks:
|
| +// * noise_reduction: used to control noise reduction for a screen-capture
|
| +// track sent to a peer connection. Derive from the googNoiseReduction
|
| +// constraint.
|
| +// * min_frame_rate: used to control frame refreshes in screen-capture tracks
|
| +// sent to a peer connection. Derived from the frameRate constraint.
|
| +class CONTENT_EXPORT VideoCaptureSettings {
|
| + public:
|
| + // Creates an object without value and with an empty failed constraint name.
|
| + VideoCaptureSettings();
|
| +
|
| + // Creates an object without value and with the given
|
| + // |failed_constraint_name|. Does not take ownership of
|
| + // |failed_constraint_name|, so it must be null or point to a string that
|
| + // remains accessible.
|
| + explicit VideoCaptureSettings(const char* failed_constraint_name);
|
| +
|
| + // Creates an object with the given values.
|
| + VideoCaptureSettings(std::string device_id,
|
| + media::VideoCaptureParams capture_params_,
|
| + base::Optional<bool> noise_reduction_,
|
| + const VideoTrackAdapterSettings& track_adapter_settings,
|
| + double min_frame_rate);
|
| +
|
| + VideoCaptureSettings(const VideoCaptureSettings& other);
|
| + VideoCaptureSettings& operator=(const VideoCaptureSettings& other);
|
| + VideoCaptureSettings(VideoCaptureSettings&& other);
|
| + VideoCaptureSettings& operator=(VideoCaptureSettings&& other);
|
| + ~VideoCaptureSettings();
|
| +
|
| + bool HasValue() const { return failed_constraint_name_ == nullptr; }
|
| +
|
| + // Convenience accessors for fields embedded in |capture_params_|.
|
| + const media::VideoCaptureFormat& Format() const {
|
| + return capture_params_.requested_format;
|
| + }
|
| + int Width() const {
|
| + DCHECK(HasValue());
|
| + return capture_params_.requested_format.frame_size.width();
|
| + }
|
| + int Height() const {
|
| + DCHECK(HasValue());
|
| + return capture_params_.requested_format.frame_size.height();
|
| + }
|
| + float FrameRate() const {
|
| + DCHECK(HasValue());
|
| + return capture_params_.requested_format.frame_rate;
|
| + }
|
| + media::ResolutionChangePolicy ResolutionChangePolicy() const {
|
| + DCHECK(HasValue());
|
| + return capture_params_.resolution_change_policy;
|
| + }
|
| + media::PowerLineFrequency PowerLineFrequency() const {
|
| + DCHECK(HasValue());
|
| + return capture_params_.power_line_frequency;
|
| + }
|
| +
|
| + // Other accessors.
|
| + const char* failed_constraint_name() const { return failed_constraint_name_; }
|
| +
|
| + const std::string& device_id() const {
|
| + DCHECK(HasValue());
|
| + return device_id_;
|
| + }
|
| + const media::VideoCaptureParams& capture_params() const {
|
| + DCHECK(HasValue());
|
| + return capture_params_;
|
| + }
|
| + const base::Optional<bool>& noise_reduction() const {
|
| + DCHECK(HasValue());
|
| + return noise_reduction_;
|
| + }
|
| + const VideoTrackAdapterSettings& track_adapter_settings() const {
|
| + DCHECK(HasValue());
|
| + return track_adapter_settings_;
|
| + }
|
| + double min_frame_rate() const {
|
| + DCHECK(HasValue());
|
| + return min_frame_rate_;
|
| + }
|
| +
|
| + private:
|
| + const char* failed_constraint_name_;
|
| + std::string device_id_;
|
| + media::VideoCaptureParams capture_params_;
|
| + base::Optional<bool> noise_reduction_;
|
| + VideoTrackAdapterSettings track_adapter_settings_;
|
| + double min_frame_rate_;
|
| +};
|
| +
|
| // Method to get boolean value of constraint with |name| from constraints.
|
| // Returns true if the constraint is specified in either mandatory or optional
|
| // constraints.
|
| @@ -93,6 +213,34 @@ auto ConstraintMin(const ConstraintType& constraint)
|
| return constraint.hasExact() ? constraint.exact() : constraint.min();
|
| }
|
|
|
| +// This function selects track settings from a set of candidate resolutions and
|
| +// frame rates, given the source video-capture format and ideal values.
|
| +// The output are settings for a VideoTrackAdapter, which can adjust the
|
| +// resolution and frame rate of the source, and consist of maximum (or
|
| +// target) width, height and frame rate, and minimum and maximum aspect ratio.
|
| +// * Minimum and maximum aspect ratios are taken from |resolution_set| and are
|
| +// not affected by ideal values.
|
| +// * The selected frame rate is always the value within the |frame_rate_set|
|
| +// range that is closest to the ideal frame rate (or the source frame rate
|
| +// if no ideal is supplied). If the chosen frame rate is greater than or equal
|
| +// to the source's frame rate, a value of 0.0 is returned, which means that
|
| +// there will be no frame-rate adjustment.
|
| +// * Width and height are selected using the
|
| +// ResolutionSet::SelectClosestPointToIdeal function, using ideal values from
|
| +// |basic_constraint_set| and using the source's width and height as the
|
| +// default resolution. The width and height returned by
|
| +// SelectClosestPointToIdeal are rounded to the nearest int. For more details,
|
| +// see the documentation for ResolutionSet::SelectClosestPointToIdeal.
|
| +// Note that this function ignores the min/max/exact values from
|
| +// |basic_constraint_set|. Only its ideal values are used.
|
| +// This function has undefined behavior if any of |resolution_set| or
|
| +// |frame_rate_set| are empty.
|
| +VideoTrackAdapterSettings CONTENT_EXPORT SelectVideoTrackAdapterSettings(
|
| + const blink::WebMediaTrackConstraintSet& basic_constraint_set,
|
| + const ResolutionSet& resolution_set,
|
| + const NumericRangeSet<double>& frame_rate_set,
|
| + const media::VideoCaptureFormat& source_format);
|
| +
|
| } // namespace content
|
|
|
| #endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_CONSTRAINTS_UTIL_H_
|
|
|