Index: remoting/webapp/media_source_renderer.js |
diff --git a/remoting/webapp/media_source_renderer.js b/remoting/webapp/media_source_renderer.js |
index a79173b01e79302d5e5c88a3de44d360e03154a3..1bbb13ed86ef2df52c03780baaf6d381edf80abe 100644 |
--- a/remoting/webapp/media_source_renderer.js |
+++ b/remoting/webapp/media_source_renderer.js |
@@ -22,7 +22,8 @@ remoting.MediaSourceRenderer = function(videoTag) { |
this.sourceBuffer_ = null; |
/** @type {!Array.<ArrayBuffer>} Queue of pending buffers that haven't been |
- * processed . */ |
+ * processed. A null element indicates that the SourceBuffer can be reset |
+ * because the following buffer contains a keyframe. */ |
this.buffers_ = []; |
} |
@@ -68,18 +69,36 @@ remoting.MediaSourceRenderer.prototype.onSourceOpen_ = function(format) { |
remoting.MediaSourceRenderer.prototype.processPendingData_ = function() { |
if (this.sourceBuffer_) { |
while (this.buffers_.length > 0 && !this.sourceBuffer_.updating) { |
- // TODO(sergeyu): Figure out the way to determine when a frame is rendered |
- // and use it to report performance statistics. |
- this.sourceBuffer_.appendBuffer( |
- /** @type {ArrayBuffer} */(this.buffers_.shift())); |
+ var buffer = /** @type {ArrayBuffer} */ this.buffers_.shift(); |
+ if (buffer == null) { |
+ // Remove all data from the SourceBuffer. By default Chrome buffers up |
+ // 150MB of data in SourceBuffer. We never need to seek the stream, so |
+ // it doesn't make sense to keep any of that data. |
+ if (this.sourceBuffer_.buffered.length > 0) { |
+ this.sourceBuffer_.remove( |
+ this.sourceBuffer_.buffered.start(0), |
+ this.sourceBuffer_.buffered.end( |
+ this.sourceBuffer_.buffered.length - 1)); |
+ } |
+ } else { |
+ // TODO(sergeyu): Figure out the way to determine when a frame is |
+ // rendered and use it to report performance statistics. |
+ this.sourceBuffer_.appendBuffer(buffer); |
+ } |
} |
} |
} |
/** |
* @param {ArrayBuffer} data |
+ * @param {boolean} keyframe |
*/ |
-remoting.MediaSourceRenderer.prototype.onIncomingData = function(data) { |
+remoting.MediaSourceRenderer.prototype.onIncomingData = |
+ function(data, keyframe) { |
+ if (keyframe) { |
+ // Queue SourceBuffer reset request. |
+ this.buffers_.push(null); |
+ } |
this.buffers_.push(data); |
this.processPendingData_(); |
} |