mirror of https://github.com/mpv-player/mpv
92a9f11a0b
The plan is to make the whole OSD thread-safe, and we start with this. We just put locks on all entry points (fortunately, dec_sub.c and all sd_*.c decoders are very closed off, and only the entry points in dec_sub.h let you access it). I think this is pretty ugly, but at least it's very simple. There's a special case with sub_get_bitmaps(): this function returns pointers to decoder data (specifically, libass images). There's no way to synchronize this internally, so expose sub_lock/sub_unlock functions. To make things simpler, and especially because the lock is sort-of exposed to the outside world, make the locks recursive. Although the only case where this is actually needed (although trivial) is sub_set_extradata(). One corner case are ASS subtitles: for some reason, we keep a single ASS_Renderer instance for subtitles around (probably to avoid rescanning fonts with ordered chapters), and this ASS_Renderer instance is not synchronized. Also, demux_libass.c loads ASS_Track objects, which are directly passed to sd_ass.c. These things are not synchronized (and would be hard to synchronize), and basically we're out of luck. But I think for now, accesses happen reasonably serialized, so there is no actual problem yet, even if we start to access OSD from other threads. |
||
---|---|---|
.. | ||
ass_mp.c | ||
ass_mp.h | ||
dec_sub.c | ||
dec_sub.h | ||
draw_bmp.c | ||
draw_bmp.h | ||
find_subfiles.c | ||
find_subfiles.h | ||
img_convert.c | ||
img_convert.h | ||
osd.c | ||
osd.h | ||
osd_dummy.c | ||
osd_font.otf | ||
osd_libass.c | ||
sd.h | ||
sd_ass.c | ||
sd_lavc.c | ||
sd_lavc_conv.c | ||
sd_lavf_srt.c | ||
sd_microdvd.c | ||
sd_movtext.c | ||
sd_spu.c | ||
sd_srt.c | ||
spudec.c | ||
spudec.h |