sub: protect ASS_Renderer state

Each subtitle track gets its own decoder instance (sd_ass). But they use
a shared ASS_Renderer. This is done mainly because of fontconfig.
Initializing fontconfig is very slow when using it with memory fonts, so
there's a practical need to cache this memory font state, which is done
by not creating separate ASS_Renderers. This is very dirty and very
evil, but we probably can't get rid of it any time soon.

The shared ASS_Renderer was not properly synchronized. While the program
logic guarantees that only one sd_ass instance is visible at a time,
there are other interactions that require synchronization. In
particular, I suspect concurrent execution of mp_ass_configure_fonts()
and sd_ass.get_bitmaps cause issues in a newer libass development
branch.

So here's a shitty hack that hopefully fixes things, hopefully only
until libass becomes less dependent on fontconfig.
This commit is contained in:
wm4
2015-07-06 21:55:37 +02:00
parent dcd167ca37
commit 385febe276
7 changed files with 24 additions and 4 deletions

View File

@@ -28,6 +28,7 @@ struct sd {
// Shared renderer for ASS - done to avoid reloading embedded fonts.
struct ass_library *ass_library;
struct ass_renderer *ass_renderer;
pthread_mutex_t *ass_lock;
// If false, try to remove multiple subtitles.
// (Only for decoders which have accept_packets_in_advance set.)