Index: content/renderer/media_recorder/audio_track_recorder.cc |
diff --git a/content/renderer/media_recorder/audio_track_recorder.cc b/content/renderer/media_recorder/audio_track_recorder.cc |
index d0dfd3bf7102c25ddbc952c5252dd506c8765372..9f96801895a91ce1f8daa61b0ec50e1f6c6855b0 100644 |
--- a/content/renderer/media_recorder/audio_track_recorder.cc |
+++ b/content/renderer/media_recorder/audio_track_recorder.cc |
@@ -13,6 +13,7 @@ |
#include "content/renderer/media/media_stream_audio_track.h" |
#include "media/base/audio_bus.h" |
#include "media/base/audio_converter.h" |
+#include "media/base/audio_fifo.h" |
#include "media/base/audio_parameters.h" |
#include "media/base/audio_sample_types.h" |
#include "media/base/bind_to_current_loop.h" |
@@ -126,15 +127,13 @@ |
// Sampling rate adapter between an OpusEncoder supported and the provided. |
std::unique_ptr<media::AudioConverter> converter_; |
- std::deque<std::unique_ptr<media::AudioBus>> audio_bus_queue_; |
+ std::unique_ptr<media::AudioFifo> fifo_; |
// Buffer for passing AudioBus data to OpusEncoder. |
std::unique_ptr<float[]> buffer_; |
// While |paused_|, AudioBuses are not encoded. |
bool paused_; |
- |
- int frames_queued_; |
OpusEncoder* opus_encoder_; |
@@ -147,7 +146,6 @@ |
: on_encoded_audio_cb_(on_encoded_audio_cb), |
bits_per_second_(bits_per_second), |
paused_(false), |
- frames_queued_(0), |
opus_encoder_(nullptr) { |
// AudioEncoder is constructed on the thread that ATR lives on, but should |
// operate only on the encoder thread after that. Reset |
@@ -175,7 +173,6 @@ |
DLOG(ERROR) << "Invalid params: " << input_params.AsHumanReadableString(); |
return; |
} |
- |
input_params_ = input_params; |
input_params_.set_frames_per_buffer(input_params_.sample_rate() * |
kOpusPreferredBufferDurationMs / |
@@ -197,8 +194,9 @@ |
converter_->AddInput(this); |
converter_->PrimeWithSilence(); |
- frames_queued_ = 0; |
- audio_bus_queue_.clear(); |
+ fifo_.reset(new media::AudioFifo( |
+ input_params_.channels(), |
+ kMaxNumberOfFifoBuffers * input_params_.frames_per_buffer())); |
buffer_.reset(new float[output_params_.channels() * |
output_params_.frames_per_buffer()]); |
@@ -239,19 +237,14 @@ |
if (!is_initialized() || paused_) |
return; |
- |
- frames_queued_ += input_bus->frames(); |
- audio_bus_queue_.push_back(std::move(input_bus)); |
- |
- 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(); |
- } |
+ // TODO(mcasas): Consider using a std::deque<std::unique_ptr<AudioBus>> |
+ // instead of |
+ // an AudioFifo, to avoid copying data needlessly since we know the sizes of |
+ // both input and output and they are multiples. |
+ fifo_->Push(input_bus.get()); |
// Wait to have enough |input_bus|s to guarantee a satisfactory conversion. |
- while (frames_queued_ >= input_params_.frames_per_buffer()) { |
+ while (fifo_->frames() >= input_params_.frames_per_buffer()) { |
std::unique_ptr<media::AudioBus> audio_bus = media::AudioBus::Create( |
output_params_.channels(), kOpusPreferredFramesPerBuffer); |
converter_->Convert(audio_bus.get()); |
@@ -263,7 +256,7 @@ |
encoded_data.get())) { |
const base::TimeTicks capture_time_of_first_sample = |
capture_time - |
- base::TimeDelta::FromMicroseconds(frames_queued_ * |
+ base::TimeDelta::FromMicroseconds(fifo_->frames() * |
base::Time::kMicrosecondsPerSecond / |
input_params_.sample_rate()); |
on_encoded_audio_cb_.Run(output_params_, std::move(encoded_data), |
@@ -275,12 +268,7 @@ |
double AudioTrackRecorder::AudioEncoder::ProvideInput( |
media::AudioBus* audio_bus, |
uint32_t frames_delayed) { |
- 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(); |
+ fifo_->Consume(audio_bus, 0, audio_bus->frames()); |
return 1.0; // Return volume greater than zero to indicate we have more data. |
} |