]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/utils.c
Merge commit '6b45f05ef5b241fd1513702119af9c30056a0ac5'
[ffmpeg] / libavformat / utils.c
index babd7d5b0c5b327c379b833bd0db59765b6233ec..6dc941bd1dc5b618dc64ad9e67990d9cafccae30 100644 (file)
@@ -2503,7 +2503,6 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt, A
            !has_decode_delay_been_guessed(st) ||
            (!st->codec_info_nb_frames && st->codec->codec->capabilities & CODEC_CAP_CHANNEL_CONF))) {
         got_picture = 0;
-        avcodec_get_frame_defaults(frame);
         switch(st->codec->codec_type) {
         case AVMEDIA_TYPE_VIDEO:
             ret = avcodec_decode_video2(st->codec, frame,
@@ -2533,7 +2532,7 @@ static int try_decode_frame(AVFormatContext *s, AVStream *st, AVPacket *avpkt, A
         ret = -1;
 
 fail:
-    avcodec_free_frame(&frame);
+    av_frame_free(&frame);
     return ret;
 }
 
@@ -2719,16 +2718,35 @@ 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) {
+                    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);
@@ -2838,15 +2856,16 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
 
         /* Ensure that subtitle_header is properly set. */
         if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE
-            && codec && !st->codec->codec)
-            avcodec_open2(st->codec, codec, options ? &options[i]
-                              : &thread_opt);
+            && codec && !st->codec->codec) {
+            if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
+                av_log(ic, AV_LOG_WARNING, "Failed to open codec in av_find_stream_info\n");
+        }
 
         //try to just open decoders, in case this is enough to get parameters
         if (!has_codec_parameters(st, NULL) && st->request_probe <= 0) {
             if (codec && !st->codec->codec)
-                avcodec_open2(st->codec, codec, options ? &options[i]
-                              : &thread_opt);
+                if (avcodec_open2(st->codec, codec, options ? &options[i] : &thread_opt) < 0)
+                    av_log(ic, AV_LOG_WARNING, "Failed to open codec in av_find_stream_info\n");
         }
         if (!options)
             av_dict_free(&thread_opt);