summaryrefslogtreecommitdiffstats
path: root/sub
diff options
context:
space:
mode:
Diffstat (limited to 'sub')
-rw-r--r--sub/dec_sub.c25
-rw-r--r--sub/dec_sub.h3
-rw-r--r--sub/sd.h4
-rw-r--r--sub/sd_ass.c2
4 files changed, 24 insertions, 10 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index fbce829f5f..be55fc0906 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -53,6 +53,7 @@ struct dec_sub {
struct sh_stream *sh;
double last_pkt_pts;
+ bool preload_attempted;
struct mp_codec_params *codec;
double start, end;
@@ -96,6 +97,7 @@ static struct sd *init_decoder(struct dec_sub *sub)
.driver = driver,
.attachments = sub->attachments,
.codec = sub->codec,
+ .preload_ok = true,
};
if (sd->driver->init(sd) >= 0)
@@ -167,16 +169,20 @@ static void update_segment(struct dec_sub *sub)
}
}
-// Read all packets from the demuxer and decode/add them. Returns false if
-// there are circumstances which makes this not possible.
-bool sub_read_all_packets(struct dec_sub *sub)
+bool sub_can_preload(struct dec_sub *sub)
{
+ bool r;
pthread_mutex_lock(&sub->lock);
+ r = sub->sd->driver->accept_packets_in_advance && !sub->preload_attempted;
+ pthread_mutex_unlock(&sub->lock);
+ return r;
+}
- if (!sub->sd->driver->accept_packets_in_advance) {
- pthread_mutex_unlock(&sub->lock);
- return false;
- }
+void sub_preload(struct dec_sub *sub)
+{
+ pthread_mutex_lock(&sub->lock);
+
+ sub->preload_attempted = true;
for (;;) {
struct demux_packet *pkt = demux_read_packet(sub->sh);
@@ -187,7 +193,6 @@ bool sub_read_all_packets(struct dec_sub *sub)
}
pthread_mutex_unlock(&sub->lock);
- return true;
}
// Read packets from the demuxer stream passed to sub_create(). Return true if
@@ -230,7 +235,9 @@ bool sub_read_packets(struct dec_sub *sub, double video_pts)
break;
}
- sub->sd->driver->decode(sub->sd, pkt);
+ if (!(sub->preload_attempted && sub->sd->preload_ok))
+ sub->sd->driver->decode(sub->sd, pkt);
+
talloc_free(pkt);
}
pthread_mutex_unlock(&sub->lock);
diff --git a/sub/dec_sub.h b/sub/dec_sub.h
index cedb140e79..63603e2174 100644
--- a/sub/dec_sub.h
+++ b/sub/dec_sub.h
@@ -32,7 +32,8 @@ void sub_destroy(struct dec_sub *sub);
void sub_lock(struct dec_sub *sub);
void sub_unlock(struct dec_sub *sub);
-bool sub_read_all_packets(struct dec_sub *sub);
+bool sub_can_preload(struct dec_sub *sub);
+void sub_preload(struct dec_sub *sub);
bool sub_read_packets(struct dec_sub *sub, double video_pts);
void sub_get_bitmaps(struct dec_sub *sub, struct mp_osd_res dim, double pts,
struct sub_bitmaps *res);
diff --git a/sub/sd.h b/sub/sd.h
index 92bbf906fd..fe64163b1b 100644
--- a/sub/sd.h
+++ b/sub/sd.h
@@ -19,6 +19,10 @@ struct sd {
struct attachment_list *attachments;
struct mp_codec_params *codec;
+
+ // Set to false as soon as the decoder discards old subtitle events.
+ // (only needed if sd_functions.accept_packets_in_advance == false)
+ bool preload_ok;
};
struct sd_functions {
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index f8c9abebb2..23f0c882f8 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -452,6 +452,7 @@ static void get_bitmaps(struct sd *sd, struct mp_osd_res dim, double pts,
if (ctx->duration_unknown && pts != MP_NOPTS_VALUE) {
mp_ass_flush_old_events(track, ts);
ctx->num_seen_packets = 0;
+ sd->preload_ok = false;
}
if (no_ass)
fill_plaintext(sd, pts);
@@ -612,6 +613,7 @@ static void reset(struct sd *sd)
if (sd->opts->sub_clear_on_seek || ctx->duration_unknown) {
ass_flush_events(ctx->ass_track);
ctx->num_seen_packets = 0;
+ sd->preload_ok = false;
}
if (ctx->converter)
lavc_conv_reset(ctx->converter);