diff options
author | Martin Herkt <lachs0r@srsfckn.biz> | 2016-11-20 18:15:08 +0100 |
---|---|---|
committer | Martin Herkt <lachs0r@srsfckn.biz> | 2016-11-20 18:15:08 +0100 |
commit | 8700700de8a4103724796077034f7f254ad974bc (patch) | |
tree | 2fce4dee518a202c45c3f16567db36edc92ed914 /sub | |
parent | e6b85c91700bee0ddc92e98a30d5021691bd6f65 (diff) | |
parent | eafc273d2c2ae6d247d741202e58ca23dc938cb2 (diff) | |
download | mpv-8700700de8a4103724796077034f7f254ad974bc.tar.bz2 mpv-8700700de8a4103724796077034f7f254ad974bc.tar.xz |
Merge branch 'master' into release/current
Diffstat (limited to 'sub')
-rw-r--r-- | sub/dec_sub.c | 9 | ||||
-rw-r--r-- | sub/osd.c | 19 | ||||
-rw-r--r-- | sub/osd.h | 2 | ||||
-rw-r--r-- | sub/osd_state.h | 1 |
4 files changed, 29 insertions, 2 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c index 39eb032982..b9f04b3123 100644 --- a/sub/dec_sub.c +++ b/sub/dec_sub.c @@ -198,6 +198,12 @@ void sub_preload(struct dec_sub *sub) pthread_mutex_unlock(&sub->lock); } +static bool is_new_segment(struct dec_sub *sub, struct demux_packet *p) +{ + return p->new_segment && + (p->start != sub->start || p->end != sub->end || p->codec != sub->codec); +} + // Read packets from the demuxer stream passed to sub_create(). Return true if // enough packets were read, false if the player should wait until the demuxer // signals new packets available (and then should retry). @@ -236,7 +242,7 @@ bool sub_read_packets(struct dec_sub *sub, double video_pts) sub->last_pkt_pts = pkt->pts; - if (pkt->new_segment) { + if (is_new_segment(sub, pkt)) { sub->new_segment = pkt; // Note that this can be delayed to a much later point in time. update_segment(sub); @@ -294,7 +300,6 @@ void sub_reset(struct dec_sub *sub) if (sub->sd->driver->reset) sub->sd->driver->reset(sub->sd); sub->last_pkt_pts = MP_NOPTS_VALUE; - sub->start = sub->end = MP_NOPTS_VALUE; sub->last_vo_pts = MP_NOPTS_VALUE; talloc_free(sub->new_segment); sub->new_segment = NULL; @@ -119,6 +119,7 @@ struct osd_state *osd_create(struct mpv_global *global) .opts = global->opts, .global = global, .log = mp_log_new(osd, global->log, "osd"), + .force_video_pts = MP_NOPTS_VALUE, }; pthread_mutex_init(&osd->lock, NULL); @@ -190,6 +191,21 @@ void osd_set_render_subs_in_filter(struct osd_state *osd, bool s) pthread_mutex_unlock(&osd->lock); } +void osd_set_force_video_pts(struct osd_state *osd, double video_pts) +{ + pthread_mutex_lock(&osd->lock); + osd->force_video_pts = video_pts; + pthread_mutex_unlock(&osd->lock); +} + +double osd_get_force_video_pts(struct osd_state *osd) +{ + pthread_mutex_lock(&osd->lock); + double pts = osd->force_video_pts; + pthread_mutex_unlock(&osd->lock); + return pts; +} + void osd_set_progbar(struct osd_state *osd, struct osd_progbar_state *s) { pthread_mutex_lock(&osd->lock); @@ -288,6 +304,9 @@ void osd_draw(struct osd_state *osd, struct mp_osd_res res, { pthread_mutex_lock(&osd->lock); + if (osd->force_video_pts != MP_NOPTS_VALUE) + video_pts = osd->force_video_pts; + if (draw_flags & OSD_DRAW_SUB_FILTER) draw_flags |= OSD_DRAW_SUB_ONLY; @@ -155,6 +155,8 @@ void osd_set_sub(struct osd_state *osd, int index, struct dec_sub *dec_sub); bool osd_get_render_subs_in_filter(struct osd_state *osd); void osd_set_render_subs_in_filter(struct osd_state *osd, bool s); +void osd_set_force_video_pts(struct osd_state *osd, double video_pts); +double osd_get_force_video_pts(struct osd_state *osd); struct osd_progbar_state { int type; // <0: disabled, 1-255: symbol, else: no symbol diff --git a/sub/osd_state.h b/sub/osd_state.h index fbccd85e70..cce415a1b9 100644 --- a/sub/osd_state.h +++ b/sub/osd_state.h @@ -67,6 +67,7 @@ struct osd_state { struct osd_object *objs[MAX_OSD_PARTS]; bool render_subs_in_filter; + double force_video_pts; bool want_redraw; bool want_redraw_notification; |