summaryrefslogtreecommitdiffstats
path: root/sub/sd.h
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-12-05 23:54:00 +0100
committerwm4 <wm4@nowhere>2015-12-05 23:54:00 +0100
commita2e7642d3c8cf20c339a38595212070d2339a2cc (patch)
treef7f3726dbc187814d080564eadfb78bba786214e /sub/sd.h
parent565efeeadaf1de5f8f64aa31cbc56e31748fb0b2 (diff)
downloadmpv-a2e7642d3c8cf20c339a38595212070d2339a2cc.tar.bz2
mpv-a2e7642d3c8cf20c339a38595212070d2339a2cc.tar.xz
sub: allow feeding bitmap subs in advance
Until now, feeding packets to the decoder in advance was done for text subtitles only. This was possible because libass buffers all subtitle data anyway (in ASS_Track). sd_lavc, responsible for bitmap subs, does not do this. But it can buffer a small number of subtitle frames ahead. Enable this. Repurpose the sub_accept_packets_in_advance(). Instead of "can take all packets" it means "can take 1 packet" now. (The old meaning is still needed locally in dec_sub.c; keep it there.) It asks the decoder whether there is place for at least 1 subtitle packet. sd_lavc implements it and returns true if its internal fixed-size subtitle queue still has a free slot. (The implementation of this in dec_sub.c isn't entirely clean. For one, decode_chain() ignores this mechanism, so it's implied that bitmap subtitles do not use the subtitle filter chain in any advanced way.) Also fix 2 bugs in the sd_lavc queue handling. Subtitles must be checked in reverse, because the first entry will often have endpts==NOPTS, which would always match. alloc_sub() must cycle the queue buffer, because it reuses memory allocations (like sub.imgs) by design.
Diffstat (limited to 'sub/sd.h')
-rw-r--r--sub/sd.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/sub/sd.h b/sub/sd.h
index a77028a43c..4be48fedb8 100644
--- a/sub/sd.h
+++ b/sub/sd.h
@@ -52,6 +52,7 @@ struct sd_functions {
void (*reset)(struct sd *sd);
void (*uninit)(struct sd *sd);
+ bool (*accepts_packet)(struct sd *sd); // implicit default if NULL: true
void (*fix_events)(struct sd *sd);
int (*control)(struct sd *sd, enum sd_ctrl cmd, void *arg);