diff options
author | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-28 22:27:27 +0000 |
---|---|---|
committer | acolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-28 22:27:27 +0000 |
commit | be57ee508ad4b8a45d15343cf96919dde4cc1952 (patch) | |
tree | 2d44342d946cffad47dba54ce65ed2e770036122 | |
parent | 65ae79ba312fa4236c466ecadb6ef3e6ac8fa1d9 (diff) | |
download | chromium_src-be57ee508ad4b8a45d15343cf96919dde4cc1952.zip chromium_src-be57ee508ad4b8a45d15343cf96919dde4cc1952.tar.gz chromium_src-be57ee508ad4b8a45d15343cf96919dde4cc1952.tar.bz2 |
Fix MediaPlayerDelegate error handling so it passes the webkitmediasource-errors.html LayoutTest.
BUG=233420
TEST=http/tests/media/media-source/webkitmediasource-errors.html LayoutTests
now passes w/o crashing.
Review URL: https://chromiumcodereview.appspot.com/15927003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@202671 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | webkit/media/android/media_source_delegate.cc | 10 | ||||
-rw-r--r-- | webkit/media/android/webmediaplayer_android.cc | 10 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_impl.cc | 46 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_util.cc | 39 | ||||
-rw-r--r-- | webkit/media/webmediaplayer_util.h | 5 |
5 files changed, 59 insertions, 51 deletions
diff --git a/webkit/media/android/media_source_delegate.cc b/webkit/media/android/media_source_delegate.cc index 03dac32..1b63ed1 100644 --- a/webkit/media/android/media_source_delegate.cc +++ b/webkit/media/android/media_source_delegate.cc @@ -373,14 +373,8 @@ void MediaSourceDelegate::OnDemuxerError( media::PipelineStatus status) { DVLOG(1) << "MediaSourceDelegate::OnDemuxerError(" << status << ") : " << player_id_; - if (status != media::PIPELINE_OK) { - DCHECK(status == media::DEMUXER_ERROR_COULD_NOT_OPEN || - status == media::DEMUXER_ERROR_COULD_NOT_PARSE || - status == media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS) - << "Unexpected error from demuxer: " << static_cast<int>(status); - if (!update_network_state_cb_.is_null()) - update_network_state_cb_.Run(WebMediaPlayer::NetworkStateFormatError); - } + if (status != media::PIPELINE_OK && !update_network_state_cb_.is_null()) + update_network_state_cb_.Run(PipelineErrorToNetworkState(status)); } void MediaSourceDelegate::OnDemuxerInitDone( diff --git a/webkit/media/android/webmediaplayer_android.cc b/webkit/media/android/webmediaplayer_android.cc index cc88632..dabb584 100644 --- a/webkit/media/android/webmediaplayer_android.cc +++ b/webkit/media/android/webmediaplayer_android.cc @@ -520,7 +520,15 @@ void WebMediaPlayerAndroid::OnMediaSeekRequest(base::TimeDelta time_to_seek, void WebMediaPlayerAndroid::UpdateNetworkState( WebMediaPlayer::NetworkState state) { - network_state_ = state; + if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing && + (state == WebMediaPlayer::NetworkStateNetworkError || + state == WebMediaPlayer::NetworkStateDecodeError)) { + // Any error that occurs before reaching ReadyStateHaveMetadata should + // be considered a format error. + network_state_ = WebMediaPlayer::NetworkStateFormatError; + } else { + network_state_ = state; + } client_->networkStateChanged(); } diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc index 481c0da..d72c766 100644 --- a/webkit/media/webmediaplayer_impl.cc +++ b/webkit/media/webmediaplayer_impl.cc @@ -873,6 +873,7 @@ void WebMediaPlayerImpl::OnPipelineEnded() { void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { DCHECK(main_loop_->BelongsToCurrentThread()); + DCHECK_NE(error, media::PIPELINE_OK); if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) { // Any error that occurs before reaching ReadyStateHaveMetadata should @@ -882,49 +883,10 @@ void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { return; } - switch (error) { - case media::PIPELINE_OK: - NOTREACHED() << "PIPELINE_OK isn't an error!"; - break; - - case media::PIPELINE_ERROR_NETWORK: - case media::PIPELINE_ERROR_READ: - SetNetworkState(WebMediaPlayer::NetworkStateNetworkError); - break; - - // TODO(vrk): Because OnPipelineInitialize() directly reports the - // NetworkStateFormatError instead of calling OnPipelineError(), I believe - // this block can be deleted. Should look into it! (crbug.com/126070) - case media::PIPELINE_ERROR_INITIALIZATION_FAILED: - case media::PIPELINE_ERROR_COULD_NOT_RENDER: - case media::PIPELINE_ERROR_URL_NOT_FOUND: - case media::DEMUXER_ERROR_COULD_NOT_OPEN: - case media::DEMUXER_ERROR_COULD_NOT_PARSE: - case media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS: - case media::DECODER_ERROR_NOT_SUPPORTED: - SetNetworkState(WebMediaPlayer::NetworkStateFormatError); - break; - - case media::PIPELINE_ERROR_DECODE: - case media::PIPELINE_ERROR_ABORT: - case media::PIPELINE_ERROR_OPERATION_PENDING: - case media::PIPELINE_ERROR_INVALID_STATE: - SetNetworkState(WebMediaPlayer::NetworkStateDecodeError); - break; - - case media::PIPELINE_ERROR_DECRYPT: - // Decrypt error. - EmeUMAHistogramCounts(current_key_system_.utf8(), "DecryptError", 1); - - // TODO(xhwang): Change to use NetworkStateDecryptError once it's added in - // Webkit (see http://crbug.com/124486). - SetNetworkState(WebMediaPlayer::NetworkStateDecodeError); - break; + SetNetworkState(PipelineErrorToNetworkState(error)); - case media::PIPELINE_STATUS_MAX: - NOTREACHED() << "PIPELINE_STATUS_MAX isn't a real error!"; - break; - } + if (error == media::PIPELINE_ERROR_DECRYPT) + EmeUMAHistogramCounts(current_key_system_.utf8(), "DecryptError", 1); // Repaint to trigger UI update. Repaint(); diff --git a/webkit/media/webmediaplayer_util.cc b/webkit/media/webmediaplayer_util.cc index ebac0f8..49aa482 100644 --- a/webkit/media/webmediaplayer_util.cc +++ b/webkit/media/webmediaplayer_util.cc @@ -24,4 +24,43 @@ WebKit::WebTimeRanges ConvertToWebTimeRanges( return result; } +WebKit::WebMediaPlayer::NetworkState PipelineErrorToNetworkState( + media::PipelineStatus error) { + DCHECK_NE(error, media::PIPELINE_OK); + + switch (error) { + case media::PIPELINE_ERROR_NETWORK: + case media::PIPELINE_ERROR_READ: + return WebKit::WebMediaPlayer::NetworkStateNetworkError; + + // TODO(vrk): Because OnPipelineInitialize() directly reports the + // NetworkStateFormatError instead of calling OnPipelineError(), I believe + // this block can be deleted. Should look into it! (crbug.com/126070) + case media::PIPELINE_ERROR_INITIALIZATION_FAILED: + case media::PIPELINE_ERROR_COULD_NOT_RENDER: + case media::PIPELINE_ERROR_URL_NOT_FOUND: + case media::DEMUXER_ERROR_COULD_NOT_OPEN: + case media::DEMUXER_ERROR_COULD_NOT_PARSE: + case media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS: + case media::DECODER_ERROR_NOT_SUPPORTED: + return WebKit::WebMediaPlayer::NetworkStateFormatError; + + case media::PIPELINE_ERROR_DECODE: + case media::PIPELINE_ERROR_ABORT: + case media::PIPELINE_ERROR_OPERATION_PENDING: + case media::PIPELINE_ERROR_INVALID_STATE: + return WebKit::WebMediaPlayer::NetworkStateDecodeError; + + case media::PIPELINE_ERROR_DECRYPT: + // TODO(xhwang): Change to use NetworkStateDecryptError once it's added in + // Webkit (see http://crbug.com/124486). + return WebKit::WebMediaPlayer::NetworkStateDecodeError; + + case media::PIPELINE_OK: + case media::PIPELINE_STATUS_MAX: + NOTREACHED() << "Unexpected status! " << error; + } + return WebKit::WebMediaPlayer::NetworkStateFormatError; +} + } // namespace webkit_media diff --git a/webkit/media/webmediaplayer_util.h b/webkit/media/webmediaplayer_util.h index b18a961..0bd645e 100644 --- a/webkit/media/webmediaplayer_util.h +++ b/webkit/media/webmediaplayer_util.h @@ -6,7 +6,9 @@ #define WEBKIT_MEDIA_WEBMEDIAPLAYER_UTIL_H_ #include "base/time.h" +#include "media/base/pipeline_status.h" #include "media/base/ranges.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayer.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebTimeRange.h" namespace webkit_media { @@ -20,6 +22,9 @@ base::TimeDelta ConvertSecondsToTimestamp(double seconds); WebKit::WebTimeRanges ConvertToWebTimeRanges( const media::Ranges<base::TimeDelta>& ranges); +WebKit::WebMediaPlayer::NetworkState PipelineErrorToNetworkState( + media::PipelineStatus error); + } // namespace webkit_media #endif // WEBKIT_MEDIA_WEBMEDIAPLAYER_UTIL_H_ |