Skip to content

Commit 6d3a5c7

Browse files
committed
Rework buffer into C++ class
1 parent 6980deb commit 6d3a5c7

File tree

1 file changed

+57
-54
lines changed

1 file changed

+57
-54
lines changed

src/SubtitleOctopus.cpp

Lines changed: 57 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -18,53 +18,53 @@
1818
#endif
1919

2020
int log_level = 3;
21-
int *is_event_animated;
2221

23-
typedef struct {
24-
void *buffer;
25-
int size;
26-
int lessen_counter;
27-
} buffer_t;
22+
class ReusableBuffer {
23+
public:
24+
ReusableBuffer(): buffer(NULL), size(-1), lessen_counter(0) {}
25+
~ReusableBuffer() {
26+
free(buffer);
27+
}
28+
void clear() {
29+
free(buffer);
30+
buffer = NULL;
31+
size = -1;
32+
lessen_counter = 0;
33+
}
34+
void *take(int new_size, bool keep_content) {
35+
if (size >= new_size) {
36+
if (size >= 1.3 * new_size) {
37+
// big reduction request
38+
lessen_counter++;
39+
} else {
40+
lessen_counter = 0;
41+
}
42+
if (lessen_counter < 10) {
43+
// not reducing the buffer yet
44+
return buffer;
45+
}
46+
}
2847

29-
void* buffer_resize(buffer_t *buf, int new_size, int keep_content) {
30-
if (buf->size >= new_size) {
31-
if (buf->size >= 1.3 * new_size) {
32-
// big reduction request
33-
buf->lessen_counter++;
48+
void *newbuf;
49+
if (keep_content) {
50+
newbuf = realloc(buffer, new_size);
3451
} else {
35-
buf->lessen_counter = 0;
36-
}
37-
if (buf->lessen_counter < 10) {
38-
// not reducing the buffer yet
39-
return buf->buffer;
52+
newbuf = malloc(new_size);
4053
}
41-
}
54+
if (!newbuf) return NULL;
4255

43-
void *newbuf;
44-
if (keep_content) {
45-
newbuf = realloc(buf->buffer, new_size);
46-
} else {
47-
newbuf = malloc(new_size);
56+
if (!keep_content) free(buffer);
57+
buffer = newbuf;
58+
size = new_size;
59+
lessen_counter = 0;
60+
return buffer;
4861
}
49-
if (!newbuf) return NULL;
5062

51-
if (!keep_content) free(buf->buffer);
52-
buf->buffer = newbuf;
53-
buf->size = new_size;
54-
buf->lessen_counter = 0;
55-
return buf->buffer;
56-
}
57-
58-
void buffer_init(buffer_t *buf) {
59-
buf->buffer = NULL;
60-
buf->size = -1;
61-
buf->lessen_counter = 0;
62-
}
63-
64-
void buffer_free(buffer_t *buf) {
65-
free(buf->buffer);
66-
buffer_init(buf);
67-
}
63+
private:
64+
void *buffer;
65+
int size;
66+
int lessen_counter;
67+
};
6868

6969
void msg_callback(int level, const char *fmt, va_list va, void *data) {
7070
if (level > log_level) // 6 for verbose
@@ -232,7 +232,7 @@ void libassjs_find_event_stop_times(double tm, double *eventFinish, double *empt
232232
if (finish > maxFinish) {
233233
maxFinish = finish;
234234
}
235-
if (!current_animated) current_animated = is_event_animated[i];
235+
if (!current_animated) current_animated = m_is_event_animated[i];
236236
}
237237
} else if (start < minStart || minStart == -1) {
238238
minStart = start;
@@ -300,8 +300,8 @@ class SubtitleOctopus {
300300
resizeCanvas(frame_w, frame_h);
301301

302302
reloadFonts();
303-
buffer_init(&m_blend);
304-
is_event_animated = NULL;
303+
m_blend.clear();
304+
m_is_event_animated = NULL;
305305
}
306306

307307
/* TRACK */
@@ -313,9 +313,9 @@ class SubtitleOctopus {
313313
exit(4);
314314
}
315315

316-
free(is_event_animated);
317-
is_event_animated = (int*)malloc(sizeof(int) * track->n_events);
318-
if (is_event_animated == NULL) {
316+
free(m_is_event_animated);
317+
m_is_event_animated = (int*)malloc(sizeof(int) * track->n_events);
318+
if (m_is_event_animated == NULL) {
319319
printf("cannot parse animated events\n");
320320
exit(5);
321321
}
@@ -336,8 +336,8 @@ class SubtitleOctopus {
336336
ass_free_track(track);
337337
track = NULL;
338338
}
339-
free(is_event_animated);
340-
is_event_animated = NULL;
339+
free(m_is_event_animated);
340+
m_is_event_animated = NULL;
341341
}
342342
/* TRACK */
343343

@@ -357,9 +357,9 @@ class SubtitleOctopus {
357357
ass_free_track(track);
358358
ass_renderer_done(ass_renderer);
359359
ass_library_done(ass_library);
360-
buffer_free(&m_blend);
361-
free(is_event_animated);
362-
is_event_animated = NULL;
360+
m_blend.clear();
361+
free(m_is_event_animated);
362+
m_is_event_animated = NULL;
363363
}
364364
void reloadLibrary() {
365365
quitLibrary();
@@ -442,7 +442,7 @@ class SubtitleOctopus {
442442

443443
// make float buffer for blending
444444
int width = max_x - min_x + 1, height = max_y - min_y + 1;
445-
float* buf = (float*)buffer_resize(&m_blend, sizeof(float) * width * height * 4, 0);
445+
float* buf = (float*)m_blend.take(sizeof(float) * width * height * 4, 0);
446446
if (buf == NULL) {
447447
printf("libass: error: cannot allocate buffer for blending");
448448
return NULL;
@@ -522,10 +522,13 @@ class SubtitleOctopus {
522522
}
523523

524524
private:
525-
buffer_t m_blend;
525+
ReusableBuffer m_blend;
526526
RenderBlendResult m_blendResult;
527+
int *m_is_event_animated;
527528
};
528529

529530
int main(int argc, char *argv[]) { return 0; }
530531

531-
#include "./SubOctpInterface.cpp"
532+
#ifdef __EMSCRIPTEN__
533+
#include "./SubOctpInterface.cpp"
534+
#endif

0 commit comments

Comments
 (0)