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.
pull/120/merge
wm4 8 years ago
parent 34c5200560
commit 66cf78e932
  1. 5
      libavformat/internal.h
  2. 2
      libavformat/mpegts.c
  3. 10
      libavformat/utils.c

@ -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 {

@ -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");

@ -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,

Loading…
Cancel
Save