[FFmpeg-cvslog] fftools/ffmpeg: refactor limiting output file size with -fs
Anton Khirnov
git at videolan.org
Sat Jul 23 13:07:03 EEST 2022
ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sat Dec 11 14:12:08 2021 +0100| [d8e944c2385fab726beb48011ebe1e48b84fe96c] | committer: Anton Khirnov
fftools/ffmpeg: refactor limiting output file size with -fs
Move the file size checking code to ffmpeg_mux. Use the recently
introduced of_filesize(), making this code consistent with the size
shown by print_report().
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d8e944c2385fab726beb48011ebe1e48b84fe96c
---
fftools/ffmpeg.c | 4 +---
fftools/ffmpeg.h | 4 ++--
fftools/ffmpeg_mux.c | 11 ++++++++++-
fftools/ffmpeg_opt.c | 3 +--
4 files changed, 14 insertions(+), 8 deletions(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index d9b512ce59..42c11e84ad 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -3462,10 +3462,8 @@ static int need_output(void)
for (i = 0; i < nb_output_streams; i++) {
OutputStream *ost = output_streams[i];
OutputFile *of = output_files[ost->file_index];
- AVFormatContext *os = output_files[ost->file_index]->ctx;
- if (ost->finished ||
- (os->pb && avio_tell(os->pb) >= of->limit_filesize))
+ if (ost->finished || of_finished(of))
continue;
if (ost->frame_number >= ost->max_frames) {
int j;
diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
index 7721f959c1..7ab7aa94bf 100644
--- a/fftools/ffmpeg.h
+++ b/fftools/ffmpeg.h
@@ -596,7 +596,6 @@ typedef struct OutputFile {
int ost_index; /* index of the first stream in output_streams */
int64_t recording_time; ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
- int64_t limit_filesize; /* filesize limit expressed in bytes */
int shortest;
} OutputFile;
@@ -697,7 +696,7 @@ int hw_device_setup_for_filter(FilterGraph *fg);
int hwaccel_decode_init(AVCodecContext *avctx);
-int of_muxer_init(OutputFile *of);
+int of_muxer_init(OutputFile *of, int64_t limit_filesize);
/* open the muxer when all the streams are initialized */
int of_check_init(OutputFile *of);
int of_write_trailer(OutputFile *of);
@@ -705,6 +704,7 @@ void of_close(OutputFile **pof);
void of_write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost,
int unqueue);
+int of_finished(OutputFile *of);
int64_t of_filesize(OutputFile *of);
#endif /* FFTOOLS_FFMPEG_H */
diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c
index 83558f7f7d..207231f33b 100644
--- a/fftools/ffmpeg_mux.c
+++ b/fftools/ffmpeg_mux.c
@@ -33,6 +33,8 @@
#include "libavformat/avio.h"
struct Muxer {
+ /* filesize limit expressed in bytes */
+ int64_t limit_filesize;
int header_written;
};
@@ -322,7 +324,7 @@ void of_close(OutputFile **pof)
av_freep(pof);
}
-int of_muxer_init(OutputFile *of)
+int of_muxer_init(OutputFile *of, int64_t limit_filesize)
{
Muxer *mux = av_mallocz(sizeof(*mux));
@@ -331,9 +333,16 @@ int of_muxer_init(OutputFile *of)
of->mux = mux;
+ mux->limit_filesize = limit_filesize;
+
return 0;
}
+int of_finished(OutputFile *of)
+{
+ return of_filesize(of) >= of->mux->limit_filesize;
+}
+
int64_t of_filesize(OutputFile *of)
{
AVIOContext *pb = of->ctx->pb;
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index c9ff272731..1a2161470c 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -2403,7 +2403,6 @@ static int open_output_file(OptionsContext *o, const char *filename)
of->ost_index = nb_output_streams;
of->recording_time = o->recording_time;
of->start_time = o->start_time;
- of->limit_filesize = o->limit_filesize;
of->shortest = o->shortest;
av_dict_copy(&of->opts, o->g->format_opts, 0);
@@ -3006,7 +3005,7 @@ loop_end:
exit_program(1);
}
- err = of_muxer_init(of);
+ err = of_muxer_init(of, o->limit_filesize);
if (err < 0) {
av_log(NULL, AV_LOG_FATAL, "Error initializing internal muxing state\n");
exit_program(1);
More information about the ffmpeg-cvslog
mailing list