[FFmpeg-cvslog] avformat/utils: limit rfps to values larger than fps

Michael Niedermayer git at videolan.org
Sun Dec 15 22:13:58 CET 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Dec 15 21:40:13 2013 +0100| [d600b18f224e02f8bfc6660bfa442e7ff3fb057c] | committer: Michael Niedermayer

avformat/utils: limit rfps to values larger than fps

This avoids some nonsense values being produced by totally corrupted input

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d600b18f224e02f8bfc6660bfa442e7ff3fb057c
---

 libavformat/avformat.h |    1 +
 libavformat/utils.c    |    6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 6bd54ce..52eef0d 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -756,6 +756,7 @@ typedef struct AVStream {
         int64_t last_dts;
         int64_t duration_gcd;
         int duration_count;
+        int64_t rfps_duration_sum;
         double (*duration_error)[2][MAX_STD_TIMEBASES];
         int64_t codec_info_duration;
         int64_t codec_info_duration_fields;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 8687cff..7f19abc 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2731,6 +2731,7 @@ int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
             }
         }
         st->info->duration_count++;
+        st->info->rfps_duration_sum += duration;
 
         if (st->info->duration_count % 10 == 0) {
             int n = st->info->duration_count;
@@ -2784,6 +2785,10 @@ void ff_rfps_calculate(AVFormatContext *ic)
                     continue;
                 if(!st->info->codec_info_duration && 1.0 < (1001*12.0)/get_std_framerate(j))
                     continue;
+
+                if (av_q2d(st->time_base) * st->info->rfps_duration_sum / st->info->duration_count < (1001*12.0 * 0.8)/get_std_framerate(j))
+                    continue;
+
                 for(k=0; k<2; k++){
                     int n= st->info->duration_count;
                     double a= st->info->duration_error[k][0][j] / n;
@@ -2805,6 +2810,7 @@ void ff_rfps_calculate(AVFormatContext *ic)
         av_freep(&st->info->duration_error);
         st->info->last_dts = AV_NOPTS_VALUE;
         st->info->duration_count = 0;
+        st->info->rfps_duration_sum = 0;
     }
 }
 



More information about the ffmpeg-cvslog mailing list