X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fmedia%2Fbase%2Fpipeline.cc;h=385db3a7e1ce5f96c0af89caf48717e8b699b488;hb=004985e17e624662a4c85c76a7654039dc83f028;hp=8c0ca54431885e8393e6d8911d60792c496d696f;hpb=2f108dbacb161091e42a3479f4e171339b7e7623;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/media/base/pipeline.cc b/src/media/base/pipeline.cc index 8c0ca54..385db3a 100644 --- a/src/media/base/pipeline.cc +++ b/src/media/base/pipeline.cc @@ -39,7 +39,6 @@ Pipeline::Pipeline( media_log_(media_log), running_(false), did_loading_progress_(false), - total_bytes_(0), volume_(1.0f), playback_rate_(0.0f), clock_(new Clock(&default_tick_clock_)), @@ -49,7 +48,6 @@ Pipeline::Pipeline( audio_ended_(false), video_ended_(false), text_ended_(false), - audio_disabled_(false), demuxer_(NULL), creation_time_(default_tick_clock_.NowTicks()) { media_log_->AddEvent(media_log_->CreatePipelineStateChangedEvent(kCreated)); @@ -161,22 +159,7 @@ TimeDelta Pipeline::GetMediaTime() const { Ranges Pipeline::GetBufferedTimeRanges() { base::AutoLock auto_lock(lock_); - Ranges time_ranges; - for (size_t i = 0; i < buffered_time_ranges_.size(); ++i) { - time_ranges.Add(buffered_time_ranges_.start(i), - buffered_time_ranges_.end(i)); - } - if (clock_->Duration() == TimeDelta() || total_bytes_ == 0) - return time_ranges; - for (size_t i = 0; i < buffered_byte_ranges_.size(); ++i) { - TimeDelta start = TimeForByteOffset_Locked(buffered_byte_ranges_.start(i)); - TimeDelta end = TimeForByteOffset_Locked(buffered_byte_ranges_.end(i)); - // Cap approximated buffered time at the length of the video. - end = std::min(end, clock_->Duration()); - time_ranges.Add(start, end); - } - - return time_ranges; + return buffered_time_ranges_; } TimeDelta Pipeline::GetMediaDuration() const { @@ -184,11 +167,6 @@ TimeDelta Pipeline::GetMediaDuration() const { return clock_->Duration(); } -int64 Pipeline::GetTotalBytes() const { - base::AutoLock auto_lock(lock_); - return total_bytes_; -} - bool Pipeline::DidLoadingProgress() const { base::AutoLock auto_lock(lock_); bool ret = did_loading_progress_; @@ -316,22 +294,11 @@ void Pipeline::SetError(PipelineStatus error) { media_log_->AddEvent(media_log_->CreatePipelineErrorEvent(error)); } -void Pipeline::OnAudioDisabled() { - DCHECK(IsRunning()); - task_runner_->PostTask(FROM_HERE, base::Bind( - &Pipeline::AudioDisabledTask, base::Unretained(this))); - media_log_->AddEvent( - media_log_->CreateEvent(MediaLogEvent::AUDIO_RENDERER_DISABLED)); -} - void Pipeline::OnAudioTimeUpdate(TimeDelta time, TimeDelta max_time) { DCHECK_LE(time.InMicroseconds(), max_time.InMicroseconds()); DCHECK(IsRunning()); base::AutoLock auto_lock(lock_); - if (audio_disabled_) - return; - if (waiting_for_clock_update_ && time < clock_->Elapsed()) return; @@ -348,7 +315,7 @@ void Pipeline::OnVideoTimeUpdate(TimeDelta max_time) { DCHECK(IsRunning()); base::AutoLock auto_lock(lock_); - if (audio_renderer_ && !audio_disabled_) + if (audio_renderer_) return; // TODO(scherkus): |state_| should only be accessed on pipeline thread, see @@ -373,39 +340,6 @@ void Pipeline::SetDuration(TimeDelta duration) { duration_change_cb_.Run(); } -void Pipeline::SetTotalBytes(int64 total_bytes) { - DCHECK(IsRunning()); - media_log_->AddEvent( - media_log_->CreateStringEvent( - MediaLogEvent::TOTAL_BYTES_SET, "total_bytes", - base::Int64ToString(total_bytes))); - int64 total_mbytes = total_bytes >> 20; - if (total_mbytes > kint32max) - total_mbytes = kint32max; - UMA_HISTOGRAM_CUSTOM_COUNTS( - "Media.TotalMBytes", static_cast(total_mbytes), 1, kint32max, 50); - - base::AutoLock auto_lock(lock_); - total_bytes_ = total_bytes; -} - -TimeDelta Pipeline::TimeForByteOffset_Locked(int64 byte_offset) const { - lock_.AssertAcquired(); - // Use floating point to avoid potential overflow when using 64 bit integers. - double time_offset_in_ms = clock_->Duration().InMilliseconds() * - (static_cast(byte_offset) / total_bytes_); - TimeDelta time_offset(TimeDelta::FromMilliseconds( - static_cast(time_offset_in_ms))); - // Since the byte->time calculation is approximate, fudge the beginning & - // ending areas to look better. - TimeDelta epsilon = clock_->Duration() / 100; - if (time_offset < epsilon) - return TimeDelta(); - if (time_offset + epsilon > clock_->Duration()) - return clock_->Duration(); - return time_offset; -} - void Pipeline::OnStateTransition(PipelineStatus status) { // Force post to process state transitions after current execution frame. task_runner_->PostTask(FROM_HERE, base::Bind( @@ -469,6 +403,7 @@ void Pipeline::StateTransitionTask(PipelineStatus status) { PipelineMetadata metadata; metadata.has_audio = audio_renderer_; metadata.has_video = video_renderer_; + metadata.timeline_offset = demuxer_->GetTimelineOffset(); DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); if (stream) metadata.natural_size = stream->video_decoder_config().natural_size(); @@ -486,7 +421,7 @@ void Pipeline::StateTransitionTask(PipelineStatus status) { // We use audio stream to update the clock. So if there is such a // stream, we pause the clock until we receive a valid timestamp. waiting_for_clock_update_ = true; - if (!audio_renderer_ || audio_disabled_) { + if (!audio_renderer_) { clock_->SetMaxTime(clock_->Duration()); StartClockIfWaitingForTimeUpdate_Locked(); } @@ -684,13 +619,6 @@ void Pipeline::OnStopCompleted(PipelineStatus status) { } } -void Pipeline::AddBufferedByteRange(int64 start, int64 end) { - DCHECK(IsRunning()); - base::AutoLock auto_lock(lock_); - buffered_byte_ranges_.Add(start, end); - did_loading_progress_ = true; -} - void Pipeline::AddBufferedTimeRange(base::TimeDelta start, base::TimeDelta end) { DCHECK(IsRunning()); @@ -853,7 +781,7 @@ void Pipeline::DoAudioRendererEnded() { audio_ended_ = true; // Start clock since there is no more audio to trigger clock updates. - if (!audio_disabled_) { + { base::AutoLock auto_lock(lock_); clock_->SetMaxTime(clock_->Duration()); StartClockIfWaitingForTimeUpdate_Locked(); @@ -889,7 +817,7 @@ void Pipeline::DoTextRendererEnded() { void Pipeline::RunEndedCallbackIfNeeded() { DCHECK(task_runner_->BelongsToCurrentThread()); - if (audio_renderer_ && !audio_ended_ && !audio_disabled_) + if (audio_renderer_ && !audio_ended_) return; if (video_renderer_ && !video_ended_) @@ -907,20 +835,6 @@ void Pipeline::RunEndedCallbackIfNeeded() { ended_cb_.Run(); } -void Pipeline::AudioDisabledTask() { - DCHECK(task_runner_->BelongsToCurrentThread()); - - base::AutoLock auto_lock(lock_); - audio_disabled_ = true; - - // Notify our demuxer that we're no longer rendering audio. - demuxer_->OnAudioRendererDisabled(); - - // Start clock since there is no more audio to trigger clock updates. - clock_->SetMaxTime(clock_->Duration()); - StartClockIfWaitingForTimeUpdate_Locked(); -} - void Pipeline::AddTextStreamTask(DemuxerStream* text_stream, const TextTrackConfig& config) { DCHECK(task_runner_->BelongsToCurrentThread()); @@ -952,7 +866,6 @@ void Pipeline::InitializeAudioRenderer(const PipelineStatusCB& done_cb) { base::Bind(&Pipeline::OnAudioUnderflow, base::Unretained(this)), base::Bind(&Pipeline::OnAudioTimeUpdate, base::Unretained(this)), base::Bind(&Pipeline::OnAudioRendererEnded, base::Unretained(this)), - base::Bind(&Pipeline::OnAudioDisabled, base::Unretained(this)), base::Bind(&Pipeline::SetError, base::Unretained(this))); } @@ -962,6 +875,7 @@ void Pipeline::InitializeVideoRenderer(const PipelineStatusCB& done_cb) { video_renderer_ = filter_collection_->GetVideoRenderer(); video_renderer_->Initialize( demuxer_->GetStream(DemuxerStream::VIDEO), + demuxer_->GetLiveness() == Demuxer::LIVENESS_LIVE, done_cb, base::Bind(&Pipeline::OnUpdateStatistics, base::Unretained(this)), base::Bind(&Pipeline::OnVideoTimeUpdate, base::Unretained(this)),