Skip to content

Commit

Permalink
Merge pull request #23 from dmitrylyzo/refactors
Browse files Browse the repository at this point in the history
  • Loading branch information
crobibero authored May 4, 2022
2 parents e5c85ab + bde46c2 commit df0e75f
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 23 deletions.
35 changes: 18 additions & 17 deletions src/SubtitleOctopus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ int log_level = 3;

class ReusableBuffer {
public:
ReusableBuffer(): buffer(NULL), size(-1), lessen_counter(0) {}
ReusableBuffer(): buffer(NULL), size(0), lessen_counter(0) {}

~ReusableBuffer() {
free(buffer);
Expand All @@ -30,11 +30,11 @@ class ReusableBuffer {
void clear() {
free(buffer);
buffer = NULL;
size = -1;
size = 0;
lessen_counter = 0;
}

void *take(int new_size, bool keep_content) {
void *take(size_t new_size, bool keep_content) {
if (size >= new_size) {
if (size >= 1.3 * new_size) {
// big reduction request
Expand Down Expand Up @@ -63,14 +63,14 @@ class ReusableBuffer {
return buffer;
}

int capacity() const {
size_t capacity() const {
return size;
}

private:
void *buffer;
int size;
int lessen_counter;
size_t size;
size_t lessen_counter;
};

void msg_callback(int level, const char *fmt, va_list va, void *data) {
Expand All @@ -90,30 +90,30 @@ const float MAX_UINT8_CAST = 255.9 / 255;

#define CLAMP_UINT8(value) ((value > MIN_UINT8_CAST) ? ((value < MAX_UINT8_CAST) ? (int)(value * 255) : 255) : 0)

typedef struct RenderBlendPart {
struct RenderBlendPart {
int dest_x, dest_y, dest_width, dest_height;
unsigned char *image;
RenderBlendPart *next;
} RenderBlendPart;
};

typedef struct RenderBlendResult {
struct RenderBlendResult {
int changed;
double blend_time;
RenderBlendPart *part;
} RenderBlendResult;
};

// maximum regions - a grid of 3x3
#define MAX_BLEND_STORAGES (3 * 3)
typedef struct {
struct RenderBlendStorage {
RenderBlendPart part;
ReusableBuffer buf;
bool taken;
} RenderBlendStorage;
};

typedef struct {
struct EventStopTimesResult {
double eventFinish, emptyFinish;
int is_animated;
} EventStopTimesResult;
};

#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
Expand Down Expand Up @@ -592,12 +592,13 @@ class SubtitleOctopus {
int width = rect.max_x - rect.min_x + 1, height = rect.max_y - rect.min_y + 1;

// make float buffer for blending
float* buf = (float*)m_blend.take(sizeof(float) * width * height * 4, 0);
const size_t buffer_size = width * height * 4 * sizeof(float);
float* buf = (float*)m_blend.take(buffer_size, 0);
if (buf == NULL) {
fprintf(stderr, "jso: cannot allocate buffer for blending\n");
return NULL;
}
memset(buf, 0, sizeof(float) * width * height * 4);
memset(buf, 0, buffer_size);

// blend things in
for (ASS_Image *cur = img; cur != NULL; cur = cur->next) {
Expand Down Expand Up @@ -640,7 +641,7 @@ class SubtitleOctopus {
}

// find closest free buffer
int needed = sizeof(unsigned int) * width * height;
size_t needed = sizeof(unsigned int) * width * height;
RenderBlendStorage *storage = m_blendParts, *bigBuffer = NULL, *smallBuffer = NULL;
for (int buffer_index = 0; buffer_index < MAX_BLEND_STORAGES; buffer_index++, storage++) {
if (storage->taken) continue;
Expand Down
17 changes: 11 additions & 6 deletions src/subtitles-octopus.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
// minimum time difference between frames
var FRAMETIME_ULP = 0.001;
// minimum time difference between subtitle events
var EVENTTIME_ULP = 0.01;

var SubtitlesOctopus = function (options) {
var supportsWebAssembly = false;
try {
Expand Down Expand Up @@ -324,7 +329,7 @@ var SubtitlesOctopus = function (options) {
}

if (size <= self.renderAhead) {
var lastRendered = currentTime - (renderNow ? 0 : 0.001);
var lastRendered = currentTime - (renderNow ? 0 : FRAMETIME_ULP);
if (!self.oneshotState.renderRequested) {
self.oneshotState.renderRequested = true;
self.worker.postMessage({
Expand Down Expand Up @@ -385,7 +390,7 @@ var SubtitlesOctopus = function (options) {
// we've already found a known event, now find
// the farthest point of consequent events
// NOTE: self.renderedItems may have gaps due to seeking
if (item.eventStart - finishTime < 0.01) {
if (item.eventStart - finishTime < EVENTTIME_ULP) {
finishTime = item.emptyFinish;
animated = item.animated;
} else {
Expand All @@ -395,7 +400,7 @@ var SubtitlesOctopus = function (options) {
}

if (!eventShown) {
if (Math.abs(self.oneshotState.requestNextTimestamp - currentTime) > 0.01) {
if (Math.abs(self.oneshotState.requestNextTimestamp - currentTime) > EVENTTIME_ULP) {
_cleanPastRendered(currentTime);
tryRequestOneshot(currentTime, true);
}
Expand Down Expand Up @@ -584,14 +589,14 @@ var SubtitlesOctopus = function (options) {
'), render: ' + Math.round(data.spentTime) + ' ms');
}
self.oneshotState.renderRequested = false;
if (Math.abs(data.lastRenderedTime - self.oneshotState.requestNextTimestamp) < 0.01) {
if (Math.abs(data.lastRenderedTime - self.oneshotState.requestNextTimestamp) < EVENTTIME_ULP) {
self.oneshotState.requestNextTimestamp = -1;
}
if (data.eventStart - data.lastRenderedTime > 0.01) {
if (data.eventStart - data.lastRenderedTime > EVENTTIME_ULP) {
// generate bogus empty element, so all timeline is covered anyway
self.renderedItems.push({
eventStart: data.lastRenderedTime,
eventFinish: data.lastRenderedTime - 0.001,
eventFinish: data.lastRenderedTime - FRAMETIME_ULP,
emptyFinish: data.eventStart,
viewport: data.viewport,
spentTime: 0,
Expand Down

0 comments on commit df0e75f

Please sign in to comment.