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".
next prev 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