| Index: chromecast/renderer/media/media_pipeline_proxy.cc
|
| diff --git a/chromecast/renderer/media/media_pipeline_proxy.cc b/chromecast/renderer/media/media_pipeline_proxy.cc
|
| deleted file mode 100644
|
| index 4196b807d36439c5e7c8897eefb29278cd0e8e0e..0000000000000000000000000000000000000000
|
| --- a/chromecast/renderer/media/media_pipeline_proxy.cc
|
| +++ /dev/null
|
| @@ -1,279 +0,0 @@
|
| -// 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 "chromecast/renderer/media/media_pipeline_proxy.h"
|
| -
|
| -#include <utility>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback_helpers.h"
|
| -#include "base/location.h"
|
| -#include "base/logging.h"
|
| -#include "base/macros.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "chromecast/common/media/cma_messages.h"
|
| -#include "chromecast/media/cma/base/coded_frame_provider.h"
|
| -#include "chromecast/renderer/media/audio_pipeline_proxy.h"
|
| -#include "chromecast/renderer/media/media_channel_proxy.h"
|
| -#include "chromecast/renderer/media/video_pipeline_proxy.h"
|
| -
|
| -namespace chromecast {
|
| -namespace media {
|
| -
|
| -// MediaPipelineProxyInternal -
|
| -// This class is not thread safe and should run on the same thread
|
| -// as the media channel proxy.
|
| -class MediaPipelineProxyInternal {
|
| - public:
|
| - static void Release(std::unique_ptr<MediaPipelineProxyInternal> proxy);
|
| -
|
| - explicit MediaPipelineProxyInternal(
|
| - scoped_refptr<MediaChannelProxy> media_channel_proxy);
|
| - virtual ~MediaPipelineProxyInternal();
|
| -
|
| - void SetClient(const MediaPipelineClient& client);
|
| - void SetCdm(int render_frame_id, int cdm_id);
|
| - void StartPlayingFrom(const base::TimeDelta& time);
|
| - void Flush(const base::Closure& flush_cb);
|
| - void Stop();
|
| - void SetPlaybackRate(double playback_rate);
|
| -
|
| - private:
|
| - void Shutdown();
|
| -
|
| - // Callbacks for CmaMessageFilterHost::MediaDelegate.
|
| - void OnFlushDone();
|
| -
|
| - base::ThreadChecker thread_checker_;
|
| -
|
| - scoped_refptr<MediaChannelProxy> media_channel_proxy_;
|
| -
|
| - MediaPipelineClient client_;
|
| -
|
| - // Store the callback for a flush.
|
| - base::Closure flush_cb_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MediaPipelineProxyInternal);
|
| -};
|
| -
|
| -// static
|
| -void MediaPipelineProxyInternal::Release(
|
| - std::unique_ptr<MediaPipelineProxyInternal> proxy) {
|
| - proxy->Shutdown();
|
| -}
|
| -
|
| -MediaPipelineProxyInternal::MediaPipelineProxyInternal(
|
| - scoped_refptr<MediaChannelProxy> media_channel_proxy)
|
| - : media_channel_proxy_(media_channel_proxy) {
|
| - DCHECK(media_channel_proxy.get());
|
| -
|
| - // Creation can be done on a different thread.
|
| - thread_checker_.DetachFromThread();
|
| -}
|
| -
|
| -MediaPipelineProxyInternal::~MediaPipelineProxyInternal() {
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::Shutdown() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| -
|
| - // Remove any callback on VideoPipelineProxyInternal.
|
| - media_channel_proxy_->SetMediaDelegate(
|
| - CmaMessageFilterProxy::MediaDelegate());
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::SetClient(const MediaPipelineClient& client) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!client.error_cb.is_null());
|
| - DCHECK(!client.buffering_state_cb.is_null());
|
| - client_ = client;
|
| -
|
| - CmaMessageFilterProxy::MediaDelegate delegate;
|
| - delegate.flush_cb = base::Bind(&MediaPipelineProxyInternal::OnFlushDone,
|
| - base::Unretained(this));
|
| - delegate.client = client;
|
| - bool success = media_channel_proxy_->SetMediaDelegate(delegate);
|
| - CHECK(success);
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::SetCdm(int render_frame_id, int cdm_id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - bool success = media_channel_proxy_->Send(
|
| - std::unique_ptr<IPC::Message>(new CmaHostMsg_SetCdm(
|
| - media_channel_proxy_->GetId(), render_frame_id, cdm_id)));
|
| - LOG_IF(ERROR, !success) << "Failed to send SetCdm=" << cdm_id;
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::Flush(const base::Closure& flush_cb) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - bool success = media_channel_proxy_->Send(std::unique_ptr<IPC::Message>(
|
| - new CmaHostMsg_Flush(media_channel_proxy_->GetId())));
|
| - if (!success) {
|
| - LOG(ERROR) << "Failed to send Flush";
|
| - return;
|
| - }
|
| - DCHECK(flush_cb_.is_null());
|
| - flush_cb_ = flush_cb;
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::Stop() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - bool success = media_channel_proxy_->Send(std::unique_ptr<IPC::Message>(
|
| - new CmaHostMsg_Stop(media_channel_proxy_->GetId())));
|
| - if (!success)
|
| - client_.error_cb.Run(::media::PIPELINE_ERROR_ABORT);
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::StartPlayingFrom(const base::TimeDelta& time) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - bool success = media_channel_proxy_->Send(std::unique_ptr<IPC::Message>(
|
| - new CmaHostMsg_StartPlayingFrom(media_channel_proxy_->GetId(), time)));
|
| - if (!success)
|
| - client_.error_cb.Run(::media::PIPELINE_ERROR_ABORT);
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::SetPlaybackRate(double playback_rate) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - media_channel_proxy_->Send(
|
| - std::unique_ptr<IPC::Message>(new CmaHostMsg_SetPlaybackRate(
|
| - media_channel_proxy_->GetId(), playback_rate)));
|
| -}
|
| -
|
| -void MediaPipelineProxyInternal::OnFlushDone() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(!flush_cb_.is_null());
|
| - base::ResetAndReturn(&flush_cb_).Run();
|
| -}
|
| -
|
| -// A macro runs current member function on |io_task_runner_| thread.
|
| -#define FORWARD_ON_IO_THREAD(param_fn, ...) \
|
| - io_task_runner_->PostTask( \
|
| - FROM_HERE, base::Bind(&MediaPipelineProxyInternal::param_fn, \
|
| - base::Unretained(proxy_.get()), ##__VA_ARGS__))
|
| -
|
| -MediaPipelineProxy::MediaPipelineProxy(
|
| - int render_frame_id,
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| - LoadType load_type)
|
| - : io_task_runner_(io_task_runner),
|
| - render_frame_id_(render_frame_id),
|
| - media_channel_proxy_(new MediaChannelProxy),
|
| - proxy_(new MediaPipelineProxyInternal(media_channel_proxy_)),
|
| - has_audio_(false),
|
| - has_video_(false),
|
| - audio_pipeline_(
|
| - new AudioPipelineProxy(io_task_runner, media_channel_proxy_)),
|
| - video_pipeline_(
|
| - new VideoPipelineProxy(io_task_runner, media_channel_proxy_)),
|
| - weak_factory_(this) {
|
| - weak_this_ = weak_factory_.GetWeakPtr();
|
| - io_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaChannelProxy::Open, media_channel_proxy_, load_type));
|
| - thread_checker_.DetachFromThread();
|
| -}
|
| -
|
| -MediaPipelineProxy::~MediaPipelineProxy() {
|
| - io_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineProxyInternal::Release, base::Passed(&proxy_)));
|
| - io_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&MediaChannelProxy::Close, media_channel_proxy_));
|
| -}
|
| -
|
| -void MediaPipelineProxy::SetClient(const MediaPipelineClient& client) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - FORWARD_ON_IO_THREAD(SetClient, client);
|
| -}
|
| -
|
| -void MediaPipelineProxy::SetCdm(int cdm_id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - FORWARD_ON_IO_THREAD(SetCdm, render_frame_id_, cdm_id);
|
| -}
|
| -
|
| -AudioPipelineProxy* MediaPipelineProxy::GetAudioPipeline() const {
|
| - return audio_pipeline_.get();
|
| -}
|
| -
|
| -VideoPipelineProxy* MediaPipelineProxy::GetVideoPipeline() const {
|
| - return video_pipeline_.get();
|
| -}
|
| -
|
| -void MediaPipelineProxy::InitializeAudio(
|
| - const ::media::AudioDecoderConfig& config,
|
| - std::unique_ptr<CodedFrameProvider> frame_provider,
|
| - const ::media::PipelineStatusCB& status_cb) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - has_audio_ = true;
|
| - audio_pipeline_->Initialize(config, std::move(frame_provider), status_cb);
|
| -}
|
| -
|
| -void MediaPipelineProxy::InitializeVideo(
|
| - const std::vector<::media::VideoDecoderConfig>& configs,
|
| - std::unique_ptr<CodedFrameProvider> frame_provider,
|
| - const ::media::PipelineStatusCB& status_cb) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - has_video_ = true;
|
| - video_pipeline_->Initialize(configs, std::move(frame_provider), status_cb);
|
| -}
|
| -
|
| -void MediaPipelineProxy::StartPlayingFrom(base::TimeDelta time) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - if (has_audio_)
|
| - audio_pipeline_->StartFeeding();
|
| - if (has_video_)
|
| - video_pipeline_->StartFeeding();
|
| - FORWARD_ON_IO_THREAD(StartPlayingFrom, time);
|
| -}
|
| -
|
| -void MediaPipelineProxy::Flush(const base::Closure& flush_cb) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(has_audio_ || has_video_);
|
| -
|
| - ::media::SerialRunner::Queue bound_fns;
|
| - if (has_audio_) {
|
| - bound_fns.Push(base::Bind(&AudioPipelineProxy::Flush,
|
| - base::Unretained(audio_pipeline_.get())));
|
| - }
|
| - if (has_video_) {
|
| - bound_fns.Push(base::Bind(&VideoPipelineProxy::Flush,
|
| - base::Unretained(video_pipeline_.get())));
|
| - }
|
| - ::media::PipelineStatusCB cb =
|
| - base::Bind(&MediaPipelineProxy::OnProxyFlushDone, weak_this_, flush_cb);
|
| - pending_flush_callbacks_ = ::media::SerialRunner::Run(bound_fns, cb);
|
| -}
|
| -
|
| -void MediaPipelineProxy::OnProxyFlushDone(const base::Closure& flush_cb,
|
| - ::media::PipelineStatus status) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK_EQ(status, ::media::PIPELINE_OK);
|
| - pending_flush_callbacks_.reset();
|
| - FORWARD_ON_IO_THREAD(Flush, flush_cb);
|
| -}
|
| -
|
| -void MediaPipelineProxy::Stop() {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - DCHECK(has_audio_ || has_video_);
|
| -
|
| - // Cancel pending flush callbacks since we are about to stop/shutdown
|
| - // audio/video pipelines. This will ensure A/V Flush won't happen in
|
| - // stopped state.
|
| - pending_flush_callbacks_.reset();
|
| -
|
| - if (has_audio_)
|
| - audio_pipeline_->Stop();
|
| - if (has_video_)
|
| - video_pipeline_->Stop();
|
| -
|
| - FORWARD_ON_IO_THREAD(Stop);
|
| -}
|
| -
|
| -void MediaPipelineProxy::SetPlaybackRate(double playback_rate) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - FORWARD_ON_IO_THREAD(SetPlaybackRate, playback_rate);
|
| -}
|
| -
|
| -} // namespace cma
|
| -} // namespace chromecast
|
|
|