cast_environment.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "media/cast/cast_environment.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/location.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h" 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::SingleThreadTaskRunner; 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void DeleteLoggingOnMainThread(scoped_ptr<media::cast::LoggingImpl> logging) { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) logging.reset(); 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace media { 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace cast { 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)CastEnvironment::CastEnvironment( 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::TickClock> clock, 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<SingleThreadTaskRunner> main_thread_proxy, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<SingleThreadTaskRunner> audio_encode_thread_proxy, 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<SingleThreadTaskRunner> audio_decode_thread_proxy, 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<SingleThreadTaskRunner> video_encode_thread_proxy, 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<SingleThreadTaskRunner> video_decode_thread_proxy, 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<SingleThreadTaskRunner> transport_thread_proxy, 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const CastLoggingConfig& logging_config) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : main_thread_proxy_(main_thread_proxy), 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) audio_encode_thread_proxy_(audio_encode_thread_proxy), 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) audio_decode_thread_proxy_(audio_decode_thread_proxy), 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) video_encode_thread_proxy_(video_encode_thread_proxy), 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) video_decode_thread_proxy_(video_decode_thread_proxy), 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) transport_thread_proxy_(transport_thread_proxy), 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) clock_(clock.Pass()), 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) logging_(new LoggingImpl(logging_config)) {} 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)CastEnvironment::~CastEnvironment() { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Logging must be deleted on the main thread. 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (main_thread_proxy_ && !main_thread_proxy_->RunsTasksOnCurrentThread()) { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) main_thread_proxy_->PostTask( 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&DeleteLoggingOnMainThread, base::Passed(&logging_))); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CastEnvironment::PostTask(ThreadId identifier, 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const tracked_objects::Location& from_here, 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Closure& task) { 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetTaskRunner(identifier)->PostTask(from_here, task); 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool CastEnvironment::PostDelayedTask( 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ThreadId identifier, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const tracked_objects::Location& from_here, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Closure& task, 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeDelta delay) { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetTaskRunner(identifier)->PostDelayedTask(from_here, task, delay); 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_refptr<SingleThreadTaskRunner> CastEnvironment::GetTaskRunner( 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ThreadId identifier) const { 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switch (identifier) { 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::MAIN: 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return main_thread_proxy_; 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::AUDIO_ENCODER: 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return audio_encode_thread_proxy_; 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::AUDIO_DECODER: 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return audio_decode_thread_proxy_; 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::VIDEO_ENCODER: 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return video_encode_thread_proxy_; 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::VIDEO_DECODER: 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return video_decode_thread_proxy_; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case CastEnvironment::TRANSPORT: 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return transport_thread_proxy_; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED() << "Invalid Thread identifier"; 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return NULL; 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool CastEnvironment::CurrentlyOn(ThreadId identifier) { 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (identifier) { 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::MAIN: 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return main_thread_proxy_ && 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) main_thread_proxy_->RunsTasksOnCurrentThread(); 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::AUDIO_ENCODER: 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return audio_encode_thread_proxy_ && 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) audio_encode_thread_proxy_->RunsTasksOnCurrentThread(); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::AUDIO_DECODER: 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return audio_decode_thread_proxy_ && 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) audio_decode_thread_proxy_->RunsTasksOnCurrentThread(); 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::VIDEO_ENCODER: 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return video_encode_thread_proxy_ && 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) video_encode_thread_proxy_->RunsTasksOnCurrentThread(); 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case CastEnvironment::VIDEO_DECODER: 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return video_decode_thread_proxy_ && 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) video_decode_thread_proxy_->RunsTasksOnCurrentThread(); 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case CastEnvironment::TRANSPORT: 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return transport_thread_proxy_ && 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) transport_thread_proxy_->RunsTasksOnCurrentThread(); 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NOTREACHED() << "Invalid thread identifier"; 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace cast 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace media 114