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( ...@@ -140,6 +140,7 @@ WebMediaPlayerAndroid::WebMediaPlayerAndroid(
has_size_info_(false), has_size_info_(false),
stream_texture_factory_(factory), stream_texture_factory_(factory),
needs_external_surface_(false), needs_external_surface_(false),
has_valid_metadata_(false),
video_frame_provider_client_(NULL), video_frame_provider_client_(NULL),
pending_playback_(false), pending_playback_(false),
player_type_(MEDIA_PLAYER_TYPE_URL), player_type_(MEDIA_PLAYER_TYPE_URL),
...@@ -427,7 +428,8 @@ bool WebMediaPlayerAndroid::seeking() const { ...@@ -427,7 +428,8 @@ bool WebMediaPlayerAndroid::seeking() const {
double WebMediaPlayerAndroid::duration() const { double WebMediaPlayerAndroid::duration() const {
DCHECK(main_thread_checker_.CalledOnValidThread()); DCHECK(main_thread_checker_.CalledOnValidThread());
// HTML5 spec requires duration to be NaN if readyState is HAVE_NOTHING // 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(); return std::numeric_limits<double>::quiet_NaN();
if (duration_ == media::kInfiniteDuration()) if (duration_ == media::kInfiniteDuration())
...@@ -481,7 +483,8 @@ WebTimeRanges WebMediaPlayerAndroid::buffered() const { ...@@ -481,7 +483,8 @@ WebTimeRanges WebMediaPlayerAndroid::buffered() const {
double WebMediaPlayerAndroid::maxTimeSeekable() const { double WebMediaPlayerAndroid::maxTimeSeekable() const {
// If we haven't even gotten to ReadyStateHaveMetadata yet then just // If we haven't even gotten to ReadyStateHaveMetadata yet then just
// return 0 so that the seekable range is empty. // 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 0.0;
return duration(); return duration();
...@@ -731,6 +734,8 @@ void WebMediaPlayerAndroid::OnMediaMetadataChanged( ...@@ -731,6 +734,8 @@ void WebMediaPlayerAndroid::OnMediaMetadataChanged(
if (success) if (success)
OnVideoSizeChanged(width, height); OnVideoSizeChanged(width, height);
has_valid_metadata_ = success;
if (need_to_signal_duration_changed) if (need_to_signal_duration_changed)
client_->durationChanged(); client_->durationChanged();
} }
...@@ -753,7 +758,7 @@ void WebMediaPlayerAndroid::OnPlaybackComplete() { ...@@ -753,7 +758,7 @@ void WebMediaPlayerAndroid::OnPlaybackComplete() {
} }
void WebMediaPlayerAndroid::OnBufferingUpdate(int percentage) { 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; did_loading_progress_ = true;
} }
......
...@@ -431,6 +431,9 @@ class WebMediaPlayerAndroid : public blink::WebMediaPlayer, ...@@ -431,6 +431,9 @@ class WebMediaPlayerAndroid : public blink::WebMediaPlayer,
// Only used for the VIDEO_HOLE logic. // Only used for the VIDEO_HOLE logic.
bool needs_external_surface_; 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 // A pointer back to the compositor to inform it about state changes. This is
// not NULL while the compositor is actively using this webmediaplayer. // not NULL while the compositor is actively using this webmediaplayer.
cc::VideoFrameProvider::Client* video_frame_provider_client_; 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