diff --git a/demux/demux_subreader.c b/demux/demux_subreader.c index e95ffda976..f422441b0b 100644 --- a/demux/demux_subreader.c +++ b/demux/demux_subreader.c @@ -1500,6 +1500,7 @@ static int d_check_file(struct demuxer *demuxer) p->sh = new_sh_stream(demuxer, STREAM_SUB); p->sh->codec = sd->codec; + p->sh->sub->frame_based = !sd->sub_uses_time; add_sub_data(demuxer, sd); subdata_free(sd); diff --git a/demux/stheader.h b/demux/stheader.h index 14418accb0..37bdbcc568 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -163,6 +163,7 @@ typedef struct sh_sub { SH_COMMON unsigned char *extradata; // extra header data passed from demuxer int extradata_len; + int frame_based; // timestamps are frame-based struct ass_track *track; // loaded by libass struct dec_sub *dec_sub; // decoder context } sh_sub_t; diff --git a/sub/dec_sub.c b/sub/dec_sub.c index dd1168d0ad..54f3c1ebfe 100644 --- a/sub/dec_sub.c +++ b/sub/dec_sub.c @@ -275,6 +275,10 @@ bool sub_read_all_packets(struct dec_sub *sub, struct sh_sub *sh) MP_TARRAY_APPEND(tmp, subs.packets, subs.num_packets, pkt); } + // 23.976 FPS is used as default timebase for frame based formats + if (sub->video_fps && sh->frame_based) + multiply_timings(&subs, sub->video_fps / 23.976); + if (opts->sub_fps && sub->video_fps) multiply_timings(&subs, opts->sub_fps / sub->video_fps);