From patchwork Mon Aug 7 09:35:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 43157 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:9329:b0:130:ccc6:6c4b with SMTP id r41csp1478980pzh; Mon, 7 Aug 2023 02:36:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFgcWU7ET43yrTPFKOCY8dvgIMx0TwGfO00Nhr8Ratf0rQE6jkjM/2wjS+RkvIeF9898l/t X-Received: by 2002:a05:6512:2251:b0:4fb:e06f:4cf0 with SMTP id i17-20020a056512225100b004fbe06f4cf0mr7045277lfu.19.1691400969396; Mon, 07 Aug 2023 02:36:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691400969; cv=none; d=google.com; s=arc-20160816; b=HsGxsyN98JZKLgtEfcFO7xXNGpRyVMQU6Vwd2wNi9la86fSDflryrZVbWRdE+WjiGM jqZUutkX0BAerFoWYsE4oemHoRNkROHbC1lgm5wkLihRr3NwikeushPhLpNbdOxOPiQM BxbI4QhFAdlc0XRyx5SLGWcMQdKOgQYkM3tH9heraJcnipBrb0L+rP3BMBokVn+6D5t2 7H2fKHcJRAgsMxAhz3ZRrhLNOhGkA4pXA6ZYNDUSZkruW/j1No8tGi4LNsHQH+r+Dm0+ ursYvpyVJWYSImq48kENDxarX8rUF7DTG7yrCihbTGZHygvgHdhS1scW9GdQ76EecXU+ MN/g== 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:references:in-reply-to:message-id:to:from:date :dkim-signature:delivered-to; bh=UntABL5RH+OUel/bI/qRLGR06REHRP6Nabda1K1u2ss=; fh=awftJPkKIDcYG+GZSKK7EGrS2s4rqD3QuLTgwd5DXmc=; b=0OZ4Ukc2L2xhM7yERJQwdN2QJ+q/oQL0D0g7xjjeufnwnW4Yt62NRKAt478lNWjSfV AyiGjLsYe39bKVFgeaU0CutSP8p9JL3NxTZ1h4tFONH9zqbW6g27El3IDgSThe4Zlr8e PULErrDco27KdgN47+Y+CzpUCQlnYvNPwpXXqFIy+xB58d6SGe7J8XMzo81Zd2jFKoD7 aksrt4jaQZ1p4sqjKpiBuYIB9D2Kn6OXGnNZdWghMIhRQA7OHYIb9fXab33evNV6Qc4I NI3NE/6AbgRLBYFP8euU3+r3vo0qN9o2iZz8cd7aj+om0Ama6eJya3lg3MNAp27s8wUX dSPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@lynne.ee header.s=s1 header.b=LjdN2nGX; 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 me22-20020a170906aed600b0098e1efaafc5si2032496ejb.195.2023.08.07.02.36.08; Mon, 07 Aug 2023 02:36:09 -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=LjdN2nGX; 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 C798668B8D2; Mon, 7 Aug 2023 12:36:04 +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 019F768B8D2 for ; Mon, 7 Aug 2023 12:35:57 +0300 (EEST) Received: from tutadb.w10.tutanota.de (unknown [192.168.1.10]) by w4.tutanota.de (Postfix) with ESMTP id 76B4610601FE for ; Mon, 7 Aug 2023 09:35:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1691400956; 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:In-Reply-To:MIME-Version:MIME-Version:Message-ID:Message-ID:Reply-To:References:References:Sender; bh=qCnuLvAdtrkg/G2wBBKXuTujfp05RY/Phr2UgNBWhTY=; b=LjdN2nGXYcvUgKw278RxLJUGSkC9o2XdfJfIx9EgHzYoXhZ8amcnZa7dj5R7ZQju EwatNvbslY6AIoPnLv7Qhyx2C6HK6GufkqDbM0ib8AMGHPxbPcCPq3lkbTJcrLFgXwG t5ztYM4UY9baZ9nPt5lbZ6Hbwixu9435BXJ1YVMghdF9QvwUEMHqtItNNGbvsMz1q58 QqHOGzgIeLaN969zV0UIVedu1u1/TLFd8qvJsjJtX6PIXtGgzK/oXE/EKN408jBDomZ XvIyMb7R+ERRFNwVz6oS6d2mPnMd/dmbWQ8e+US6G4pVbi1UUBXHQLZXwejsejyC0as 7zuwQgyKug== Date: Mon, 7 Aug 2023 11:35:56 +0200 (CEST) From: Lynne To: FFmpeg development discussions and patches Message-ID: In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] wmavoice: convert DCT-I/DST-I to lavu/tx 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: V3zqEhu5uM9S No real changes from V1, just used a CMP_TARGET for the FATE tests, and changed the _new suffix to _ref for the references. New references are here, to be uploaded to FATE under the same names: https://files.lynne.ee/streaming_CBR-7K_ref.pcm https://files.lynne.ee/streaming_CBR-11K_ref.pcm https://files.lynne.ee/streaming_CBR-19K_ref.pcm Before and after comparisons for 11K, if anyone is interested: https://files.lynne.ee/wmavoice_current.png https://files.lynne.ee/wmavoice_new.png https://files.lynne.ee/wmavoice_microsoft.png From a2cdeddb8be7e4c6a93de51edc9533accbff2a87 Mon Sep 17 00:00:00 2001 From: Lynne Date: Fri, 4 Aug 2023 21:16:30 +0200 Subject: [PATCH v2] wmavoice: convert DCT-I/DST-I to lavu/tx This is the very last user of any lavc transform code. This also *corrects* wmavoice decoding, as the previous DCT/DST transforms were incorrect, bringing it closer to Microsoft's own wmavoice decoder. --- libavcodec/wmavoice.c | 29 +++++++++++++++++------------ tests/fate/wma.mak | 11 +++++++---- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/libavcodec/wmavoice.c b/libavcodec/wmavoice.c index 5ae92e2dbc..915315cb8a 100644 --- a/libavcodec/wmavoice.c +++ b/libavcodec/wmavoice.c @@ -42,8 +42,6 @@ #include "acelp_vectors.h" #include "acelp_filters.h" #include "lsp.h" -#include "dct.h" -#include "rdft.h" #include "sinewin.h" #define MAX_BLOCKS 8 ///< maximum number of blocks per frame @@ -266,8 +264,8 @@ typedef struct WMAVoiceContext { */ AVTXContext *rdft, *irdft; ///< contexts for FFT-calculation in the av_tx_fn rdft_fn, irdft_fn; ///< postfilter (for denoise filter) - DCTContext dct, dst; ///< contexts for phase shift (in Hilbert - ///< transform, part of postfilter) + AVTXContext *dct, *dst; ///< contexts for phase shift (in Hilbert + av_tx_fn dct_fn, dst_fn; ///< transform, part of postfilter) float sin[511], cos[511]; ///< 8-bit cosine/sine windows over [-pi,pi] ///< range float postfilter_agc; ///< gain control memory, used in @@ -391,10 +389,6 @@ static av_cold int wmavoice_decode_init(AVCodecContext *ctx) if (s->do_apf) { float scale = 1.0f; - if ((ret = ff_dct_init (&s->dct, 6, DCT_I)) < 0 || - (ret = ff_dct_init (&s->dst, 6, DST_I)) < 0) - return ret; - ret = av_tx_init(&s->rdft, &s->rdft_fn, AV_TX_FLOAT_RDFT, 0, 1 << 7, &scale, 0); if (ret < 0) return ret; @@ -403,6 +397,16 @@ static av_cold int wmavoice_decode_init(AVCodecContext *ctx) if (ret < 0) return ret; + scale = 1.0 / (1 << 6); + ret = av_tx_init(&s->dct, &s->dct_fn, AV_TX_FLOAT_DCT_I, 0, 1 << 6, &scale, 0); + if (ret < 0) + return ret; + + scale = 1.0 / (1 << 6); + ret = av_tx_init(&s->dst, &s->dst_fn, AV_TX_FLOAT_DST_I, 0, 1 << 6, &scale, 0); + if (ret < 0) + return ret; + ff_sine_window_init(s->cos, 256); memcpy(&s->sin[255], s->cos, 256 * sizeof(s->cos[0])); for (n = 0; n < 255; n++) { @@ -612,6 +616,7 @@ static void calc_input_response(WMAVoiceContext *s, float *lpcs_src, float irange, angle_mul, gain_mul, range, sq; LOCAL_ALIGNED_32(float, coeffs, [0x82]); LOCAL_ALIGNED_32(float, lpcs, [0x82]); + LOCAL_ALIGNED_32(float, lpcs_dct, [0x82]); int n, idx; memcpy(coeffs, coeffs_dst, 0x82*sizeof(float)); @@ -662,8 +667,8 @@ static void calc_input_response(WMAVoiceContext *s, float *lpcs_src, * is a sine input) by doing a phase shift (in theory, H(sin())=cos()). * Hilbert_Transform(RDFT(x)) = Laplace_Transform(x), which calculates the * "moment" of the LPCs in this filter. */ - s->dct.dct_calc(&s->dct, lpcs); - s->dst.dct_calc(&s->dst, lpcs); + s->dct_fn(s->dct, lpcs_dct, lpcs, sizeof(float)); + s->dst_fn(s->dst, lpcs, lpcs_dct, sizeof(float)); /* Split out the coefficient indexes into phase/magnitude pairs */ idx = 255 + av_clip(lpcs[64], -255, 255); @@ -2003,8 +2008,8 @@ static av_cold int wmavoice_decode_end(AVCodecContext *ctx) if (s->do_apf) { av_tx_uninit(&s->rdft); av_tx_uninit(&s->irdft); - ff_dct_end(&s->dct); - ff_dct_end(&s->dst); + av_tx_uninit(&s->dct); + av_tx_uninit(&s->dst); } return 0; diff --git a/tests/fate/wma.mak b/tests/fate/wma.mak index c13874ebfc..ed2ac24c65 100644 --- a/tests/fate/wma.mak +++ b/tests/fate/wma.mak @@ -20,18 +20,21 @@ fate-wmapro: $(FATE_WMAPRO-yes) FATE_WMAVOICE-$(call DEMDEC, ASF, WMAVOICE) += fate-wmavoice-7k fate-wmavoice-7k: CMD = pcm -i $(TARGET_SAMPLES)/wmavoice/streaming_CBR-7K.wma -fate-wmavoice-7k: REF = $(SAMPLES)/wmavoice/streaming_CBR-7K.pcm +fate-wmavoice-7k: REF = $(SAMPLES)/wmavoice/streaming_CBR-7K_ref.pcm +fate-wmavoice-7k: CMP_TARGET = 1368.61 fate-wmavoice-7k: FUZZ = 3 FATE_WMAVOICE-$(call DEMDEC, ASF, WMAVOICE) += fate-wmavoice-11k fate-wmavoice-11k: CMD = pcm -i $(TARGET_SAMPLES)/wmavoice/streaming_CBR-11K.wma -fate-wmavoice-11k: REF = $(SAMPLES)/wmavoice/streaming_CBR-11K.pcm +fate-wmavoice-11k: REF = $(SAMPLES)/wmavoice/streaming_CBR-11K_ref.pcm +fate-wmavoice-11k: CMP_TARGET = 965.24 fate-wmavoice-11k: FUZZ = 3 FATE_WMAVOICE-$(call DEMDEC, ASF, WMAVOICE) += fate-wmavoice-19k fate-wmavoice-19k: CMD = pcm -i $(TARGET_SAMPLES)/wmavoice/streaming_CBR-19K.wma -fate-wmavoice-19k: REF = $(SAMPLES)/wmavoice/streaming_CBR-19K.pcm -fate-wmavoice-19k: FUZZ = 3 +fate-wmavoice-19k: REF = $(SAMPLES)/wmavoice/streaming_CBR-19K_ref.pcm +fate-wmavoice-19k: CMP_TARGET = 689.33 +fate-wmavoice-11k: FUZZ = 3 $(FATE_WMAVOICE-yes): CMP = stddev -- 2.40.1