blob: c891c8c1c1ccb579e72ee453f4e4eefad9245fcb [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_PROCESSOR_OPTIONS_H_
#define CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_PROCESSOR_OPTIONS_H_
#include <string>
#include <vector>
#include "base/files/file.h"
#include "base/macros.h"
#include "base/threading/thread_checker.h"
#include "content/common/content_export.h"
#include "content/public/common/media_stream_request.h"
#include "media/base/audio_point.h"
#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
#include "third_party/webrtc/api/mediastreaminterface.h"
#include "third_party/webrtc/media/base/mediachannel.h"
#include "third_party/webrtc/modules/audio_processing/include/audio_processing.h"
namespace webrtc {
class EchoCancellation;
class TypingDetection;
}
namespace content {
using webrtc::AudioProcessing;
// A helper class to parse audio constraints from a blink::WebMediaConstraints
// object.
// TODO(guidou): Remove this class. http://crbug.com/706408
class CONTENT_EXPORT MediaAudioConstraints {
public:
// Constraint keys used by audio processing.
static const char kEchoCancellation[];
static const char kGoogEchoCancellation[];
static const char kGoogExperimentalEchoCancellation[];
static const char kGoogAutoGainControl[];
static const char kGoogExperimentalAutoGainControl[];
static const char kGoogNoiseSuppression[];
static const char kGoogExperimentalNoiseSuppression[];
static const char kGoogBeamforming[];
static const char kGoogArrayGeometry[];
static const char kGoogHighpassFilter[];
static const char kGoogTypingNoiseDetection[];
static const char kGoogAudioMirroring[];
// Merge |options| with |kDefaultAudioConstraints|. For any key which
// exists in both, the value from |options| is maintained.
// New values from |kDefaultAudioConstraints| will
// be added.
// TODO(hta): Switch to an interface without "cricket::" when webrtc has one.
// |effects| is the bitmasks telling whether certain platform
// hardware audio effects are enabled, like hardware echo cancellation. If
// some hardware effect is enabled, the corresponding software audio
// processing will be disabled.
MediaAudioConstraints(const blink::WebMediaConstraints& constraints,
int effects);
virtual ~MediaAudioConstraints();
bool GetGoogAudioMirroring() const;
bool GetGoogAutoGainControl() const;
bool GetGoogExperimentalEchoCancellation() const;
bool GetGoogTypingNoiseDetection() const;
bool GetGoogNoiseSuppression() const;
bool GetGoogExperimentalNoiseSuppression() const;
bool GetGoogBeamforming() const;
bool GetGoogHighpassFilter() const;
bool GetGoogExperimentalAutoGainControl() const;
std::string GetGoogArrayGeometry() const;
// Gets the property of echo cancellation defined in |constraints_|. The
// returned value depends on a combination of |effects_|, |kEchoCancellation|
// and |kGoogEchoCancellation| in |constraints_|.
bool GetEchoCancellationProperty() const;
// Returns true if all the mandatory constraints in |constraints_| are valid;
// Otherwise return false.
bool IsValid() const;
// Exposed for testing.
bool default_audio_processing_constraint_value() const {
return default_audio_processing_constraint_value_;
}
private:
// Gets the default value of constraint named by |key| in |constraints|.
bool GetDefaultValueForConstraint(const std::string& key) const;
const blink::WebMediaConstraints constraints_;
const int effects_;
bool default_audio_processing_constraint_value_;
};
// Simple struct with audio-processing properties. Will substitute
// MediaAudioConstraints once the old constraints-processing algorithm is
// removed. http://crbug.com/706408
struct CONTENT_EXPORT AudioProcessingProperties {
// Creates an AudioProcessingProperties object with fields initialized to
// their default values.
AudioProcessingProperties();
AudioProcessingProperties(const AudioProcessingProperties& other);
AudioProcessingProperties& operator=(const AudioProcessingProperties& other);
AudioProcessingProperties(AudioProcessingProperties&& other);
AudioProcessingProperties& operator=(AudioProcessingProperties&& other);
~AudioProcessingProperties();
bool enable_sw_echo_cancellation = true;
bool disable_hw_echo_cancellation = false;
bool goog_audio_mirroring = false;
bool goog_auto_gain_control = true;
bool goog_experimental_echo_cancellation =
#if defined(OS_ANDROID)
false;
#else
true;
#endif
bool goog_typing_noise_detection = true;
bool goog_noise_suppression = true;
bool goog_experimental_noise_suppression = true;
bool goog_beamforming = true;
bool goog_highpass_filter = true;
bool goog_experimental_auto_gain_control = true;
std::vector<media::Point> goog_array_geometry;
};
// A helper class to log echo information in general and Echo Cancellation
// quality in particular.
class CONTENT_EXPORT EchoInformation {
public:
EchoInformation();
virtual ~EchoInformation();
// Updates stats, and reports delay metrics as UMA stats every 5 seconds.
// Must be called every time AudioProcessing::ProcessStream() is called.
void UpdateAecStats(webrtc::EchoCancellation* echo_cancellation);
// Reports AEC divergent filter metrics as UMA and resets the associated data.
void ReportAndResetAecDivergentFilterStats();
private:
void UpdateAecDelayStats(webrtc::EchoCancellation* echo_cancellation);
void UpdateAecDivergentFilterStats(
webrtc::EchoCancellation* echo_cancellation);
// Counter to track 5 seconds of data in order to query a new metric from
// webrtc::EchoCancellation::GetEchoDelayMetrics().
int delay_stats_time_ms_;
bool echo_frames_received_;
// Counter to track 1 second of data in order to query a new divergent filter
// fraction metric from webrtc::EchoCancellation::GetMetrics().
int divergent_filter_stats_time_ms_;
// Total number of times we queried for the divergent filter fraction metric.
int num_divergent_filter_fraction_;
// Number of non-zero divergent filter fraction metrics.
int num_non_zero_divergent_filter_fraction_;
// Ensures that this class is accessed on the same thread.
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(EchoInformation);
};
// Enables the echo cancellation in |audio_processing|.
void EnableEchoCancellation(AudioProcessing* audio_processing);
// Enables the noise suppression in |audio_processing|.
void EnableNoiseSuppression(AudioProcessing* audio_processing,
webrtc::NoiseSuppression::Level ns_level);
// Enables the typing detection in |audio_processing|.
void EnableTypingDetection(AudioProcessing* audio_processing,
webrtc::TypingDetection* typing_detector);
// Starts the echo cancellation dump in |audio_processing|.
void StartEchoCancellationDump(AudioProcessing* audio_processing,
base::File aec_dump_file);
// Stops the echo cancellation dump in |audio_processing|.
// This method has no impact if echo cancellation dump has not been started on
// |audio_processing|.
void StopEchoCancellationDump(AudioProcessing* audio_processing);
void EnableAutomaticGainControl(AudioProcessing* audio_processing);
void GetAudioProcessingStats(
AudioProcessing* audio_processing,
webrtc::AudioProcessorInterface::AudioProcessorStats* stats);
// Returns the array geometry from the media constraints if existing and
// otherwise that provided by the input device.
CONTENT_EXPORT std::vector<webrtc::Point> GetArrayGeometryPreferringConstraints(
const MediaAudioConstraints& audio_constraints,
const MediaStreamDevice::AudioDeviceParameters& input_params);
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_MEDIA_STREAM_AUDIO_PROCESSOR_OPTIONS_H_