mirror of
https://github.com/mpv-player/mpv
synced 2024-12-25 00:02:13 +00:00
sub: do not ignore demuxer wakeups
Setting demux_set_stream_wakeup_cb() will make all sh_stream (i.e. track) specific wakeups go to this callback. But the callback takes care of only the sub_preload() case (where it tries to pre-load subtitles from already parsed and memory-present subtitles in a blocking way). The old code assumed that the normal demuxer wakeup callback is called. This was disregarded when the newer code was added. (And actually, the original plan was to make _all_ per-sh_stream wakeups go to specialized callbacks to avoid wasted work. dec_sub really should set the callback always, and propagate wakeups to the playloop code. But it's too far into the night to write coherent code.) I couldn't actually observe any manifestation of this bug. Normally, the playloop wakes up for other reasons (such as driving audio and video decoding), so the lost wakeups rarely matter.
This commit is contained in:
parent
423323170b
commit
c4440db744
@ -71,8 +71,6 @@ struct dec_sub {
|
||||
struct sd *sd;
|
||||
|
||||
struct demux_packet *new_segment;
|
||||
|
||||
struct mp_dispatch_queue *demux_waiter;
|
||||
};
|
||||
|
||||
static void update_subtitle_speed(struct dec_sub *sub)
|
||||
@ -192,13 +190,10 @@ struct dec_sub *sub_create(struct mpv_global *global, struct sh_stream *sh,
|
||||
.last_vo_pts = MP_NOPTS_VALUE,
|
||||
.start = MP_NOPTS_VALUE,
|
||||
.end = MP_NOPTS_VALUE,
|
||||
.demux_waiter = mp_dispatch_create(sub),
|
||||
};
|
||||
sub->opts = sub->opts_cache->opts;
|
||||
mpthread_mutex_init_recursive(&sub->lock);
|
||||
|
||||
demux_set_stream_wakeup_cb(sub->sh, wakeup_demux, sub->demux_waiter);
|
||||
|
||||
sub->sd = init_decoder(sub);
|
||||
if (sub->sd) {
|
||||
update_subtitle_speed(sub);
|
||||
@ -251,13 +246,16 @@ void sub_preload(struct dec_sub *sub)
|
||||
{
|
||||
pthread_mutex_lock(&sub->lock);
|
||||
|
||||
struct mp_dispatch_queue *demux_waiter = mp_dispatch_create(NULL);
|
||||
demux_set_stream_wakeup_cb(sub->sh, wakeup_demux, demux_waiter);
|
||||
|
||||
sub->preload_attempted = true;
|
||||
|
||||
for (;;) {
|
||||
struct demux_packet *pkt = NULL;
|
||||
int r = demux_read_packet_async(sub->sh, &pkt);
|
||||
if (r == 0) {
|
||||
mp_dispatch_queue_process(sub->demux_waiter, INFINITY);
|
||||
mp_dispatch_queue_process(demux_waiter, INFINITY);
|
||||
continue;
|
||||
}
|
||||
if (!pkt)
|
||||
@ -266,6 +264,9 @@ void sub_preload(struct dec_sub *sub)
|
||||
talloc_free(pkt);
|
||||
}
|
||||
|
||||
demux_set_stream_wakeup_cb(sub->sh, NULL, NULL);
|
||||
talloc_free(demux_waiter);
|
||||
|
||||
pthread_mutex_unlock(&sub->lock);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user