OSDN Git Service

ffmpeg: Use filter graph output frame rate also for frame duration estimation
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Jan 2015 19:15:15 +0000 (20:15 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Jan 2015 19:33:08 +0000 (20:33 +0100)
Previously the duration was sometimes wrong, this addition
limits the value and improves which frames are choosen when
reducing the frame rate

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

index 909dd68..0a39274 100644 (file)
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -895,6 +895,7 @@ static void do_video_out(AVFormatContext *s,
     double duration = 0;
     int frame_size = 0;
     InputStream *ist = NULL;
+    AVFilterContext *filter = ost->filter->filter;
 
     if (ost->source_index >= 0)
         ist = input_streams[ost->source_index];
@@ -902,6 +903,13 @@ static void do_video_out(AVFormatContext *s,
     if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
         duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
 
+    // We take the conservative approuch here and take the minimum even though
+    // this should be correct on its own but a value too small is harmless, one
+    // too big can lead to errors
+    if (filter->inputs[0]->frame_rate.num > 0 &&
+        filter->inputs[0]->frame_rate.den > 0)
+        duration = FFMIN(duration, 1/(av_q2d(filter->inputs[0]->frame_rate) * av_q2d(enc->time_base)));
+
     if (!ost->filters_script &&
         !ost->filters &&
         next_picture &&