From patchwork Sun Jun 18 22:09:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 4027 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.22.4 with SMTP id 4csp645620vsw; Sun, 18 Jun 2017 15:09:42 -0700 (PDT) X-Received: by 10.223.162.156 with SMTP id s28mr15606265wra.97.1497823782239; Sun, 18 Jun 2017 15:09:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1497823782; cv=none; d=google.com; s=arc-20160816; b=yy4OWbYbUJi4qf4H3o10RZMMokRhqSCrcc8RAcBGM3wHCvObfRKqS0wx5PMWna9tIQ JcMOcuH6WlgzeVkgj+1MpqtUZtLKjxbBV3HWH0fI7PpMoTvDZOvWrCPMHQs9NUlCdFOm J5nn0K4XxHNZWLypUJ36n1aniLk5qiNZh4XpL+IEoMFaYWAoap+Rv9P8OGYvpcik0BJ6 BPl09rZbBzLzGrzv/ACXSsi2KQiohPD18Zqlq53Od4VcfUFTRSLb1QGAL+nYF7jL4dSG tKD1Zvh1p88JDmUW/xGabatudhXLIyBldEYl3OLW/3RggxkfPOvrzlbKLLjLuLxxEpwq gVSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=NcgAdgtKD//xYlMb9UloXjvcBFYIq2cMKQsuR+D9G4c=; b=uudGuOJXR7t3oLBqg2uRdHjVshwN07kdop/M482l611wNBYdv5ibQxYWcEcFYIxW3/ GJu26ydixp1voO9p2GtI8VI0suhY+OEWNk3EkFTMseQD1c/ODXKOpkW+X4BkBhwBkW2+ otmn/sIIejNQ/4ExLWgYJKaJrSRtU4MMlR0nQIb4mtbOVO65Q8BE4HOKees/r0DryNK3 c1LRXgFWp/kI+LzSRlzMUtqyleE2kB97uYf0wKBSHiHeM6GekHvpLLTUpeTU2YUFddR0 mYbbbDY0C6pGZ/FBXnBZf/us6g5bfImSFm403vSsKHSiogb2cJOAxL6IZ7o5SIuHrIpB 88SA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.b=CsUL48Qj; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f1si8283930wrc.356.2017.06.18.15.09.41; Sun, 18 Jun 2017 15:09:42 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com header.b=CsUL48Qj; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C961468A303; Mon, 19 Jun 2017 01:09:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com [74.125.82.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 70BA8689AE4 for ; Mon, 19 Jun 2017 01:09:28 +0300 (EEST) Received: by mail-wm0-f51.google.com with SMTP id d73so59433947wma.0 for ; Sun, 18 Jun 2017 15:09:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id; bh=aioscTKT68a/EB3RGMAc4r89bQB4HZrbQ5If8+krsHM=; b=CsUL48Qj7dYdxyaADiqkUYhBTTpqUsb/M27j4bHNJ9ztzVrkQE1Q9P42j0YhFLDyra ARqC4PVodIAsBntVomP/id4nI3hd7JRDfLpMxqOUEGl4orYDC+pOq/cHFlhwWfLiYfY2 pOv3eiyGU0XCb60M7AbgMi5DCwC1++t80paZPmkmNqUarCVAjPXlBKZOn8BQhXVdyoiM 7iHV+7uwfzI5phJDJtwcNG+Z3O2vjOfIC3zHRsyhh1nfwjtdfGUS1tYHK8G2DelgXgzX X4+3i9ADqqCxg81FOxXOHuHAfonTq2HE1hP/7dDL9T17qTmF0phHgx1qe0tAMoBhnE5Z g1wA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=aioscTKT68a/EB3RGMAc4r89bQB4HZrbQ5If8+krsHM=; b=Um3y0LxkGgXiaBFVmY+SZvjQg3am32iNjBhvHOKSIv8mAAs+89ia+6xCQw0W2czhLO bYDc7TAJyqjxciY7FQpQt9vzTIk63YNfdAJXMW5VcufEbuDVaJM9b6+KPiWcydqwoCtg Q5zBukgDcXP2xU6qxCIqyggnqOAiJSy3DqpKepvRexLtRb2RSSFTeOtBalNbL0Lgqe2P nU1UT9oU1z6A70jnCNGTbOg01YRKSmrCHMTnAnzAqf2p6dStdWDcIROvf2gUL9yM5e1x leuuWaBm0WcxDUTBDHJE11NaBe4TEvifln+Voh2Zg5MeZLiT8ycr4vrJKd8KqKs9YHec lVVg== X-Gm-Message-State: AKS2vOxYsgW8RISM+vDB603JyCFNR6da6MKfezUPju5tXchvrLm6G8++ GJ0+kvk8gK1e4PaHpWY= X-Received: by 10.28.52.83 with SMTP id b80mr13634581wma.63.1497823772000; Sun, 18 Jun 2017 15:09:32 -0700 (PDT) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id 62sm8922667wra.44.2017.06.18.15.09.31 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 18 Jun 2017 15:09:31 -0700 (PDT) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 18 Jun 2017 23:09:23 +0100 Message-Id: <20170618220926.24656-1-sw@jkqxz.net> X-Mailer: git-send-email 2.11.0 Subject: [FFmpeg-devel] [PATCH 1/4] ffmpeg: Flush output BSFs when encode reaches EOF X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Before this, output bitstream filters would never see EOF and therefore would not be able to flush any delayed packets. (cherry picked from commit f64d1100a54d12c78ce436181bb64229c56da6b3) --- ffmpeg.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 6170bd453c..f265980fdd 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -814,7 +814,8 @@ static void close_output_stream(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; @@ -822,10 +823,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 */ @@ -834,19 +836,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, 0); } - } else + } else if (!eof) write_packet(of, pkt, ost, 0); finish: @@ -922,7 +929,7 @@ static void do_audio_out(OutputFile *of, OutputStream *ost, av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &enc->time_base)); } - output_packet(of, &pkt, ost); + output_packet(of, &pkt, ost, 0); } return; @@ -1010,7 +1017,7 @@ static void do_subtitle_out(OutputFile *of, pkt.pts += av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase); } pkt.dts = pkt.pts; - output_packet(of, &pkt, ost); + output_packet(of, &pkt, ost, 0); } } @@ -1196,7 +1203,7 @@ static void do_video_out(OutputFile *of, pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->mux_timebase); pkt.flags |= AV_PKT_FLAG_KEY; - output_packet(of, &pkt, ost); + output_packet(of, &pkt, ost, 0); } else #endif { @@ -1299,7 +1306,7 @@ static void do_video_out(OutputFile *of, } frame_size = pkt.size; - output_packet(of, &pkt, ost); + output_packet(of, &pkt, ost, 0); /* if two pass, output log */ if (ost->logfile && enc->stats_out) { @@ -1930,6 +1937,7 @@ static void flush_encoders(void) fprintf(ost->logfile, "%s", enc->stats_out); } if (ret == AVERROR_EOF) { + output_packet(of, &pkt, ost, 1); break; } if (ost->finished & MUXER_FINISHED) { @@ -1938,7 +1946,7 @@ static void flush_encoders(void) } av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase); pkt_size = pkt.size; - output_packet(of, &pkt, ost); + output_packet(of, &pkt, ost, 0); if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) { do_video_stats(ost, pkt_size); } @@ -2077,7 +2085,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p } #endif - output_packet(of, &opkt, ost); + output_packet(of, &opkt, ost, 0); } int guess_input_channel_layout(InputStream *ist)