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 21 matching lines...) Expand all Loading... |
32 Pipeline::Pipeline( | 32 Pipeline::Pipeline( |
33 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 33 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
34 MediaLog* media_log) | 34 MediaLog* media_log) |
35 : task_runner_(task_runner), | 35 : task_runner_(task_runner), |
36 media_log_(media_log), | 36 media_log_(media_log), |
37 running_(false), | 37 running_(false), |
38 did_loading_progress_(false), | 38 did_loading_progress_(false), |
39 volume_(1.0f), | 39 volume_(1.0f), |
40 playback_rate_(0.0f), | 40 playback_rate_(0.0f), |
41 status_(PIPELINE_OK), | 41 status_(PIPELINE_OK), |
42 is_initialized_(false), | |
43 state_(kCreated), | 42 state_(kCreated), |
44 renderer_ended_(false), | 43 renderer_ended_(false), |
45 text_renderer_ended_(false), | 44 text_renderer_ended_(false), |
46 demuxer_(NULL), | 45 demuxer_(NULL), |
47 pending_cdm_context_(nullptr), | 46 pending_cdm_context_(nullptr), |
48 weak_factory_(this) { | 47 weak_factory_(this) { |
49 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); | 48 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); |
50 media_log_->AddEvent( | 49 media_log_->AddEvent( |
51 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); | 50 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); |
52 } | 51 } |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 PipelineStatusCB done_cb = | 327 PipelineStatusCB done_cb = |
329 base::Bind(&Pipeline::StateTransitionTask, weak_factory_.GetWeakPtr()); | 328 base::Bind(&Pipeline::StateTransitionTask, weak_factory_.GetWeakPtr()); |
330 | 329 |
331 // Switch states, performing any entrance actions for the new state as well. | 330 // Switch states, performing any entrance actions for the new state as well. |
332 SetState(GetNextState()); | 331 SetState(GetNextState()); |
333 switch (state_) { | 332 switch (state_) { |
334 case kInitDemuxer: | 333 case kInitDemuxer: |
335 return InitializeDemuxer(done_cb); | 334 return InitializeDemuxer(done_cb); |
336 | 335 |
337 case kInitRenderer: | 336 case kInitRenderer: |
| 337 // When the state_ transfers to kInitRenderer, it means the demuxer has |
| 338 // finished parsing the init info. It should call ReportMetadata in case |
| 339 // meeting 'decode' error when passing media segment but WebMediaPlayer's |
| 340 // ready_state_ is still ReadyStateHaveNothing. In that case, it will |
| 341 // treat it as NetworkStateFormatError not NetworkStateDecodeError. |
| 342 ReportMetadata(); |
| 343 start_timestamp_ = demuxer_->GetStartTime(); |
| 344 |
338 return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); | 345 return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); |
339 | 346 |
340 case kPlaying: | 347 case kPlaying: |
341 // Report metadata the first time we enter the playing state. | |
342 if (!is_initialized_) { | |
343 is_initialized_ = true; | |
344 ReportMetadata(); | |
345 start_timestamp_ = demuxer_->GetStartTime(); | |
346 } | |
347 | |
348 DCHECK(start_timestamp_ >= base::TimeDelta()); | 348 DCHECK(start_timestamp_ >= base::TimeDelta()); |
349 renderer_->StartPlayingFrom(start_timestamp_); | 349 renderer_->StartPlayingFrom(start_timestamp_); |
350 | 350 |
351 if (text_renderer_) | 351 if (text_renderer_) |
352 text_renderer_->StartPlaying(); | 352 text_renderer_->StartPlaying(); |
353 | 353 |
354 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 354 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
355 | 355 |
356 PlaybackRateChangedTask(GetPlaybackRate()); | 356 PlaybackRateChangedTask(GetPlaybackRate()); |
357 VolumeChangedTask(GetVolume()); | 357 VolumeChangedTask(GetVolume()); |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 base::Bind(&Pipeline::OnUpdateStatistics, weak_this), | 722 base::Bind(&Pipeline::OnUpdateStatistics, weak_this), |
723 base::Bind(&Pipeline::BufferingStateChanged, weak_this), | 723 base::Bind(&Pipeline::BufferingStateChanged, weak_this), |
724 base::ResetAndReturn(&paint_cb_), | 724 base::ResetAndReturn(&paint_cb_), |
725 base::Bind(&Pipeline::OnRendererEnded, weak_this), | 725 base::Bind(&Pipeline::OnRendererEnded, weak_this), |
726 base::Bind(&Pipeline::OnError, weak_this)); | 726 base::Bind(&Pipeline::OnError, weak_this)); |
727 } | 727 } |
728 | 728 |
729 void Pipeline::ReportMetadata() { | 729 void Pipeline::ReportMetadata() { |
730 DCHECK(task_runner_->BelongsToCurrentThread()); | 730 DCHECK(task_runner_->BelongsToCurrentThread()); |
731 PipelineMetadata metadata; | 731 PipelineMetadata metadata; |
732 metadata.has_audio = renderer_->HasAudio(); | |
733 metadata.has_video = renderer_->HasVideo(); | |
734 metadata.timeline_offset = demuxer_->GetTimelineOffset(); | 732 metadata.timeline_offset = demuxer_->GetTimelineOffset(); |
735 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 733 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
736 if (stream) { | 734 if (stream) { |
| 735 metadata.has_video = true; |
737 metadata.natural_size = stream->video_decoder_config().natural_size(); | 736 metadata.natural_size = stream->video_decoder_config().natural_size(); |
738 metadata.video_rotation = stream->video_rotation(); | 737 metadata.video_rotation = stream->video_rotation(); |
739 } | 738 } |
| 739 if (demuxer_->GetStream(DemuxerStream::AUDIO)) { |
| 740 metadata.has_audio = true; |
| 741 } |
740 metadata_cb_.Run(metadata); | 742 metadata_cb_.Run(metadata); |
741 } | 743 } |
742 | 744 |
743 void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { | 745 void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { |
744 DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; | 746 DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; |
745 DCHECK(task_runner_->BelongsToCurrentThread()); | 747 DCHECK(task_runner_->BelongsToCurrentThread()); |
746 buffering_state_cb_.Run(new_buffering_state); | 748 buffering_state_cb_.Run(new_buffering_state); |
747 } | 749 } |
748 | 750 |
749 } // namespace media | 751 } // namespace media |
OLD | NEW |