Browse Source

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.
tags/n3.4
wm4 8 years ago
parent
commit
66cf78e932
3 changed files with 17 additions and 0 deletions
  1. +5
    -0
      libavformat/internal.h
  2. +2
    -0
      libavformat/mpegts.c
  3. +10
    -0
      libavformat/utils.c

+ 5
- 0
libavformat/internal.h View File

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


+ 2
- 0
libavformat/mpegts.c View File

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



+ 10
- 0
libavformat/utils.c View File

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