Index: media/base/download_rate_monitor.cc |
diff --git a/media/base/download_rate_monitor.cc b/media/base/download_rate_monitor.cc |
index 88916e4b57a4b3f27f69c71a57b756e85d7869c6..b561fa59b62d21a89a0db7ac93ef3642dfbadcd8 100644 |
--- a/media/base/download_rate_monitor.cc |
+++ b/media/base/download_rate_monitor.cc |
@@ -142,6 +142,8 @@ void DownloadRateMonitor::Reset() { |
loaded_ = false; |
bitrate_ = 0; |
stopped_ = true; |
+ media_stream_ = false; |
+ streaming_ = false; |
} |
DownloadRateMonitor::~DownloadRateMonitor() { } |
@@ -198,14 +200,25 @@ bool DownloadRateMonitor::ShouldNotifyCanPlayThrough() { |
if (has_notified_can_play_through_) |
return false; |
- // If the media is from a local file (|loaded_|) or if all bytes are |
- // buffered, fire CanPlayThrough. |
- if (loaded_ || buffered_bytes_ == total_bytes_) |
+ // Fire CanPlayThrough immediately if the source is loaded or streaming. |
+ // |
+ // NOTE: It is a requirement for CanPlayThrough to fire immediately if the |
+ // source is |loaded_|, but the choice to fire the event for any streaming |
+ // element is an optimistic design decision that may need to be tweaked. The |
+ // only streaming element that *must* fire CanPlayThrough immediately is a |
+ // media_stream_ whose source is local, such as from a webcam. |
+ if (loaded_ || streaming_ || media_stream_) |
wjia(left Chromium)
2011/11/22 23:01:17
should it be: if (loaded_ || !streaming_ || media_
vrk (LEFT CHROMIUM)
2011/11/23 21:29:45
So to be clear, the DownloadRateMonitor does not d
|
+ return true; |
+ |
+ // If all bytes are buffered, fire CanPlayThrough. |
+ if (buffered_bytes_ == total_bytes_) |
return true; |
- // Cannot approximate when the media can play through if bitrate is unknown. |
+ // If bitrate is unknown, optimistically fire CanPlayThrough immediately. |
+ // This is so a video with an unknown bitrate with the "autoplay" attribute |
+ // will not wait until the entire file is downloaded before playback begins. |
if (bitrate_ <= 0) |
- return false; |
+ return true; |
float bytes_needed_per_second = bitrate_ / 8; |
float download_rate = ApproximateDownloadByteRate(); |