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

Side by Side Diff: media/filters/video_renderer_base.cc

Issue 9717021: Make Callback::Reset() return a copy to support use-cases where Run() ends up modifying |*this|. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: no base:: Created 8 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « media/filters/gpu_video_decoder.cc ('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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/callback.h" 6 #include "base/callback.h"
7 #include "base/callback_helpers.h"
7 #include "base/threading/platform_thread.h" 8 #include "base/threading/platform_thread.h"
8 #include "media/base/buffers.h" 9 #include "media/base/buffers.h"
9 #include "media/base/filter_host.h" 10 #include "media/base/filter_host.h"
10 #include "media/base/limits.h" 11 #include "media/base/limits.h"
11 #include "media/base/pipeline.h" 12 #include "media/base/pipeline.h"
12 #include "media/base/video_frame.h" 13 #include "media/base/video_frame.h"
13 #include "media/filters/video_renderer_base.h" 14 #include "media/filters/video_renderer_base.h"
14 15
15 namespace media { 16 namespace media {
16 17
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 } 366 }
366 367
367 if (!frame) { 368 if (!frame) {
368 if (state_ != kSeeking) 369 if (state_ != kSeeking)
369 return; 370 return;
370 371
371 // Abort seek early for a NULL frame because we won't get more frames. 372 // Abort seek early for a NULL frame because we won't get more frames.
372 // A new seek will be requested after this one completes so there is no 373 // A new seek will be requested after this one completes so there is no
373 // point trying to collect more frames. 374 // point trying to collect more frames.
374 state_ = kPrerolled; 375 state_ = kPrerolled;
375 ResetAndRunCB(&seek_cb_, PIPELINE_OK); 376 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
376 return; 377 return;
377 } 378 }
378 379
379 // Discard frames until we reach our desired seek timestamp. 380 // Discard frames until we reach our desired seek timestamp.
380 if (state_ == kSeeking && !frame->IsEndOfStream() && 381 if (state_ == kSeeking && !frame->IsEndOfStream() &&
381 (frame->GetTimestamp() + frame->GetDuration()) <= seek_timestamp_) { 382 (frame->GetTimestamp() + frame->GetDuration()) <= seek_timestamp_) {
382 AttemptRead_Locked(); 383 AttemptRead_Locked();
383 return; 384 return;
384 } 385 }
385 386
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 // Because we might remain in the prerolled state for an undetermined amount 425 // Because we might remain in the prerolled state for an undetermined amount
425 // of time (i.e., we were not playing before we received a seek), we'll 426 // of time (i.e., we were not playing before we received a seek), we'll
426 // manually update the current frame and notify the subclass below. 427 // manually update the current frame and notify the subclass below.
427 if (!ready_frames_.front()->IsEndOfStream()) { 428 if (!ready_frames_.front()->IsEndOfStream()) {
428 current_frame_ = ready_frames_.front(); 429 current_frame_ = ready_frames_.front();
429 ready_frames_.pop_front(); 430 ready_frames_.pop_front();
430 } 431 }
431 432
432 // ...and we're done seeking! 433 // ...and we're done seeking!
433 DCHECK(!seek_cb_.is_null()); 434 DCHECK(!seek_cb_.is_null());
434 ResetAndRunCB(&seek_cb_, PIPELINE_OK); 435 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
435 436
436 base::AutoUnlock ul(lock_); 437 base::AutoUnlock ul(lock_);
437 paint_cb_.Run(); 438 paint_cb_.Run();
438 } 439 }
439 } 440 }
440 441
441 void VideoRendererBase::AttemptRead_Locked() { 442 void VideoRendererBase::AttemptRead_Locked() {
442 lock_.AssertAcquired(); 443 lock_.AssertAcquired();
443 DCHECK_NE(kEnded, state_); 444 DCHECK_NE(kEnded, state_);
444 445
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 500
500 int VideoRendererBase::NumFrames_Locked() const { 501 int VideoRendererBase::NumFrames_Locked() const {
501 lock_.AssertAcquired(); 502 lock_.AssertAcquired();
502 int outstanding_frames = 503 int outstanding_frames =
503 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) + 504 (current_frame_ ? 1 : 0) + (last_available_frame_ ? 1 : 0) +
504 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0); 505 (current_frame_ && (current_frame_ == last_available_frame_) ? -1 : 0);
505 return ready_frames_.size() + outstanding_frames; 506 return ready_frames_.size() + outstanding_frames;
506 } 507 }
507 508
508 } // namespace media 509 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/gpu_video_decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698