summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRodger Combs <rodger.combs@gmail.com>2014-06-21 19:56:50 -0500
committerRodger Combs <rodger.combs@gmail.com>2014-07-20 00:05:39 -0500
commita751418fd2b87d00bec8c2d6a89b04abaaa54172 (patch)
tree8982cc54b794c2f64aa26fa7fbe8f2394b822f13
parent67966b6f64690dbfb18ea34b99ed8b26c158a2d0 (diff)
downloadlibass-a751418fd2b87d00bec8c2d6a89b04abaaa54172.tar.bz2
libass-a751418fd2b87d00bec8c2d6a89b04abaaa54172.tar.xz
Dumb hack: check if fribidi is unsafe, and use a mutex if it is
-rw-r--r--libass/ass_library.c5
-rw-r--r--libass/ass_library.h3
-rw-r--r--libass/ass_render.c9
3 files changed, 17 insertions, 0 deletions
diff --git a/libass/ass_library.c b/libass/ass_library.c
index 5fb5a18..5d372d0 100644
--- a/libass/ass_library.c
+++ b/libass/ass_library.c
@@ -23,6 +23,7 @@
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
+#include <fribidi.h>
#include "ass.h"
#include "ass_library.h"
@@ -46,6 +47,10 @@ ASS_Library *ass_library_init(void)
pthread_attr_init(&lib->pthread_attr);
pthread_mutexattr_init(&lib->pthread_mutexattr);
pthread_condattr_init(&lib->pthread_condattr);
+
+ lib->unsafe_fribidi = !strstr(fribidi_version_info, "--enable-malloc");
+ if (lib->unsafe_fribidi)
+ pthread_mutex_init(&lib->fribidi_mutex, &lib->pthread_mutexattr);
#endif
return lib;
diff --git a/libass/ass_library.h b/libass/ass_library.h
index 9b056ff..c7de273 100644
--- a/libass/ass_library.h
+++ b/libass/ass_library.h
@@ -46,6 +46,9 @@ struct ass_library {
pthread_attr_t pthread_attr;
pthread_mutexattr_t pthread_mutexattr;
pthread_condattr_t pthread_condattr;
+
+ int unsafe_fribidi;
+ pthread_mutex_t fribidi_mutex;
#endif
};
diff --git a/libass/ass_render.c b/libass/ass_render.c
index c57ddd7..4223cf6 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -2148,6 +2148,11 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
}
// Find shape runs and shape text
+
+#ifdef CONFIG_PTHREAD
+ if(render_priv->library->unsafe_fribidi)
+ pthread_mutex_lock(&render_priv->library->fribidi_mutex);
+#endif
ass_shaper_set_base_direction(shaper,
resolve_base_direction(state->font_encoding));
ass_shaper_find_runs(shaper, render_priv, glyphs,
@@ -2252,6 +2257,10 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event,
free_render_context(state);
return 1;
}
+#ifdef CONFIG_PTHREAD
+ if(render_priv->library->unsafe_fribidi)
+ pthread_mutex_unlock(&render_priv->library->fribidi_mutex);
+#endif
// Reposition according to the map
pen.x = 0;