From 5606cf29482b096df7a6b4b515c9ecb3d40fdf89 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 4 Mar 2014 00:28:10 +0100 Subject: sub: use new FFmpeg API to check MicroDVD FPS Before this, it wasn't possible to distinguish MicroDVD subtitles without FPS header, and subtitles with FPS header equal to FFmpeg's fallback FPS. --- demux/demux_lavf.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'demux/demux_lavf.c') diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index d85e4b8095..cc503383ea 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -461,11 +461,19 @@ static void handle_stream(demuxer_t *demuxer, int i) sh_sub->w = codec->width; sh_sub->h = codec->height; - // Hack for MicroDVD: if time_base matches the ffmpeg microdvd reader's - // default FPS (23.976), assume the MicroDVD file did not declare a - // FPS, and the MicroDVD file uses frame based timing. - if (codec->time_base.num == 125 && codec->time_base.den == 2997) - sh_sub->frame_based = true; + if (matches_avinputformat_name(priv, "microdvd")) { + AVRational r; + if (av_opt_get_q(avfc, "subfps", AV_OPT_SEARCH_CHILDREN, &r) >= 0) { + // File headers don't have a FPS set. + if (r.num < 1 || r.den < 1) + sh_sub->frame_based = av_q2d(av_inv_q(codec->time_base)); + } else { + // Older libavcodec versions. If the FPS matches the microdvd + // reader's default, assume it uses frame based timing. + if (codec->time_base.num == 125 && codec->time_base.den == 2997) + sh_sub->frame_based = 23.976; + } + } break; } case AVMEDIA_TYPE_ATTACHMENT: { -- cgit v1.2.3