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

Side by Side Diff: media/remoting/remoting_controller.cc

Issue 2389473002: Media Remoting: Add RemotingController. (Closed)
Patch Set: Created 4 years, 2 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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/remoting/remoting_controller.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "media/base/bind_to_current_loop.h"
10
11 namespace media {
12
13 RemotingController::RemotingController(mojom::RemoterFactory* remoter_factory)
14 : is_fullscreen_(false),
15 is_sink_available_(false),
16 is_remoting_(false),
17 binding_(this),
18 task_runner_(base::ThreadTaskRunnerHandle::Get()) {
19 remoter_factory->Create(binding_.CreateInterfacePtrAndBind(),
20 mojo::GetProxy(&remoter_));
21 }
22
23 RemotingController::~RemotingController() {}
24
25 void RemotingController::OnSinkAvailable() {
26 DCHECK(task_runner_->BelongsToCurrentThread());
27
28 is_sink_available_ = true;
29 Update();
30 }
31
32 void RemotingController::OnSinkGone() {
33 DCHECK(task_runner_->BelongsToCurrentThread());
34
35 is_sink_available_ = false;
36 Update();
37 }
38
39 void RemotingController::OnStarted() {
40 DCHECK(task_runner_->BelongsToCurrentThread());
41
42 VLOG(1) << "Remoting started successively.";
43 if (is_remoting_)
44 switch_renderer_cb_.Run();
45 else
46 remoter_->Stop(mojom::RemotingStopReason::LOCAL_PLAYBACK);
47 }
48
49 void RemotingController::OnStartFailed(mojom::RemotingStartFailReason reason) {
50 DCHECK(task_runner_->BelongsToCurrentThread());
51
52 VLOG(1) << "Failed to start remoting:" << reason;
53 is_remoting_ = false;
54 }
55
56 void RemotingController::OnMessageFromSink(
57 const std::vector<uint8_t>& message) {
58 DCHECK(task_runner_->BelongsToCurrentThread());
59
60 // TODO(xjz): Merge with Eric's CL to handle the RPC messages here.
61 NOTIMPLEMENTED();
62 }
63
64 void RemotingController::OnStopped(mojom::RemotingStopReason reason) {
65 DCHECK(task_runner_->BelongsToCurrentThread());
66
67 VLOG(1) << "Remoting stopped: " << reason;
68 is_remoting_ = false;
69 }
70
71 void RemotingController::OnEnteredFullscreen() {
72 DCHECK(task_runner_->BelongsToCurrentThread());
73
74 is_fullscreen_ = true;
75 Update();
76 }
77
78 void RemotingController::OnExitedFullscreen() {
79 DCHECK(task_runner_->BelongsToCurrentThread());
80
81 is_fullscreen_ = false;
82 Update();
83 }
84
85 void RemotingController::OnSetCdm(CdmContext* cdm_context) {
86 DCHECK(task_runner_->BelongsToCurrentThread());
87
88 // TODO(xjz): Not implemented. Will add in up-coming change.
89 NOTIMPLEMENTED();
90 }
91
92 void RemotingController::SetSwitchRenderCallback(
93 const SwitchRendererCallback& cb) {
94 DCHECK(task_runner_->BelongsToCurrentThread());
95 DCHECK(!cb.is_null());
96
97 switch_renderer_cb_ = cb;
98 }
99
100 void RemotingController::OnDecoderConfigChanged(
101 const AudioDecoderConfig& audio_config,
102 const VideoDecoderConfig& video_config) {
103 DCHECK(task_runner_->BelongsToCurrentThread());
104
105 audio_decoder_config_ = audio_config;
106 video_decoder_config_ = video_config;
107 Update();
108 }
109
110 bool RemotingController::isVideoConfigSupported() {
111 DCHECK(task_runner_->BelongsToCurrentThread());
112
113 if (!video_decoder_config_.IsValidConfig())
114 return false;
xhwang 2016/10/01 07:12:15 You should be able to DCHECK in OnDecoderConfigCha
xjz 2016/10/03 22:31:08 Done.
115
116 switch (video_decoder_config_.codec()) {
117 case VideoCodec::kCodecH264:
118 case VideoCodec::kCodecVP8:
xhwang 2016/10/01 07:12:15 Just OCC, VP9 is not supported?
xjz 2016/10/03 22:31:08 For now, assume receiver only supports H264 and VP
119 return true;
120 default:
121 VLOG(2) << "Remoting does not support video codec: "
122 << video_decoder_config_.codec();
123 return false;
124 }
125 }
126
127 bool RemotingController::isAudioConfigSupported() {
128 DCHECK(task_runner_->BelongsToCurrentThread());
129
130 if (!audio_decoder_config_.IsValidConfig())
131 return false;
xhwang 2016/10/01 07:12:15 ditto
xjz 2016/10/03 22:31:08 Done.
132
133 switch (audio_decoder_config_.codec()) {
134 case AudioCodec::kCodecAAC:
135 case AudioCodec::kCodecMP3:
136 case AudioCodec::kCodecPCM:
137 case AudioCodec::kCodecVorbis:
138 case AudioCodec::kCodecFLAC:
139 case AudioCodec::kCodecAMR_NB:
140 case AudioCodec::kCodecAMR_WB:
141 case AudioCodec::kCodecPCM_MULAW:
142 case AudioCodec::kCodecGSM_MS:
143 case AudioCodec::kCodecPCM_S16BE:
144 case AudioCodec::kCodecPCM_S24BE:
145 case AudioCodec::kCodecOpus:
146 case AudioCodec::kCodecEAC3:
147 case AudioCodec::kCodecPCM_ALAW:
148 case AudioCodec::kCodecALAC:
149 case AudioCodec::kCodecAC3:
150 return true;
151 default:
152 VLOG(2) << "Remoting does not support audio codec: "
153 << audio_decoder_config_.codec();
154 return false;
155 }
156 }
157
158 void RemotingController::Update() {
159 DCHECK(task_runner_->BelongsToCurrentThread());
160
161 // TODO(xjz): The switching logic for encrypted content will be added in a
162 // later CL.
163
164 bool should_be_remoting =
165 is_sink_available_ && is_fullscreen_ && isVideoConfigSupported() &&
166 isAudioConfigSupported() && !video_decoder_config_.is_encrypted() &&
167 !switch_renderer_cb_.is_null();
168 if (is_remoting_ == should_be_remoting)
169 return;
170
171 // Switch between local and remoting.
172 is_remoting_ = should_be_remoting;
173 if (is_remoting_) {
174 remoter_->Start();
175 } else {
176 switch_renderer_cb_.Run();
177 remoter_->Stop(mojom::RemotingStopReason::LOCAL_PLAYBACK);
178 }
179 }
180
181 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698