Skip to content

Commit 49d86ec

Browse files
committed
Implement ability to limit libass memory and to control target fps
1 parent 992a113 commit 49d86ec

5 files changed

+24
-6
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ src/subtitles-octopus-worker.bc: dist/libraries/lib/libass.a src/Makefile src/su
293293
# Dist Files
294294
EMCC_COMMON_ARGS = \
295295
$(GLOBAL_CFLAGS) \
296-
-s EXPORTED_FUNCTIONS="['_main', '_malloc', '_libassjs_render_blend', '_free']" \
296+
-s EXPORTED_FUNCTIONS="['_main', '_malloc', '_libassjs_render_blend', '_libassjs_set_memory_limit']" \
297297
-s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall', 'cwrap', 'getValue', 'FS_createPreloadedFile', 'FS_createFolder']" \
298298
-s NO_EXIT_RUNTIME=1 \
299299
--use-preload-plugins \

src/SubtitleOctopus.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,13 @@ class SubtitleOctopus {
212212
}
213213
};
214214

215+
void libassjs_set_memory_limit(int limit) {
216+
if (limit > 0) {
217+
printf("libass: setting total libass memory limit to %d MiB\n", limit);
218+
ass_set_cache_limits(ass_renderer, 0, limit);
219+
}
220+
}
221+
215222
const float MIN_UINT8_CAST = 0.9 / 255;
216223
const float MAX_UINT8_CAST = 255.9 / 255;
217224

src/post-worker.js

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ self.rafId = null;
77
self.nextIsRaf = false;
88
self.lastCurrentTimeReceivedAt = Date.now();
99
self.targetFps = 30;
10+
self.libassMemoryLimit = 0; // in MiB
1011

1112
self.width = 0;
1213
self.height = 0;
@@ -547,6 +548,8 @@ function onMessageFromMainEmscriptenThread(message) {
547548
Module.canvas.boundingClientRect = message.data.boundingClientRect;
548549
}
549550
}
551+
self.targetFps = message.data.targetFps || self.targetFps;
552+
self.libassMemoryLimit = message.data.libassMemoryLimit || self.libassMemoryLimit;
550553
removeRunDependency('worker-init');
551554
break;
552555
}

src/pre-worker.js

+4
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ Module['onRuntimeInitialized'] = function () {
9393
self.octObj = new Module.SubtitleOctopus();
9494

9595
self._render_blend = Module['cwrap']('libassjs_render_blend', null, ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number']);
96+
self._set_memory_limit = Module['cwrap']('libassjs_set_memory_limit', null, ['number']);
9697

9798
self.changed = Module._malloc(4);
9899

@@ -107,6 +108,9 @@ Module['onRuntimeInitialized'] = function () {
107108
self.ass_track = self.octObj.track;
108109
self.ass_library = self.octObj.ass_library;
109110
self.ass_renderer = self.octObj.ass_renderer;
111+
if (self.libassMemoryLimit > 0) {
112+
self._set_memory_limit(self.libassMemoryLimit);
113+
}
110114
};
111115

112116
Module["print"] = function (text) {

src/subtitles-octopus.js

+9-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ var SubtitlesOctopus = function (options) {
1414
var self = this;
1515
self.canvas = options.canvas; // HTML canvas element (optional if video specified)
1616
self.renderMode = options.lossyRender ? 'fast' : (options.blendRender ? 'blend' : 'normal');
17+
self.libassMemoryLimit = options.libassMemoryLimit || 0;
18+
self.targetFps = options.targetFps || undefined;
1719
self.isOurCanvas = false; // (internal) we created canvas and manage it
1820
self.video = options.video; // HTML video element (optional if canvas specified)
1921
self.canvasParent = null; // (internal) HTML canvas parent element
@@ -28,7 +30,7 @@ var SubtitlesOctopus = function (options) {
2830
self.subUrl = options.subUrl; // Link to sub file (optional if subContent specified)
2931
self.subContent = options.subContent || null; // Sub content (optional if subUrl specified)
3032
self.onErrorEvent = options.onError; // Function called in case of critical error meaning sub wouldn't be shown and you should use alternative method (for instance it occurs if browser doesn't support web workers).
31-
self.debug = options.debug || false; // When debug enabled, some performance info printed in console.
33+
self.debug = options.debug || false; // When debug enabled, some performance info printed in console.
3234
self.lastRenderTime = 0; // (internal) Last time we got some frame from worker
3335
self.pixelRatio = window.devicePixelRatio || 1; // (internal) Device pixel ratio (for high dpi devices)
3436

@@ -104,7 +106,9 @@ var SubtitlesOctopus = function (options) {
104106
subContent: self.subContent,
105107
fonts: self.fonts,
106108
availableFonts: self.availableFonts,
107-
debug: self.debug
109+
debug: self.debug,
110+
targetFps: self.targetFps,
111+
libassMemoryLimit: self.libassMemoryLimit
108112
});
109113
};
110114

@@ -253,9 +257,9 @@ var SubtitlesOctopus = function (options) {
253257
}
254258
if (self.debug) {
255259
var drawTime = Math.round(performance.now() - beforeDrawTime);
256-
var blendTime = data.blendTime || 0;
257-
if (blendTime > 0) {
258-
console.log('render: ' + Math.round(data.spentTime - blendTime) + ' ms, blend: ' + Math.round(blendTime) + ' ms, draw: ' + drawTime + ' ms');
260+
var blendTime = data.blendTime;
261+
if (typeof blendTime !== 'undefined') {
262+
console.log('render: ' + Math.round(data.spentTime - blendTime) + ' ms, blend: ' + Math.round(blendTime) + ' ms, draw: ' + drawTime + ' ms; TOTAL=' + Math.round(data.spentTime + drawTime) + ' ms');
259263
} else {
260264
console.log(Math.round(data.spentTime) + ' ms (+ ' + drawTime + ' ms draw)');
261265
}

0 commit comments

Comments
 (0)