Skip to content

Commit 6980deb

Browse files
committed
Less zealous logging
1 parent 21c84cc commit 6980deb

File tree

4 files changed

+117
-19
lines changed

4 files changed

+117
-19
lines changed

src/SubtitleOctopus.cpp

Lines changed: 105 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#endif
1919

2020
int log_level = 3;
21+
int *is_event_animated;
2122

2223
typedef struct {
2324
void *buffer;
@@ -62,6 +63,7 @@ void buffer_init(buffer_t *buf) {
6263

6364
void buffer_free(buffer_t *buf) {
6465
free(buf->buffer);
66+
buffer_init(buf);
6567
}
6668

6769
void msg_callback(int level, const char *fmt, va_list va, void *data) {
@@ -102,31 +104,115 @@ double libassjs_find_next_event_start(double tm) {
102104
return closest / 1000.0;
103105
}
104106

105-
int _is_event_complex(ASS_Event *event) {
107+
static int _is_move_tag_animated(char *begin, char *end) {
108+
int params[6];
109+
int count = 0, value = 0, num_digits = 0;
110+
for (; begin < end; begin++) {
111+
switch (*begin) {
112+
case ' ': // fallthrough
113+
case '\t':
114+
break;
115+
case ',':
116+
params[count] = value;
117+
count++;
118+
value = 0;
119+
num_digits = 0;
120+
break;
121+
default: {
122+
int digit = *begin - '0';
123+
if (digit < 0 || digit > 9) return 0; // invalid move
124+
value = value * 10 + digit;
125+
num_digits++;
126+
break;
127+
}
128+
}
129+
}
130+
if (num_digits > 0) {
131+
params[count] = value;
132+
count++;
133+
}
134+
if (count < 4) return 0; // invalid move
135+
136+
// move is animated if (x1,y1) != (x2,y2)
137+
return params[0] != params[2] || params[1] != params[3];
138+
}
139+
140+
static int _is_animated_tag(char *begin, char *end) {
141+
// strip whitespaces around the tag
142+
while (begin < end && (*begin == ' ' || *begin == '\t')) begin++;
143+
while (end > begin && (end[-1] == ' ' || end[-1] == '\t')) end--;
144+
145+
int length = end - begin;
146+
if (length < 3 || *begin != '\\') return 0; // too short to be animated or not a command
147+
148+
switch (begin[1]) {
149+
case 'k': // fallthrough
150+
case 'K':
151+
// \kXX is karaoke
152+
return 1;
153+
case 't':
154+
// \t(...) is transition
155+
return length >= 4 && begin[2] == '(' && end[-1] == ')';
156+
case 'm':
157+
if (length >=7 && end[-1] == ')' && strcmp(begin, "\\move(") == 0) {
158+
return _is_move_tag_animated(begin + 6, end - 1);
159+
}
160+
break;
161+
case 'f':
162+
// \fad() or \fade() are fades
163+
return (length >= 7 && end[-1] == ')' &&
164+
(strcmp(begin, "\\fad(") == 0 || strcmp(begin, "\\fade(") == 0));
165+
}
166+
167+
return 0;
168+
}
169+
170+
static int _is_event_animated(ASS_Event *event) {
106171
// event is complex if it's animated in any way,
107172
// either by having non-empty Effect or
108173
// by having tags (enclosed in '{}' in Text)
109174
if (event->Effect && event->Effect[0] != '\0') return 1;
110175

111176
int escaped = 0;
177+
char *tagStart = NULL;
112178
for (char *p = event->Text; *p != '\0'; p++) {
113179
switch (*p) {
114180
case '\\':
115181
escaped = !escaped;
116182
break;
117183
case '{':
118-
if (escaped) return 1;
184+
if (!escaped && tagStart == NULL) tagStart = p + 1;
185+
break;
186+
case '}':
187+
if (!escaped && tagStart != NULL) {
188+
if (_is_animated_tag(tagStart, p)) return 1;
189+
tagStart = NULL;
190+
}
191+
break;
192+
case ';':
193+
if (tagStart != NULL) {
194+
if (_is_animated_tag(tagStart, p)) return 1;
195+
}
196+
tagStart = p + 1;
119197
break;
120198
}
121199
}
122200

123201
return 0;
124202
}
125203

126-
int libassjs_find_event_stop_times(double tm, double *eventFinish, double *emptyFinish) {
204+
static void detect_animated_events() {
205+
ASS_Event *cur = track->events;
206+
int *animated = is_animated_events;
207+
for (int i = 0; i < track->n_events; i++, cur++, animated++) {
208+
*animated = _is_event_animated(cur);
209+
}
210+
}
211+
212+
void libassjs_find_event_stop_times(double tm, double *eventFinish, double *emptyFinish, int *is_animated) {
127213
if (!track || track->n_events == 0) {
128214
*eventFinish = *emptyFinish = -1;
129-
return 0;
215+
return;
130216
}
131217

132218
ASS_Event *cur = track->events;
@@ -146,12 +232,13 @@ int libassjs_find_event_stop_times(double tm, double *eventFinish, double *empty
146232
if (finish > maxFinish) {
147233
maxFinish = finish;
148234
}
149-
if (!current_animated && _is_event_complex(cur)) current_animated = 1;
235+
if (!current_animated) current_animated = is_event_animated[i];
150236
}
151237
} else if (start < minStart || minStart == -1) {
152238
minStart = start;
153239
}
154240
}
241+
*is_animated = current_animated;
155242

156243
if (minFinish != -1) {
157244
// some event is going on, so we need to re-draw either when it stops
@@ -169,8 +256,6 @@ int libassjs_find_event_stop_times(double tm, double *eventFinish, double *empty
169256
// there's no empty space after eventFinish happens
170257
*emptyFinish = *eventFinish;
171258
}
172-
173-
return current_animated;
174259
}
175260

176261
class SubtitleOctopus {
@@ -216,6 +301,7 @@ class SubtitleOctopus {
216301

217302
reloadFonts();
218303
buffer_init(&m_blend);
304+
is_event_animated = NULL;
219305
}
220306

221307
/* TRACK */
@@ -226,6 +312,14 @@ class SubtitleOctopus {
226312
printf("Failed to start a track\n");
227313
exit(4);
228314
}
315+
316+
free(is_event_animated);
317+
is_event_animated = (int*)malloc(sizeof(int) * track->n_events);
318+
if (is_event_animated == NULL) {
319+
printf("cannot parse animated events\n");
320+
exit(5);
321+
}
322+
detect_animated_events();
229323
}
230324

231325
void createTrackMem(char *buf, unsigned long bufsize) {
@@ -242,6 +336,8 @@ class SubtitleOctopus {
242336
ass_free_track(track);
243337
track = NULL;
244338
}
339+
free(is_event_animated);
340+
is_event_animated = NULL;
245341
}
246342
/* TRACK */
247343

@@ -262,6 +358,8 @@ class SubtitleOctopus {
262358
ass_renderer_done(ass_renderer);
263359
ass_library_done(ass_library);
264360
buffer_free(&m_blend);
361+
free(is_event_animated);
362+
is_event_animated = NULL;
265363
}
266364
void reloadLibrary() {
267365
quitLibrary();

src/post-worker.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,10 @@ self.oneshotRender = function (lastRenderedTime, renderNow, iteration) {
251251
var eventFinish = -1.0, emptyFinish = -1.0, animated = false;
252252
var rendered = {};
253253
if (eventStart >= 0) {
254-
animated = self._find_event_stop_times(eventStart, self.eventFinish, self.emptyFinish) != 0;
254+
self._find_event_stop_times(eventStart, self.eventFinish, self.emptyFinish, self.isAnimated);
255255
eventFinish = Module.getValue(self.eventFinish, 'double');
256256
emptyFinish = Module.getValue(self.emptyFinish, 'double');
257+
animated = Module.getValue(self.isAnimated, 'i32') != 0;
257258

258259
rendered = self.blendRenderTiming(eventStart, true);
259260
}

src/pre-worker.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Module['onRuntimeInitialized'] = function () {
9393
self.octObj = new Module.SubtitleOctopus();
9494

9595
self._find_next_event_start = Module['cwrap']('libassjs_find_next_event_start', 'number', ['number']);
96-
self._find_event_stop_times = Module['cwrap']('libassjs_find_event_stop_times', null, ['number', 'number', 'number']);
96+
self._find_event_stop_times = Module['cwrap']('libassjs_find_event_stop_times', null, ['number', 'number', 'number', 'number']);
9797

9898
self.changed = Module._malloc(4);
9999
self.blendTime = Module._malloc(8);
@@ -104,6 +104,7 @@ Module['onRuntimeInitialized'] = function () {
104104

105105
self.eventFinish = Module._malloc(8);
106106
self.emptyFinish = Module._malloc(8);
107+
self.isAnimated = Module._malloc(4);
107108

108109
self.octObj.initLibrary(screen.width, screen.height);
109110
self.octObj.createTrack("/sub.ass");

src/subtitles-octopus.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ var SubtitlesOctopus = function (options) {
318318

319319
if (size <= self.renderAhead) {
320320
lastRendered = currentTime - (renderNow ? 0 : 0.001);
321-
console.info('requesting new frame because current prerender size is less than limit (start=' + lastRendered + ')');
322321
if (!self.oneshotState.renderRequested) {
323322
self.oneshotState.renderRequested = true;
324323
self.worker.postMessage({
@@ -331,8 +330,6 @@ var SubtitlesOctopus = function (options) {
331330
console.info('worker busy, requesting to seek');
332331
self.oneshotState.requestNextTimestamp = lastRendered;
333332
}
334-
} else {
335-
console.debug('not requesting new frame yet as prerender size is over limit');
336333
}
337334
}
338335

@@ -389,14 +386,13 @@ var SubtitlesOctopus = function (options) {
389386
tryRequestOneshot(currentTime, true);
390387
}
391388
} else if (_cleanPastRendered(currentTime) && finishTime >= 0) {
392-
console.debug('some prerendered frame retired, requesting new');
393389
tryRequestOneshot(finishTime, animated);
394390
}
395391
}
396392

397393
function resetRenderAheadCache() {
398394
if (self.renderAhead > 0) {
399-
console.debug('resetting prerender cache');
395+
console.info('resetting prerender cache');
400396
self.renderedItems = [];
401397
self.oneshotState.eventStart = null;
402398
self.oneshotState.iteration++;
@@ -537,9 +533,11 @@ var SubtitlesOctopus = function (options) {
537533
return;
538534
}
539535

540-
console.info('oneshot received (start=' +
541-
data.eventStart + ', empty=' + data.emptyFinish +
542-
'), render: ' + Math.round(data.spentTime) + ' ms');
536+
if (self.debug) {
537+
console.info('oneshot received (start=' +
538+
data.eventStart + ', empty=' + data.emptyFinish +
539+
'), render: ' + Math.round(data.spentTime) + ' ms');
540+
}
543541
self.oneshotState.renderRequested = false;
544542
if (Math.abs(data.lastRenderedTime - self.oneshotState.requestNextTimestamp) < 0.01) {
545543
self.oneshotState.requestNextTimestamp = -1;
@@ -594,12 +592,12 @@ var SubtitlesOctopus = function (options) {
594592
});
595593

596594
if (self.oneshotState.requestNextTimestamp >= 0) {
597-
console.debug("requesting out of order event at " + self.oneshotState.requestNextTimestamp);
595+
// requesting an out of order event render
598596
tryRequestOneshot(self.oneshotState.requestNextTimestamp, true);
599597
} else if (data.eventStart < 0) {
600598
console.info('oneshot received "end of frames" event');
601599
} else if (data.emptyFinish >= 0) {
602-
console.debug("there's some more event to render, try requesting next event");
600+
// there's some more event to render, try requesting next event
603601
tryRequestOneshot(data.emptyFinish, data.animated);
604602
} else {
605603
console.info('there are no more events to prerender');

0 commit comments

Comments
 (0)