summaryrefslogtreecommitdiffstats
path: root/webkit/media
diff options
context:
space:
mode:
authorvrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-01 22:44:55 +0000
committervrk@google.com <vrk@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-12-01 22:44:55 +0000
commit62fce1c52d79a0707e6d1d5df3d43296a9b567a6 (patch)
tree5df8a298a8cbcd2d19fbdad2124de3f5f6a32457 /webkit/media
parent953a616e68ce35e4de10498e5df3445235d7ff52 (diff)
downloadchromium_src-62fce1c52d79a0707e6d1d5df3d43296a9b567a6.zip
chromium_src-62fce1c52d79a0707e6d1d5df3d43296a9b567a6.tar.gz
chromium_src-62fce1c52d79a0707e6d1d5df3d43296a9b567a6.tar.bz2
Fire CanPlayThrough immediately for local and streaming media files
Changes DownloadRateMonitor logic to know to immediately fire CanPlayThrough for media files with local sources, including local webcam streams. Renamed the concept of "loaded" source to "local" source in the media pipeline for clarity. Also updated the DownloadRateMonitor logic slightly to lean toward optimism in firing CanPlayThrough, including firing the event immediately for streaming media. BUG=105163 TEST=media_unittests,test_shell_tests, wjia's media stream test page works Review URL: http://codereview.chromium.org/8661002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@112560 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/media')
-rw-r--r--webkit/media/buffered_data_source.cc10
-rw-r--r--webkit/media/buffered_data_source.h3
-rw-r--r--webkit/media/buffered_data_source_unittest.cc6
-rw-r--r--webkit/media/simple_data_source.cc2
-rw-r--r--webkit/media/simple_data_source_unittest.cc26
-rw-r--r--webkit/media/webmediaplayer_impl.cc21
6 files changed, 23 insertions, 45 deletions
diff --git a/webkit/media/buffered_data_source.cc b/webkit/media/buffered_data_source.cc
index 0c005ab..8a5feba 100644
--- a/webkit/media/buffered_data_source.cc
+++ b/webkit/media/buffered_data_source.cc
@@ -45,7 +45,6 @@ BufferedDataSource::BufferedDataSource(
media::MediaLog* media_log)
: total_bytes_(kPositionNotSpecified),
buffered_bytes_(0),
- loaded_(false),
streaming_(false),
frame_(frame),
loader_(NULL),
@@ -431,7 +430,6 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
// TODO(hclam): Needs more thinking about supporting servers without range
// request or their partial response is not complete.
total_bytes_ = instance_size;
- loaded_ = false;
streaming_ = (instance_size == kPositionNotSpecified) ||
!loader_->range_supported();
} else {
@@ -501,7 +499,6 @@ void BufferedDataSource::NonHttpInitialStartCallback(int error) {
if (success) {
total_bytes_ = instance_size;
buffered_bytes_ = total_bytes_;
- loaded_ = true;
} else {
loader_->Stop();
}
@@ -616,7 +613,7 @@ void BufferedDataSource::NetworkEventCallback() {
// In case of non-HTTP request we don't need to report network events,
// so return immediately.
- if (loaded_)
+ if (!url_.SchemeIs(kHttpScheme) && !url_.SchemeIs(kHttpsScheme))
return;
bool is_downloading_data = loader_->is_downloading_data();
@@ -657,11 +654,6 @@ void BufferedDataSource::UpdateHostState_Locked() {
if (!filter_host)
return;
- filter_host->SetLoaded(loaded_);
-
- if (streaming_)
- filter_host->SetStreaming(true);
-
if (total_bytes_ != kPositionNotSpecified)
filter_host->SetTotalBytes(total_bytes_);
filter_host->SetBufferedBytes(buffered_bytes_);
diff --git a/webkit/media/buffered_data_source.h b/webkit/media/buffered_data_source.h
index d7dc37f..1332489 100644
--- a/webkit/media/buffered_data_source.h
+++ b/webkit/media/buffered_data_source.h
@@ -147,9 +147,6 @@ class BufferedDataSource : public WebDataSource {
int64 total_bytes_;
int64 buffered_bytes_;
- // True if this data source is considered loaded.
- bool loaded_;
-
// This value will be true if this data source can only support streaming.
// i.e. range request is not supported.
bool streaming_;
diff --git a/webkit/media/buffered_data_source_unittest.cc b/webkit/media/buffered_data_source_unittest.cc
index 2bcae64..b32bf5c 100644
--- a/webkit/media/buffered_data_source_unittest.cc
+++ b/webkit/media/buffered_data_source_unittest.cc
@@ -110,7 +110,6 @@ class BufferedDataSourceTest : public testing::Test {
void InitializeWith206Response() {
Initialize(media::PIPELINE_OK);
- EXPECT_CALL(host_, SetLoaded(false));
EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
EXPECT_CALL(host_, SetBufferedBytes(0));
Respond(response_generator_.Generate206(0));
@@ -198,7 +197,6 @@ class BufferedDataSourceTest : public testing::Test {
TEST_F(BufferedDataSourceTest, Range_Supported) {
Initialize(media::PIPELINE_OK);
- EXPECT_CALL(host_, SetLoaded(false));
EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
EXPECT_CALL(host_, SetBufferedBytes(0));
Respond(response_generator_.Generate206(0));
@@ -233,13 +231,12 @@ TEST_F(BufferedDataSourceTest, Range_NotSupported) {
Respond(response_generator_.Generate200());
// Now it'll succeed.
- EXPECT_CALL(host_, SetLoaded(false));
EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
EXPECT_CALL(host_, SetBufferedBytes(0));
- EXPECT_CALL(host_, SetStreaming(true));
Respond(response_generator_.Generate200());
EXPECT_TRUE(data_source_->loading());
+ EXPECT_TRUE(data_source_->IsStreaming());
Stop();
}
@@ -265,7 +262,6 @@ TEST_F(BufferedDataSourceTest, Range_MissingContentLength) {
Initialize(media::PIPELINE_OK);
// It'll manage without a Content-Length response.
- EXPECT_CALL(host_, SetLoaded(false));
EXPECT_CALL(host_, SetTotalBytes(response_generator_.content_length()));
EXPECT_CALL(host_, SetBufferedBytes(0));
Respond(response_generator_.Generate206(
diff --git a/webkit/media/simple_data_source.cc b/webkit/media/simple_data_source.cc
index 16d0a9f..04e94d1 100644
--- a/webkit/media/simple_data_source.cc
+++ b/webkit/media/simple_data_source.cc
@@ -352,8 +352,6 @@ void SimpleDataSource::UpdateHostState() {
if (host()) {
host()->SetTotalBytes(size_);
host()->SetBufferedBytes(size_);
- // If scheme is file or data, say we are loaded.
- host()->SetLoaded(url_.SchemeIsFile() || url_.SchemeIs(kDataScheme));
}
}
diff --git a/webkit/media/simple_data_source_unittest.cc b/webkit/media/simple_data_source_unittest.cc
index 62b933c3..df6ee03 100644
--- a/webkit/media/simple_data_source_unittest.cc
+++ b/webkit/media/simple_data_source_unittest.cc
@@ -84,7 +84,7 @@ class SimpleDataSourceTest : public testing::Test {
MessageLoop::current()->RunAllPending();
}
- void RequestSucceeded(bool is_loaded) {
+ void RequestSucceeded() {
WebURLResponse response(gurl_);
response.setExpectedContentLength(kDataSize);
@@ -93,11 +93,8 @@ class SimpleDataSourceTest : public testing::Test {
EXPECT_TRUE(data_source_->GetSize(&size));
EXPECT_EQ(kDataSize, size);
- for (int i = 0; i < kDataSize; ++i) {
+ for (int i = 0; i < kDataSize; ++i)
data_source_->didReceiveData(NULL, data_ + i, 1, 1);
- }
-
- EXPECT_CALL(host_, SetLoaded(is_loaded));
InSequence s;
EXPECT_CALL(host_, SetTotalBytes(kDataSize));
@@ -170,21 +167,21 @@ class SimpleDataSourceTest : public testing::Test {
TEST_F(SimpleDataSourceTest, InitializeHTTP) {
InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
- RequestSucceeded(false);
+ RequestSucceeded();
DestroyDataSource();
}
TEST_F(SimpleDataSourceTest, InitializeHTTPS) {
InitializeDataSource(kHttpsUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
- RequestSucceeded(false);
+ RequestSucceeded();
DestroyDataSource();
}
TEST_F(SimpleDataSourceTest, InitializeFile) {
InitializeDataSource(kFileUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
- RequestSucceeded(true);
+ RequestSucceeded();
DestroyDataSource();
}
@@ -197,7 +194,6 @@ TEST_F(SimpleDataSourceTest, InitializeData) {
data_source_->set_host(&host_);
data_source_->SetURLLoaderForTest(url_loader_);
- EXPECT_CALL(host_, SetLoaded(true));
EXPECT_CALL(host_, SetTotalBytes(sizeof(kDataUrlDecoded)));
EXPECT_CALL(host_, SetBufferedBytes(sizeof(kDataUrlDecoded)));
@@ -233,7 +229,7 @@ TEST_F(SimpleDataSourceTest, StopWhenDownloading) {
TEST_F(SimpleDataSourceTest, AsyncRead) {
InitializeDataSource(kFileUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
- RequestSucceeded(true);
+ RequestSucceeded();
AsyncRead();
DestroyDataSource();
}
@@ -245,7 +241,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
// Make sure no redirect case works as expected.
InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
- RequestSucceeded(false);
+ RequestSucceeded();
EXPECT_TRUE(data_source_->HasSingleOrigin());
DestroyDataSource();
@@ -253,7 +249,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1);
- RequestSucceeded(false);
+ RequestSucceeded();
EXPECT_TRUE(data_source_->HasSingleOrigin());
DestroyDataSource();
@@ -262,7 +258,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1);
Redirect(kHttpRedirectToSameDomainUrl2);
- RequestSucceeded(false);
+ RequestSucceeded();
EXPECT_TRUE(data_source_->HasSingleOrigin());
DestroyDataSource();
@@ -270,7 +266,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
InitializeDataSource(kHttpUrl,
media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToDifferentDomainUrl1);
- RequestSucceeded(false);
+ RequestSucceeded();
EXPECT_FALSE(data_source_->HasSingleOrigin());
DestroyDataSource();
@@ -279,7 +275,7 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
media::NewExpectedStatusCB(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1);
Redirect(kHttpRedirectToDifferentDomainUrl1);
- RequestSucceeded(false);
+ RequestSucceeded();
EXPECT_FALSE(data_source_->HasSingleOrigin());
DestroyDataSource();
}
diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
index 941f88f..7df55e6 100644
--- a/webkit/media/webmediaplayer_impl.cc
+++ b/webkit/media/webmediaplayer_impl.cc
@@ -291,9 +291,14 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url) {
}
// TODO(wjia): add audio decoder handling when it's available.
- if (has_video || has_audio)
+ if (has_video || has_audio) {
+ // TODO(vrk/wjia): Setting true for local_source is under the assumption
+ // that the MediaStream represents a local webcam. This will need to
+ // change in the future when GetVideoDecoder is no longer hardcoded to
+ // only return CaptureVideoDecoders.
filter_collection_->SetDemuxerFactory(
- new media::DummyDemuxerFactory(has_video, has_audio));
+ new media::DummyDemuxerFactory(has_video, has_audio, true));
+ }
}
// Handle any volume changes that occured before load().
@@ -746,14 +751,11 @@ void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) {
is_accelerated_compositing_active_);
}
- if (pipeline_->IsLoaded())
+ if (pipeline_->IsLocalSource())
SetNetworkState(WebKit::WebMediaPlayer::Loaded);
SetReadyState(WebKit::WebMediaPlayer::HaveMetadata);
- // Fire canplaythrough immediately after playback begins because of
- // crbug.com/105163.
- // TODO(vrk): set ready state to HaveFutureData when bug above is fixed.
- SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData);
+ SetReadyState(WebKit::WebMediaPlayer::HaveFutureData);
} else {
// TODO(hclam): should use |status| to determine the state
// properly and reports error using MediaError.
@@ -842,10 +844,7 @@ void WebMediaPlayerImpl::OnNetworkEvent(NetworkEvent type) {
SetNetworkState(WebKit::WebMediaPlayer::Idle);
break;
case media::CAN_PLAY_THROUGH:
- // Temporarily disable delayed firing of CAN_PLAY_THROUGH due to
- // crbug.com/105163.
- // TODO(vrk): uncomment code below when bug above is fixed.
- // SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData);
+ SetReadyState(WebKit::WebMediaPlayer::HaveEnoughData);
break;
default:
NOTREACHED();