Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Lynne <dev@lynne.ee>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: [FFmpeg-devel] [PATCH 2/2] wmavoice: convert DCT-I/DST-I to lavu/tx
Date: Fri, 4 Aug 2023 21:23:09 +0200 (CEST)
Message-ID: <Nb1-E8V--B-9@lynne.ee> (raw)
In-Reply-To: <Nb0zHDh--3-9@lynne.ee-Nb0zLQ1----9>

[-- Attachment #1: Type: text/plain, Size: 296 bytes --]

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.

Note: this requires new FATE files, or for the tests to be modified
to use a target error.


[-- Attachment #2: 0002-wmavoice-convert-DCT-I-DST-I-to-lavu-tx.patch --]
[-- Type: text/x-diff, Size: 5146 bytes --]

From c892079d2b816d2742aa3c192c090e2cb83952e7 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Fri, 4 Aug 2023 21:16:30 +0200
Subject: [PATCH 2/2] 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    |  6 +++---
 2 files changed, 20 insertions(+), 15 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..d23ea29c92 100644
--- a/tests/fate/wma.mak
+++ b/tests/fate/wma.mak
@@ -20,17 +20,17 @@ 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_new.pcm
 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_new.pcm
 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: REF = $(SAMPLES)/wmavoice/streaming_CBR-19K_new.pcm
 fate-wmavoice-19k: FUZZ = 3
 
 $(FATE_WMAVOICE-yes): CMP = stddev
-- 
2.40.1


[-- Attachment #3: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2023-08-04 19:23 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-04 19:19 [FFmpeg-devel] [PATCH 1/2] wmavoice: convert RDFT " Lynne
     [not found] ` <Nb0zHDh--3-9@lynne.ee-Nb0zLQ1----9>
2023-08-04 19:23   ` Lynne [this message]
     [not found]   ` <Nb1-E8V--B-9@lynne.ee-Nb1-HOx----9>
2023-08-07  9:35     ` [FFmpeg-devel] [PATCH v2] wmavoice: convert DCT-I/DST-I " Lynne
2023-08-13 13:46       ` Paul B Mahol
     [not found]     ` <NbELai4--3-9@lynne.ee-NbELelX----9>
2023-09-01  4:39       ` [FFmpeg-devel] [PATCH v3] " Lynne
     [not found]       ` <NdE1Sht--3-9@lynne.ee-NdE1WqH----9>
2023-09-01 22:06         ` Lynne

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Nb1-E8V--B-9@lynne.ee \
    --to=dev@lynne.ee \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git