Commit d3d9a00b authored by Michael Niedermayer's avatar Michael Niedermayer

ffmpeg: Use filter graph output frame rate also for frame duration estimation

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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 7b328560
...@@ -895,6 +895,7 @@ static void do_video_out(AVFormatContext *s, ...@@ -895,6 +895,7 @@ static void do_video_out(AVFormatContext *s,
double duration = 0; double duration = 0;
int frame_size = 0; int frame_size = 0;
InputStream *ist = NULL; InputStream *ist = NULL;
AVFilterContext *filter = ost->filter->filter;
if (ost->source_index >= 0) if (ost->source_index >= 0)
ist = input_streams[ost->source_index]; ist = input_streams[ost->source_index];
...@@ -902,6 +903,13 @@ static void do_video_out(AVFormatContext *s, ...@@ -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) 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)); 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 && if (!ost->filters_script &&
!ost->filters && !ost->filters &&
next_picture && next_picture &&
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment