Commit 678c74cf authored by c.padhi's avatar c.padhi Committed by Commit bot

Replace AudioFifo with a deque of AudioBus in ATR::AudioEncoder

This CL uses a std::deque<std::unique_ptr<media::AudioBus>> instead
of an AudioFifo, to avoid copying data needlessly.

BUG=None

Review-Url: https://codereview.chromium.org/2854363002
Cr-Commit-Position: refs/heads/master@{#471039}
parent 60e4c6d3
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include "content/renderer/media/media_stream_audio_track.h" #include "content/renderer/media/media_stream_audio_track.h"
#include "media/base/audio_bus.h" #include "media/base/audio_bus.h"
#include "media/base/audio_converter.h" #include "media/base/audio_converter.h"
#include "media/base/audio_fifo.h"
#include "media/base/audio_parameters.h" #include "media/base/audio_parameters.h"
#include "media/base/audio_sample_types.h" #include "media/base/audio_sample_types.h"
#include "media/base/bind_to_current_loop.h" #include "media/base/bind_to_current_loop.h"
...@@ -127,7 +126,7 @@ class AudioTrackRecorder::AudioEncoder ...@@ -127,7 +126,7 @@ class AudioTrackRecorder::AudioEncoder
// Sampling rate adapter between an OpusEncoder supported and the provided. // Sampling rate adapter between an OpusEncoder supported and the provided.
std::unique_ptr<media::AudioConverter> converter_; std::unique_ptr<media::AudioConverter> converter_;
std::unique_ptr<media::AudioFifo> fifo_; std::deque<std::unique_ptr<media::AudioBus>> audio_bus_queue_;
// Buffer for passing AudioBus data to OpusEncoder. // Buffer for passing AudioBus data to OpusEncoder.
std::unique_ptr<float[]> buffer_; std::unique_ptr<float[]> buffer_;
...@@ -135,6 +134,8 @@ class AudioTrackRecorder::AudioEncoder ...@@ -135,6 +134,8 @@ class AudioTrackRecorder::AudioEncoder
// While |paused_|, AudioBuses are not encoded. // While |paused_|, AudioBuses are not encoded.
bool paused_; bool paused_;
int frames_queued_;
OpusEncoder* opus_encoder_; OpusEncoder* opus_encoder_;
DISALLOW_COPY_AND_ASSIGN(AudioEncoder); DISALLOW_COPY_AND_ASSIGN(AudioEncoder);
...@@ -146,6 +147,7 @@ AudioTrackRecorder::AudioEncoder::AudioEncoder( ...@@ -146,6 +147,7 @@ AudioTrackRecorder::AudioEncoder::AudioEncoder(
: on_encoded_audio_cb_(on_encoded_audio_cb), : on_encoded_audio_cb_(on_encoded_audio_cb),
bits_per_second_(bits_per_second), bits_per_second_(bits_per_second),
paused_(false), paused_(false),
frames_queued_(0),
opus_encoder_(nullptr) { opus_encoder_(nullptr) {
// AudioEncoder is constructed on the thread that ATR lives on, but should // AudioEncoder is constructed on the thread that ATR lives on, but should
// operate only on the encoder thread after that. Reset // operate only on the encoder thread after that. Reset
...@@ -173,6 +175,7 @@ void AudioTrackRecorder::AudioEncoder::OnSetFormat( ...@@ -173,6 +175,7 @@ void AudioTrackRecorder::AudioEncoder::OnSetFormat(
DLOG(ERROR) << "Invalid params: " << input_params.AsHumanReadableString(); DLOG(ERROR) << "Invalid params: " << input_params.AsHumanReadableString();
return; return;
} }
input_params_ = input_params; input_params_ = input_params;
input_params_.set_frames_per_buffer(input_params_.sample_rate() * input_params_.set_frames_per_buffer(input_params_.sample_rate() *
kOpusPreferredBufferDurationMs / kOpusPreferredBufferDurationMs /
...@@ -194,9 +197,8 @@ void AudioTrackRecorder::AudioEncoder::OnSetFormat( ...@@ -194,9 +197,8 @@ void AudioTrackRecorder::AudioEncoder::OnSetFormat(
converter_->AddInput(this); converter_->AddInput(this);
converter_->PrimeWithSilence(); converter_->PrimeWithSilence();
fifo_.reset(new media::AudioFifo( frames_queued_ = 0;
input_params_.channels(), audio_bus_queue_.clear();
kMaxNumberOfFifoBuffers * input_params_.frames_per_buffer()));
buffer_.reset(new float[output_params_.channels() * buffer_.reset(new float[output_params_.channels() *
output_params_.frames_per_buffer()]); output_params_.frames_per_buffer()]);
...@@ -237,14 +239,19 @@ void AudioTrackRecorder::AudioEncoder::EncodeAudio( ...@@ -237,14 +239,19 @@ void AudioTrackRecorder::AudioEncoder::EncodeAudio(
if (!is_initialized() || paused_) if (!is_initialized() || paused_)
return; return;
// TODO(mcasas): Consider using a std::deque<std::unique_ptr<AudioBus>>
// instead of frames_queued_ += input_bus->frames();
// an AudioFifo, to avoid copying data needlessly since we know the sizes of audio_bus_queue_.push_back(std::move(input_bus));
// both input and output and they are multiples.
fifo_->Push(input_bus.get()); const int max_frame_limit =
kMaxNumberOfFifoBuffers * input_params_.frames_per_buffer();
while (frames_queued_ > max_frame_limit) {
frames_queued_ -= audio_bus_queue_.front()->frames();
audio_bus_queue_.pop_front();
}
// Wait to have enough |input_bus|s to guarantee a satisfactory conversion. // Wait to have enough |input_bus|s to guarantee a satisfactory conversion.
while (fifo_->frames() >= input_params_.frames_per_buffer()) { while (frames_queued_ >= input_params_.frames_per_buffer()) {
std::unique_ptr<media::AudioBus> audio_bus = media::AudioBus::Create( std::unique_ptr<media::AudioBus> audio_bus = media::AudioBus::Create(
output_params_.channels(), kOpusPreferredFramesPerBuffer); output_params_.channels(), kOpusPreferredFramesPerBuffer);
converter_->Convert(audio_bus.get()); converter_->Convert(audio_bus.get());
...@@ -256,7 +263,7 @@ void AudioTrackRecorder::AudioEncoder::EncodeAudio( ...@@ -256,7 +263,7 @@ void AudioTrackRecorder::AudioEncoder::EncodeAudio(
encoded_data.get())) { encoded_data.get())) {
const base::TimeTicks capture_time_of_first_sample = const base::TimeTicks capture_time_of_first_sample =
capture_time - capture_time -
base::TimeDelta::FromMicroseconds(fifo_->frames() * base::TimeDelta::FromMicroseconds(frames_queued_ *
base::Time::kMicrosecondsPerSecond / base::Time::kMicrosecondsPerSecond /
input_params_.sample_rate()); input_params_.sample_rate());
on_encoded_audio_cb_.Run(output_params_, std::move(encoded_data), on_encoded_audio_cb_.Run(output_params_, std::move(encoded_data),
...@@ -268,7 +275,12 @@ void AudioTrackRecorder::AudioEncoder::EncodeAudio( ...@@ -268,7 +275,12 @@ void AudioTrackRecorder::AudioEncoder::EncodeAudio(
double AudioTrackRecorder::AudioEncoder::ProvideInput( double AudioTrackRecorder::AudioEncoder::ProvideInput(
media::AudioBus* audio_bus, media::AudioBus* audio_bus,
uint32_t frames_delayed) { uint32_t frames_delayed) {
fifo_->Consume(audio_bus, 0, audio_bus->frames()); if (audio_bus_queue_.empty())
return 0.0;
frames_queued_ -= audio_bus->frames();
audio_bus_queue_.front()->CopyTo(audio_bus);
audio_bus_queue_.pop_front();
return 1.0; // Return volume greater than zero to indicate we have more data. return 1.0; // Return volume greater than zero to indicate we have more data.
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment