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..0e9ea5110682eda1f8f925151381966241cfdefc 100644 |
--- a/media/mojo/services/mojo_audio_decoder.cc |
+++ b/media/mojo/services/mojo_audio_decoder.cc |
@@ -11,6 +11,7 @@ |
#include "base/logging.h" |
#include "base/single_thread_task_runner.h" |
#include "base/thread_task_runner_handle.h" |
+#include "media/base/audio_buffer.h" |
#include "media/base/cdm_context.h" |
#include "media/mojo/common/media_type_converters.h" |
@@ -65,6 +66,7 @@ void MojoAudioDecoder::Initialize(const AudioDecoderConfig& config, |
base::Bind(&MojoAudioDecoder::OnConnectionError, base::Unretained(this))); |
init_cb_ = init_cb; |
+ output_cb_ = output_cb; |
// Using base::Unretained(this) is safe because |this| owns |remote_decoder_|, |
// and the callback won't be dispatched if |remote_decoder_| is destroyed. |
@@ -87,10 +89,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))); |
} |
@@ -126,7 +126,7 @@ void MojoAudioDecoder::OnBufferDecoded(interfaces::AudioBufferPtr buffer) { |
DVLOG(1) << __FUNCTION__; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- NOTIMPLEMENTED(); |
+ output_cb_.Run(buffer.To<scoped_refptr<AudioBuffer>>()); |
} |
void MojoAudioDecoder::OnConnectionError() { |
@@ -153,6 +153,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 +193,38 @@ void MojoAudioDecoder::OnResetDone() { |
base::ResetAndReturn(&reset_cb_).Run(); |
} |
+void MojoAudioDecoder::CreateDataPipe() { |
+ MojoCreateDataPipeOptions options; |
+ options.struct_size = sizeof(MojoCreateDataPipeOptions); |
+ options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
+ options.element_num_bytes = 1; |
+ // TODO(timav): Consider capacity calculation based on AudioDecoderConfig. |
+ options.capacity_num_bytes = 512 * 1024; |
+ |
+ 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 |