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

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: 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 | 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 "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 {
59 base::AutoLock auto_lock(lock_);
scherkus (not reviewing) 2014/07/08 18:37:20 we shouldn't have any synchronization issues insid
xhwang 2014/07/08 19:32:16 Done.
60 // We do not want to start the clock running. We only want to set the
61 // base media time so our timestamp calculations will be correct.
62 clock_->SetTime(base::TimeDelta(), base::TimeDelta());
63 }
58 } 64 }
59 65
60 Pipeline::~Pipeline() { 66 Pipeline::~Pipeline() {
61 DCHECK(thread_checker_.CalledOnValidThread()) 67 DCHECK(thread_checker_.CalledOnValidThread())
62 << "Pipeline must be destroyed on same thread that created it"; 68 << "Pipeline must be destroyed on same thread that created it";
63 DCHECK(!running_) << "Stop() must complete before destroying object"; 69 DCHECK(!running_) << "Stop() must complete before destroying object";
64 DCHECK(stop_cb_.is_null()); 70 DCHECK(stop_cb_.is_null());
65 DCHECK(seek_cb_.is_null()); 71 DCHECK(seek_cb_.is_null());
66 72
67 media_log_->AddEvent( 73 media_log_->AddEvent(
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 return InitializeAudioRenderer(done_cb); 372 return InitializeAudioRenderer(done_cb);
367 373
368 case kInitVideoRenderer: 374 case kInitVideoRenderer:
369 return InitializeVideoRenderer(done_cb); 375 return InitializeVideoRenderer(done_cb);
370 376
371 case kPlaying: 377 case kPlaying:
372 // Finish initial start sequence the first time we enter the playing 378 // Finish initial start sequence the first time we enter the playing
373 // state. 379 // state.
374 if (filter_collection_) { 380 if (filter_collection_) {
375 filter_collection_.reset(); 381 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_) { 382 if (!audio_renderer_ && !video_renderer_) {
383 ErrorChangedTask(PIPELINE_ERROR_COULD_NOT_RENDER); 383 ErrorChangedTask(PIPELINE_ERROR_COULD_NOT_RENDER);
384 return; 384 return;
385 } 385 }
386 386
387 { 387 {
388 PipelineMetadata metadata; 388 PipelineMetadata metadata;
389 metadata.has_audio = audio_renderer_; 389 metadata.has_audio = audio_renderer_;
390 metadata.has_video = video_renderer_; 390 metadata.has_video = video_renderer_;
391 metadata.timeline_offset = demuxer_->GetTimelineOffset(); 391 metadata.timeline_offset = demuxer_->GetTimelineOffset();
392 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); 392 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO);
393 if (stream) { 393 if (stream) {
394 metadata.natural_size = 394 metadata.natural_size =
395 stream->video_decoder_config().natural_size(); 395 stream->video_decoder_config().natural_size();
396 } 396 }
397 metadata_cb_.Run(metadata); 397 metadata_cb_.Run(metadata);
398 } 398 }
399 } 399 }
400 400
401 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); 401 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK);
402 402
403 {
404 base::AutoLock auto_lock(lock_);
405 clock_->SetTime(start_timestamp_, start_timestamp_);
406 }
407
403 if (audio_renderer_) 408 if (audio_renderer_)
404 audio_renderer_->StartPlayingFrom(start_timestamp_); 409 audio_renderer_->StartPlayingFrom(start_timestamp_);
405 if (video_renderer_) 410 if (video_renderer_)
406 video_renderer_->StartPlayingFrom(start_timestamp_); 411 video_renderer_->StartPlayingFrom(start_timestamp_);
407 if (text_renderer_) 412 if (text_renderer_)
408 text_renderer_->StartPlaying(); 413 text_renderer_->StartPlaying();
409 414
410 PlaybackRateChangedTask(GetPlaybackRate()); 415 PlaybackRateChangedTask(GetPlaybackRate());
411 VolumeChangedTask(GetVolume()); 416 VolumeChangedTask(GetVolume());
412 return; 417 return;
(...skipping 21 matching lines...) Expand all
434 DCHECK_EQ(*video_buffering_state, BUFFERING_HAVE_NOTHING); 439 DCHECK_EQ(*video_buffering_state, BUFFERING_HAVE_NOTHING);
435 } 440 }
436 #endif 441 #endif
437 442
438 void Pipeline::DoSeek( 443 void Pipeline::DoSeek(
439 base::TimeDelta seek_timestamp, 444 base::TimeDelta seek_timestamp,
440 const PipelineStatusCB& done_cb) { 445 const PipelineStatusCB& done_cb) {
441 DCHECK(task_runner_->BelongsToCurrentThread()); 446 DCHECK(task_runner_->BelongsToCurrentThread());
442 DCHECK(!pending_callbacks_.get()); 447 DCHECK(!pending_callbacks_.get());
443 SerialRunner::Queue bound_fns; 448 SerialRunner::Queue bound_fns;
449 {
450 base::AutoLock auto_lock(lock_);
451 PauseClockAndStopRendering_Locked();
452 }
444 453
445 // Pause. 454 // Pause.
446 if (text_renderer_) { 455 if (text_renderer_) {
447 bound_fns.Push(base::Bind( 456 bound_fns.Push(base::Bind(
448 &TextRenderer::Pause, base::Unretained(text_renderer_.get()))); 457 &TextRenderer::Pause, base::Unretained(text_renderer_.get())));
449 } 458 }
450 459
451 // Flush. 460 // Flush.
452 if (audio_renderer_) { 461 if (audio_renderer_) {
453 bound_fns.Push(base::Bind( 462 bound_fns.Push(base::Bind(
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 685
677 DCHECK(seek_cb_.is_null()); 686 DCHECK(seek_cb_.is_null());
678 687
679 SetState(kSeeking); 688 SetState(kSeeking);
680 seek_cb_ = seek_cb; 689 seek_cb_ = seek_cb;
681 audio_ended_ = false; 690 audio_ended_ = false;
682 video_ended_ = false; 691 video_ended_ = false;
683 text_ended_ = false; 692 text_ended_ = false;
684 start_timestamp_ = time; 693 start_timestamp_ = time;
685 694
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( 695 DoSeek(time, base::Bind(
693 &Pipeline::OnStateTransition, base::Unretained(this))); 696 &Pipeline::OnStateTransition, base::Unretained(this)));
694 } 697 }
695 698
696 void Pipeline::DoAudioRendererEnded() { 699 void Pipeline::DoAudioRendererEnded() {
697 DCHECK(task_runner_->BelongsToCurrentThread()); 700 DCHECK(task_runner_->BelongsToCurrentThread());
698 701
699 if (state_ != kPlaying) 702 if (state_ != kPlaying)
700 return; 703 return;
701 704
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() { 913 void Pipeline::StartClockIfWaitingForTimeUpdate_Locked() {
911 lock_.AssertAcquired(); 914 lock_.AssertAcquired();
912 if (clock_state_ != CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE) 915 if (clock_state_ != CLOCK_WAITING_FOR_AUDIO_TIME_UPDATE)
913 return; 916 return;
914 917
915 clock_state_ = CLOCK_PLAYING; 918 clock_state_ = CLOCK_PLAYING;
916 clock_->Play(); 919 clock_->Play();
917 } 920 }
918 921
919 } // namespace media 922 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698