| Index: chromecast/browser/media/cma_message_filter_host.cc
|
| diff --git a/chromecast/browser/media/cma_message_filter_host.cc b/chromecast/browser/media/cma_message_filter_host.cc
|
| deleted file mode 100644
|
| index acdba2037246e5fe6f8f07326942ab63b58aa78e..0000000000000000000000000000000000000000
|
| --- a/chromecast/browser/media/cma_message_filter_host.cc
|
| +++ /dev/null
|
| @@ -1,543 +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/browser/media/cma_message_filter_host.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <memory>
|
| -#include <utility>
|
| -
|
| -#include "base/lazy_instance.h"
|
| -#include "base/memory/shared_memory.h"
|
| -#include "base/sync_socket.h"
|
| -#include "base/threading/thread_checker.h"
|
| -#include "chromecast/browser/media/media_pipeline_host.h"
|
| -#include "chromecast/common/media/cma_messages.h"
|
| -#include "chromecast/media/cdm/cast_cdm_proxy.h"
|
| -#include "chromecast/media/cma/pipeline/av_pipeline_client.h"
|
| -#include "chromecast/media/cma/pipeline/media_pipeline_client.h"
|
| -#include "chromecast/media/cma/pipeline/video_pipeline_client.h"
|
| -#include "chromecast/public/graphics_types.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -#include "media/base/bind_to_current_loop.h"
|
| -
|
| -namespace chromecast {
|
| -namespace media {
|
| -
|
| -#define FORWARD_CALL(arg_pipeline, arg_fn, ...) \
|
| - task_runner_->PostTask( \
|
| - FROM_HERE, \
|
| - base::Bind(&MediaPipelineHost::arg_fn, \
|
| - base::Unretained(arg_pipeline), __VA_ARGS__))
|
| -
|
| -namespace {
|
| -
|
| -const size_t kMaxSharedMem = 8 * 1024 * 1024;
|
| -
|
| -// Map of MediaPipelineHost instances that is accessed only from the CMA thread.
|
| -// The existence of a MediaPipelineHost* in this map implies that the instance
|
| -// is still valid.
|
| -class MediaPipelineCmaMap {
|
| - public:
|
| - MediaPipelineCmaMap() { thread_checker_.DetachFromThread(); }
|
| -
|
| - MediaPipelineHost* GetMediaPipeline(int process_id, int media_id) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - uint64_t pipeline_id = GetPipelineId(process_id, media_id);
|
| - auto it = id_pipeline_map_.find(pipeline_id);
|
| - return it != id_pipeline_map_.end() ? it->second : nullptr;
|
| - }
|
| -
|
| - void SetMediaPipeline(int process_id, int media_id, MediaPipelineHost* host) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - uint64_t pipeline_id = GetPipelineId(process_id, media_id);
|
| - auto ret = id_pipeline_map_.insert(std::make_pair(pipeline_id, host));
|
| -
|
| - // Check there is no other entry with the same ID.
|
| - DCHECK(ret.second != false);
|
| - }
|
| -
|
| - void DestroyMediaPipeline(int process_id,
|
| - int media_id,
|
| - std::unique_ptr<MediaPipelineHost> media_pipeline) {
|
| - DCHECK(thread_checker_.CalledOnValidThread());
|
| - uint64_t pipeline_id = GetPipelineId(process_id, media_id);
|
| - auto it = id_pipeline_map_.find(pipeline_id);
|
| - if (it != id_pipeline_map_.end())
|
| - id_pipeline_map_.erase(it);
|
| - }
|
| -
|
| - private:
|
| - uint64_t GetPipelineId(int process_id, int media_id) {
|
| - return (static_cast<uint64_t>(process_id) << 32) +
|
| - static_cast<uint64_t>(media_id);
|
| - }
|
| -
|
| - base::ThreadChecker thread_checker_;
|
| - std::map<uint64_t, MediaPipelineHost*> id_pipeline_map_;
|
| -};
|
| -
|
| -base::LazyInstance<MediaPipelineCmaMap> g_pipeline_map =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -void SetCdmOnCmaThread(int render_process_id, int media_id, CastCdm* cdm) {
|
| - MediaPipelineHost* pipeline =
|
| - g_pipeline_map.Get().GetMediaPipeline(render_process_id, media_id);
|
| - if (!pipeline) {
|
| - LOG(WARNING) << "MediaPipelineHost not alive: " << render_process_id << ","
|
| - << media_id;
|
| - return;
|
| - }
|
| -
|
| - pipeline->SetCdm(static_cast<CastCdmContext*>(cdm->GetCdmContext()));
|
| -}
|
| -
|
| -// BrowserCdm instance must be retrieved/accessed on the UI thread, then
|
| -// passed to MediaPipelineHost on CMA thread.
|
| -void SetCdmOnUiThread(
|
| - int render_process_id,
|
| - int render_frame_id,
|
| - int media_id,
|
| - int cdm_id,
|
| - scoped_refptr<base::SingleThreadTaskRunner> cma_task_runner) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| -
|
| - content::RenderProcessHost* host =
|
| - content::RenderProcessHost::FromID(render_process_id);
|
| - if (!host) {
|
| - LOG(ERROR) << "RenderProcessHost not alive for ID: " << render_process_id;
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<::media::MediaKeys> cdm = host->GetCdm(render_frame_id, cdm_id);
|
| - if (!cdm) {
|
| - LOG(WARNING) << "Could not find BrowserCdm (" << render_frame_id << ","
|
| - << cdm_id << ")";
|
| - return;
|
| - }
|
| -
|
| - CastCdm* cast_cdm = static_cast<CastCdmProxy*>(cdm.get())->cast_cdm();
|
| -
|
| - // base::Unretained is safe to use here, as all calls on |cast_cdm|,
|
| - // including the destructor, will happen on the CMA thread.
|
| - cma_task_runner->PostTask(
|
| - FROM_HERE, base::Bind(&SetCdmOnCmaThread, render_process_id, media_id,
|
| - base::Unretained(cast_cdm)));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -CmaMessageFilterHost::CmaMessageFilterHost(
|
| - int render_process_id,
|
| - const CreateMediaPipelineBackendCB& create_backend_cb,
|
| - scoped_refptr<base::SingleThreadTaskRunner> task_runner,
|
| - MediaResourceTracker* resource_tracker)
|
| - : content::BrowserMessageFilter(CastMediaMsgStart),
|
| - process_id_(render_process_id),
|
| - create_backend_cb_(create_backend_cb),
|
| - task_runner_(task_runner),
|
| - resource_tracker_(resource_tracker),
|
| - weak_factory_(this) {
|
| - weak_this_ = weak_factory_.GetWeakPtr();
|
| -}
|
| -
|
| -CmaMessageFilterHost::~CmaMessageFilterHost() {
|
| - DCHECK(media_pipelines_.empty());
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnChannelClosing() {
|
| - content::BrowserMessageFilter::OnChannelClosing();
|
| - DeleteEntries();
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnDestruct() const {
|
| - content::BrowserThread::DeleteOnIOThread::Destruct(this);
|
| -}
|
| -
|
| -bool CmaMessageFilterHost::OnMessageReceived(const IPC::Message& message) {
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(CmaMessageFilterHost, message)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_CreateMedia, CreateMedia)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_DestroyMedia, DestroyMedia)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_SetCdm, SetCdm)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_CreateAvPipe, CreateAvPipe)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_AudioInitialize, AudioInitialize)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_VideoInitialize, VideoInitialize)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_StartPlayingFrom, StartPlayingFrom)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_Flush, Flush)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_Stop, Stop)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_SetPlaybackRate, SetPlaybackRate)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_SetVolume, SetVolume)
|
| - IPC_MESSAGE_HANDLER(CmaHostMsg_NotifyPipeWrite, NotifyPipeWrite)
|
| - IPC_MESSAGE_UNHANDLED(handled = false)
|
| - IPC_END_MESSAGE_MAP()
|
| -
|
| - return handled;
|
| -}
|
| -
|
| -void CmaMessageFilterHost::DeleteEntries() {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| -
|
| - for (MediaPipelineMap::iterator it = media_pipelines_.begin();
|
| - it != media_pipelines_.end(); ) {
|
| - int media_id = it->first;
|
| - std::unique_ptr<MediaPipelineHost> media_pipeline(it->second);
|
| - media_pipelines_.erase(it++);
|
| - task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineCmaMap::DestroyMediaPipeline,
|
| - base::Unretained(g_pipeline_map.Pointer()), process_id_,
|
| - media_id, base::Passed(&media_pipeline)));
|
| - }
|
| -}
|
| -
|
| -MediaPipelineHost* CmaMessageFilterHost::LookupById(int media_id) {
|
| - MediaPipelineMap::iterator it = media_pipelines_.find(media_id);
|
| - if (it == media_pipelines_.end())
|
| - return NULL;
|
| - return it->second;
|
| -}
|
| -
|
| -
|
| -// *** Handle incoming messages ***
|
| -
|
| -void CmaMessageFilterHost::CreateMedia(int media_id, LoadType load_type) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| -
|
| - std::unique_ptr<MediaPipelineHost> media_pipeline_host(
|
| - new MediaPipelineHost());
|
| - MediaPipelineClient client;
|
| - client.time_update_cb = ::media::BindToCurrentLoop(base::Bind(
|
| - &CmaMessageFilterHost::OnTimeUpdate, weak_this_, media_id));
|
| - client.buffering_state_cb = ::media::BindToCurrentLoop(base::Bind(
|
| - &CmaMessageFilterHost::OnBufferingNotification, weak_this_, media_id));
|
| - client.error_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnPlaybackError,
|
| - weak_this_, media_id, media::kNoTrackId));
|
| - client.pipeline_backend_created_cb =
|
| - base::Bind(&MediaResourceTracker::IncrementUsageCount,
|
| - base::Unretained(resource_tracker_));
|
| - client.pipeline_backend_destroyed_cb =
|
| - base::Bind(&MediaResourceTracker::DecrementUsageCount,
|
| - base::Unretained(resource_tracker_));
|
| -
|
| - task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&MediaPipelineCmaMap::SetMediaPipeline,
|
| - base::Unretained(g_pipeline_map.Pointer()),
|
| - process_id_, media_id, media_pipeline_host.get()));
|
| - task_runner_->PostTask(FROM_HERE,
|
| - base::Bind(&MediaPipelineHost::Initialize,
|
| - base::Unretained(media_pipeline_host.get()),
|
| - load_type, client, create_backend_cb_));
|
| - std::pair<MediaPipelineMap::iterator, bool> ret =
|
| - media_pipelines_.insert(
|
| - std::make_pair(media_id, media_pipeline_host.release()));
|
| -
|
| - // Check there is no other entry with the same ID.
|
| - DCHECK(ret.second != false);
|
| -}
|
| -
|
| -void CmaMessageFilterHost::DestroyMedia(int media_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| -
|
| - MediaPipelineMap::iterator it = media_pipelines_.find(media_id);
|
| - if (it == media_pipelines_.end())
|
| - return;
|
| -
|
| - std::unique_ptr<MediaPipelineHost> media_pipeline(it->second);
|
| - media_pipelines_.erase(it);
|
| - task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineCmaMap::DestroyMediaPipeline,
|
| - base::Unretained(g_pipeline_map.Pointer()), process_id_,
|
| - media_id, base::Passed(&media_pipeline)));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::SetCdm(int media_id,
|
| - int render_frame_id,
|
| - int cdm_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline)
|
| - return;
|
| -
|
| - content::BrowserThread::PostTask(
|
| - content::BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&SetCdmOnUiThread, process_id_, render_frame_id, media_id,
|
| - cdm_id, task_runner_));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::CreateAvPipe(
|
| - int media_id, TrackId track_id, size_t shared_mem_size) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| -
|
| - base::FileDescriptor foreign_socket_handle;
|
| - base::SharedMemoryHandle foreign_memory_handle;
|
| -
|
| - // A few sanity checks before allocating resources.
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline || !PeerHandle() || shared_mem_size > kMaxSharedMem) {
|
| - Send(new CmaMsg_AvPipeCreated(
|
| - media_id, track_id, false,
|
| - foreign_memory_handle, foreign_socket_handle));
|
| - return;
|
| - }
|
| -
|
| - // Create the local/foreign sockets to signal media message
|
| - // consune/feed events.
|
| - // Use CancelableSyncSocket so that write is always non-blocking.
|
| - std::unique_ptr<base::CancelableSyncSocket> local_socket(
|
| - new base::CancelableSyncSocket());
|
| - std::unique_ptr<base::CancelableSyncSocket> foreign_socket(
|
| - new base::CancelableSyncSocket());
|
| - if (!base::CancelableSyncSocket::CreatePair(local_socket.get(),
|
| - foreign_socket.get()) ||
|
| - foreign_socket->handle() == -1) {
|
| - Send(new CmaMsg_AvPipeCreated(
|
| - media_id, track_id, false,
|
| - foreign_memory_handle, foreign_socket_handle));
|
| - return;
|
| - }
|
| -
|
| - // Shared memory used to convey media messages.
|
| - std::unique_ptr<base::SharedMemory> shared_memory(new base::SharedMemory());
|
| - if (!shared_memory->CreateAndMapAnonymous(shared_mem_size) ||
|
| - !shared_memory->ShareToProcess(PeerHandle(), &foreign_memory_handle)) {
|
| - Send(new CmaMsg_AvPipeCreated(
|
| - media_id, track_id, false,
|
| - foreign_memory_handle, foreign_socket_handle));
|
| - return;
|
| - }
|
| -
|
| - // Note: the IPC message can be sent only once the pipe has been fully
|
| - // configured. Part of this configuration is done in
|
| - // |MediaPipelineHost::SetAvPipe|.
|
| - // TODO(erickung): investigate possible memory leak here.
|
| - // If the weak pointer in |av_pipe_set_cb| gets invalidated,
|
| - // then |foreign_memory_handle| leaks.
|
| - base::Closure pipe_read_activity_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnPipeReadActivity, weak_this_,
|
| - media_id, track_id));
|
| - base::Closure av_pipe_set_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnAvPipeSet, weak_this_,
|
| - media_id, track_id,
|
| - foreign_memory_handle, base::Passed(&foreign_socket)));
|
| - task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineHost::SetAvPipe,
|
| - base::Unretained(media_pipeline),
|
| - track_id,
|
| - base::Passed(&shared_memory),
|
| - pipe_read_activity_cb,
|
| - av_pipe_set_cb));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnAvPipeSet(
|
| - int media_id,
|
| - TrackId track_id,
|
| - base::SharedMemoryHandle foreign_memory_handle,
|
| - std::unique_ptr<base::CancelableSyncSocket> foreign_socket) {
|
| - base::FileDescriptor foreign_socket_handle;
|
| - foreign_socket_handle.fd = foreign_socket->handle();
|
| - foreign_socket_handle.auto_close = false;
|
| -
|
| - // This message can only be set once the pipe has fully been configured
|
| - // by |MediaPipelineHost|.
|
| - Send(new CmaMsg_AvPipeCreated(
|
| - media_id, track_id, true, foreign_memory_handle, foreign_socket_handle));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::AudioInitialize(
|
| - int media_id, TrackId track_id, const ::media::AudioDecoderConfig& config) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline) {
|
| - Send(new CmaMsg_TrackStateChanged(
|
| - media_id, track_id, ::media::PIPELINE_ERROR_ABORT));
|
| - return;
|
| - }
|
| -
|
| - AvPipelineClient client;
|
| - client.wait_for_key_cb = ::media::BindToCurrentLoop(base::Bind(
|
| - &CmaMessageFilterHost::OnWaitForKey, weak_this_, media_id, track_id));
|
| - client.eos_cb = ::media::BindToCurrentLoop(base::Bind(
|
| - &CmaMessageFilterHost::OnEos, weak_this_, media_id, track_id));
|
| - client.playback_error_cb = ::media::BindToCurrentLoop(base::Bind(
|
| - &CmaMessageFilterHost::OnPlaybackError, weak_this_, media_id, track_id));
|
| - client.statistics_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnStatisticsUpdated, weak_this_,
|
| - media_id, track_id));
|
| -
|
| - ::media::PipelineStatusCB pipeline_status_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnTrackStateChanged, weak_this_,
|
| - media_id, track_id));
|
| - task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineHost::AudioInitialize,
|
| - base::Unretained(media_pipeline),
|
| - track_id, client, config, pipeline_status_cb));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::VideoInitialize(
|
| - int media_id, TrackId track_id,
|
| - const std::vector<::media::VideoDecoderConfig>& configs) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline) {
|
| - Send(new CmaMsg_TrackStateChanged(
|
| - media_id, track_id, ::media::PIPELINE_ERROR_ABORT));
|
| - return;
|
| - }
|
| -
|
| - VideoPipelineClient client;
|
| - client.av_pipeline_client.wait_for_key_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnWaitForKey, weak_this_,
|
| - media_id, track_id));
|
| - client.av_pipeline_client.eos_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnEos, weak_this_,
|
| - media_id, track_id));
|
| - client.av_pipeline_client.playback_error_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnPlaybackError, weak_this_,
|
| - media_id, track_id));
|
| - client.av_pipeline_client.statistics_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnStatisticsUpdated, weak_this_,
|
| - media_id, track_id));
|
| - client.natural_size_changed_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnNaturalSizeChanged, weak_this_,
|
| - media_id, track_id));
|
| -
|
| - ::media::PipelineStatusCB pipeline_status_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnTrackStateChanged, weak_this_,
|
| - media_id, track_id));
|
| - task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineHost::VideoInitialize,
|
| - base::Unretained(media_pipeline),
|
| - track_id, client, configs, pipeline_status_cb));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::StartPlayingFrom(
|
| - int media_id, base::TimeDelta time) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline)
|
| - return;
|
| - FORWARD_CALL(media_pipeline, StartPlayingFrom, time);
|
| -}
|
| -
|
| -void CmaMessageFilterHost::Flush(int media_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline) {
|
| - Send(new CmaMsg_FlushDone(media_id));
|
| - return;
|
| - }
|
| - base::Closure flush_cb = ::media::BindToCurrentLoop(
|
| - base::Bind(&CmaMessageFilterHost::OnFlushDone, weak_this_, media_id));
|
| - FORWARD_CALL(media_pipeline, Flush, flush_cb);
|
| -}
|
| -
|
| -void CmaMessageFilterHost::Stop(int media_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline)
|
| - return;
|
| - task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&MediaPipelineHost::Stop,
|
| - base::Unretained(media_pipeline)));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::SetPlaybackRate(
|
| - int media_id, double playback_rate) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline)
|
| - return;
|
| - FORWARD_CALL(media_pipeline, SetPlaybackRate, playback_rate);
|
| -}
|
| -
|
| -void CmaMessageFilterHost::SetVolume(
|
| - int media_id, TrackId track_id, float volume) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline)
|
| - return;
|
| - FORWARD_CALL(media_pipeline, SetVolume, track_id, volume);
|
| -}
|
| -
|
| -void CmaMessageFilterHost::NotifyPipeWrite(int media_id, TrackId track_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - MediaPipelineHost* media_pipeline = LookupById(media_id);
|
| - if (!media_pipeline)
|
| - return;
|
| - FORWARD_CALL(media_pipeline, NotifyPipeWrite, track_id);
|
| -}
|
| -
|
| -// *** Browser to renderer messages ***
|
| -
|
| -void CmaMessageFilterHost::OnFlushDone(int media_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_FlushDone(media_id));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnTrackStateChanged(
|
| - int media_id, TrackId track_id, ::media::PipelineStatus status) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_TrackStateChanged(media_id, track_id, status));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnPipeReadActivity(int media_id, TrackId track_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_NotifyPipeRead(media_id, track_id));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnTimeUpdate(
|
| - int media_id,
|
| - base::TimeDelta media_time,
|
| - base::TimeDelta max_media_time,
|
| - base::TimeTicks stc) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_TimeUpdate(media_id,
|
| - media_time, max_media_time, stc));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnBufferingNotification(
|
| - int media_id, ::media::BufferingState state) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_BufferingNotification(media_id, state));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnWaitForKey(int media_id, TrackId track_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_WaitForKey(media_id, track_id));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnEos(int media_id, TrackId track_id) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_Eos(media_id, track_id));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnPlaybackError(
|
| - int media_id, TrackId track_id, ::media::PipelineStatus status) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_PlaybackError(media_id, track_id, status));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnStatisticsUpdated(
|
| - int media_id, TrackId track_id, const ::media::PipelineStatistics& stats) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_PlaybackStatistics(media_id, track_id, stats));
|
| -}
|
| -
|
| -void CmaMessageFilterHost::OnNaturalSizeChanged(
|
| - int media_id, TrackId track_id, const gfx::Size& size) {
|
| - DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
|
| - Send(new CmaMsg_NaturalSizeChanged(media_id, track_id, size));
|
| -}
|
| -
|
| -} // namespace media
|
| -} // namespace chromecast
|
|
|