From patchwork Mon Apr 19 20:23:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lynne X-Patchwork-Id: 27120 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:5014:0:0:0:0:0 with SMTP id e20csp838637iob; Mon, 19 Apr 2021 13:24:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzVyqFVONqnt2nPPpcC8uj4uT77gYFCblnBFLLcjIZbvwIsox+EoGt9mDt+pIf8sOzNA925 X-Received: by 2002:a05:6402:3591:: with SMTP id y17mr5730773edc.67.1618863846907; Mon, 19 Apr 2021 13:24:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618863846; cv=none; d=google.com; s=arc-20160816; b=lfFTAoHy9XlkStT7c7SHuCesIlBT1I4ZMqwxITUkONFbBrx95mEMNgeoTggk5CGpC3 Mh+1Ey5uF18Osk62jYsQpgafROYo0t2hiqWY0kVnTlck4gUR7genSebazWW1vDTdSVD3 DFbAshjexh98ySTwVIN2Vtr+5YZ3HPYvGEtSnlaR1MoKeTVoPej50h4nnUdMa6mWDiyu tHRAWYsC72jxxi3hJWeR1BWXpvtuLua6zPhKeIwDPujOZj+ME7EsK05kZ4Oif1OqP+WX vrmiQC9ahRgTptCs8dNcs1kSOwSHRe8exyi44WLh5kgMLnoFVhIYbRcqOFIb99zlkrsC wP7A== 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=mwzLmcpQ1i+AEEbOX1R7fRL229JelDKpwLg7Pvz/RbU=; b=l+axqV8l9DZHra/z/j38LMgLwT9SwRNXYtum1n3AwBmsklVf2as0QuRQdVekaCKScs zYSVFkgOov1HEQVYYq48thahAqYRwZJ3skP3nAAL0pTVCAPvABZ03KM0hDgsEqzlxn/J uUhfr3vaHRtAx7nV1/zPVpiUNArzX67F62eVhiLNpImdh4iX3g90EBSMM6GzUe0BnIhV ajUcEfdRHSuu7KdBMA6IZZuuo2qumcpdP2BInFRqHGelUEoRK4riHpVBKKrhnC2267cO ctDSftTR2U6LJkMGgIV813Psbr/kL4KPSy7aDl2hr621Xo5JyID1MOU+XZ7w5CNiBEDR T3eg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@lynne.ee header.s=s1 header.b=GreaLsDL; 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 bs9si12068669edb.595.2021.04.19.13.24.06; Mon, 19 Apr 2021 13:24:06 -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=GreaLsDL; 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 27FD6680903; Mon, 19 Apr 2021 23:24: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 46717680903 for ; Mon, 19 Apr 2021 23:23:57 +0300 (EEST) Received: from w3.tutanota.de (unknown [192.168.1.164]) by w4.tutanota.de (Postfix) with ESMTP id E8D0A1060318 for ; Mon, 19 Apr 2021 20:23:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1618863836; 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=M/7196AaoRVPY+IIMj6BhxIZlYe3QHay+lZLIUUFlIE=; b=GreaLsDLigs1LEWcd3HHez8xbUBMfZexT4mRQQ0kQThy1wCE6ydyfkwZGNBjWByc rJAw6bkKi6ou2p8HP3z+7eI1hvxWohCT7RWiQebJbgA5MWLU6MlVEy6Kso2FPfA+zee qP3my0CMjUxrWcR3AnlL7H/QE26qc+f0JNrQ4NuvYg3FhVSZy5LJWHt8f/SdRsN+laW I+uXXOB0iFXpXmwTcBXnx2/oJVA7hnNrfn0jaxh+lvFSzGzZ9JkvReHYD70ULgyQfSu k+SjjwGQyY3ZsASaAe053JuU9KeOcVrZFJAozzWlcC3cCGnBUnTQ4rgQWpAqvpuC0Hz jVSqi2a2bg== Date: Mon, 19 Apr 2021 22:23: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 06/11] lavu/tx: add full-sized iMDCT transform flag 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: IWiN30x9Y22J Patch attached. Subject: [PATCH 06/11] lavu/tx: add full-sized iMDCT transform flag --- libavutil/tx.h | 11 ++++++++++- libavutil/tx_priv.h | 4 ++++ libavutil/tx_template.c | 29 ++++++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/libavutil/tx.h b/libavutil/tx.h index a3d70644e4..55173810ee 100644 --- a/libavutil/tx.h +++ b/libavutil/tx.h @@ -55,7 +55,8 @@ enum AVTXType { * Stride must be a non-zero multiple of sizeof(float). * * NOTE: the inverse transform is half-length, meaning the output will not - * contain redundant data. This is what most codecs work with. + * contain redundant data. This is what most codecs work with. To do a full + * inverse transform, set the AV_TX_FULL_IMDCT flag on init. */ AV_TX_FLOAT_MDCT = 1, @@ -116,6 +117,14 @@ enum AVTXFlags { * May be slower with certain transform types. */ AV_TX_UNALIGNED = 1ULL << 1, + + /** + * Performs a full inverse MDCT rather than leaving out samples that can be + * derived through symmetry. Requires an output array of 'len' floats, + * rather than the usual 'len/2' floats. + * Ignored for all transforms but inverse MDCTs. + */ + AV_TX_FULL_IMDCT = 1ULL << 2, }; /** diff --git a/libavutil/tx_priv.h b/libavutil/tx_priv.h index 0b40234355..1d4245e71b 100644 --- a/libavutil/tx_priv.h +++ b/libavutil/tx_priv.h @@ -121,6 +121,10 @@ struct AVTXContext { int *pfatab; /* Input/Output mapping for compound transforms */ int *revtab; /* Input mapping for power of two transforms */ int *inplace_idx; /* Required indices to revtab for in-place transforms */ + + av_tx_fn top_tx; /* Used for computing transforms derived from other + * transforms, like full-length iMDCTs and RDFTs. + * NOTE: Do NOT use this to mix assembly with C code. */ }; /* Checks if type is an MDCT */ diff --git a/libavutil/tx_template.c b/libavutil/tx_template.c index b3532c1c5e..a68a84dcd5 100644 --- a/libavutil/tx_template.c +++ b/libavutil/tx_template.c @@ -875,6 +875,24 @@ static void naive_mdct(AVTXContext *s, void *_dst, void *_src, } } +static void full_imdct_wrapper_fn(AVTXContext *s, void *_dst, void *_src, + ptrdiff_t stride) +{ + int len = s->m*s->n*4; + int len2 = len >> 1; + int len4 = len >> 2; + FFTSample *dst = _dst; + + s->top_tx(s, dst + len4, _src, stride); + + stride /= sizeof(*dst); + + for (int i = 0; i < len4; i++) { + dst[ i*stride] = -dst[(len2 - i - 1)*stride]; + dst[(len - i - 1)*stride] = dst[(len2 + i + 0)*stride]; + } +} + static int gen_mdct_exptab(AVTXContext *s, int len4, double scale) { const double theta = (scale < 0 ? len4 : 0) + 1.0/8.0; @@ -942,6 +960,10 @@ int TX_NAME(ff_tx_init_mdct_fft)(AVTXContext *s, av_tx_fn *tx, if (is_mdct) { s->scale = *((SCALE_TYPE *)scale); *tx = inv ? naive_imdct : naive_mdct; + if (inv && (flags & AV_TX_FULL_IMDCT)) { + s->top_tx = *tx; + *tx = full_imdct_wrapper_fn; + } } return 0; } @@ -990,8 +1012,13 @@ int TX_NAME(ff_tx_init_mdct_fft)(AVTXContext *s, av_tx_fn *tx, init_cos_tabs(i); } - if (is_mdct) + if (is_mdct) { + if (inv && (flags & AV_TX_FULL_IMDCT)) { + s->top_tx = *tx; + *tx = full_imdct_wrapper_fn; + } return gen_mdct_exptab(s, n*m, *((SCALE_TYPE *)scale)); + } return 0; }