Index: media/blink/multibuffer_data_source.cc |
diff --git a/media/blink/multibuffer_data_source.cc b/media/blink/multibuffer_data_source.cc |
index 335617a6b4bbe8bd0ef5dd58fc9e26f5c484df42..a0e16e6138528bb2531889f20ebe92b077fea7af 100644 |
--- a/media/blink/multibuffer_data_source.cc |
+++ b/media/blink/multibuffer_data_source.cc |
@@ -23,14 +23,15 @@ namespace { |
// Minimum preload buffer. |
const int64_t kMinBufferPreload = 2 << 20; // 2 Mb |
// Maxmimum preload buffer. |
-const int64_t kMaxBufferPreload = 20 << 20; // 20 Mb |
+const int64_t kMaxBufferPreload = 50 << 20; // 50 Mb |
// Preload this much extra, then stop preloading until we fall below the |
// kTargetSecondsBufferedAhead. |
const int64_t kPreloadHighExtra = 1 << 20; // 1 Mb |
-// Total size of the pinned region in the cache. |
-const int64_t kMaxBufferSize = 25 << 20; // 25 Mb |
+// Default pin region size. |
+// Note that we go over this if preload is calculated high enough. |
+const int64_t kDefaultPinSize = 25 << 20; // 25 Mb |
// If bitrate is not known, use this. |
const int64_t kDefaultBitrate = 200 * 8 << 10; // 200 Kbps. |
@@ -599,22 +600,32 @@ void MultibufferDataSource::UpdateBufferSizes() { |
int64_t bytes_per_second = (bitrate / 8.0) * playback_rate; |
+ // Preload 10 seconds of data, clamped to some min/max value. |
int64_t preload = clamp(kTargetSecondsBufferedAhead * bytes_per_second, |
kMinBufferPreload, kMaxBufferPreload); |
+ // We preload this much, then we stop unil we read |preload| before resuming. |
int64_t preload_high = preload + kPreloadHighExtra; |
- // Assert that kMaxBufferSize is big enough that the subtraction on the next |
- // line cannot go negative. |
- static_assert(kMaxBufferSize > kMaxBufferPreload + kPreloadHighExtra, |
- "kMaxBufferSize too small to contain preload."); |
- int64_t back_buffer = clamp(kTargetSecondsBufferedBehind * bytes_per_second, |
- kMinBufferPreload, kMaxBufferSize - preload_high); |
+ // We pin a few seconds of data behind the current reading position. |
+ int64_t pin_backward = clamp(kTargetSecondsBufferedBehind * bytes_per_second, |
+ kMinBufferPreload, kMaxBufferPreload); |
+ |
+ // We always pin at least kDefaultPinSize ahead of the read position. |
+ // Normally, the extra space between preload_high and kDefaultPinSize will |
+ // not actually have any data in it, but if it does, we don't want to throw it |
+ // away right before we need it. |
+ int64_t pin_forward = std::max(preload_high, kDefaultPinSize); |
+ |
+ // Note that the buffer size is advisory as only non-pinned data is allowed |
+ // to be thrown away. Most of the time we pin a region that is larger than |
+ // |buffer_size|, which only makes sense because most of the time, some of |
+ // the data in pinned region is not present in the cache. |
int64_t buffer_size = |
std::min((kTargetSecondsBufferedAhead + kTargetSecondsBufferedBehind) * |
bytes_per_second, |
- kMaxBufferSize); |
+ preload_high + pin_backward); |
reader_->SetMaxBuffer(buffer_size); |
- reader_->SetPinRange(back_buffer, kMaxBufferPreload + kPreloadHighExtra); |
+ reader_->SetPinRange(pin_backward, pin_forward); |
if (preload_ == METADATA) { |
reader_->SetPreload(0, 0); |