diff options
Diffstat (limited to 'src/backend_libjpeg.c')
-rw-r--r-- | src/backend_libjpeg.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/src/backend_libjpeg.c b/src/backend_libjpeg.c index 3fde6c2..e83ddc3 100644 --- a/src/backend_libjpeg.c +++ b/src/backend_libjpeg.c @@ -21,6 +21,7 @@ struct private { static void source_free(struct imv_source *src) { + pthread_mutex_lock(&src->busy); free(src->name); src->name = NULL; @@ -37,6 +38,8 @@ static void source_free(struct imv_source *src) free(src->private); src->private = NULL; + pthread_mutex_unlock(&src->busy); + pthread_mutex_destroy(&src->busy); free(src); } @@ -64,6 +67,7 @@ static void report_error(struct imv_source *src) msg.bitmap = NULL; msg.error = "Internal error"; + pthread_mutex_unlock(&src->busy); src->callback(&msg); } @@ -82,24 +86,31 @@ static void send_bitmap(struct imv_source *src, void *bitmap) msg.frametime = 0; msg.error = NULL; + pthread_mutex_unlock(&src->busy); src->callback(&msg); } -static void load_image(struct imv_source *src) +static int load_image(struct imv_source *src) { + /* Don't run if this source is already active */ + if (pthread_mutex_trylock(&src->busy)) { + return -1; + } + struct private *private = src->private; void *bitmap = malloc(src->height * src->width * 4); int rcode = tjDecompress2(private->jpeg, private->data, private->len, bitmap, src->width, 0, src->height, TJPF_RGBA, TJFLAG_FASTDCT); - if (!rcode) { - send_bitmap(src, bitmap); - } else { + if (rcode) { free(bitmap); report_error(src); - return; + return -1; } + + send_bitmap(src, bitmap); + return 0; } static enum backend_result open_path(const char *path, struct imv_source **src) @@ -148,6 +159,7 @@ static enum backend_result open_path(const char *path, struct imv_source **src) source->height = height; source->num_frames = 1; source->next_frame = 1; + pthread_mutex_init(&source->busy, NULL); source->load_first_frame = &load_image; source->load_next_frame = NULL; source->free = &source_free; @@ -187,6 +199,7 @@ static enum backend_result open_memory(void *data, size_t len, struct imv_source source->height = height; source->num_frames = 1; source->next_frame = 1; + pthread_mutex_init(&source->busy, NULL); source->load_first_frame = &load_image; source->load_next_frame = NULL; source->free = &source_free; |