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

Side by Side Diff: media/renderers/video_renderer_impl.cc

Issue 1135143002: Partially revert change to not post AttemptRead() every Render(). (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 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
« no previous file with comments | « media/renderers/video_renderer_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/renderers/video_renderer_impl.h" 5 #include "media/renderers/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/command_line.h" 10 #include "base/command_line.h"
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 // and MaybeStopSinkAfterFirstPaint() will ignore this request if time starts 232 // and MaybeStopSinkAfterFirstPaint() will ignore this request if time starts
233 // before the call executes. 233 // before the call executes.
234 if (render_first_frame_and_stop_ && !posted_maybe_stop_after_first_paint_) { 234 if (render_first_frame_and_stop_ && !posted_maybe_stop_after_first_paint_) {
235 posted_maybe_stop_after_first_paint_ = true; 235 posted_maybe_stop_after_first_paint_ = true;
236 task_runner_->PostDelayedTask( 236 task_runner_->PostDelayedTask(
237 FROM_HERE, base::Bind(&VideoRendererImpl::MaybeStopSinkAfterFirstPaint, 237 FROM_HERE, base::Bind(&VideoRendererImpl::MaybeStopSinkAfterFirstPaint,
238 weak_factory_.GetWeakPtr()), 238 weak_factory_.GetWeakPtr()),
239 base::TimeDelta::FromMilliseconds(250)); 239 base::TimeDelta::FromMilliseconds(250));
240 } 240 }
241 241
242 // To avoid unnecessary work, only post this task if there is a chance of work 242 // Always post this task, it will acquire new frames if necessary and since it
243 // to be done. AttemptRead() may still ignore this call for other reasons. 243 // happens on another thread, even if we don't have room in the queue now, by
244 if (!rendered_end_of_stream_ && !HaveReachedBufferingCap(effective_frames)) { 244 // the time it runs (may be delayed up to 50ms for complex decodes!) we might.
245 task_runner_->PostTask(FROM_HERE, 245 task_runner_->PostTask(FROM_HERE, base::Bind(&VideoRendererImpl::AttemptRead,
246 base::Bind(&VideoRendererImpl::AttemptRead, 246 weak_factory_.GetWeakPtr()));
247 weak_factory_.GetWeakPtr()));
248 }
249 247
250 return result; 248 return result;
251 } 249 }
252 250
253 void VideoRendererImpl::OnFrameDropped() { 251 void VideoRendererImpl::OnFrameDropped() {
254 base::AutoLock auto_lock(lock_); 252 base::AutoLock auto_lock(lock_);
255 DCHECK(use_new_video_renderering_path_); 253 DCHECK(use_new_video_renderering_path_);
256 algorithm_->OnLastFrameDropped(); 254 algorithm_->OnLastFrameDropped();
257 } 255 }
258 256
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 base::AutoLock auto_lock(lock_); 676 base::AutoLock auto_lock(lock_);
679 render_first_frame_and_stop_ = false; 677 render_first_frame_and_stop_ = false;
680 } 678 }
681 679
682 if (!time_progressing_ && sink_started_) 680 if (!time_progressing_ && sink_started_)
683 StopSink(); 681 StopSink();
684 } 682 }
685 683
686 bool VideoRendererImpl::HaveReachedBufferingCap() { 684 bool VideoRendererImpl::HaveReachedBufferingCap() {
687 DCHECK(task_runner_->BelongsToCurrentThread()); 685 DCHECK(task_runner_->BelongsToCurrentThread());
688 return HaveReachedBufferingCap(use_new_video_renderering_path_ 686 const size_t kMaxVideoFrames = limits::kMaxVideoFrames;
689 ? algorithm_->EffectiveFramesQueued()
690 : 0);
691 }
692 687
693 bool VideoRendererImpl::HaveReachedBufferingCap(size_t effective_frames) {
694 if (use_new_video_renderering_path_) { 688 if (use_new_video_renderering_path_) {
695 // When the display rate is less than the frame rate, the effective frames 689 // When the display rate is less than the frame rate, the effective frames
696 // queued may be much smaller than the actual number of frames queued. Here 690 // queued may be much smaller than the actual number of frames queued. Here
697 // we ensure that frames_queued() doesn't get excessive. 691 // we ensure that frames_queued() doesn't get excessive.
698 return effective_frames >= static_cast<size_t>(limits::kMaxVideoFrames) || 692 return algorithm_->EffectiveFramesQueued() >= kMaxVideoFrames ||
699 algorithm_->frames_queued() >= 693 algorithm_->frames_queued() >= 3 * kMaxVideoFrames;
700 static_cast<size_t>(3 * limits::kMaxVideoFrames);
701 } 694 }
702 695
703 return ready_frames_.size() >= static_cast<size_t>(limits::kMaxVideoFrames); 696 return ready_frames_.size() >= kMaxVideoFrames;
704 } 697 }
705 698
706 void VideoRendererImpl::StartSink() { 699 void VideoRendererImpl::StartSink() {
707 DCHECK(task_runner_->BelongsToCurrentThread()); 700 DCHECK(task_runner_->BelongsToCurrentThread());
708 sink_->Start(this); 701 sink_->Start(this);
709 sink_started_ = true; 702 sink_started_ = true;
710 was_background_rendering_ = false; 703 was_background_rendering_ = false;
711 } 704 }
712 705
713 void VideoRendererImpl::StopSink() { 706 void VideoRendererImpl::StopSink() {
(...skipping 23 matching lines...) Expand all
737 (algorithm_->frames_queued() == 1u && 730 (algorithm_->frames_queued() == 1u &&
738 algorithm_->average_frame_duration() == base::TimeDelta())) { 731 algorithm_->average_frame_duration() == base::TimeDelta())) {
739 rendered_end_of_stream_ = true; 732 rendered_end_of_stream_ = true;
740 task_runner_->PostTask(FROM_HERE, ended_cb_); 733 task_runner_->PostTask(FROM_HERE, ended_cb_);
741 } 734 }
742 735
743 return effective_frames; 736 return effective_frames;
744 } 737 }
745 738
746 } // namespace media 739 } // namespace media
OLDNEW
« no previous file with comments | « media/renderers/video_renderer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698