Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(626)

Unified Diff: remoting/webapp/media_source_renderer.js

Issue 329663002: Fix MediaSource renderer to limit memory consumption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« remoting/webapp/client_plugin.js ('K') | « remoting/webapp/client_plugin.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_();
}
« remoting/webapp/client_plugin.js ('K') | « remoting/webapp/client_plugin.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698