You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-11 14:30:22 +02:00
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().
This commit is contained in:
@ -3462,10 +3462,8 @@ static int need_output(void)
|
|||||||
for (i = 0; i < nb_output_streams; i++) {
|
for (i = 0; i < nb_output_streams; i++) {
|
||||||
OutputStream *ost = output_streams[i];
|
OutputStream *ost = output_streams[i];
|
||||||
OutputFile *of = output_files[ost->file_index];
|
OutputFile *of = output_files[ost->file_index];
|
||||||
AVFormatContext *os = output_files[ost->file_index]->ctx;
|
|
||||||
|
|
||||||
if (ost->finished ||
|
if (ost->finished || of_finished(of))
|
||||||
(os->pb && avio_tell(os->pb) >= of->limit_filesize))
|
|
||||||
continue;
|
continue;
|
||||||
if (ost->frame_number >= ost->max_frames) {
|
if (ost->frame_number >= ost->max_frames) {
|
||||||
int j;
|
int j;
|
||||||
|
@ -596,7 +596,6 @@ typedef struct OutputFile {
|
|||||||
int ost_index; /* index of the first stream in output_streams */
|
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 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 start_time; ///< start time in microseconds == AV_TIME_BASE units
|
||||||
int64_t limit_filesize; /* filesize limit expressed in bytes */
|
|
||||||
|
|
||||||
int shortest;
|
int shortest;
|
||||||
} OutputFile;
|
} OutputFile;
|
||||||
@ -697,7 +696,7 @@ int hw_device_setup_for_filter(FilterGraph *fg);
|
|||||||
|
|
||||||
int hwaccel_decode_init(AVCodecContext *avctx);
|
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 */
|
/* open the muxer when all the streams are initialized */
|
||||||
int of_check_init(OutputFile *of);
|
int of_check_init(OutputFile *of);
|
||||||
int of_write_trailer(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,
|
void of_write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost,
|
||||||
int unqueue);
|
int unqueue);
|
||||||
|
int of_finished(OutputFile *of);
|
||||||
int64_t of_filesize(OutputFile *of);
|
int64_t of_filesize(OutputFile *of);
|
||||||
|
|
||||||
#endif /* FFTOOLS_FFMPEG_H */
|
#endif /* FFTOOLS_FFMPEG_H */
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
#include "libavformat/avio.h"
|
#include "libavformat/avio.h"
|
||||||
|
|
||||||
struct Muxer {
|
struct Muxer {
|
||||||
|
/* filesize limit expressed in bytes */
|
||||||
|
int64_t limit_filesize;
|
||||||
int header_written;
|
int header_written;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -322,7 +324,7 @@ void of_close(OutputFile **pof)
|
|||||||
av_freep(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));
|
Muxer *mux = av_mallocz(sizeof(*mux));
|
||||||
|
|
||||||
@ -331,9 +333,16 @@ int of_muxer_init(OutputFile *of)
|
|||||||
|
|
||||||
of->mux = mux;
|
of->mux = mux;
|
||||||
|
|
||||||
|
mux->limit_filesize = limit_filesize;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int of_finished(OutputFile *of)
|
||||||
|
{
|
||||||
|
return of_filesize(of) >= of->mux->limit_filesize;
|
||||||
|
}
|
||||||
|
|
||||||
int64_t of_filesize(OutputFile *of)
|
int64_t of_filesize(OutputFile *of)
|
||||||
{
|
{
|
||||||
AVIOContext *pb = of->ctx->pb;
|
AVIOContext *pb = of->ctx->pb;
|
||||||
|
@ -2403,7 +2403,6 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
of->ost_index = nb_output_streams;
|
of->ost_index = nb_output_streams;
|
||||||
of->recording_time = o->recording_time;
|
of->recording_time = o->recording_time;
|
||||||
of->start_time = o->start_time;
|
of->start_time = o->start_time;
|
||||||
of->limit_filesize = o->limit_filesize;
|
|
||||||
of->shortest = o->shortest;
|
of->shortest = o->shortest;
|
||||||
av_dict_copy(&of->opts, o->g->format_opts, 0);
|
av_dict_copy(&of->opts, o->g->format_opts, 0);
|
||||||
|
|
||||||
@ -3006,7 +3005,7 @@ loop_end:
|
|||||||
exit_program(1);
|
exit_program(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = of_muxer_init(of);
|
err = of_muxer_init(of, o->limit_filesize);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
av_log(NULL, AV_LOG_FATAL, "Error initializing internal muxing state\n");
|
av_log(NULL, AV_LOG_FATAL, "Error initializing internal muxing state\n");
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
|
Reference in New Issue
Block a user