From patchwork Fri Apr 7 08:17:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Davy Durham X-Patchwork-Id: 41011 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4645:b0:e3:3194:9d20 with SMTP id eb5csp198135pzb; Fri, 7 Apr 2023 01:17:44 -0700 (PDT) X-Google-Smtp-Source: AKy350bxb7zTEpdXWvW3+5RmZwtSN8YowhAcx17+M0UQDqezzoxQyvDUPsb9tz0804qjAhvZ3lY3 X-Received: by 2002:a05:6402:32f:b0:500:50f6:dd34 with SMTP id q15-20020a056402032f00b0050050f6dd34mr1326680edw.1.1680855463909; Fri, 07 Apr 2023 01:17:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680855463; cv=none; d=google.com; s=arc-20160816; b=xBEtawQ/CjUUU+Ya1QpGvtmMYRFznT5khqRJwKL6RSoZHzZRiKJzF7vgpFUCCzZXER 6KbPZVmwrpu9pxq38UEKTRdKtEBodIrpaCGY7DHogR5LG6EDBRwufp5BKF6P2o4IMsiY SYbRmfgzjAmtWkv2iNa6oSg/8DthF08JvTYhwRWwxBdjz729VqaFm/DosSCKnc1Q0gWD t7aWTPu101Lai8H2mW6fsEoOMZWjLxrsTqQCqUGQ+B24YfXFQTLbK3qWgYQyRFAixQJv Wr/2kBbGzTrs8OohVHmS0dZakd6uxWA1UmXiRhXDpEjrQjsyvW7E4HydczBsb/7UZC9y 0wcw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:to:from:user-agent:mime-version :date:message-id:dkim-signature:delivered-to; bh=mwVLDS2iSjBgtOIl6owigCwD56vEkZ05XWIgpxhEmF8=; b=g+APQDu/s1rY6JbYQq8Z2qPZ7I7C9Jyyx4KFyorlEUrmJSITmoF/a/vEvJJ3tCgmQn HVoHOvm8IlXK/+qqlP7o8xJctCJ+I5428f8prOsh27wr2HtYYwb2GT0AYz8Fbf36PtB9 8r4WPkDezbTzm1hdQUjZIsDSZnxLFmZHYiZY5ZDTa0d3qkmaJ1UHtakUexBbWHIQAjIx 88SuMK9Zg9vUBLjdenikkttv5y/hkw0vlZh3yB1ouwluCA5chaqtrYUxkM+sVvHIpj1L 2u4YZZoJ/uZUKHfcTL/+nJcyELhqvvgqAgukuco/LdIkjZ/6C5E3pgx5h+NWIOV0ipa/ ooGQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@davyandbeth-com.20210112.gappssmtp.com header.s=20210112 header.b="uVBsM/p/"; 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 f8-20020a05640214c800b004acb24be0d2si570176edx.315.2023.04.07.01.17.42; Fri, 07 Apr 2023 01:17:43 -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=@davyandbeth-com.20210112.gappssmtp.com header.s=20210112 header.b="uVBsM/p/"; 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 9FBD868ACF2; Fri, 7 Apr 2023 11:17:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yw1-f182.google.com (mail-yw1-f182.google.com [209.85.128.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BC9EA68AA0F for ; Fri, 7 Apr 2023 11:17:32 +0300 (EEST) Received: by mail-yw1-f182.google.com with SMTP id 00721157ae682-54c12009c30so71422417b3.9 for ; Fri, 07 Apr 2023 01:17:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=davyandbeth-com.20210112.gappssmtp.com; s=20210112; t=1680855451; h=content-transfer-encoding:content-language:to:subject:from :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=Mp1sozCnISM7Uu6GXWqhp7+GirkQ4nchvxY6MTAc8WQ=; b=uVBsM/p/VNOFi3Vrq8zRfDxRwTdOGO5x30j7z7pKLqdLXgR2uNre5ghqHIRa9JdfcP VyNZbBb54/SIZ0tD9rlzPJwBDzb5f/sPIjVgbjtXl+ynpOdeP1FfaRInpiQ/Bs/XN18y lCqIk3XQNQB2ZVZITH1qA1XKAOR0NJ6YPmYFeR292xuYflzchLPJqAwvpDEmyt2w1Vb5 GJ5dVNqMKPYt0Rmr18A/BeGErWTSTNYb97XupOGjPYsj/7nryoi7v0lUiYzZ5rivm6xI kccM4WJIrP3SAfeiW2RayyFya8qzhD6mpzH4CjDZsGs1p1DQwyMvy3bT3RR3Z1KnKhTE P/WA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680855451; h=content-transfer-encoding:content-language:to:subject:from :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Mp1sozCnISM7Uu6GXWqhp7+GirkQ4nchvxY6MTAc8WQ=; b=Mqu7I9IoyNDYXkaaBkVt73eJ8ECx5r7jOVpIELt4k9/eI16jg/YbClZlszhL93dWHT 6FVUANP7lF9CTZLeK+JR3oyRzRZos0TLpMijWgHgbsf4BuZrCetVOmziAZfJeLu3mGA8 kl/25Gar1O4tGlWfvH0UzzcfkSt093zuQ+hU97YIKPRDTPHXgJKD9iW/Mn51zaauRnIK jAMWpxpU1F9/yHpsoGqixd1dMO0+ItEx/HvWvxeEK8dPdCyL7DrYAMGd9KU5TOkRdW9O sSM79hHo8IJvGBMnc+wAueMkRCH4aS91qCP0jz8OEwV+AJ5FpvHozd9um+kU3nALf6fw e3Ig== X-Gm-Message-State: AAQBX9c6Y/fc27EUHBJHkVRyx40Y9kynrr8sijc5nUDmf6x6SwjJxFtU 2hVOV2ugPkAQsu74bMSIeR7V+Ehl4aHPnbhbtAsyeg== X-Received: by 2002:a0d:e682:0:b0:53c:d480:f510 with SMTP id p124-20020a0de682000000b0053cd480f510mr1080370ywe.0.1680855450653; Fri, 07 Apr 2023 01:17:30 -0700 (PDT) Received: from [192.168.1.92] ([68.249.219.17]) by smtp.googlemail.com with ESMTPSA id z17-20020a814c11000000b0054639050316sm869668ywa.124.2023.04.07.01.17.30 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 07 Apr 2023 01:17:30 -0700 (PDT) Message-ID: <95761cbf-b1bf-a3c5-0308-587661361f76@davyandbeth.com> Date: Fri, 7 Apr 2023 03:17:29 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 From: Davy Durham To: ffmpeg-devel@ffmpeg.org Content-Language: en-US Subject: [FFmpeg-devel] [PATCH] fftools/ffmpeg: sleep more efficiently when using -re or -readrate X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HhlCoSK7P5WM NOTE: This is a resolved patch if the "input burst time" patch is applied first. When the ffmpeg cli tool is given a read rate (i.e. -re or -readrate), the read function is called repeatedly but which may return EAGAIN if it should be called again later. How much later is not indicated and the trancode loop just sleeps for 10ms and tries again. On the next try it may get EGAIN again and this adds up to wasted CPU. For example, conversions of audio files show about a 15-20% higher CPU usage than necessary, when compared to running without a read rate. This patch introduces InputFile::next_read_time which is computed on the way out of the read function, ifile_get_packet(), when it returns EAGAIN. Before sleeping, the transcoding loop now consults this value to determine how long it should sleep rather than blindly sleeping 10ms. Running ffmpeg under the 'time' command shows an improved real+sys time after this change, and these savings improve further if one specifies a larger pkt size to the demuxer (e.g. -max_size for .wav, -raw_packet_size for raw, etc.) since the system is able to sleep longer (and now accurately) each iteration. Signed-off-by: Davy Durham --- fftools/ffmpeg.c | 22 +++++++++++++++++----- fftools/ffmpeg.h | 1 + fftools/ffmpeg_demux.c | 9 ++++++--- 3 files changed, 24 insertions(+), 8 deletions(-) } } -- 2.25.1 diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 438bee8fef..42bb14556e 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3633,13 +3633,25 @@ static int got_eagain(void) return 0; } -static void reset_eagain(void) +/* returns the earliest delay in microseconds after which all inputs should be read again */ +static int64_t reset_eagain(void) { + int64_t now = av_gettime_relative(); + int64_t d, min_next_read_time = now + 1000000; /* start 1 sec from now */ int i; - for (i = 0; i < nb_input_files; i++) - input_files[i]->eagain = 0; + for (i = 0; i < nb_input_files; i++) { + InputFile* f = input_files[i]; + if (f->eagain) { + f->eagain = 0; + min_next_read_time = FFMIN(min_next_read_time, f->next_read_time); + f->next_read_time = 0; + } + } for (OutputStream *ost = ost_iter(NULL); ost; ost = ost_iter(ost)) ost->unavailable = 0; + + d = min_next_read_time - now; + return d > 0 ? d : 0; } static void decode_flush(InputFile *ifile) @@ -3929,8 +3941,8 @@ static int transcode_step(void) ost = choose_output(); if (!ost) { if (got_eagain()) { - reset_eagain(); - av_usleep(10000); + int64_t delay = reset_eagain(); + av_usleep(delay); return 0; } av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n"); diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index e057e6da3a..e077950eaa 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -453,6 +453,7 @@ typedef struct InputFile { AVFormatContext *ctx; int eof_reached; /* true if eof reached */ int eagain; /* true if last read attempt returned EAGAIN */ + int64_t next_read_time; /* if eagain, this is the av_gettime_relative() value after which we should read again */ int64_t input_ts_offset; int input_sync_ref; /** diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index af423c9be4..fc2feda344 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -454,15 +454,18 @@ int ifile_get_packet(InputFile *f, AVPacket **pkt) ); float scale = f->rate_emu ? 1.0 : f->readrate; int64_t burst_until = AV_TIME_BASE * f->initial_read_burst; + int64_t now = av_gettime_relative(); for (i = 0; i < f->nb_streams; i++) { InputStream *ist = f->streams[i]; - int64_t stream_ts_offset, pts, now; + int64_t stream_ts_offset, pts, now_adj; if (!ist->nb_packets || (ist->decoding_needed && !ist->got_output)) continue; stream_ts_offset = FFMAX(ist->first_dts != AV_NOPTS_VALUE ? ist->first_dts : 0, file_start); pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE); - now = (av_gettime_relative() - ist->start) * scale + stream_ts_offset; - if (pts - burst_until > now) + now_adj = (now - ist->start) * scale + stream_ts_offset; + if (pts - burst_until > now_adj) { + f->next_read_time = now + (pts - now_adj); return AVERROR(EAGAIN); + }