OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "remoting/client/software_video_renderer.h" | 5 #include "remoting/client/software_video_renderer.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
334 decode_task_runner_->PostTask( | 334 decode_task_runner_->PostTask( |
335 FROM_HERE, base::Bind(&SoftwareVideoRenderer::Core::OnSessionConfig, | 335 FROM_HERE, base::Bind(&SoftwareVideoRenderer::Core::OnSessionConfig, |
336 base::Unretained(core_.get()), config)); | 336 base::Unretained(core_.get()), config)); |
337 } | 337 } |
338 | 338 |
339 ChromotingStats* SoftwareVideoRenderer::GetStats() { | 339 ChromotingStats* SoftwareVideoRenderer::GetStats() { |
340 DCHECK(CalledOnValidThread()); | 340 DCHECK(CalledOnValidThread()); |
341 return &stats_; | 341 return &stats_; |
342 } | 342 } |
343 | 343 |
344 void SoftwareVideoRenderer::ProcessVideoPacket(scoped_ptr<VideoPacket> packet, | 344 void SoftwareVideoRenderer::ProcessVideoPacket( |
345 const base::Closure& done) { | 345 scoped_ptr<VideoPacket> packet, |
346 const ProgressCallback& progress_callback) { | |
346 DCHECK(CalledOnValidThread()); | 347 DCHECK(CalledOnValidThread()); |
347 | 348 |
348 // If the video packet is empty then drop it. Empty packets are used to | 349 // If the video packet is empty then drop it. Empty packets are used to |
349 // maintain activity on the network. | 350 // maintain activity on the network. |
350 if (!packet->has_data() || packet->data().size() == 0) { | 351 if (!packet->has_data() || packet->data().size() == 0) { |
351 done.Run(); | 352 progress_callback.Run(PacketProgress::DONE); |
352 return; | 353 return; |
353 } | 354 } |
354 | 355 |
355 // Add one frame to the counter. | 356 // Add one frame to the counter. |
356 stats_.video_frame_rate()->Record(1); | 357 stats_.video_frame_rate()->Record(1); |
357 | 358 |
358 // Record other statistics received from host. | 359 // Record other statistics received from host. |
359 stats_.video_bandwidth()->Record(packet->data().size()); | 360 stats_.video_bandwidth()->Record(packet->data().size()); |
360 if (packet->has_capture_time_ms()) | 361 if (packet->has_capture_time_ms()) |
361 stats_.video_capture_ms()->Record(packet->capture_time_ms()); | 362 stats_.video_capture_ms()->Record(packet->capture_time_ms()); |
362 if (packet->has_encode_time_ms()) | 363 if (packet->has_encode_time_ms()) |
363 stats_.video_encode_ms()->Record(packet->encode_time_ms()); | 364 stats_.video_encode_ms()->Record(packet->encode_time_ms()); |
364 if (packet->has_latest_event_timestamp() && | 365 if (packet->has_latest_event_timestamp() && |
365 packet->latest_event_timestamp() > latest_event_timestamp_) { | 366 packet->latest_event_timestamp() > latest_event_timestamp_) { |
366 latest_event_timestamp_ = packet->latest_event_timestamp(); | 367 latest_event_timestamp_ = packet->latest_event_timestamp(); |
367 base::TimeDelta round_trip_latency = | 368 base::TimeDelta round_trip_latency = |
368 base::Time::Now() - | 369 base::Time::Now() - |
369 base::Time::FromInternalValue(packet->latest_event_timestamp()); | 370 base::Time::FromInternalValue(packet->latest_event_timestamp()); |
370 stats_.round_trip_ms()->Record(round_trip_latency.InMilliseconds()); | 371 stats_.round_trip_ms()->Record(round_trip_latency.InMilliseconds()); |
371 } | 372 } |
372 | 373 |
373 // Measure the latency between the last packet being received and presented. | 374 // Measure the latency between the last packet being received and presented. |
374 base::Time decode_start = base::Time::Now(); | 375 base::Time decode_start = base::Time::Now(); |
375 | 376 |
376 base::Closure decode_done = base::Bind(&SoftwareVideoRenderer::OnPacketDone, | 377 base::Closure decode_done = base::Bind(&SoftwareVideoRenderer::OnPacketDone, |
377 weak_factory_.GetWeakPtr(), | 378 weak_factory_.GetWeakPtr(), |
378 decode_start, done); | 379 decode_start, progress_callback); |
Wez
2015/02/03 00:54:32
nit: Note that because you're binding this via a W
Sergey Ulanov
2015/02/09 19:14:54
Yes. These are not like Pepper callbacks that are
| |
379 | 380 |
380 decode_task_runner_->PostTask(FROM_HERE, base::Bind( | 381 decode_task_runner_->PostTask(FROM_HERE, base::Bind( |
381 &SoftwareVideoRenderer::Core::DecodePacket, | 382 &SoftwareVideoRenderer::Core::DecodePacket, |
382 base::Unretained(core_.get()), base::Passed(&packet), decode_done)); | 383 base::Unretained(core_.get()), base::Passed(&packet), decode_done)); |
383 } | 384 } |
384 | 385 |
385 void SoftwareVideoRenderer::DrawBuffer(webrtc::DesktopFrame* buffer) { | 386 void SoftwareVideoRenderer::DrawBuffer(webrtc::DesktopFrame* buffer) { |
386 decode_task_runner_->PostTask( | 387 decode_task_runner_->PostTask( |
387 FROM_HERE, base::Bind(&SoftwareVideoRenderer::Core::DrawBuffer, | 388 FROM_HERE, base::Bind(&SoftwareVideoRenderer::Core::DrawBuffer, |
388 base::Unretained(core_.get()), buffer)); | 389 base::Unretained(core_.get()), buffer)); |
(...skipping 15 matching lines...) Expand all Loading... | |
404 | 405 |
405 void SoftwareVideoRenderer::SetOutputSizeAndClip( | 406 void SoftwareVideoRenderer::SetOutputSizeAndClip( |
406 const webrtc::DesktopSize& view_size, | 407 const webrtc::DesktopSize& view_size, |
407 const webrtc::DesktopRect& clip_area) { | 408 const webrtc::DesktopRect& clip_area) { |
408 decode_task_runner_->PostTask( | 409 decode_task_runner_->PostTask( |
409 FROM_HERE, | 410 FROM_HERE, |
410 base::Bind(&SoftwareVideoRenderer::Core::SetOutputSizeAndClip, | 411 base::Bind(&SoftwareVideoRenderer::Core::SetOutputSizeAndClip, |
411 base::Unretained(core_.get()), view_size, clip_area)); | 412 base::Unretained(core_.get()), view_size, clip_area)); |
412 } | 413 } |
413 | 414 |
414 void SoftwareVideoRenderer::OnPacketDone(base::Time decode_start, | 415 void SoftwareVideoRenderer::OnPacketDone( |
415 const base::Closure& done) { | 416 base::Time decode_start, |
417 const ProgressCallback& progress_callback) { | |
416 DCHECK(CalledOnValidThread()); | 418 DCHECK(CalledOnValidThread()); |
417 | 419 |
418 // Record the latency between the packet being received and presented. | 420 // Record the latency between the packet being received and presented. |
419 stats_.video_decode_ms()->Record( | 421 stats_.video_decode_ms()->Record( |
420 (base::Time::Now() - decode_start).InMilliseconds()); | 422 (base::Time::Now() - decode_start).InMilliseconds()); |
421 | 423 |
422 done.Run(); | 424 progress_callback.Run(PacketProgress::DONE); |
423 } | 425 } |
424 | 426 |
425 } // namespace remoting | 427 } // namespace remoting |
OLD | NEW |