diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 092c5e179a..45efa75047 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -976,7 +976,6 @@ static int decode_audio(InputStream *ist, const AVPacket *pkt, int *got_output, static int64_t video_duration_estimate(const InputStream *ist, const AVFrame *frame) { const InputFile *ifile = input_files[ist->file_index]; - const int container_nots = !!(ifile->ctx->iformat->flags & AVFMT_NOTIMESTAMPS); int64_t codec_duration = 0; // XXX lavf currently makes up frame durations when they are not provided by @@ -986,7 +985,7 @@ static int64_t video_duration_estimate(const InputStream *ist, const AVFrame *fr // durations, then this should be simplified. // prefer frame duration for containers with timestamps - if (frame->duration > 0 && !container_nots) + if (frame->duration > 0 && !ifile->format_nots) return frame->duration; if (ist->dec_ctx->framerate.den && ist->dec_ctx->framerate.num) { @@ -998,7 +997,7 @@ static int64_t video_duration_estimate(const InputStream *ist, const AVFrame *fr } // prefer codec-layer duration for containers without timestamps - if (codec_duration > 0 && container_nots) + if (codec_duration > 0 && ifile->format_nots) return codec_duration; // when timestamps are available, repeat last frame's actual duration diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index d1af94590d..5863ca1faf 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -442,6 +442,9 @@ typedef struct InputFile { int index; + // input format has no timestamps + int format_nots; + AVFormatContext *ctx; int eof_reached; /* true if eof reached */ int eagain; /* true if last read attempt returned EAGAIN */ diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index 2822f0ab7f..581990fdf2 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -1504,6 +1504,8 @@ int ifile_open(const OptionsContext *o, const char *filename) d->duration = 0; d->time_base = (AVRational){ 1, 1 }; + f->format_nots = !!(ic->iformat->flags & AVFMT_NOTIMESTAMPS); + f->readrate = o->readrate ? o->readrate : 0.0; if (f->readrate < 0.0f) { av_log(d, AV_LOG_ERROR, "Option -readrate is %0.3f; it must be non-negative.\n", f->readrate);