cast_environment.cc revision f2477e01787aa58f445919b809d89e252beef54f
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/cast/cast_environment.h"
6
7#include "base/logging.h"
8
9using base::TaskRunner;
10
11namespace media {
12namespace cast {
13
14CastEnvironment::CastEnvironment(
15    base::TickClock* clock,
16    scoped_refptr<TaskRunner> main_thread_proxy,
17    scoped_refptr<TaskRunner> audio_encode_thread_proxy,
18    scoped_refptr<TaskRunner> audio_decode_thread_proxy,
19    scoped_refptr<TaskRunner> video_encode_thread_proxy,
20    scoped_refptr<TaskRunner> video_decode_thread_proxy,
21    const CastLoggingConfig& config)
22    : clock_(clock),
23      main_thread_proxy_(main_thread_proxy),
24      audio_encode_thread_proxy_(audio_encode_thread_proxy),
25      audio_decode_thread_proxy_(audio_decode_thread_proxy),
26      video_encode_thread_proxy_(video_encode_thread_proxy),
27      video_decode_thread_proxy_(video_decode_thread_proxy),
28      logging_(new LoggingImpl(clock, main_thread_proxy, config)) {
29  DCHECK(main_thread_proxy) << "Main thread required";
30}
31
32CastEnvironment::~CastEnvironment() {}
33
34bool CastEnvironment::PostTask(ThreadId identifier,
35                          const tracked_objects::Location& from_here,
36                          const base::Closure& task) {
37  scoped_refptr<TaskRunner> task_runner =
38      GetMessageTaskRunnerForThread(identifier);
39
40  return task_runner->PostTask(from_here, task);
41}
42
43bool CastEnvironment::PostDelayedTask(ThreadId identifier,
44                                 const tracked_objects::Location& from_here,
45                                 const base::Closure& task,
46                                 base::TimeDelta delay) {
47  scoped_refptr<TaskRunner> task_runner =
48      GetMessageTaskRunnerForThread(identifier);
49
50  return task_runner->PostDelayedTask(from_here, task, delay);
51}
52
53scoped_refptr<TaskRunner> CastEnvironment::GetMessageTaskRunnerForThread(
54    ThreadId identifier) {
55  switch (identifier) {
56    case CastEnvironment::MAIN:
57      return main_thread_proxy_;
58    case CastEnvironment::AUDIO_ENCODER:
59      return audio_encode_thread_proxy_;
60    case CastEnvironment::AUDIO_DECODER:
61      return audio_decode_thread_proxy_;
62    case CastEnvironment::VIDEO_ENCODER:
63      return video_encode_thread_proxy_;
64    case CastEnvironment::VIDEO_DECODER:
65      return video_decode_thread_proxy_;
66    default:
67      NOTREACHED() << "Invalid Thread identifier";
68      return NULL;
69  }
70}
71
72bool CastEnvironment::CurrentlyOn(ThreadId identifier) {
73  switch (identifier) {
74    case CastEnvironment::MAIN:
75      return main_thread_proxy_->RunsTasksOnCurrentThread();
76    case CastEnvironment::AUDIO_ENCODER:
77      return audio_encode_thread_proxy_->RunsTasksOnCurrentThread();
78    case CastEnvironment::AUDIO_DECODER:
79      return audio_decode_thread_proxy_->RunsTasksOnCurrentThread();
80    case CastEnvironment::VIDEO_ENCODER:
81      return video_encode_thread_proxy_->RunsTasksOnCurrentThread();
82    case CastEnvironment::VIDEO_DECODER:
83      return video_decode_thread_proxy_->RunsTasksOnCurrentThread();
84    default:
85      NOTREACHED() << "Invalid thread identifier";
86      return false;
87  }
88}
89
90base::TickClock* CastEnvironment::Clock() const {
91  return clock_;
92}
93
94LoggingImpl* CastEnvironment::Logging() {
95  DCHECK(CurrentlyOn(CastEnvironment::MAIN)) <<
96      "Must be called from main thread";
97  return logging_.get();
98}
99
100}  // namespace cast
101}  // namespace media
102