summaryrefslogtreecommitdiff
path: root/avtools
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2017-03-14 00:39:57 +0000
committerMark Thompson <sw@jkqxz.net>2017-04-02 17:54:05 +0100
commitf64d1100a54d12c78ce436181bb64229c56da6b3 (patch)
treee8414eb5a34ddd0d2361ae88f95c9c8ff372c998 /avtools
parent9aa251c98ce60e5ee83156e5292547a7671ced3a (diff)
avconv: Flush output BSFs when encode reaches EOF
Before this, output bitstream filters would never see EOF and therefore would not be able to flush any delayed packets.
Diffstat (limited to 'avtools')
-rw-r--r--avtools/avconv.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/avtools/avconv.c b/avtools/avconv.c
index 3f5806788e..2e218e96c7 100644
--- a/avtools/avconv.c
+++ b/avtools/avconv.c
@@ -359,7 +359,8 @@ static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
}
}
-static void output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
+static void output_packet(OutputFile *of, AVPacket *pkt,
+ OutputStream *ost, int eof)
{
int ret = 0;
@@ -367,10 +368,11 @@ static void output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
if (ost->nb_bitstream_filters) {
int idx;
- ret = av_bsf_send_packet(ost->bsf_ctx[0], pkt);
+ ret = av_bsf_send_packet(ost->bsf_ctx[0], eof ? NULL : pkt);
if (ret < 0)
goto finish;
+ eof = 0;
idx = 1;
while (idx) {
/* get a packet from the previous filter up the chain */
@@ -379,19 +381,24 @@ static void output_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost)
ret = 0;
idx--;
continue;
+ } else if (ret == AVERROR_EOF) {
+ eof = 1;
} else if (ret < 0)
goto finish;
/* send it to the next filter down the chain or to the muxer */
if (idx < ost->nb_bitstream_filters) {
- ret = av_bsf_send_packet(ost->bsf_ctx[idx], pkt);
+ ret = av_bsf_send_packet(ost->bsf_ctx[idx], eof ? NULL : pkt);
if (ret < 0)
goto finish;
idx++;
- } else
+ eof = 0;
+ } else if (eof)
+ goto finish;
+ else
write_packet(of, pkt, ost);
}
- } else
+ } else if (!eof)
write_packet(of, pkt, ost);
finish:
@@ -444,7 +451,7 @@ static void do_audio_out(OutputFile *of, OutputStream *ost,
if (ret < 0)
goto error;
- output_packet(of, &pkt, ost);
+ output_packet(of, &pkt, ost, 0);
}
return;
@@ -518,7 +525,7 @@ static void do_subtitle_out(OutputFile *of,
else
pkt.pts += 90 * sub->end_display_time;
}
- output_packet(of, &pkt, ost);
+ output_packet(of, &pkt, ost, 0);
}
}
@@ -594,7 +601,7 @@ static void do_video_out(OutputFile *of,
if (ret < 0)
goto error;
- output_packet(of, &pkt, ost);
+ output_packet(of, &pkt, ost, 0);
*frame_size = pkt.size;
/* if two pass, output log */
@@ -1082,11 +1089,11 @@ static void flush_encoders(void)
if (ost->logfile && enc->stats_out) {
fprintf(ost->logfile, "%s", enc->stats_out);
}
+ output_packet(of, &pkt, ost, ret == AVERROR_EOF);
if (ret == AVERROR_EOF) {
stop_encoding = 1;
break;
}
- output_packet(of, &pkt, ost);
}
if (stop_encoding)
@@ -1179,7 +1186,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
opkt.size = pkt->size;
}
- output_packet(of, &opkt, ost);
+ output_packet(of, &opkt, ost, 0);
}
static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame)