summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-28 22:27:27 +0000
committeracolwell@chromium.org <acolwell@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-28 22:27:27 +0000
commitbe57ee508ad4b8a45d15343cf96919dde4cc1952 (patch)
tree2d44342d946cffad47dba54ce65ed2e770036122
parent65ae79ba312fa4236c466ecadb6ef3e6ac8fa1d9 (diff)
downloadchromium_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.cc10
-rw-r--r--webkit/media/android/webmediaplayer_android.cc10
-rw-r--r--webkit/media/webmediaplayer_impl.cc46
-rw-r--r--webkit/media/webmediaplayer_util.cc39
-rw-r--r--webkit/media/webmediaplayer_util.h5
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_