summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2017-05-23 13:36:38 +0200
committerwm4 <nfxjfg@googlemail.com>2017-06-07 11:08:06 +0200
commit66cf78e932956eaa7d5a9dab8766efbfc1431e55 (patch)
tree6fb2a32d50643c5b00d5c7a149d2bba21a7f8142 /libavformat
parent34c52005605d68f7cd1957b169b6732c7d2447d9 (diff)
lavf: consider codec framerate for framerate detection
Fixes detection of some TV sample as 24.5 FPS. With the patch applied, it's detected as 25 FPS. This is enabled for mpegts only.
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/internal.h5
-rw-r--r--libavformat/mpegts.c2
-rw-r--r--libavformat/utils.c10
3 files changed, 17 insertions, 0 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h
index c856945ce9..d136c79bdd 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -145,6 +145,11 @@ struct AVFormatInternal {
* ID3v2 tag useful for MP3 demuxing
*/
AVDictionary *id3v2_meta;
+
+ /*
+ * Prefer the codec framerate for avg_frame_rate computation.
+ */
+ int prefer_codec_framerate;
};
struct AVStreamInternal {
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 3eff1522bd..4d2f5c6802 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -2616,6 +2616,8 @@ static int mpegts_read_header(AVFormatContext *s)
int len;
int64_t pos, probesize = s->probesize;
+ s->internal->prefer_codec_framerate = 1;
+
if (ffio_ensure_seekback(pb, probesize) < 0)
av_log(s, AV_LOG_WARNING, "Failed to allocate buffers for seekback\n");
diff --git a/libavformat/utils.c b/libavformat/utils.c
index c641377385..38d247c6cd 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3904,6 +3904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
st->info->codec_info_duration) {
int best_fps = 0;
double best_error = 0.01;
+ AVRational codec_frame_rate = avctx->framerate;
if (st->info->codec_info_duration >= INT64_MAX / st->time_base.num / 2||
st->info->codec_info_duration_fields >= INT64_MAX / st->time_base.den ||
@@ -3924,6 +3925,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
best_error = error;
best_fps = std_fps.num;
}
+
+ if (ic->internal->prefer_codec_framerate && codec_frame_rate.num > 0 && codec_frame_rate.den > 0) {
+ error = fabs(av_q2d(codec_frame_rate) /
+ av_q2d(std_fps) - 1);
+ if (error < best_error) {
+ best_error = error;
+ best_fps = std_fps.num;
+ }
+ }
}
if (best_fps)
av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,