summaryrefslogtreecommitdiffstats
path: root/webkit/media
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-15 20:24:58 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-15 20:24:58 +0000
commitc2a45e243be60e579477651cf8f69649b9bd9827 (patch)
tree09044ef8952fa55d771227e45050e6681011a3ef /webkit/media
parent1afaecc5ac52da8d37a7d3cf18159b0b7bbdbba1 (diff)
downloadchromium_src-c2a45e243be60e579477651cf8f69649b9bd9827.zip
chromium_src-c2a45e243be60e579477651cf8f69649b9bd9827.tar.gz
chromium_src-c2a45e243be60e579477651cf8f69649b9bd9827.tar.bz2
Move duration change logic from WebMediaPlayerImpl to ChunkDemuxer.
BUG=176085 TEST=All existing tests still pass. Review URL: https://chromiumcodereview.appspot.com/12252017 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182810 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/media')
-rw-r--r--webkit/media/webmediaplayer_impl.cc79
-rw-r--r--webkit/media/webmediaplayer_impl.h7
2 files changed, 21 insertions, 65 deletions
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
index 5948c1d..f904e25 100644
--- a/webkit/media/webmediaplayer_impl.cc
+++ b/webkit/media/webmediaplayer_impl.cc
@@ -4,6 +4,7 @@
#include "webkit/media/webmediaplayer_impl.h"
+#include <algorithm>
#include <limits>
#include <string>
#include <vector>
@@ -131,7 +132,6 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
paused_(true),
seeking_(false),
playback_rate_(0.0f),
- user_specified_duration_(-1),
pending_seek_(false),
pending_seek_seconds_(0.0f),
client_(client),
@@ -491,14 +491,25 @@ float WebMediaPlayerImpl::duration() const {
if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing)
return std::numeric_limits<float>::quiet_NaN();
- double duration = user_specified_duration_;
- if (duration < 0)
+ double duration;
+ if (chunk_demuxer_) {
+ duration = chunk_demuxer_->GetDuration();
+ } else {
duration = GetPipelineDuration();
+ }
- // Make sure super small durations don't get truncated to 0 by
- // the double -> float conversion.
- if (duration > 0.0 && duration < std::numeric_limits<float>::min())
- return std::numeric_limits<float>::min();
+ // Make sure super small durations don't get truncated to 0 and
+ // large durations don't get converted to infinity by the double -> float
+ // conversion.
+ //
+ // TODO(acolwell): Remove when WebKit is changed to report duration as a
+ // double.
+ if (duration > 0.0 && duration < std::numeric_limits<double>::infinity()) {
+ duration = std::max(duration,
+ static_cast<double>(std::numeric_limits<float>::min()));
+ duration = std::min(duration,
+ static_cast<double>(std::numeric_limits<float>::max()));
+ }
return static_cast<float>(duration);
}
@@ -693,17 +704,9 @@ bool WebMediaPlayerImpl::sourceAppend(const WebKit::WebString& id,
unsigned length) {
DCHECK_EQ(main_loop_, MessageLoop::current());
- double old_duration = GetPipelineDuration();
if (!chunk_demuxer_->AppendData(id.utf8().data(), data, length))
return false;
- double new_duration = GetPipelineDuration();
- if (old_duration != new_duration) {
- // Clear user specified duration since the AppendData() call caused
- // the presentation duration to change.
- user_specified_duration_ = -1;
- OnDurationChange();
- }
return true;
}
@@ -714,39 +717,7 @@ bool WebMediaPlayerImpl::sourceAbort(const WebKit::WebString& id) {
void WebMediaPlayerImpl::sourceSetDuration(double new_duration) {
DCHECK_GE(new_duration, 0);
-
- if (user_specified_duration_ == new_duration)
- return;
-
- // Update |user_specified_duration_| so it reports exactly what the
- // application specified.
- user_specified_duration_ = new_duration;
-
- // Compute & bounds check the duration actually sent to the ChunkDemuxer.
- // This can be different than the value of |user_specified_duration_| if the
- // value of |new_duration| doesn't fit the range or precision of
- // base::TimeDelta.
- base::TimeDelta min_duration = base::TimeDelta::FromInternalValue(1);
- base::TimeDelta max_duration =
- base::TimeDelta::FromInternalValue(kint64max - 1);
- double min_duration_in_seconds = min_duration.InSecondsF();
- double max_duration_in_seconds = max_duration.InSecondsF();
-
- base::TimeDelta duration;
- if (new_duration == std::numeric_limits<double>::infinity()) {
- duration = media::kInfiniteDuration();
- } else if (new_duration < min_duration_in_seconds) {
- duration = min_duration;
- } else if (new_duration > max_duration_in_seconds) {
- duration = max_duration;
- } else {
- duration = base::TimeDelta::FromMicroseconds(
- new_duration * base::Time::kMicrosecondsPerSecond);
- }
-
- DCHECK(duration > base::TimeDelta());
- chunk_demuxer_->SetDuration(duration);
- OnDurationChange();
+ chunk_demuxer_->SetDuration(new_duration);
}
void WebMediaPlayerImpl::sourceEndOfStream(
@@ -767,17 +738,8 @@ void WebMediaPlayerImpl::sourceEndOfStream(
NOTIMPLEMENTED();
}
- double old_duration = GetPipelineDuration();
if (!chunk_demuxer_->EndOfStream(pipeline_status))
DVLOG(1) << "EndOfStream call failed.";
-
- double new_duration = GetPipelineDuration();
- if (old_duration != new_duration) {
- // Clear user specified duration since the EndOfStream() call caused
- // the presentation duration to change.
- user_specified_duration_ = -1;
- OnDurationChange();
- }
}
bool WebMediaPlayerImpl::sourceSetTimestampOffset(const WebKit::WebString& id,
@@ -1170,7 +1132,8 @@ void WebMediaPlayerImpl::StartPipeline() {
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineEnded),
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineError),
BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineSeek),
- BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState));
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnPipelineBufferingState),
+ BIND_TO_RENDER_LOOP(&WebMediaPlayerImpl::OnDurationChange));
}
void WebMediaPlayerImpl::SetNetworkState(WebMediaPlayer::NetworkState state) {
diff --git a/webkit/media/webmediaplayer_impl.h b/webkit/media/webmediaplayer_impl.h
index 81566fd..9518f24 100644
--- a/webkit/media/webmediaplayer_impl.h
+++ b/webkit/media/webmediaplayer_impl.h
@@ -311,13 +311,6 @@ class WebMediaPlayerImpl
float playback_rate_;
base::TimeDelta paused_time_;
- // The duration passed to the last sourceSetDuration(). If
- // sourceSetDuration() is never called or a sourceAppend() call or
- // a sourceEndOfStream() call changes the pipeline duration, then this
- // variable is set to < 0 to indicate that the pipeline duration represents
- // the actual duration instead of a user specified value.
- double user_specified_duration_;
-
// Seek gets pending if another seek is in progress. Only last pending seek
// will have effect.
bool pending_seek_;