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

Side by Side Diff: media/base/pipeline.cc

Issue 377003002: Pipeline: Call clock_->SetTime() right before StartPlayingFrom(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix PipelineTest.Seek Created 6 years, 5 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 | « no previous file | media/base/pipeline_unittest.cc » ('j') | 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 "media/base/pipeline.h" 5 #include "media/base/pipeline.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 audio_ended_(false), 48 audio_ended_(false),
49 video_ended_(false), 49 video_ended_(false),
50 text_ended_(false), 50 text_ended_(false),
51 audio_buffering_state_(BUFFERING_HAVE_NOTHING), 51 audio_buffering_state_(BUFFERING_HAVE_NOTHING),
52 video_buffering_state_(BUFFERING_HAVE_NOTHING), 52 video_buffering_state_(BUFFERING_HAVE_NOTHING),
53 demuxer_(NULL), 53 demuxer_(NULL),
54 underflow_disabled_for_testing_(false) { 54 underflow_disabled_for_testing_(false) {
55 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); 55 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated));
56 media_log_->AddEvent( 56 media_log_->AddEvent(
57 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); 57 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED));
58 clock_->SetTime(base::TimeDelta(), base::TimeDelta());
58 } 59 }
59 60
60 Pipeline::~Pipeline() { 61 Pipeline::~Pipeline() {
61 DCHECK(thread_checker_.CalledOnValidThread()) 62 DCHECK(thread_checker_.CalledOnValidThread())
62 << "Pipeline must be destroyed on same thread that created it"; 63 << "Pipeline must be destroyed on same thread that created it";
63 DCHECK(!running_) << "Stop() must complete before destroying object"; 64 DCHECK(!running_) << "Stop() must complete before destroying object";
64 DCHECK(stop_cb_.is_null()); 65 DCHECK(stop_cb_.is_null());
65 DCHECK(seek_cb_.is_null()); 66 DCHECK(seek_cb_.is_null());
66 67
67 media_log_->AddEvent( 68 media_log_->AddEvent(
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 return InitializeAudioRenderer(done_cb); 367 return InitializeAudioRenderer(done_cb);
367 368
368 case kInitVideoRenderer: 369 case kInitVideoRenderer:
369 return InitializeVideoRenderer(done_cb); 370 return InitializeVideoRenderer(done_cb);
370 371
371 case kPlaying: 372 case kPlaying:
372 // Finish initial start sequence the first time we enter the playing 373 // Finish initial start sequence the first time we enter the playing
373 // state. 374 // state.
374 if (filter_collection_) { 375 if (filter_collection_) {
375 filter_collection_.reset(); 376 filter_collection_.reset();
376 {
377 base::AutoLock l(lock_);
378 // We do not want to start the clock running. We only want to set the
379 // base media time so our timestamp calculations will be correct.
380 clock_->SetTime(base::TimeDelta(), base::TimeDelta());
381 }
382 if (!audio_renderer_ && !video_renderer_) { 377 if (!audio_renderer_ && !video_renderer_) {
383 ErrorChangedTask(PIPELINE_ERROR_COULD_NOT_RENDER); 378 ErrorChangedTask(PIPELINE_ERROR_COULD_NOT_RENDER);
384 return; 379 return;
385 } 380 }
386 381
387 { 382 {
388 PipelineMetadata metadata; 383 PipelineMetadata metadata;
389 metadata.has_audio = audio_renderer_; 384 metadata.has_audio = audio_renderer_;
390 metadata.has_video = video_renderer_; 385 metadata.has_video = video_renderer_;
391 metadata.timeline_offset = demuxer_->GetTimelineOffset(); 386 metadata.timeline_offset = demuxer_->GetTimelineOffset();
392 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); 387 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
393 if (stream) { 388 if (stream) {
394 metadata.natural_size = 389 metadata.natural_size =
395 stream->video_decoder_config().natural_size(); 390 stream->video_decoder_config().natural_size();
396 } 391 }
397 metadata_cb_.Run(metadata); 392 metadata_cb_.Run(metadata);
398 } 393 }
399 } 394 }
400 395
401 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); 396 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
402 397
398 {
399 base::AutoLock auto_lock(lock_);
400 clock_->SetTime(start_timestamp_, start_timestamp_);
401 }
402
403 if (audio_renderer_) 403 if (audio_renderer_)
404 audio_renderer_->StartPlayingFrom(start_timestamp_); 404 audio_renderer_->StartPlayingFrom(start_timestamp_);
405 if (video_renderer_) 405 if (video_renderer_)
406 video_renderer_->StartPlayingFrom(start_timestamp_); 406 video_renderer_->StartPlayingFrom(start_timestamp_);
407 if (text_renderer_) 407 if (text_renderer_)
408 text_renderer_->StartPlaying(); 408 text_renderer_->StartPlaying();
409 409
410 PlaybackRateChangedTask(GetPlaybackRate()); 410 PlaybackRateChangedTask(GetPlaybackRate());
411 VolumeChangedTask(GetVolume()); 411 VolumeChangedTask(GetVolume());
412 return; 412 return;
(...skipping 21 matching lines...) Expand all
434 DCHECK_EQ(*video_buffering_state, BUFFERING_HAVE_NOTHING); 434 DCHECK_EQ(*video_buffering_state, BUFFERING_HAVE_NOTHING);
435 } 435 }
436 #endif 436 #endif
437 437
438 void Pipeline::DoSeek( 438 void Pipeline::DoSeek(
439 base::TimeDelta seek_timestamp, 439 base::TimeDelta seek_timestamp,
440 const PipelineStatusCB& done_cb) { 440 const PipelineStatusCB& done_cb) {
441 DCHECK(task_runner_->BelongsToCurrentThread()); 441 DCHECK(task_runner_->BelongsToCurrentThread());
442 DCHECK(!pending_callbacks_.get()); 442 DCHECK(!pending_callbacks_.get());
443 SerialRunner::Queue bound_fns; 443 SerialRunner::Queue bound_fns;
444 {
445 base::AutoLock auto_lock(lock_);
446 PauseClockAndStopRendering_Locked();
447 }
444 448
445 // Pause. 449 // Pause.
446 if (text_renderer_) { 450 if (text_renderer_) {
447 bound_fns.Push(base::Bind( 451 bound_fns.Push(base::Bind(
448 &TextRenderer::Pause, base::Unretained(text_renderer_.get()))); 452 &TextRenderer::Pause, base::Unretained(text_renderer_.get())));
449 } 453 }
450 454
451 // Flush. 455 // Flush.
452 if (audio_renderer_) { 456 if (audio_renderer_) {
453 bound_fns.Push(base::Bind( 457 bound_fns.Push(base::Bind(
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 680
677 DCHECK(seek_cb_.is_null()); 681 DCHECK(seek_cb_.is_null());
678 682
679 SetState(kSeeking); 683 SetState(kSeeking);
680 seek_cb_ = seek_cb; 684 seek_cb_ = seek_cb;
681 audio_ended_ = false; 685 audio_ended_ = false;
682 video_ended_ = false; 686 video_ended_ = false;
683 text_ended_ = false; 687 text_ended_ = false;
684 start_timestamp_ = time; 688 start_timestamp_ = time;
685 689
686 // Kick off seeking!
687 {
688 base::AutoLock auto_lock(lock_);
689 PauseClockAndStopRendering_Locked();
690 clock_->SetTime(time, time);
691 }
692 DoSeek(time, base::Bind( 690 DoSeek(time, base::Bind(
693 &Pipeline::OnStateTransition, base::Unretained(this))); 691 &Pipeline::OnStateTransition, base::Unretained(this)));
694 } 692 }
695 693
696 void Pipeline::DoAudioRendererEnded() { 694 void Pipeline::DoAudioRendererEnded() {
697 DCHECK(task_runner_->BelongsToCurrentThread()); 695 DCHECK(task_runner_->BelongsToCurrentThread());
698 696
699 if (state_ != kPlaying) 697 if (state_ != kPlaying)
700 return; 698 return;
701 699
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() { 908 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() {
911 lock_.AssertAcquired(); 909 lock_.AssertAcquired();
912 if (clock_state_ != CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE) 910 if (clock_state_ != CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE)
913 return; 911 return;
914 912
915 clock_state_ = CLOCK_PLAYING; 913 clock_state_ = CLOCK_PLAYING;
916 clock_->Play(); 914 clock_->Play();
917 } 915 }
918 916
919 } // namespace media 917 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/base/pipeline_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698