| 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..fd70732d7a9c2261165ea999463b079fedd022f7
|
| --- /dev/null
|
| +++ b/media/mojo/services/mojo_demuxer_stream_adapter.cc
|
| @@ -0,0 +1,103 @@
|
| +// 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(
|
| + mojo::DemuxerStreamPtr demuxer_stream,
|
| + const base::Closure& stream_ready_cb)
|
| + : demuxer_stream_(demuxer_stream.Pass()),
|
| + stream_ready_cb_(stream_ready_cb),
|
| + 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(read_cb_.is_null());
|
| + read_cb_ = read_cb;
|
| + demuxer_stream_->Read(base::Bind(&MojoDemuxerStreamAdapter::OnBufferReady,
|
| + weak_factory_.GetWeakPtr()));
|
| +}
|
| +
|
| +AudioDecoderConfig MojoDemuxerStreamAdapter::audio_decoder_config() {
|
| + DCHECK(!config_queue_.empty());
|
| + return config_queue_.front();
|
| +}
|
| +
|
| +VideoDecoderConfig MojoDemuxerStreamAdapter::video_decoder_config() {
|
| + NOTREACHED();
|
| + return VideoDecoderConfig();
|
| +}
|
| +
|
| +media::DemuxerStream::Type MojoDemuxerStreamAdapter::type() {
|
| + return media::DemuxerStream::AUDIO;
|
| +}
|
| +
|
| +void MojoDemuxerStreamAdapter::EnableBitstreamConverter() {
|
| + NOTREACHED();
|
| +}
|
| +
|
| +bool MojoDemuxerStreamAdapter::SupportsConfigChanges() {
|
| + return true;
|
| +}
|
| +
|
| +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_cb_.Run();
|
| +}
|
| +
|
| +void MojoDemuxerStreamAdapter::OnAudioDecoderConfigChanged(
|
| + mojo::AudioDecoderConfigPtr config) {
|
| + config_queue_.push(config.To<media::AudioDecoderConfig>());
|
| +
|
| + if (!read_cb_.is_null()) {
|
| + read_cb_.Run(media::DemuxerStream::Status::kConfigChanged, NULL);
|
| + read_cb_.Reset();
|
| + }
|
| +}
|
| +
|
| +void MojoDemuxerStreamAdapter::OnBufferReady(
|
| + mojo::DemuxerStream::Status status,
|
| + mojo::MediaDecoderBufferPtr buffer) {
|
| + DCHECK(!read_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(!media_buffer.get());
|
| + config_queue_.pop();
|
| +
|
| + // If the |config_queue_| is empty we need to wait for
|
| + // OnAudioDecoderConfigChanged before invoking |read_cb|.
|
| + if (config_queue_.empty())
|
| + return;
|
| + }
|
| + read_cb_.Run(media_status, media_buffer);
|
| + read_cb_.Reset();
|
| +}
|
| +
|
| +} // namespace media
|
|
|