OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/renderer/media/cast_session_delegate.h" | 5 #include "chrome/renderer/media/cast_session_delegate.h" |
6 | 6 |
| 7 #include <utility> |
| 8 |
7 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
8 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
9 #include "base/logging.h" | 11 #include "base/logging.h" |
10 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
11 #include "base/strings/stringprintf.h" | 13 #include "base/strings/stringprintf.h" |
12 #include "base/thread_task_runner_handle.h" | 14 #include "base/thread_task_runner_handle.h" |
13 #include "build/build_config.h" | 15 #include "build/build_config.h" |
14 #include "chrome/renderer/media/cast_threads.h" | 16 #include "chrome/renderer/media/cast_threads.h" |
15 #include "chrome/renderer/media/cast_transport_sender_ipc.h" | 17 #include "chrome/renderer/media/cast_transport_sender_ipc.h" |
16 #include "components/version_info/version_info.h" | 18 #include "components/version_info/version_info.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 const net::IPEndPoint& local_endpoint, | 60 const net::IPEndPoint& local_endpoint, |
59 const net::IPEndPoint& remote_endpoint, | 61 const net::IPEndPoint& remote_endpoint, |
60 scoped_ptr<base::DictionaryValue> options, | 62 scoped_ptr<base::DictionaryValue> options, |
61 const ErrorCallback& error_callback) { | 63 const ErrorCallback& error_callback) { |
62 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 64 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
63 | 65 |
64 // CastSender uses the renderer's IO thread as the main thread. This reduces | 66 // CastSender uses the renderer's IO thread as the main thread. This reduces |
65 // thread hopping for incoming video frames and outgoing network packets. | 67 // thread hopping for incoming video frames and outgoing network packets. |
66 // TODO(hubbe): Create cast environment in ctor instead. | 68 // TODO(hubbe): Create cast environment in ctor instead. |
67 cast_environment_ = new CastEnvironment( | 69 cast_environment_ = new CastEnvironment( |
68 scoped_ptr<base::TickClock>(new base::DefaultTickClock()).Pass(), | 70 scoped_ptr<base::TickClock>(new base::DefaultTickClock()), |
69 base::ThreadTaskRunnerHandle::Get(), | 71 base::ThreadTaskRunnerHandle::Get(), |
70 g_cast_threads.Get().GetAudioEncodeMessageLoopProxy(), | 72 g_cast_threads.Get().GetAudioEncodeMessageLoopProxy(), |
71 g_cast_threads.Get().GetVideoEncodeMessageLoopProxy()); | 73 g_cast_threads.Get().GetVideoEncodeMessageLoopProxy()); |
72 | 74 |
73 // Rationale for using unretained: The callback cannot be called after the | 75 // Rationale for using unretained: The callback cannot be called after the |
74 // destruction of CastTransportSenderIPC, and they both share the same thread. | 76 // destruction of CastTransportSenderIPC, and they both share the same thread. |
75 cast_transport_.reset(new CastTransportSenderIPC( | 77 cast_transport_.reset(new CastTransportSenderIPC( |
76 local_endpoint, | 78 local_endpoint, remote_endpoint, std::move(options), |
77 remote_endpoint, | |
78 options.Pass(), | |
79 base::Bind(&CastSessionDelegateBase::ReceivePacket, | 79 base::Bind(&CastSessionDelegateBase::ReceivePacket, |
80 base::Unretained(this)), | 80 base::Unretained(this)), |
81 base::Bind(&CastSessionDelegateBase::StatusNotificationCB, | 81 base::Bind(&CastSessionDelegateBase::StatusNotificationCB, |
82 base::Unretained(this), error_callback), | 82 base::Unretained(this), error_callback), |
83 base::Bind(&media::cast::LogEventDispatcher::DispatchBatchOfEvents, | 83 base::Bind(&media::cast::LogEventDispatcher::DispatchBatchOfEvents, |
84 base::Unretained(cast_environment_->logger())))); | 84 base::Unretained(cast_environment_->logger())))); |
85 } | 85 } |
86 | 86 |
87 void CastSessionDelegateBase::StatusNotificationCB( | 87 void CastSessionDelegateBase::StatusNotificationCB( |
88 const ErrorCallback& error_callback, | 88 const ErrorCallback& error_callback, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 create_video_encode_mem_cb); | 156 create_video_encode_mem_cb); |
157 } | 157 } |
158 | 158 |
159 | 159 |
160 void CastSessionDelegate::StartUDP( | 160 void CastSessionDelegate::StartUDP( |
161 const net::IPEndPoint& local_endpoint, | 161 const net::IPEndPoint& local_endpoint, |
162 const net::IPEndPoint& remote_endpoint, | 162 const net::IPEndPoint& remote_endpoint, |
163 scoped_ptr<base::DictionaryValue> options, | 163 scoped_ptr<base::DictionaryValue> options, |
164 const ErrorCallback& error_callback) { | 164 const ErrorCallback& error_callback) { |
165 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 165 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
166 CastSessionDelegateBase::StartUDP(local_endpoint, | 166 CastSessionDelegateBase::StartUDP(local_endpoint, remote_endpoint, |
167 remote_endpoint, | 167 std::move(options), error_callback); |
168 options.Pass(), | |
169 error_callback); | |
170 event_subscribers_.reset( | 168 event_subscribers_.reset( |
171 new media::cast::RawEventSubscriberBundle(cast_environment_)); | 169 new media::cast::RawEventSubscriberBundle(cast_environment_)); |
172 | 170 |
173 cast_sender_ = CastSender::Create(cast_environment_, cast_transport_.get()); | 171 cast_sender_ = CastSender::Create(cast_environment_, cast_transport_.get()); |
174 } | 172 } |
175 | 173 |
176 void CastSessionDelegate::ToggleLogging(bool is_audio, bool enable) { | 174 void CastSessionDelegate::ToggleLogging(bool is_audio, bool enable) { |
177 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 175 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
178 if (!event_subscribers_.get()) | 176 if (!event_subscribers_.get()) |
179 return; | 177 return; |
180 | 178 |
181 if (enable) | 179 if (enable) |
182 event_subscribers_->AddEventSubscribers(is_audio); | 180 event_subscribers_->AddEventSubscribers(is_audio); |
183 else | 181 else |
184 event_subscribers_->RemoveEventSubscribers(is_audio); | 182 event_subscribers_->RemoveEventSubscribers(is_audio); |
185 } | 183 } |
186 | 184 |
187 void CastSessionDelegate::GetEventLogsAndReset( | 185 void CastSessionDelegate::GetEventLogsAndReset( |
188 bool is_audio, | 186 bool is_audio, |
189 const std::string& extra_data, | 187 const std::string& extra_data, |
190 const EventLogsCallback& callback) { | 188 const EventLogsCallback& callback) { |
191 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 189 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
192 | 190 |
193 if (!event_subscribers_.get()) { | 191 if (!event_subscribers_.get()) { |
194 callback.Run(make_scoped_ptr(new base::BinaryValue).Pass()); | 192 callback.Run(make_scoped_ptr(new base::BinaryValue)); |
195 return; | 193 return; |
196 } | 194 } |
197 | 195 |
198 media::cast::EncodingEventSubscriber* subscriber = | 196 media::cast::EncodingEventSubscriber* subscriber = |
199 event_subscribers_->GetEncodingEventSubscriber(is_audio); | 197 event_subscribers_->GetEncodingEventSubscriber(is_audio); |
200 if (!subscriber) { | 198 if (!subscriber) { |
201 callback.Run(make_scoped_ptr(new base::BinaryValue).Pass()); | 199 callback.Run(make_scoped_ptr(new base::BinaryValue)); |
202 return; | 200 return; |
203 } | 201 } |
204 | 202 |
205 media::cast::proto::LogMetadata metadata; | 203 media::cast::proto::LogMetadata metadata; |
206 media::cast::FrameEventList frame_events; | 204 media::cast::FrameEventList frame_events; |
207 media::cast::PacketEventList packet_events; | 205 media::cast::PacketEventList packet_events; |
208 | 206 |
209 subscriber->GetEventsAndReset(&metadata, &frame_events, &packet_events); | 207 subscriber->GetEventsAndReset(&metadata, &frame_events, &packet_events); |
210 | 208 |
211 if (!extra_data.empty()) | 209 if (!extra_data.empty()) |
212 metadata.set_extra_data(extra_data); | 210 metadata.set_extra_data(extra_data); |
213 media::cast::proto::GeneralDescription* gen_desc = | 211 media::cast::proto::GeneralDescription* gen_desc = |
214 metadata.mutable_general_description(); | 212 metadata.mutable_general_description(); |
215 gen_desc->set_product(version_info::GetProductName()); | 213 gen_desc->set_product(version_info::GetProductName()); |
216 gen_desc->set_product_version(version_info::GetVersionNumber()); | 214 gen_desc->set_product_version(version_info::GetVersionNumber()); |
217 gen_desc->set_os(version_info::GetOSType()); | 215 gen_desc->set_os(version_info::GetOSType()); |
218 | 216 |
219 scoped_ptr<char[]> serialized_log(new char[media::cast::kMaxSerializedBytes]); | 217 scoped_ptr<char[]> serialized_log(new char[media::cast::kMaxSerializedBytes]); |
220 int output_bytes; | 218 int output_bytes; |
221 bool success = media::cast::SerializeEvents(metadata, | 219 bool success = media::cast::SerializeEvents(metadata, |
222 frame_events, | 220 frame_events, |
223 packet_events, | 221 packet_events, |
224 true, | 222 true, |
225 media::cast::kMaxSerializedBytes, | 223 media::cast::kMaxSerializedBytes, |
226 serialized_log.get(), | 224 serialized_log.get(), |
227 &output_bytes); | 225 &output_bytes); |
228 | 226 |
229 if (!success) { | 227 if (!success) { |
230 DVLOG(2) << "Failed to serialize event log."; | 228 DVLOG(2) << "Failed to serialize event log."; |
231 callback.Run(make_scoped_ptr(new base::BinaryValue).Pass()); | 229 callback.Run(make_scoped_ptr(new base::BinaryValue)); |
232 return; | 230 return; |
233 } | 231 } |
234 | 232 |
235 DVLOG(2) << "Serialized log length: " << output_bytes; | 233 DVLOG(2) << "Serialized log length: " << output_bytes; |
236 | 234 |
237 scoped_ptr<base::BinaryValue> blob( | 235 scoped_ptr<base::BinaryValue> blob( |
238 new base::BinaryValue(serialized_log.Pass(), output_bytes)); | 236 new base::BinaryValue(std::move(serialized_log), output_bytes)); |
239 callback.Run(blob.Pass()); | 237 callback.Run(std::move(blob)); |
240 } | 238 } |
241 | 239 |
242 void CastSessionDelegate::GetStatsAndReset(bool is_audio, | 240 void CastSessionDelegate::GetStatsAndReset(bool is_audio, |
243 const StatsCallback& callback) { | 241 const StatsCallback& callback) { |
244 DCHECK(io_task_runner_->BelongsToCurrentThread()); | 242 DCHECK(io_task_runner_->BelongsToCurrentThread()); |
245 | 243 |
246 if (!event_subscribers_.get()) { | 244 if (!event_subscribers_.get()) { |
247 callback.Run(make_scoped_ptr(new base::DictionaryValue).Pass()); | 245 callback.Run(make_scoped_ptr(new base::DictionaryValue)); |
248 return; | 246 return; |
249 } | 247 } |
250 | 248 |
251 media::cast::StatsEventSubscriber* subscriber = | 249 media::cast::StatsEventSubscriber* subscriber = |
252 event_subscribers_->GetStatsEventSubscriber(is_audio); | 250 event_subscribers_->GetStatsEventSubscriber(is_audio); |
253 if (!subscriber) { | 251 if (!subscriber) { |
254 callback.Run(make_scoped_ptr(new base::DictionaryValue).Pass()); | 252 callback.Run(make_scoped_ptr(new base::DictionaryValue)); |
255 return; | 253 return; |
256 } | 254 } |
257 | 255 |
258 scoped_ptr<base::DictionaryValue> stats = subscriber->GetStats(); | 256 scoped_ptr<base::DictionaryValue> stats = subscriber->GetStats(); |
259 subscriber->Reset(); | 257 subscriber->Reset(); |
260 | 258 |
261 callback.Run(stats.Pass()); | 259 callback.Run(std::move(stats)); |
262 } | 260 } |
263 | 261 |
264 void CastSessionDelegate::OnOperationalStatusChange( | 262 void CastSessionDelegate::OnOperationalStatusChange( |
265 bool is_for_audio, | 263 bool is_for_audio, |
266 const ErrorCallback& error_callback, | 264 const ErrorCallback& error_callback, |
267 media::cast::OperationalStatus status) { | 265 media::cast::OperationalStatus status) { |
268 DCHECK(cast_sender_); | 266 DCHECK(cast_sender_); |
269 | 267 |
270 switch (status) { | 268 switch (status) { |
271 case media::cast::STATUS_UNINITIALIZED: | 269 case media::cast::STATUS_UNINITIALIZED: |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 error_callback.Run(base::StringPrintf("%s codec runtime error.", | 305 error_callback.Run(base::StringPrintf("%s codec runtime error.", |
308 is_for_audio ? "Audio" : "Video")); | 306 is_for_audio ? "Audio" : "Video")); |
309 break; | 307 break; |
310 } | 308 } |
311 } | 309 } |
312 | 310 |
313 void CastSessionDelegate::ReceivePacket( | 311 void CastSessionDelegate::ReceivePacket( |
314 scoped_ptr<media::cast::Packet> packet) { | 312 scoped_ptr<media::cast::Packet> packet) { |
315 // Do nothing (frees packet) | 313 // Do nothing (frees packet) |
316 } | 314 } |
OLD | NEW |