blob: 4a8c6fb974ed539c8462c78f477bf8cf085c4365 [file] [log] [blame]
/*
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/modules/audio_coding/neteq/audio_classifier.h"
#include <assert.h>
#include <string.h>
namespace webrtc {
static const int kDefaultSampleRateHz = 48000;
static const int kDefaultFrameRateHz = 50;
static const int kDefaultFrameSizeSamples =
kDefaultSampleRateHz / kDefaultFrameRateHz;
static const float kDefaultThreshold = 0.5f;
AudioClassifier::AudioClassifier()
: analysis_info_(),
is_music_(false),
music_probability_(0),
// This actually assigns the pointer to a static constant struct
// rather than creates a struct and |celt_mode_| does not need
// to be deleted.
celt_mode_(opus_custom_mode_create(kDefaultSampleRateHz,
kDefaultFrameSizeSamples,
NULL)),
analysis_state_() {
assert(celt_mode_);
}
AudioClassifier::~AudioClassifier() {}
bool AudioClassifier::Analysis(const int16_t* input,
int input_length,
int channels) {
// Must be 20 ms frames at 48 kHz sampling.
assert((input_length / channels) == kDefaultFrameSizeSamples);
// Only mono or stereo are allowed.
assert(channels == 1 || channels == 2);
// Call Opus' classifier, defined in
// "third_party/opus/src/src/analysis.h", with lsb_depth = 16.
// Also uses a down-mixing function downmix_int, defined in
// "third_party/opus/src/src/opus_private.h", with
// constants c1 = 0, and c2 = -2.
run_analysis(&analysis_state_,
celt_mode_,
input,
kDefaultFrameSizeSamples,
kDefaultFrameSizeSamples,
0,
-2,
channels,
kDefaultSampleRateHz,
16,
downmix_int,
&analysis_info_);
music_probability_ = analysis_info_.music_prob;
is_music_ = music_probability_ > kDefaultThreshold;
return is_music_;
}
bool AudioClassifier::is_music() const {
return is_music_;
}
} // namespace webrtc