Commit 536be704 authored by atsykhonia's avatar atsykhonia Committed by Commit bot

If duration of media source is unknown then return NaN.

According to spec http://www.w3schools.com/tags/av_prop_duration.asp,
if no audio/video is set, NaN should be returned. When metadata is not
available, duration is unknown then NaN is returned.

R=qinmin@chromium.org

Review URL: https://codereview.chromium.org/552723003

Cr-Commit-Position: refs/heads/master@{#294131}
parent 6fc28ad9
......@@ -140,6 +140,7 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
has_size_info_(false),
stream_texture_factory_(factory),
needs_external_surface_(false),
has_valid_metadata_(false),
video_frame_provider_client_(NULL),
pending_playback_(false),
player_type_(MEDIA_PLAYER_TYPE_URL),
......@@ -427,7 +428,8 @@ bool WebMediaPlayerAndroid::seeking() const {
double WebMediaPlayerAndroid::duration() const {
DCHECK(main_thread_checker_.CalledOnValidThread());
// HTML5 spec requires duration to be NaN if readyState is HAVE_NOTHING
if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing)
if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing ||
!has_valid_metadata_)
return std::numeric_limits<double>::quiet_NaN();
if (duration_ == media::kInfiniteDuration())
......@@ -481,7 +483,8 @@ WebTimeRanges WebMediaPlayerAndroid::buffered() const {
double WebMediaPlayerAndroid::maxTimeSeekable() const {
// If we haven't even gotten to ReadyStateHaveMetadata yet then just
// return 0 so that the seekable range is empty.
if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata)
if (ready_state_ < WebMediaPlayer::ReadyStateHaveMetadata ||
!has_valid_metadata_)
return 0.0;
return duration();
......@@ -731,6 +734,8 @@ void WebMediaPlayerAndroid::OnMediaMetadataChanged(
if (success)
OnVideoSizeChanged(width, height);
has_valid_metadata_ = success;
if (need_to_signal_duration_changed)
client_->durationChanged();
}
......@@ -753,7 +758,7 @@ void WebMediaPlayerAndroid::OnPlaybackComplete() {
}
void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) {
buffered_[0].end = duration() * percentage / 100;
buffered_[0].end = has_valid_metadata_ ? duration() * percentage / 100 : 0;
did_loading_progress_ = true;
}
......
......@@ -431,6 +431,9 @@ class WebMediaPlayerAndroid : public blink::WebMediaPlayer,
// Only used for the VIDEO_HOLE logic.
bool needs_external_surface_;
// Whether valid metadata are available
bool has_valid_metadata_;
// A pointer back to the compositor to inform it about state changes. This is
// not NULL while the compositor is actively using this webmediaplayer.
cc::VideoFrameProvider::Client* video_frame_provider_client_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment