@@ -4358,7 +4358,6 @@ static int transcode_step(void)
static int transcode(void)
{
int ret, i;
- AVFormatContext *os;
OutputStream *ost;
InputStream *ist;
int64_t timer_start;
@@ -4427,18 +4426,6 @@ static int transcode(void)
/* dump report by using the first video and audio streams */
print_report(1, timer_start, av_gettime_relative());
- /* close the output files */
- for (i = 0; i < nb_output_files; i++) {
- os = output_files[i]->ctx;
- if (os && os->oformat && !(os->oformat->flags & AVFMT_NOFILE)) {
- if ((ret = avio_closep(&os->pb)) < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error closing file %s: %s\n", os->url, av_err2str(ret));
- if (exit_on_error)
- exit_program(1);
- }
- }
- }
-
/* close each encoder */
for (i = 0; i < nb_output_streams; i++) {
ost = output_streams[i];
@@ -35,6 +35,7 @@
struct Muxer {
/* filesize limit expressed in bytes */
int64_t limit_filesize;
+ int64_t final_filesize;
int header_written;
};
@@ -317,6 +318,17 @@ int of_write_trailer(OutputFile *of)
return ret;
}
+ of->mux->final_filesize = of_filesize(of);
+
+ if (!(of->format->flags & AVFMT_NOFILE)) {
+ ret = avio_closep(&of->ctx->pb);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error closing file %s: %s\n",
+ of->ctx->url, av_err2str(ret));
+ return ret;
+ }
+ }
+
return 0;
}
@@ -373,7 +385,9 @@ int64_t of_filesize(OutputFile *of)
AVIOContext *pb = of->ctx->pb;
int64_t ret = -1;
- if (pb) {
+ if (of->mux->final_filesize)
+ ret = of->mux->final_filesize;
+ else if (pb) {
ret = avio_size(pb);
if (ret <= 0) // FIXME improve avio_size() so it works with non seekable output too
ret = avio_tell(pb);