OLD | NEW |
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 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 return InitializeDemuxer(done_cb); | 336 return InitializeDemuxer(done_cb); |
337 | 337 |
338 case kInitRenderer: | 338 case kInitRenderer: |
339 return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); | 339 return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); |
340 | 340 |
341 case kPlaying: | 341 case kPlaying: |
342 // Report metadata the first time we enter the playing state. | 342 // Report metadata the first time we enter the playing state. |
343 if (!is_initialized_) { | 343 if (!is_initialized_) { |
344 is_initialized_ = true; | 344 is_initialized_ = true; |
345 ReportMetadata(); | 345 ReportMetadata(); |
| 346 start_timestamp_ = demuxer_->GetStartTime(); |
346 } | 347 } |
347 | 348 |
348 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 349 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
349 | 350 |
| 351 DCHECK(start_timestamp_ >= base::TimeDelta()); |
350 renderer_->StartPlayingFrom(start_timestamp_); | 352 renderer_->StartPlayingFrom(start_timestamp_); |
351 | 353 |
352 if (text_renderer_) | 354 if (text_renderer_) |
353 text_renderer_->StartPlaying(); | 355 text_renderer_->StartPlaying(); |
354 | 356 |
355 PlaybackRateChangedTask(GetPlaybackRate()); | 357 PlaybackRateChangedTask(GetPlaybackRate()); |
356 VolumeChangedTask(GetVolume()); | 358 VolumeChangedTask(GetVolume()); |
357 return; | 359 return; |
358 | 360 |
359 case kStopping: | 361 case kStopping: |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
577 | 579 |
578 // TODO(scherkus): should we run the callback? I'm tempted to say the API | 580 // TODO(scherkus): should we run the callback? I'm tempted to say the API |
579 // will only execute the first Seek() request. | 581 // will only execute the first Seek() request. |
580 DVLOG(1) << "Media pipeline has not started, ignoring seek to " | 582 DVLOG(1) << "Media pipeline has not started, ignoring seek to " |
581 << time.InMicroseconds() << " (current state: " << state_ << ")"; | 583 << time.InMicroseconds() << " (current state: " << state_ << ")"; |
582 return; | 584 return; |
583 } | 585 } |
584 | 586 |
585 DCHECK(seek_cb_.is_null()); | 587 DCHECK(seek_cb_.is_null()); |
586 | 588 |
| 589 const base::TimeDelta seek_timestamp = |
| 590 std::max(time, demuxer_->GetStartTime()); |
| 591 |
587 SetState(kSeeking); | 592 SetState(kSeeking); |
588 seek_cb_ = seek_cb; | 593 seek_cb_ = seek_cb; |
589 renderer_ended_ = false; | 594 renderer_ended_ = false; |
590 text_renderer_ended_ = false; | 595 text_renderer_ended_ = false; |
591 start_timestamp_ = time; | 596 start_timestamp_ = seek_timestamp; |
592 | 597 |
593 DoSeek(time, | 598 DoSeek(seek_timestamp, |
594 base::Bind(&Pipeline::OnStateTransition, weak_factory_.GetWeakPtr())); | 599 base::Bind(&Pipeline::OnStateTransition, weak_factory_.GetWeakPtr())); |
595 } | 600 } |
596 | 601 |
597 void Pipeline::OnRendererEnded() { | 602 void Pipeline::OnRendererEnded() { |
598 DCHECK(task_runner_->BelongsToCurrentThread()); | 603 DCHECK(task_runner_->BelongsToCurrentThread()); |
599 media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::ENDED)); | 604 media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::ENDED)); |
600 | 605 |
601 if (state_ != kPlaying) | 606 if (state_ != kPlaying) |
602 return; | 607 return; |
603 | 608 |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 metadata_cb_.Run(metadata); | 712 metadata_cb_.Run(metadata); |
708 } | 713 } |
709 | 714 |
710 void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { | 715 void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { |
711 DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; | 716 DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; |
712 DCHECK(task_runner_->BelongsToCurrentThread()); | 717 DCHECK(task_runner_->BelongsToCurrentThread()); |
713 buffering_state_cb_.Run(new_buffering_state); | 718 buffering_state_cb_.Run(new_buffering_state); |
714 } | 719 } |
715 | 720 |
716 } // namespace media | 721 } // namespace media |
OLD | NEW |