Chromium Code Reviews| Index: media/mojo/services/mojo_demuxer_stream_adapter.cc |
| diff --git a/media/mojo/services/mojo_demuxer_stream_adapter.cc b/media/mojo/services/mojo_demuxer_stream_adapter.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..0e9c246e0504b8a6885eafffa04c263fe8f02338 |
| --- /dev/null |
| +++ b/media/mojo/services/mojo_demuxer_stream_adapter.cc |
| @@ -0,0 +1,102 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "media/mojo/services/mojo_demuxer_stream_adapter.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/callback_helpers.h" |
| +#include "media/base/decoder_buffer.h" |
| +#include "media/mojo/services/media_type_converters.h" |
| + |
| +namespace media { |
| + |
| +MojoDemuxerStreamAdapter::MojoDemuxerStreamAdapter( |
|
scherkus (not reviewing)
2014/09/09 20:35:32
media/ loves us some clang-format ... we just have
|
| + mojo::DemuxerStreamPtr stream, |
| + const base::Closure& stream_ready) : demuxer_stream_(stream.Pass()), |
| + stream_ready_callback_(stream_ready), |
| + weak_factory_(this) { |
| + demuxer_stream_.set_client(this); |
| +} |
| + |
| +MojoDemuxerStreamAdapter::~MojoDemuxerStreamAdapter() { |
| +} |
| + |
| +void MojoDemuxerStreamAdapter::Read(const DemuxerStream::ReadCB& read_cb) { |
| + // We shouldn't be holding on to a previous callback if a new Read() came in. |
| + DCHECK(on_config_change_cb_.is_null()); |
| + demuxer_stream_->Read(base::Bind(&MojoDemuxerStreamAdapter::OnBufferReady, |
| + weak_factory_.GetWeakPtr(), |
| + read_cb)); |
|
xhwang
2014/09/10 00:00:52
Based on the DemuxerStream API, we should have at
tim (not reviewing)
2014/09/10 23:08:28
I see. I was going to say why bother adding state
xhwang
2014/09/15 04:57:28
For kConfigChanged, the buffer is always NULL.
tim (not reviewing)
2014/09/15 21:52:51
Acknowledged.
|
| +} |
| + |
| +AudioDecoderConfig MojoDemuxerStreamAdapter::audio_decoder_config() { |
| + DCHECK(!config_queue_.empty()); |
| + return config_queue_.front(); |
| +} |
| + |
| +VideoDecoderConfig MojoDemuxerStreamAdapter::video_decoder_config() { |
| + DCHECK(false); // TODO(tim): Video unsupported. |
|
scherkus (not reviewing)
2014/09/09 20:35:32
NOTREACHED()?
xhwang
2014/09/10 00:00:52
NOTREACHED() given l.44.
tim (not reviewing)
2014/09/10 23:08:28
Done.
tim (not reviewing)
2014/09/10 23:08:29
Done.
|
| + return VideoDecoderConfig(); |
| +} |
| + |
| +media::DemuxerStream::Type MojoDemuxerStreamAdapter::type() { |
| + return media::DemuxerStream::AUDIO; |
| +} |
| + |
| +void MojoDemuxerStreamAdapter::EnableBitstreamConverter() { |
| + NOTIMPLEMENTED(); |
| +} |
|
xhwang
2014/09/10 00:00:52
In media pipeline this is only used by GpuVideoDec
tim (not reviewing)
2014/09/10 23:08:28
Done.
|
| + |
| +bool MojoDemuxerStreamAdapter::SupportsConfigChanges() { |
| + return true; |
| +} |
|
xhwang
2014/09/10 00:00:52
This is only used by audio_renderer_impl.cc. So if
tim (not reviewing)
2014/09/10 23:08:28
For now I'm using ARI. In fact the test I added i
|
| + |
| +VideoRotation MojoDemuxerStreamAdapter::video_rotation() { |
| + NOTIMPLEMENTED(); |
| + return VIDEO_ROTATION_0; |
| +} |
| + |
| +void MojoDemuxerStreamAdapter::OnStreamReady( |
| + mojo::ScopedDataPipeConsumerHandle pipe) { |
| + // TODO(tim): We don't support pipe streaming yet. |
| + DCHECK(!pipe.is_valid()); |
| + DCHECK(!config_queue_.empty()); |
| + stream_ready_callback_.Run(); |
| +} |
| + |
| +void MojoDemuxerStreamAdapter::OnAudioDecoderConfigChanged( |
| + mojo::AudioDecoderConfigPtr config) { |
| + config_queue_.push(config.To<media::AudioDecoderConfig>()); |
| + |
| + if (!on_config_change_cb_.is_null()) |
| + base::ResetAndReturn(&on_config_change_cb_).Run(); |
| +} |
| + |
| +void MojoDemuxerStreamAdapter::OnBufferReady( |
| + const ReadCB& read_cb, |
| + mojo::DemuxerStream::Status status, |
| + mojo::MediaDecoderBufferPtr buffer) { |
| + DCHECK(on_config_change_cb_.is_null()); |
| + DCHECK(!config_queue_.empty()); |
| + |
| + media::DemuxerStream::Status media_status( |
| + static_cast<media::DemuxerStream::Status>(status)); |
| + scoped_refptr<media::DecoderBuffer> media_buffer( |
| + buffer.To<scoped_refptr<media::DecoderBuffer> >()); |
| + |
| + if (status == mojo::DemuxerStream::STATUS_CONFIG_CHANGED) { |
| + DCHECK_GE(config_queue_.size(), 1U); |
|
scherkus (not reviewing)
2014/09/09 20:35:32
DCHECK(!config_queue_.empty()) ?
tim (not reviewing)
2014/09/10 23:08:28
There should be at least 1 element in the queue at
xhwang
2014/09/15 04:57:28
scherkus was recommending to check !empty(), which
tim (not reviewing)
2014/09/15 21:52:51
Done.
|
| + config_queue_.pop(); |
| + |
| + // If the |config_queue_| is empty we need to wait for |
| + // OnAudioDecoderConfigChanged before invoking |read_cb|. |
| + if (config_queue_.empty()) { |
| + on_config_change_cb_ = base::Bind(read_cb, media_status, media_buffer); |
|
xhwang
2014/09/10 00:00:52
If we keep a class member read_cb_, we don't need
tim (not reviewing)
2014/09/10 23:08:28
See my question at 30, I might be misunderstanding
xhwang
2014/09/15 04:57:28
See my reply above.
tim (not reviewing)
2014/09/15 21:52:51
Acknowledged.
|
| + return; |
| + } |
| + } |
| + read_cb.Run(media_status, media_buffer); |
| +} |
| + |
| +} // namespace media |