[FFmpeg-cvslog] avformat/utils: reject poorly fitting rfps values earlier

Michael Niedermayer git at videolan.org
Sat Dec 7 04:28:42 CET 2013


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sat Dec  7 04:13:44 2013 +0100| [1770da18f7e63b3afbfda9ab598f3e7424206e39] | committer: Michael Niedermayer

avformat/utils: reject poorly fitting rfps values earlier

This avoids collecting statistics for rfps values that very likely
will get rejected later.

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

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

 libavformat/utils.c |   34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index babd7d5..71100f8 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2719,16 +2719,36 @@ int ff_rfps_add_frame(AVFormatContext *ic, AVStream *st, int64_t ts)
 //         if(st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 //             av_log(NULL, AV_LOG_ERROR, "%f\n", dts);
         for (i=0; i<MAX_STD_TIMEBASES; i++) {
-            int framerate= get_std_framerate(i);
-            double sdts= dts*framerate/(1001*12);
-            for(j=0; j<2; j++){
-                int64_t ticks= llrint(sdts+j*0.5);
-                double error= sdts - ticks + j*0.5;
-                st->info->duration_error[j][0][i] += error;
-                st->info->duration_error[j][1][i] += error*error;
+            if (st->info->duration_error[0][1][i] < 1e10) {
+                int framerate= get_std_framerate(i);
+                double sdts= dts*framerate/(1001*12);
+                for(j=0; j<2; j++){
+                    int64_t ticks= llrint(sdts+j*0.5);
+                    double error= sdts - ticks + j*0.5;
+                    st->info->duration_error[j][0][i] += error;
+                    st->info->duration_error[j][1][i] += error*error;
+                }
             }
         }
         st->info->duration_count++;
+
+        if (st->info->duration_count % 10 == 0) {
+            int n = st->info->duration_count;
+            for (i=0; i<MAX_STD_TIMEBASES; i++) {
+                if (st->info->duration_error[0][1][i] < 1e10) {
+                    int framerate= get_std_framerate(i);
+                    double a0     = st->info->duration_error[0][0][i] / n;
+                    double error0 = st->info->duration_error[0][1][i] / n - a0*a0;
+                    double a1     = st->info->duration_error[1][0][i] / n;
+                    double error1 = st->info->duration_error[1][1][i] / n - a1*a1;
+                    if (error0 > 0.04 && error1 > 0.04) {
+                        st->info->duration_error[0][1][i] = 2e10;
+                        st->info->duration_error[1][1][i] = 2e10;
+                    }
+                }
+            }
+        }
+
         // ignore the first 4 values, they might have some random jitter
         if (st->info->duration_count > 3 && is_relative(ts) == is_relative(last))
             st->info->duration_gcd = av_gcd(st->info->duration_gcd, duration);



More information about the ffmpeg-cvslog mailing list