Chromium Code Reviews| 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..26978ffc197953631fc7bcc1db286e0ea8d7f9d9 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 'null' indicates that the SourceBuffer can be reset because |
|
Jamie
2014/06/11 21:41:43
Nit: missing period after "processed".
Also, "nul
Sergey Ulanov
2014/06/11 23:41:12
Done.
|
| + * the following buffer is a keyframe. */ |
| this.buffers_ = []; |
| } |
| @@ -68,18 +69,37 @@ 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())); |
| + /** @type {ArrayBuffer} */ |
| + var buffer = 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_(); |
| } |