Before this, output bitstream filters would never see EOF and
therefore would not be able to flush any delayed packets.
---
There might be a nicer way to achieve this result? (Code is copied from
output_packet() and modified to flush.)
avtools/avconv.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/avtools/avconv.c b/avtools/avconv.c
index 5c36761c1..1e5ccddb5 100644
--- a/avtools/avconv.c
+++ b/avtools/avconv.c
@@ -1033,6 +1033,50 @@ FF_ENABLE_DEPRECATION_WARNINGS
}
+static void flush_bsfs(OutputFile *of, OutputStream *ost)
+{
+ AVPacket pkt;
+ int ret = 0, flush_idx;
+
+ for (flush_idx = 0; flush_idx < ost->nb_bitstream_filters; flush_idx++) {
+ int idx;
+
+ ret = av_bsf_send_packet(ost->bsf_ctx[flush_idx], NULL);
+ if (ret < 0)
+ goto finish;
+
+ idx = flush_idx + 1;
+ while (idx > flush_idx) {
+ /* get a packet from the previous filter up the chain */
+ ret = av_bsf_receive_packet(ost->bsf_ctx[idx - 1], &pkt);
+ if (ret == AVERROR(EAGAIN)) {
+ ret = 0;
+ idx--;
+ continue;
+ } else if (ret == AVERROR(EOF) && idx - 1 == flush_idx) {
+ break;
+ } 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);
+ if (ret < 0)
+ goto finish;
+ idx++;
+ } else
+ write_packet(of, &pkt, ost);
+ }
+ }
+
+finish:
+ if (ret < 0 && ret != AVERROR_EOF) {
+ av_log(NULL, AV_LOG_FATAL, "Error applying bitstream filters to an
output "
+ "packet for stream #%d:%d.\n", ost->file_index, ost->index);
+ exit_program(1);
+ }
+}
+
static void flush_encoders(void)
{
int i, ret;
@@ -1083,6 +1127,7 @@ static void flush_encoders(void)
fprintf(ost->logfile, "%s", enc->stats_out);
}
if (ret == AVERROR_EOF) {
+ flush_bsfs(of, ost);
stop_encoding = 1;
break;
}
--
2.11.0
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel