|
19 | 19 |
|
20 | 20 | int log_level = 3; |
21 | 21 |
|
22 | | -typedef struct { |
| 22 | +class ReusableBuffer { |
| 23 | +private: |
23 | 24 | void *buffer; |
24 | 25 | size_t size; |
25 | 26 | size_t lessen_counter; |
26 | | -} buffer_t; |
27 | 27 |
|
28 | | -void* buffer_resize(buffer_t *buf, size_t new_size, int keep_content) { |
29 | | - if (buf->size >= new_size) { |
30 | | - if (buf->size >= 1.3 * new_size) { |
31 | | - // big reduction request |
32 | | - buf->lessen_counter++; |
33 | | - } else { |
34 | | - buf->lessen_counter = 0; |
35 | | - } |
36 | | - if (buf->lessen_counter < 10) { |
37 | | - // not reducing the buffer yet |
38 | | - return buf->buffer; |
39 | | - } |
| 28 | +public: |
| 29 | + ReusableBuffer(): buffer(NULL), size(0), lessen_counter(0) {} |
| 30 | + |
| 31 | + ~ReusableBuffer() { |
| 32 | + free(buffer); |
40 | 33 | } |
41 | 34 |
|
42 | | - void *newbuf; |
43 | | - if (keep_content) { |
44 | | - newbuf = realloc(buf->buffer, new_size); |
45 | | - } else { |
46 | | - newbuf = malloc(new_size); |
| 35 | + void clear() { |
| 36 | + free(buffer); |
| 37 | + buffer = NULL; |
| 38 | + size = 0; |
| 39 | + lessen_counter = 0; |
47 | 40 | } |
48 | | - if (!newbuf) return NULL; |
49 | 41 |
|
50 | | - if (!keep_content) free(buf->buffer); |
51 | | - buf->buffer = newbuf; |
52 | | - buf->size = new_size; |
53 | | - buf->lessen_counter = 0; |
54 | | - return buf->buffer; |
55 | | -} |
| 42 | + void *ensure_size(size_t new_size, bool keep_content) { |
| 43 | + if (size >= new_size) { |
| 44 | + if (size >= 1.3 * new_size) { |
| 45 | + // big reduction request |
| 46 | + lessen_counter++; |
| 47 | + } else { |
| 48 | + lessen_counter = 0; |
| 49 | + } |
| 50 | + if (lessen_counter < 10) { |
| 51 | + // not reducing the buffer yet |
| 52 | + return buffer; |
| 53 | + } |
| 54 | + } |
56 | 55 |
|
57 | | -void buffer_init(buffer_t *buf) { |
58 | | - buf->buffer = NULL; |
59 | | - buf->size = 0; |
60 | | - buf->lessen_counter = 0; |
61 | | -} |
| 56 | + void *newbuf; |
| 57 | + if (keep_content) { |
| 58 | + newbuf = realloc(buffer, new_size); |
| 59 | + } else { |
| 60 | + newbuf = malloc(new_size); |
| 61 | + } |
| 62 | + if (!newbuf) return NULL; |
62 | 63 |
|
63 | | -void buffer_free(buffer_t *buf) { |
64 | | - free(buf->buffer); |
65 | | -} |
| 64 | + if (!keep_content) free(buffer); |
| 65 | + buffer = newbuf; |
| 66 | + size = new_size; |
| 67 | + lessen_counter = 0; |
| 68 | + return buffer; |
| 69 | + } |
| 70 | + |
| 71 | + size_t capacity() const { |
| 72 | + return size; |
| 73 | + } |
| 74 | +}; |
66 | 75 |
|
67 | 76 | void msg_callback(int level, const char *fmt, va_list va, void *data) { |
68 | 77 | if (level > log_level) // 6 for verbose |
@@ -127,7 +136,7 @@ class SubtitleOctopus { |
127 | 136 | resizeCanvas(frame_w, frame_h); |
128 | 137 |
|
129 | 138 | reloadFonts(); |
130 | | - buffer_init(&m_blend); |
| 139 | + m_blend.clear(); |
131 | 140 | } |
132 | 141 |
|
133 | 142 | /* TRACK */ |
@@ -173,7 +182,7 @@ class SubtitleOctopus { |
173 | 182 | ass_free_track(track); |
174 | 183 | ass_renderer_done(ass_renderer); |
175 | 184 | ass_library_done(ass_library); |
176 | | - buffer_free(&m_blend); |
| 185 | + m_blend.clear(); |
177 | 186 | } |
178 | 187 | void reloadLibrary() { |
179 | 188 | quitLibrary(); |
@@ -265,7 +274,7 @@ class SubtitleOctopus { |
265 | 274 |
|
266 | 275 | // make float buffer for blending |
267 | 276 | const size_t buffer_size = width * height * 4 * sizeof(float); |
268 | | - float* buf = (float*)buffer_resize(&m_blend, buffer_size, 0); |
| 277 | + float* buf = (float*)m_blend.ensure_size(buffer_size, false); |
269 | 278 | if (buf == NULL) { |
270 | 279 | printf("libass: error: cannot allocate buffer for blending"); |
271 | 280 | return &m_blendResult; |
@@ -345,7 +354,7 @@ class SubtitleOctopus { |
345 | 354 | } |
346 | 355 |
|
347 | 356 | private: |
348 | | - buffer_t m_blend; |
| 357 | + ReusableBuffer m_blend; |
349 | 358 | RenderBlendResult m_blendResult; |
350 | 359 | }; |
351 | 360 |
|
|
0 commit comments