Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1955)

Unified Diff: content/renderer/media/media_stream_constraints_util.h

Issue 2941553003: Reland "SelectSettings algorithm for audio constraints." (Closed)
Patch Set: fix test Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 1c666a34f6cbfc0c7dac5a16bfd536efe4327ae2..4c238a53c3199641081f7548a024ce2de178a0ab 100644
--- a/content/renderer/media/media_stream_constraints_util.h
+++ b/content/renderer/media/media_stream_constraints_util.h
@@ -10,6 +10,7 @@
#include "base/logging.h"
#include "content/common/content_export.h"
#include "content/common/media/media_devices.mojom.h"
+#include "content/renderer/media/media_stream_audio_processor_options.h"
#include "content/renderer/media/video_track_adapter.h"
#include "media/capture/video_capture_types.h"
#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
@@ -50,6 +51,9 @@ class NumericRangeSet;
// * min_frame_rate and max_frame_rate: used to control frame refreshes in
// screen-capture tracks sent to a peer connection. Derived from the
// frameRate constraint.
+// If SelectSettings fails, the HasValue() method returns false and
+// failed_constraint_name() returns the name of one of the (possibly multiple)
+// constraints that could not be satisfied.
class CONTENT_EXPORT VideoCaptureSettings {
public:
// Creates an object without value and with an empty failed constraint name.
@@ -57,8 +61,8 @@ class CONTENT_EXPORT 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.
+ // |failed_constraint_name|, so it must point to a string that remains
+ // accessible. |failed_constraint_name| must be non-null.
explicit VideoCaptureSettings(const char* failed_constraint_name);
// Creates an object with the given values.
@@ -140,6 +144,95 @@ class CONTENT_EXPORT VideoCaptureSettings {
base::Optional<double> max_frame_rate_;
};
+// This class represents the output the SelectSettings algorithm for audio
+// 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. AudioCaptureSettings 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
+// * device_parameters: these are the hardware parameters for the device
+// selected by SelectSettings. They can be used to verify that the
+// parameters with which the audio stream is actually created corresponds
+// to what SelectSettings selected. It can also be used to implement
+// getSettings() for device-related properties such as sampleRate and
+// channelCount.
+// The following fields are used to control various audio features:
+// * hotword_enabled
+// * disable_local_echo
+// * render_to_associated_sink
+// The audio_properties field is used to control the audio-processing module,
+// which provides features such as software-based echo cancellation.
+// If SelectSettings fails, the HasValue() method returns false and
+// failed_constraint_name() returns the name of one of the (possibly multiple)
+// constraints that could not be satisfied.
+class CONTENT_EXPORT AudioCaptureSettings {
+ public:
+ // Creates an object without value and with an empty failed constraint name.
+ AudioCaptureSettings();
+
+ // Creates an object without value and with the given
+ // |failed_constraint_name|. Does not take ownership of
+ // |failed_constraint_name|, so it must point to a string that remains
+ // accessible. |failed_constraint_name| must be non-null.
+ explicit AudioCaptureSettings(const char* failed_constraint_name);
+
+ // Creates an object with the given values.
+ explicit AudioCaptureSettings(
+ std::string device_id,
+ const media::AudioParameters& audio_parameters,
+ bool enable_hotword,
+ bool disable_local_echo,
+ bool enable_automatic_output_device_selection,
+ const AudioProcessingProperties& audio_processing_properties);
+ AudioCaptureSettings(const AudioCaptureSettings& other);
+ AudioCaptureSettings& operator=(const AudioCaptureSettings& other);
+ AudioCaptureSettings(AudioCaptureSettings&& other);
+ AudioCaptureSettings& operator=(AudioCaptureSettings&& other);
+
+ bool HasValue() const { return failed_constraint_name_ == nullptr; }
+
+ // Accessors.
+ const char* failed_constraint_name() const { return failed_constraint_name_; }
+ const std::string& device_id() const {
+ DCHECK(HasValue());
+ return device_id_;
+ }
+ // This field is meaningless in content capture.
+ const media::AudioParameters& device_parameters() const {
+ DCHECK(HasValue());
+ return audio_parameters_;
+ }
+ bool hotword_enabled() const {
+ DCHECK(HasValue());
+ return hotword_enabled_;
+ }
+ bool disable_local_echo() const {
+ DCHECK(HasValue());
+ return disable_local_echo_;
+ }
+ bool render_to_associated_sink() const {
+ DCHECK(HasValue());
+ return render_to_associated_sink_;
+ }
+ AudioProcessingProperties audio_processing_properties() const {
+ DCHECK(HasValue());
+ return audio_processing_properties_;
+ }
+
+ private:
+ const char* failed_constraint_name_;
+ std::string device_id_;
+ media::AudioParameters audio_parameters_;
+ bool hotword_enabled_;
+ bool disable_local_echo_;
+ bool render_to_associated_sink_;
+ AudioProcessingProperties audio_processing_properties_;
+};
+
// Method to get boolean value of constraint with |name| from constraints.
// Returns true if the constraint is specified in either mandatory or optional
// constraints.
@@ -220,6 +313,22 @@ auto ConstraintMin(const ConstraintType& constraint)
return constraint.HasExact() ? constraint.Exact() : constraint.Min();
}
+// If |value| is outside the range of |constraint|, returns the name of the
+// failed constraint. Otherwise, returns nullptr. The return value converts to
+// bool in the expected way.
+template <typename NumericConstraintType, typename ValueType>
+const char* IsOutsideConstraintRange(NumericConstraintType constraint,
+ ValueType value) {
+ return (ConstraintHasMin(constraint) && value < ConstraintMin(constraint)) ||
+ (ConstraintHasMax(constraint) &&
+ value > ConstraintMax(constraint))
+ ? constraint.GetName()
+ : nullptr;
+}
+
+std::string GetMediaStreamSource(const blink::WebMediaConstraints& constraints);
+bool IsDeviceCapture(const blink::WebMediaConstraints& constraints);
+
// 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
@@ -249,6 +358,17 @@ VideoTrackAdapterSettings CONTENT_EXPORT SelectVideoTrackAdapterSettings(
const media::VideoCaptureFormat& source_format,
bool expect_source_native_size);
+// Generic distance function between two values for numeric constraints. Based
+// on the fitness-distance function described in
+// https://w3c.github.io/mediacapture-main/#dfn-fitness-distance
+double NumericConstraintFitnessDistance(double value1, double value2);
+
+// Fitness distance between |value| and |constraint|.
+// Based on https://w3c.github.io/mediacapture-main/#dfn-fitness-distance.
+double StringConstraintFitnessDistance(
+ const blink::WebString& value,
+ const blink::StringConstraint& constraint);
+
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_CONSTRAINTS_UTIL_H_

Powered by Google App Engine
This is Rietveld 408576698