Chromium Code Reviews| Index: media/base/pipeline.cc |
| diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc |
| index 059710525372976dad8118a21e144fc6542d154c..6ac894aec477c8d747e7ad1999602dbc7630422f 100644 |
| --- a/media/base/pipeline.cc |
| +++ b/media/base/pipeline.cc |
| @@ -39,7 +39,6 @@ Pipeline::Pipeline( |
| volume_(1.0f), |
| playback_rate_(0.0f), |
| status_(PIPELINE_OK), |
| - is_initialized_(false), |
| state_(kCreated), |
| renderer_ended_(false), |
| text_renderer_ended_(false), |
| @@ -297,6 +296,14 @@ void Pipeline::SetDuration(TimeDelta duration) { |
| void Pipeline::OnStateTransition(PipelineStatus status) { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| + // When demuxer has finished the init segment, it should call ReportMetadata |
|
DaleCurtis
2014/11/20 18:59:51
This is too general of a location for this code; t
|
| + // in case meeting 'decode' error when passing media segment but |
| + // WebMediaPlayer's ready_state_ is still ReadyStateHaveNothing. In that case |
| + // it will be treated as NetworkStateFormatError not NetworkStateDecodeError. |
| + if (state_ == kInitDemuxer && status == PIPELINE_OK) { |
| + ReportMetadata(); |
| + start_timestamp_ = demuxer_->GetStartTime(); |
| + } |
| // Force post to process state transitions after current execution frame. |
| task_runner_->PostTask( |
| FROM_HERE, |
| @@ -339,13 +346,6 @@ void Pipeline::StateTransitionTask(PipelineStatus status) { |
| return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); |
| case kPlaying: |
| - // Report metadata the first time we enter the playing state. |
| - if (!is_initialized_) { |
| - is_initialized_ = true; |
| - ReportMetadata(); |
| - start_timestamp_ = demuxer_->GetStartTime(); |
| - } |
| - |
| base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| DCHECK(start_timestamp_ >= base::TimeDelta()); |
| @@ -702,15 +702,17 @@ void Pipeline::InitializeRenderer(const base::Closure& done_cb) { |
| void Pipeline::ReportMetadata() { |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| PipelineMetadata metadata; |
| - metadata.has_audio = renderer_->HasAudio(); |
| - metadata.has_video = renderer_->HasVideo(); |
| metadata.timeline_offset = demuxer_->GetTimelineOffset(); |
| DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| if (stream) { |
| + metadata.has_video = true; |
| metadata.natural_size = stream->video_decoder_config().natural_size(); |
| metadata.video_rotation = stream->video_rotation(); |
| } |
| - metadata_cb_.Run(metadata); |
| + if (demuxer_->GetStream(DemuxerStream::AUDIO)) { |
| + metadata.has_audio = true; |
| + } |
| + base::ResetAndReturn(&metadata_cb_).Run(metadata); |
| } |
| void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { |