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