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 "media/filters/video_renderer_impl.h" | 5 #include "media/filters/video_renderer_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 state_(kUninitialized), | 35 state_(kUninitialized), |
36 thread_(), | 36 thread_(), |
37 pending_read_(false), | 37 pending_read_(false), |
38 drop_frames_(drop_frames), | 38 drop_frames_(drop_frames), |
39 buffering_state_(BUFFERING_HAVE_NOTHING), | 39 buffering_state_(BUFFERING_HAVE_NOTHING), |
40 paint_cb_(paint_cb), | 40 paint_cb_(paint_cb), |
41 last_timestamp_(kNoTimestamp()), | 41 last_timestamp_(kNoTimestamp()), |
42 last_painted_timestamp_(kNoTimestamp()), | 42 last_painted_timestamp_(kNoTimestamp()), |
43 frames_decoded_(0), | 43 frames_decoded_(0), |
44 frames_dropped_(0), | 44 frames_dropped_(0), |
| 45 frames_delay_time_(0), |
45 is_shutting_down_(false), | 46 is_shutting_down_(false), |
46 weak_factory_(this) { | 47 weak_factory_(this) { |
47 DCHECK(!paint_cb_.is_null()); | 48 DCHECK(!paint_cb_.is_null()); |
48 } | 49 } |
49 | 50 |
50 VideoRendererImpl::~VideoRendererImpl() { | 51 VideoRendererImpl::~VideoRendererImpl() { |
51 DCHECK(task_runner_->BelongsToCurrentThread()); | 52 DCHECK(task_runner_->BelongsToCurrentThread()); |
52 | 53 |
53 { | 54 { |
54 base::AutoLock auto_lock(lock_); | 55 base::AutoLock auto_lock(lock_); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 | 264 |
264 scoped_refptr<VideoFrame> next_frame = ready_frames_.front(); | 265 scoped_refptr<VideoFrame> next_frame = ready_frames_.front(); |
265 ready_frames_.pop_front(); | 266 ready_frames_.pop_front(); |
266 frames_decoded_++; | 267 frames_decoded_++; |
267 | 268 |
268 last_timestamp_ = next_frame->timestamp(); | 269 last_timestamp_ = next_frame->timestamp(); |
269 last_painted_timestamp_ = next_frame->timestamp(); | 270 last_painted_timestamp_ = next_frame->timestamp(); |
270 | 271 |
271 paint_cb_.Run(next_frame); | 272 paint_cb_.Run(next_frame); |
272 | 273 |
| 274 base::TimeDelta now = get_time_cb_.Run(); |
| 275 frames_delay_time_ += (now - last_painted_timestamp_).InSecondsF(); |
| 276 |
273 task_runner_->PostTask( | 277 task_runner_->PostTask( |
274 FROM_HERE, | 278 FROM_HERE, |
275 base::Bind(&VideoRendererImpl::AttemptRead, weak_factory_.GetWeakPtr())); | 279 base::Bind(&VideoRendererImpl::AttemptRead, weak_factory_.GetWeakPtr())); |
276 } | 280 } |
277 | 281 |
278 void VideoRendererImpl::DropNextReadyFrame_Locked() { | 282 void VideoRendererImpl::DropNextReadyFrame_Locked() { |
279 TRACE_EVENT0("media", "VideoRendererImpl:frameDropped"); | 283 TRACE_EVENT0("media", "VideoRendererImpl:frameDropped"); |
280 | 284 |
281 lock_.AssertAcquired(); | 285 lock_.AssertAcquired(); |
282 | 286 |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 void VideoRendererImpl::UpdateStatsAndWait_Locked( | 463 void VideoRendererImpl::UpdateStatsAndWait_Locked( |
460 base::TimeDelta wait_duration) { | 464 base::TimeDelta wait_duration) { |
461 lock_.AssertAcquired(); | 465 lock_.AssertAcquired(); |
462 DCHECK_GE(frames_decoded_, 0); | 466 DCHECK_GE(frames_decoded_, 0); |
463 DCHECK_LE(frames_dropped_, frames_decoded_); | 467 DCHECK_LE(frames_dropped_, frames_decoded_); |
464 | 468 |
465 if (frames_decoded_) { | 469 if (frames_decoded_) { |
466 PipelineStatistics statistics; | 470 PipelineStatistics statistics; |
467 statistics.video_frames_decoded = frames_decoded_; | 471 statistics.video_frames_decoded = frames_decoded_; |
468 statistics.video_frames_dropped = frames_dropped_; | 472 statistics.video_frames_dropped = frames_dropped_; |
| 473 statistics.total_frame_delay = frames_delay_time_; |
469 task_runner_->PostTask(FROM_HERE, base::Bind(statistics_cb_, statistics)); | 474 task_runner_->PostTask(FROM_HERE, base::Bind(statistics_cb_, statistics)); |
470 | 475 |
471 frames_decoded_ = 0; | 476 frames_decoded_ = 0; |
472 frames_dropped_ = 0; | 477 frames_dropped_ = 0; |
| 478 frames_delay_time_ = 0; |
473 } | 479 } |
474 | 480 |
475 frame_available_.TimedWait(wait_duration); | 481 frame_available_.TimedWait(wait_duration); |
476 } | 482 } |
477 | 483 |
478 } // namespace media | 484 } // namespace media |
OLD | NEW |