Chromium Code Reviews| 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 weak_factory_(this) { | 46 weak_factory_(this) { |
| 48 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); | 47 media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); |
| 49 media_log_->AddEvent( | 48 media_log_->AddEvent( |
| 50 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); | 49 media_log_->CreateEvent(MediaLogEvent::PIPELINE_CREATED)); |
| 51 } | 50 } |
| 52 | 51 |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 UMA_HISTOGRAM_LONG_TIMES("Media.Duration", duration); | 289 UMA_HISTOGRAM_LONG_TIMES("Media.Duration", duration); |
| 291 | 290 |
| 292 base::AutoLock auto_lock(lock_); | 291 base::AutoLock auto_lock(lock_); |
| 293 duration_ = duration; | 292 duration_ = duration; |
| 294 if (!duration_change_cb_.is_null()) | 293 if (!duration_change_cb_.is_null()) |
| 295 duration_change_cb_.Run(); | 294 duration_change_cb_.Run(); |
| 296 } | 295 } |
| 297 | 296 |
| 298 void Pipeline::OnStateTransition(PipelineStatus status) { | 297 void Pipeline::OnStateTransition(PipelineStatus status) { |
| 299 DCHECK(task_runner_->BelongsToCurrentThread()); | 298 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 299 // When demuxer has finished the init segment, it should call ReportMetadata | |
| 300 // in case meeting 'decode' error when passing media segment but | |
| 301 // WebMediaPlayer's ready_state_ is still ReadyStateHaveNothing. In that case | |
| 302 // it will be treated as NetworkStateFormatError not NetworkStateDecodeError. | |
| 303 if (state_ == kInitDemuxer && status == PIPELINE_OK) { | |
|
DaleCurtis
2014/11/19 00:20:29
Why here instead of in StateTransitionTask before
| |
| 304 ReportMetadata(); | |
|
philipj_slow
2014/11/18 09:24:23
Will this affect both MSE and normal playback? The
| |
| 305 start_timestamp_ = demuxer_->GetStartTime(); | |
| 306 } | |
| 300 // Force post to process state transitions after current execution frame. | 307 // Force post to process state transitions after current execution frame. |
| 301 task_runner_->PostTask( | 308 task_runner_->PostTask( |
| 302 FROM_HERE, | 309 FROM_HERE, |
| 303 base::Bind( | 310 base::Bind( |
| 304 &Pipeline::StateTransitionTask, weak_factory_.GetWeakPtr(), status)); | 311 &Pipeline::StateTransitionTask, weak_factory_.GetWeakPtr(), status)); |
| 305 } | 312 } |
| 306 | 313 |
| 307 void Pipeline::StateTransitionTask(PipelineStatus status) { | 314 void Pipeline::StateTransitionTask(PipelineStatus status) { |
| 308 DCHECK(task_runner_->BelongsToCurrentThread()); | 315 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 309 | 316 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 332 // Switch states, performing any entrance actions for the new state as well. | 339 // Switch states, performing any entrance actions for the new state as well. |
| 333 SetState(GetNextState()); | 340 SetState(GetNextState()); |
| 334 switch (state_) { | 341 switch (state_) { |
| 335 case kInitDemuxer: | 342 case kInitDemuxer: |
| 336 return InitializeDemuxer(done_cb); | 343 return InitializeDemuxer(done_cb); |
| 337 | 344 |
| 338 case kInitRenderer: | 345 case kInitRenderer: |
| 339 return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); | 346 return InitializeRenderer(base::Bind(done_cb, PIPELINE_OK)); |
| 340 | 347 |
| 341 case kPlaying: | 348 case kPlaying: |
| 342 // Report metadata the first time we enter the playing state. | |
| 343 if (!is_initialized_) { | |
| 344 is_initialized_ = true; | |
| 345 ReportMetadata(); | |
| 346 start_timestamp_ = demuxer_->GetStartTime(); | |
| 347 } | |
| 348 | |
| 349 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); | 349 base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); |
| 350 | 350 |
| 351 DCHECK(start_timestamp_ >= base::TimeDelta()); | 351 DCHECK(start_timestamp_ >= base::TimeDelta()); |
| 352 renderer_->StartPlayingFrom(start_timestamp_); | 352 renderer_->StartPlayingFrom(start_timestamp_); |
| 353 | 353 |
| 354 if (text_renderer_) | 354 if (text_renderer_) |
| 355 text_renderer_->StartPlaying(); | 355 text_renderer_->StartPlaying(); |
| 356 | 356 |
| 357 PlaybackRateChangedTask(GetPlaybackRate()); | 357 PlaybackRateChangedTask(GetPlaybackRate()); |
| 358 VolumeChangedTask(GetVolume()); | 358 VolumeChangedTask(GetVolume()); |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 703 DCHECK(task_runner_->BelongsToCurrentThread()); | 703 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 704 PipelineMetadata metadata; | 704 PipelineMetadata metadata; |
| 705 metadata.has_audio = renderer_->HasAudio(); | 705 metadata.has_audio = renderer_->HasAudio(); |
| 706 metadata.has_video = renderer_->HasVideo(); | 706 metadata.has_video = renderer_->HasVideo(); |
| 707 metadata.timeline_offset = demuxer_->GetTimelineOffset(); | 707 metadata.timeline_offset = demuxer_->GetTimelineOffset(); |
| 708 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); | 708 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 709 if (stream) { | 709 if (stream) { |
| 710 metadata.natural_size = stream->video_decoder_config().natural_size(); | 710 metadata.natural_size = stream->video_decoder_config().natural_size(); |
| 711 metadata.video_rotation = stream->video_rotation(); | 711 metadata.video_rotation = stream->video_rotation(); |
| 712 } | 712 } |
| 713 metadata_cb_.Run(metadata); | 713 base::ResetAndReturn(&metadata_cb_).Run(metadata); |
| 714 } | 714 } |
| 715 | 715 |
| 716 void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { | 716 void Pipeline::BufferingStateChanged(BufferingState new_buffering_state) { |
| 717 DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; | 717 DVLOG(1) << __FUNCTION__ << "(" << new_buffering_state << ") "; |
| 718 DCHECK(task_runner_->BelongsToCurrentThread()); | 718 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 719 buffering_state_cb_.Run(new_buffering_state); | 719 buffering_state_cb_.Run(new_buffering_state); |
| 720 } | 720 } |
| 721 | 721 |
| 722 } // namespace media | 722 } // namespace media |
| OLD | NEW |