Commit be57ee50 authored by acolwell@chromium.org's avatar acolwell@chromium.org

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
parent 65ae79ba
...@@ -373,14 +373,8 @@ void MediaSourceDelegate::OnDemuxerError( ...@@ -373,14 +373,8 @@ void MediaSourceDelegate::OnDemuxerError(
media::PipelineStatus status) { media::PipelineStatus status) {
DVLOG(1) << "MediaSourceDelegate::OnDemuxerError(" << status << ") : " DVLOG(1) << "MediaSourceDelegate::OnDemuxerError(" << status << ") : "
<< player_id_; << player_id_;
if (status != media::PIPELINE_OK) { if (status != media::PIPELINE_OK && !update_network_state_cb_.is_null())
DCHECK(status == media::DEMUXER_ERROR_COULD_NOT_OPEN || update_network_state_cb_.Run(PipelineErrorToNetworkState(status));
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);
}
} }
void MediaSourceDelegate::OnDemuxerInitDone( void MediaSourceDelegate::OnDemuxerInitDone(
......
...@@ -520,7 +520,15 @@ void WebMediaPlayerAndroid::OnMediaSeekRequest(base::TimeDelta time_to_seek, ...@@ -520,7 +520,15 @@ void WebMediaPlayerAndroid::OnMediaSeekRequest(base::TimeDelta time_to_seek,
void WebMediaPlayerAndroid::UpdateNetworkState( void WebMediaPlayerAndroid::UpdateNetworkState(
WebMediaPlayer::NetworkState state) { 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(); client_->networkStateChanged();
} }
......
...@@ -873,6 +873,7 @@ void WebMediaPlayerImpl::OnPipelineEnded() { ...@@ -873,6 +873,7 @@ void WebMediaPlayerImpl::OnPipelineEnded() {
void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) {
DCHECK(main_loop_->BelongsToCurrentThread()); DCHECK(main_loop_->BelongsToCurrentThread());
DCHECK_NE(error, media::PIPELINE_OK);
if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) { if (ready_state_ == WebMediaPlayer::ReadyStateHaveNothing) {
// Any error that occurs before reaching ReadyStateHaveMetadata should // Any error that occurs before reaching ReadyStateHaveMetadata should
...@@ -882,49 +883,10 @@ void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) { ...@@ -882,49 +883,10 @@ void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) {
return; return;
} }
switch (error) { SetNetworkState(PipelineErrorToNetworkState(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;
case media::PIPELINE_STATUS_MAX: if (error == media::PIPELINE_ERROR_DECRYPT)
NOTREACHED() << "PIPELINE_STATUS_MAX isn't a real error!"; EmeUMAHistogramCounts(current_key_system_.utf8(), "DecryptError", 1);
break;
}
// Repaint to trigger UI update. // Repaint to trigger UI update.
Repaint(); Repaint();
......
...@@ -24,4 +24,43 @@ WebKit::WebTimeRanges ConvertToWebTimeRanges( ...@@ -24,4 +24,43 @@ WebKit::WebTimeRanges ConvertToWebTimeRanges(
return result; 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 } // namespace webkit_media
...@@ -6,7 +6,9 @@ ...@@ -6,7 +6,9 @@
#define WEBKIT_MEDIA_WEBMEDIAPLAYER_UTIL_H_ #define WEBKIT_MEDIA_WEBMEDIAPLAYER_UTIL_H_
#include "base/time.h" #include "base/time.h"
#include "media/base/pipeline_status.h"
#include "media/base/ranges.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" #include "third_party/WebKit/Source/WebKit/chromium/public/WebTimeRange.h"
namespace webkit_media { namespace webkit_media {
...@@ -20,6 +22,9 @@ base::TimeDelta ConvertSecondsToTimestamp(double seconds); ...@@ -20,6 +22,9 @@ base::TimeDelta ConvertSecondsToTimestamp(double seconds);
WebKit::WebTimeRanges ConvertToWebTimeRanges( WebKit::WebTimeRanges ConvertToWebTimeRanges(
const media::Ranges<base::TimeDelta>& ranges); const media::Ranges<base::TimeDelta>& ranges);
WebKit::WebMediaPlayer::NetworkState PipelineErrorToNetworkState(
media::PipelineStatus error);
} // namespace webkit_media } // namespace webkit_media
#endif // WEBKIT_MEDIA_WEBMEDIAPLAYER_UTIL_H_ #endif // WEBKIT_MEDIA_WEBMEDIAPLAYER_UTIL_H_
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