From patchwork Sat Nov 28 19:46:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 24133 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B38D344B15E for ; Sat, 28 Nov 2020 21:56:40 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9B567688146; Sat, 28 Nov 2020 21:56:40 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f196.google.com (mail-qt1-f196.google.com [209.85.160.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5F4CA68811C for ; Sat, 28 Nov 2020 21:56:34 +0200 (EET) Received: by mail-qt1-f196.google.com with SMTP id l2so5536418qtq.4 for ; Sat, 28 Nov 2020 11:56:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iWqI97OOKdb0njIB299Bdg1a0fE/VxuqqyF/nl8X1xA=; b=TM1DasLrk4tvl9Hvbxlm5fJnTQU+vLKqGDjIU6K+Gv53OHZdC4ZCw/CuUo/yWBYNnd SPkvQG9Bmi4up6ojWRH5XFjazmD7Vm0TPaMSVI6pXtOG6NRzU+qNNVdlMxmF8VNsxOM4 Sl+9n3/Yh34R1pHoqamKYVqEs5jZvRSMjuw3tbMlDB1kSYcXxuSKaqhhZFVYv0fnS3Lv A3HitcLdw82LKpja7bO5Dvd0QHtLdnWnoNwAtpSLIYZn8XXTTGxm/N4yv/Sib3wBHUu7 Aud4ZZIOEnDdPm52pZBzRNzC+L0bD3EaOja4eSZJCUJGKH38X+GmEdvr6RzTTt9q5TE0 T4mA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=iWqI97OOKdb0njIB299Bdg1a0fE/VxuqqyF/nl8X1xA=; b=oboJ45EywllTlmcxrcCuTQtzcdyj/H0BIxGKao4MVSf7CppWK+cW82HnhS9ZDYOZyc HliPjLHm3sLY7pbauN4nOLTKmtc9vfboPtXExnRLIsQIum5+DYAhsITnRWEuiEY3gadZ ORrSqWh1eJ+r9w3lQ5u1XDFxuXwaHXQHHN3fkofyIYKnvwhfiszU5VTZpdjI8R8pprzF hCP+ogExuPy7LA9JrXxfhQ635Wtw5WPpWHWu8OGOnRqHQXUT7elKOokLtPK/aR4Cjx1i qZPUBhmsCkGPVWNUlOrLd7zApYI8ZvUNE1M8Mpsb37YNC7lvg30Em7FROADmSTJ7ugIp KKeA== X-Gm-Message-State: AOAM532ceF0D+cZAZWN9ccCS/YJLQE3iGPGLXa3dXdUiyCF3+jG6NJ0P FGto54IYHuzVasiiGYCz8hx+KvQwkGY= X-Google-Smtp-Source: ABdhPJwXHOflW9bjJkV38gAT2MGkMFXe8lYkd2te0y2dEQYQcUK2nCKXx/lHecOxGfugMduejcL+fw== X-Received: by 2002:aed:2946:: with SMTP id s64mr14123729qtd.73.1606592916965; Sat, 28 Nov 2020 11:48:36 -0800 (PST) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id l28sm9288553qkl.7.2020.11.28.11.48.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Nov 2020 11:48:36 -0800 (PST) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Sat, 28 Nov 2020 14:46:54 -0500 Message-Id: <20201128194654.33756-2-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201128194654.33756-1-andriy.gelman@gmail.com> References: <20201128194654.33756-1-andriy.gelman@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] RFC ffmpeg: exit demuxers earlier after signal received 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 Cc: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman We currently use the same interrupt_callback function for both muxers and demuxers to break out of potential infinite loops. The function decode_interrupt_cb() checks for how many SIGINT/SIGTERM interrupts have been received, and (usually) two interrupts are needed to break out of an infinite loop. If this condition is seen on the muxer, however, we will fail to flush the avio buffers (see retry_transfer_wrapper()). An example of this issue is seen in Ticket #9009 (which would be fixed by this patch). A more robust alternative maybe to break out of demuxers with one interrupt. The error should propagate through, close the muxers and allow them to flush properly. (If the infinite loop is present on the muxer then a second interrupt would cause it break out and have the same behavior as before.) This patch adds this behavior. I've labelled it RFC because it potentially touches many demuxers. --- fftools/ffmpeg.c | 6 ++++++ fftools/ffmpeg.h | 1 + fftools/ffmpeg_opt.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 01f4ef15d8..bb27eec879 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -510,7 +510,13 @@ static int decode_interrupt_cb(void *ctx) return received_nb_signals > atomic_load(&transcode_init_done); } +static int decode_interrupt_one_sig_cb(void *ctx) +{ + return received_nb_signals > 0; +} + const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL }; +const AVIOInterruptCB int_one_sig_cb = { decode_interrupt_one_sig_cb, NULL }; static void ffmpeg_cleanup(int ret) { diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 3b54dab7fc..c49af30009 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -627,6 +627,7 @@ extern int vstats_version; extern int auto_conversion_filters; extern const AVIOInterruptCB int_cb; +extern const AVIOInterruptCB int_one_sig_cb; extern const OptionDef options[]; extern const HWAccel hwaccels[]; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 7ee034c9c9..2908f23010 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -1156,7 +1156,7 @@ static int open_input_file(OptionsContext *o, const char *filename) ic->flags |= AVFMT_FLAG_NONBLOCK; if (o->bitexact) ic->flags |= AVFMT_FLAG_BITEXACT; - ic->interrupt_callback = int_cb; + ic->interrupt_callback = int_one_sig_cb; if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) { av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);