11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/mojo/services/mojo_demuxer_stream_impl.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/audio_decoder_config.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/mojo/interfaces/demuxer_stream.mojom.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/mojo/services/media_type_converters.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/bindings/interface_impl.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/system/data_pipe.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media { 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMojoDemuxerStreamImpl::MojoDemuxerStreamImpl(media::DemuxerStream* stream) 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : stream_(stream), weak_factory_(this) { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMojoDemuxerStreamImpl::~MojoDemuxerStreamImpl() { 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MojoDemuxerStreamImpl::Read(const mojo::Callback< 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void(mojo::DemuxerStream::Status, mojo::MediaDecoderBufferPtr)>& callback) { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stream_->Read(base::Bind(&MojoDemuxerStreamImpl::OnBufferReady, 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_.GetWeakPtr(), 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback)); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MojoDemuxerStreamImpl::OnBufferReady( 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BufferReadyCB& callback, 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media::DemuxerStream::Status status, 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<media::DecoderBuffer>& buffer) { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (status == media::DemuxerStream::kConfigChanged) { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Send the config change so our client can read it once it parses the 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Status obtained via Run() below. 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client()->OnAudioDecoderConfigChanged( 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mojo::AudioDecoderConfig::From(stream_->audio_decoder_config())); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(tim): Once using DataPipe, fill via the producer handle and then 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // read more to keep the pipe full. 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(static_cast<mojo::DemuxerStream::Status>(status), 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mojo::MediaDecoderBuffer::From(buffer)); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MojoDemuxerStreamImpl::OnConnectionEstablished() { 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This is called when our DemuxerStreamClient has connected itself and is 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // ready to receive messages. Send an initial config and notify it that 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // we are now ready for business. 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client()->OnAudioDecoderConfigChanged( 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mojo::AudioDecoderConfig::From(stream_->audio_decoder_config())); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(tim): Create a DataPipe, hold the producer handle, and pass the 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // consumer handle here. 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci client()->OnStreamReady(mojo::ScopedDataPipeConsumerHandle()); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace media 61