[FFmpeg-devel] [PATCH 19/22] fftools/ffmpeg: stop accessing input format from decoding code

Anton Khirnov anton at khirnov.net
Mon May 8 12:17:35 EEST 2023


Export the corresponding flag in InputFile instead. This will allow
making the demuxer AVFormatContext private in future commits, similarly
to what was previously done for muxers.
---
 fftools/ffmpeg.c       | 5 ++---
 fftools/ffmpeg.h       | 3 +++
 fftools/ffmpeg_demux.c | 2 ++
 3 files changed, 7 insertions(+), 3 deletions(-)

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 1d596d1b29..2882f4308a 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);
-- 
2.39.2



More information about the ffmpeg-devel mailing list