Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(405)

Unified Diff: media/mojo/services/mojo_audio_decoder.cc

Issue 1823443002: Use data pipe for encoded buffers in MojoAudioDecoder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@spitzer-audio-service-impl
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/mojo/services/mojo_audio_decoder.cc
diff --git a/media/mojo/services/mojo_audio_decoder.cc b/media/mojo/services/mojo_audio_decoder.cc
index ee6fe3cdded26c4be697798da442fa4d1e099ba6..49d11329044c22b41f9b5cd15a7c60fddd5594b4 100644
--- a/media/mojo/services/mojo_audio_decoder.cc
+++ b/media/mojo/services/mojo_audio_decoder.cc
@@ -87,10 +87,8 @@ void MojoAudioDecoder::Decode(const scoped_refptr<DecoderBuffer>& buffer,
DCHECK(decode_cb_.is_null());
decode_cb_ = decode_cb;
- // This code won't work because |buffer| is not serialized.
- // TODO(timav): Serialize DecodeBuffer into data pipe.
remote_decoder_->Decode(
- interfaces::DecoderBuffer::From(buffer),
+ TransferDecoderBuffer(buffer),
base::Bind(&MojoAudioDecoder::OnDecodeStatus, base::Unretained(this)));
}
@@ -153,6 +151,9 @@ void MojoAudioDecoder::OnInitialized(bool status,
needs_bitstream_conversion_ = needs_bitstream_conversion;
+ if (status)
+ CreateDataPipe();
+
task_runner_->PostTask(FROM_HERE, base::Bind(init_cb_, status));
}
@@ -190,4 +191,38 @@ void MojoAudioDecoder::OnResetDone() {
base::ResetAndReturn(&reset_cb_).Run();
}
+void MojoAudioDecoder::CreateDataPipe() {
+ // Allocate DataPipe size based on audio content. 100kb should suffice.
+ MojoCreateDataPipeOptions options;
+ options.struct_size = sizeof(MojoCreateDataPipeOptions);
+ options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
+ options.element_num_bytes = 1;
+ options.capacity_num_bytes = 100 * 1024;
xhwang 2016/03/19 04:57:25 We use 512k for audio in mojo_demuxer_stream: http
Tima Vaisburd 2016/03/19 22:04:46 We can calculate from the configuration if we know
xhwang 2016/03/20 16:15:57 Why 48k is the limit and why 20ms? We'll have only
Tima Vaisburd 2016/03/21 19:08:26 Used 512k and added TODO to evaluate a smaller siz
+
+ mojo::DataPipe write_pipe(options);
+
+ // Keep producer end.
+ producer_handle_ = std::move(write_pipe.producer_handle);
+
+ // Pass consumer end to |remote_decoder_|.
+ remote_decoder_->SetDataSource(std::move(write_pipe.consumer_handle));
+}
+
+interfaces::DecoderBufferPtr MojoAudioDecoder::TransferDecoderBuffer(
+ const scoped_refptr<DecoderBuffer>& media_buffer) {
+ interfaces::DecoderBufferPtr buffer =
+ interfaces::DecoderBuffer::From(media_buffer);
+ if (media_buffer->end_of_stream())
+ return buffer;
+
+ // Serialize the data section of the DecoderBuffer into our pipe.
+ uint32_t num_bytes = base::checked_cast<uint32_t>(media_buffer->data_size());
+ DCHECK_GT(num_bytes, 0u);
+ CHECK_EQ(WriteDataRaw(producer_handle_.get(), media_buffer->data(),
+ &num_bytes, MOJO_READ_DATA_FLAG_ALL_OR_NONE),
+ MOJO_RESULT_OK);
+ CHECK_EQ(num_bytes, static_cast<uint32_t>(media_buffer->data_size()));
+ return buffer;
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698