Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1618)

Unified Diff: chromecast/renderer/media/media_pipeline_proxy.cc

Issue 2300993003: CmaRenderer is dead. Long live MojoRenderer. (Closed)
Patch Set: update OWNERS file Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromecast/renderer/media/media_pipeline_proxy.h ('k') | chromecast/renderer/media/video_pipeline_proxy.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chromecast/renderer/media/media_pipeline_proxy.h ('k') | chromecast/renderer/media/video_pipeline_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698