diff options
author | Rodger Combs <rodger.combs@gmail.com> | 2014-06-21 19:56:50 -0500 |
---|---|---|
committer | Rodger Combs <rodger.combs@gmail.com> | 2014-07-20 00:05:39 -0500 |
commit | a751418fd2b87d00bec8c2d6a89b04abaaa54172 (patch) | |
tree | 8982cc54b794c2f64aa26fa7fbe8f2394b822f13 | |
parent | 67966b6f64690dbfb18ea34b99ed8b26c158a2d0 (diff) | |
download | libass-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.c | 5 | ||||
-rw-r--r-- | libass/ass_library.h | 3 | ||||
-rw-r--r-- | libass/ass_render.c | 9 |
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; |