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) { |