Commit fda58eb9 authored by Alex Leung's avatar Alex Leung Committed by Commit Bot

[Chromecast] Create a new buffer for each call to CmaBackend::PushBuffer

The buffer passed to CmaBackend::PushBuffer may be stored in the backend
decoder for some time before actual playout.  It should not be modified
since it could corrupt audio that is yet to play out.

Bug: b/124402185, b/126295803
Test: Tested multizone on Android
Change-Id: Ie31d3b8f9d831597e00f2f5b72b3e2694b38406b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1603762
Commit-Queue: Alex Leung <alexleung@google.com>
Reviewed-by: default avatarKenneth MacKay <kmackay@chromium.org>
Cr-Commit-Position: refs/heads/master@{#658303}
parent 21c50692
......@@ -131,7 +131,6 @@ class CastAudioOutputStream::CmaWrapper : public CmaBackend::Decoder::Delegate {
std::unique_ptr<TaskRunnerImpl> cma_backend_task_runner_;
std::unique_ptr<CmaBackend> cma_backend_;
std::unique_ptr<::media::AudioBus> audio_bus_;
scoped_refptr<media::DecoderBufferBase> decoder_buffer_;
base::OneShotTimer push_timer_;
bool push_in_progress_;
bool encountered_error_;
......@@ -225,9 +224,6 @@ void CastAudioOutputStream::CmaWrapper::Initialize(
}
audio_bus_ = ::media::AudioBus::Create(audio_params_);
decoder_buffer_ =
base::MakeRefCounted<DecoderBufferAdapter>(new ::media::DecoderBuffer(
audio_params_.GetBytesPerBuffer(::media::kSampleFormatS16)));
timestamp_helper_.SetBaseTimestamp(base::TimeDelta());
}
......@@ -330,15 +326,15 @@ void CastAudioOutputStream::CmaWrapper::PushBuffer() {
DVLOG(3) << "frames_filled=" << frame_count << " with latency=" << delay;
DCHECK_EQ(frame_count, audio_bus_->frames());
DCHECK_EQ(static_cast<int>(decoder_buffer_->data_size()),
audio_params_.GetBytesPerBuffer(::media::kSampleFormatS16));
auto decoder_buffer =
base::MakeRefCounted<DecoderBufferAdapter>(new ::media::DecoderBuffer(
audio_params_.GetBytesPerBuffer(::media::kSampleFormatS16)));
audio_bus_->ToInterleaved<::media::SignedInt16SampleTypeTraits>(
frame_count,
reinterpret_cast<int16_t*>(decoder_buffer_->writable_data()));
decoder_buffer_->set_timestamp(timestamp_helper_.GetTimestamp());
frame_count, reinterpret_cast<int16_t*>(decoder_buffer->writable_data()));
decoder_buffer->set_timestamp(timestamp_helper_.GetTimestamp());
timestamp_helper_.AddFrames(frame_count);
BufferStatus status = audio_decoder_->PushBuffer(decoder_buffer_.get());
BufferStatus status = audio_decoder_->PushBuffer(std::move(decoder_buffer));
if (status != CmaBackend::BufferStatus::kBufferPending)
OnPushBufferComplete(status);
}
......
......@@ -33,6 +33,9 @@ class CmaBackend {
// MediaPipelineBackend::Decoder.
// See chromecast/public/media/media_pipeline_backend.h for documentation.
virtual void SetDelegate(Delegate* delegate) = 0;
// Pushes buffer to decoder. A new |buffer| should be used for each call
// and should not be mutated by the caller.
virtual BufferStatus PushBuffer(
scoped_refptr<DecoderBufferBase> buffer) = 0;
......
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