From patchwork Tue Jun 20 00:57:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 42236 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:be15:b0:121:b37c:e101 with SMTP id ge21csp1037843pzb; Mon, 19 Jun 2023 17:57:57 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7zHkvQVEJO+Cv4eZrNaZwDFmwPmmHRcmAJom046uDRa0JIPYuGg2QS2+wtnmZ/SmPTB+WW X-Received: by 2002:a17:907:9303:b0:988:6bd2:b0bc with SMTP id bu3-20020a170907930300b009886bd2b0bcmr5086517ejc.2.1687222676780; Mon, 19 Jun 2023 17:57:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687222676; cv=none; d=google.com; s=arc-20160816; b=z92Qhqe3JmVHtb2a0Q02A+d2SrDckpbLC3gLlzZzLUNG5op02izx9VmtEXdhApfGTk /Ec7ncVz4UOjKe8U0k8H45082MmO5Bi3sQWjQo4vKg0cyN2RAiAqAPTkFbX8BrwnZqaX QItY1wG8llCSsT2n6DAyGGsZDaG52PRdPrOSFjZ/v02J6Ieuf3JTFDx+VQ2Wp6RVdYd9 GzzPi43TntHr8jGPA2i3cFm1ElcYnybNQNLcobxgkHRtGHpLJ/QW/bGhMlZAMkPVoQE/ 6n0DjCUSWerLfYjV2KFYS6OHmF+rKV6ez9K9A3E74RWUcJ6HY1FkJYPqUP6UKLS/0dlW l6NQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :mime-version:message-id:to:from:date:dkim-signature:delivered-to; bh=7eiljDU6c/m0b7XBndULO4rwTsAZkfTbEKj+1eQX5/U=; b=Zgr94i3x64ZP+eXvbu64PAkhk/MPwNEQOaXs+WOroAcACmHFkDYW6S/DBqbGRpgkxW MqThSqWein0pTnBg1Vp1X4D4xFcHq4dXerUESk6/kUlIP2Q4f8llfCG+sIukEFf0M1xe pvgEzcCk+iplg31nQW+vMHUXZhRExdv3ycSItG6t/MuKh7Q7HafBWPn0npOmVNakwaSF p6txKsfuYfriorJ3fV2PlyZeEDICuEjvPzcFNtit8GD1Mww4pX+OcCWkDco7NWXdQ1/f ZufSU7TpcAO8iYjWU+pQx28o6HVHHWVJLoP/EW/S4nk+CIwxAK6HROFbbwAqJ6Z8yvTZ gnfA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@lynne.ee header.s=s1 header.b=r6CzXP7a; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=lynne.ee Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id bg16-20020a170906a05000b00977d0db2c6asi406079ejb.63.2023.06.19.17.57.55; Mon, 19 Jun 2023 17:57:56 -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=@lynne.ee header.s=s1 header.b=r6CzXP7a; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=lynne.ee Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5E51F68C08B; Tue, 20 Jun 2023 03:57:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from w4.tutanota.de (w4.tutanota.de [81.3.6.165]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 031F568BF73 for ; Tue, 20 Jun 2023 03:57:46 +0300 (EEST) Received: from tutadb.w10.tutanota.de (unknown [192.168.1.10]) by w4.tutanota.de (Postfix) with ESMTP id 059221060163 for ; Tue, 20 Jun 2023 00:57:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1687222665; s=s1; d=lynne.ee; h=From:From:To:To:Subject:Subject:Content-Description:Content-ID:Content-Type:Content-Type:Content-Transfer-Encoding:Cc:Date:Date:In-Reply-To:MIME-Version:MIME-Version:Message-ID:Message-ID:Reply-To:References:Sender; bh=fJ8gbupn2Fl2Itao2ZPuS/NVC8kEJdErHt3DkHkGNMw=; b=r6CzXP7apoaXjMoa0cnyVsUE4zloPizisF2nINVbjwgxBj6NZFpX41zst9m/r9jY WP1Rbn8ngPbd/aI5Wah/cJWzalzL03BuvcEHvX8Cu4pzyzRMECWhbqOR5ME3ceGS2zA SHnePKiH235toeiPMLwtrQKE0Qs7n+rJX5RTWLYAcRMxi+IM+MvztBT154n/NyBOIG6 1NwkyJBoiRkOTI6vB4YRtuBHbKIpz9p9ia7OtqFDW5rLHE59V+7onZ1SWTVACWmWm39 NpPY+hUH3Rm9M/Kfs4UXHgPYEQPYhPc3/EgB19UpG29u2oRLtPBzLTO9vLIQ1Vj88We 9u+L9yIOKg== Date: Tue, 20 Jun 2023 02:57:45 +0200 (CEST) From: Lynne To: Ffmpeg Devel Message-ID: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavu/tx: make 32-bit fixed-point transforms more bitexact 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: c0Xh++hMCdAn Using the sqrt/cos/sin approximations we have, the only parts left which may be inexact are multiplies and divisions in some transforms. Patch attached. From b2fd8fde86d421109d7922ded7b4691384af2214 Mon Sep 17 00:00:00 2001 From: Lynne Date: Tue, 20 Jun 2023 02:47:17 +0200 Subject: [PATCH] lavu/tx: make 32-bit fixed-point transforms more bitexact Using the sqrt/cos/sin approximations we have, the only parts left which may be inexact are multiplies and divisions in some transforms. --- libavutil/tx_priv.h | 2 ++ libavutil/tx_template.c | 38 +++++++++++++++++++++++++++---- tests/fate/ac3.mak | 2 +- tests/ref/fate/unknown_layout-ac3 | 2 +- tests/ref/lavf/rm | 2 +- 5 files changed, 38 insertions(+), 8 deletions(-) diff --git a/libavutil/tx_priv.h b/libavutil/tx_priv.h index d5ff8e1421..2f056a777c 100644 --- a/libavutil/tx_priv.h +++ b/libavutil/tx_priv.h @@ -110,6 +110,8 @@ typedef void TXComplex; #elif defined(TX_INT32) +#include "softfloat.h" + /* Properly rounds the result */ #define CMUL(dre, dim, are, aim, bre, bim) \ do { \ diff --git a/libavutil/tx_template.c b/libavutil/tx_template.c index 983de75a47..719dae2440 100644 --- a/libavutil/tx_template.c +++ b/libavutil/tx_template.c @@ -60,6 +60,17 @@ typedef struct FFTabInitData { int factors[TX_MAX_SUB]; /* Must be sorted high -> low */ } FFTabInitData; +#if defined(TX_INT32) +static TXSample COS_GEN(double freq) +{ + int c_f, s_f; + av_sincos_sf(llrintf(freq * (1 << 30) / M_PI), &s_f, &c_f); + return av_clip64(((int64_t)c_f) << 1, INT32_MIN, INT32_MAX); +} +#else +#define COS_GEN cos +#endif + #define SR_TABLE(len) \ static av_cold void TX_TAB(ff_tx_init_tab_ ##len)(void) \ { \ @@ -67,7 +78,7 @@ static av_cold void TX_TAB(ff_tx_init_tab_ ##len)(void) \ TXSample *tab = TX_TAB(ff_tx_tab_ ##len); \ \ for (int i = 0; i < len/4; i++) \ - *tab++ = RESCALE(cos(i*freq)); \ + *tab++ = COS_GEN(i*freq); \ \ *tab = 0; \ } @@ -1903,22 +1914,39 @@ int TX_TAB(ff_tx_mdct_gen_exp)(AVTXContext *s, int *pre_tab) { int off = 0; int len4 = s->len >> 1; - double scale = s->scale_d; - const double theta = (scale < 0 ? len4 : 0) + 1.0/8.0; + const double theta = (s->scale_d < 0 ? len4 : 0) + 1.0/8.0; size_t alloc = pre_tab ? 2*len4 : len4; +#if defined(TX_INT32) + int scale = llrintf(fabs(s->scale_d) * (1 << 30)); + SoftFloat scale_sf = av_int2sf(scale, 30); + scale_sf = av_sqrt_sf(scale_sf); +#else + double scale = sqrt(fabs(s->scale_d)); +#endif + if (!(s->exp = av_malloc_array(alloc, sizeof(*s->exp)))) return AVERROR(ENOMEM); - scale = sqrt(fabs(scale)); - if (pre_tab) off = len4; for (int i = 0; i < len4; i++) { const double alpha = M_PI_2 * (i + theta) / len4; + +#if defined(TX_INT32) + int c_f, s_f; + SoftFloat cos_sf, sin_sf; + av_sincos_sf(llrintf(alpha * (1 << 30) / M_PI), &s_f, &c_f); + cos_sf = av_int2sf(c_f, 30); + sin_sf = av_int2sf(s_f, 30); + cos_sf = av_mul_sf(cos_sf, scale_sf); + sin_sf = av_mul_sf(sin_sf, scale_sf); + s->exp[off + i] = (TXComplex){ av_sf2int(cos_sf, 30) << 1, av_sf2int(sin_sf, 30) << 1 }; +#else s->exp[off + i] = (TXComplex){ RESCALE(cos(alpha) * scale), RESCALE(sin(alpha) * scale) }; +#endif } if (pre_tab) diff --git a/tests/fate/ac3.mak b/tests/fate/ac3.mak index 2dfd59dfb1..85766e82c7 100644 --- a/tests/fate/ac3.mak +++ b/tests/fate/ac3.mak @@ -89,7 +89,7 @@ fate-ac3-fixed-encode: tests/data/asynth-44100-2.wav fate-ac3-fixed-encode: SRC = $(TARGET_PATH)/tests/data/asynth-44100-2.wav fate-ac3-fixed-encode: CMD = md5 -i $(SRC) -c ac3_fixed -ab 128k -f ac3 -flags +bitexact -af aresample fate-ac3-fixed-encode: CMP = oneline -fate-ac3-fixed-encode: REF = e9d78bca187b4bbafc4512bcea8efd3e +fate-ac3-fixed-encode: REF = 3c1781a78ba3ea653c145798511644eb FATE_EAC3-$(call ALLYES, EAC3_DEMUXER EAC3_MUXER EAC3_CORE_BSF) += fate-eac3-core-bsf fate-eac3-core-bsf: CMD = md5pipe -i $(TARGET_SAMPLES)/eac3/the_great_wall_7.1.eac3 -c:a copy -bsf:a eac3_core -fflags +bitexact -f eac3 diff --git a/tests/ref/fate/unknown_layout-ac3 b/tests/ref/fate/unknown_layout-ac3 index a694c52899..c535c4ff05 100644 --- a/tests/ref/fate/unknown_layout-ac3 +++ b/tests/ref/fate/unknown_layout-ac3 @@ -1 +1 @@ -ff7e25844b3cb6abb571ef7e226cbafa +c40992cfc42a620b592e03153a74ff68 diff --git a/tests/ref/lavf/rm b/tests/ref/lavf/rm index 62251380cf..dc7b9ed57b 100644 --- a/tests/ref/lavf/rm +++ b/tests/ref/lavf/rm @@ -1,2 +1,2 @@ -a7b0ac6e5131bbf662a07ccc82ab8618 *tests/data/lavf/lavf.rm +b471964c3f313ed33245ef3e56f144c0 *tests/data/lavf/lavf.rm 346424 tests/data/lavf/lavf.rm -- 2.40.1