Skip to content

Commit 516c6d4

Browse files
JustAMandmitrylyzo
authored andcommitted
Rework buffer into C++ class
Cherry-picked from: jellyfin@6d3a5c7 Add 'ReusableBuffer::capacity' from [Restructure renderBlend so it can return multiple pieces; JS side not ready yet] Cherry-picked from: jellyfin@0cc2bf8 Move private data members to the top. Rename 'ReusableBuffer::take' -> 'ReusableBuffer::ensure_size'.
1 parent 887779e commit 516c6d4

File tree

1 file changed

+47
-38
lines changed

1 file changed

+47
-38
lines changed

src/SubtitleOctopus.cpp

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,50 +19,59 @@
1919

2020
int log_level = 3;
2121

22-
typedef struct {
22+
class ReusableBuffer {
23+
private:
2324
void *buffer;
2425
size_t size;
2526
size_t lessen_counter;
26-
} buffer_t;
2727

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);
4033
}
4134

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;
4740
}
48-
if (!newbuf) return NULL;
4941

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+
}
5655

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;
6263

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+
};
6675

6776
void msg_callback(int level, const char *fmt, va_list va, void *data) {
6877
if (level > log_level) // 6 for verbose
@@ -127,7 +136,7 @@ class SubtitleOctopus {
127136
resizeCanvas(frame_w, frame_h);
128137

129138
reloadFonts();
130-
buffer_init(&m_blend);
139+
m_blend.clear();
131140
}
132141

133142
/* TRACK */
@@ -173,7 +182,7 @@ class SubtitleOctopus {
173182
ass_free_track(track);
174183
ass_renderer_done(ass_renderer);
175184
ass_library_done(ass_library);
176-
buffer_free(&m_blend);
185+
m_blend.clear();
177186
}
178187
void reloadLibrary() {
179188
quitLibrary();
@@ -265,7 +274,7 @@ class SubtitleOctopus {
265274

266275
// make float buffer for blending
267276
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);
269278
if (buf == NULL) {
270279
printf("libass: error: cannot allocate buffer for blending");
271280
return &m_blendResult;
@@ -345,7 +354,7 @@ class SubtitleOctopus {
345354
}
346355

347356
private:
348-
buffer_t m_blend;
357+
ReusableBuffer m_blend;
349358
RenderBlendResult m_blendResult;
350359
};
351360

0 commit comments

Comments
 (0)