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.
This commit is contained in:
@@ -42,8 +42,6 @@
|
|||||||
#include "acelp_vectors.h"
|
#include "acelp_vectors.h"
|
||||||
#include "acelp_filters.h"
|
#include "acelp_filters.h"
|
||||||
#include "lsp.h"
|
#include "lsp.h"
|
||||||
#include "dct.h"
|
|
||||||
#include "rdft.h"
|
|
||||||
#include "sinewin.h"
|
#include "sinewin.h"
|
||||||
|
|
||||||
#define MAX_BLOCKS 8 ///< maximum number of blocks per frame
|
#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
|
AVTXContext *rdft, *irdft; ///< contexts for FFT-calculation in the
|
||||||
av_tx_fn rdft_fn, irdft_fn; ///< postfilter (for denoise filter)
|
av_tx_fn rdft_fn, irdft_fn; ///< postfilter (for denoise filter)
|
||||||
DCTContext dct, dst; ///< contexts for phase shift (in Hilbert
|
AVTXContext *dct, *dst; ///< contexts for phase shift (in Hilbert
|
||||||
///< transform, part of postfilter)
|
av_tx_fn dct_fn, dst_fn; ///< transform, part of postfilter)
|
||||||
float sin[511], cos[511]; ///< 8-bit cosine/sine windows over [-pi,pi]
|
float sin[511], cos[511]; ///< 8-bit cosine/sine windows over [-pi,pi]
|
||||||
///< range
|
///< range
|
||||||
float postfilter_agc; ///< gain control memory, used in
|
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) {
|
if (s->do_apf) {
|
||||||
float scale = 1.0f;
|
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);
|
ret = av_tx_init(&s->rdft, &s->rdft_fn, AV_TX_FLOAT_RDFT, 0, 1 << 7, &scale, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -403,6 +397,16 @@ static av_cold int wmavoice_decode_init(AVCodecContext *ctx)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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);
|
ff_sine_window_init(s->cos, 256);
|
||||||
memcpy(&s->sin[255], s->cos, 256 * sizeof(s->cos[0]));
|
memcpy(&s->sin[255], s->cos, 256 * sizeof(s->cos[0]));
|
||||||
for (n = 0; n < 255; n++) {
|
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;
|
float irange, angle_mul, gain_mul, range, sq;
|
||||||
LOCAL_ALIGNED_32(float, coeffs, [0x82]);
|
LOCAL_ALIGNED_32(float, coeffs, [0x82]);
|
||||||
LOCAL_ALIGNED_32(float, lpcs, [0x82]);
|
LOCAL_ALIGNED_32(float, lpcs, [0x82]);
|
||||||
|
LOCAL_ALIGNED_32(float, lpcs_dct, [0x82]);
|
||||||
int n, idx;
|
int n, idx;
|
||||||
|
|
||||||
memcpy(coeffs, coeffs_dst, 0x82*sizeof(float));
|
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()).
|
* is a sine input) by doing a phase shift (in theory, H(sin())=cos()).
|
||||||
* Hilbert_Transform(RDFT(x)) = Laplace_Transform(x), which calculates the
|
* Hilbert_Transform(RDFT(x)) = Laplace_Transform(x), which calculates the
|
||||||
* "moment" of the LPCs in this filter. */
|
* "moment" of the LPCs in this filter. */
|
||||||
s->dct.dct_calc(&s->dct, lpcs);
|
s->dct_fn(s->dct, lpcs_dct, lpcs, sizeof(float));
|
||||||
s->dst.dct_calc(&s->dst, lpcs);
|
s->dst_fn(s->dst, lpcs, lpcs_dct, sizeof(float));
|
||||||
|
|
||||||
/* Split out the coefficient indexes into phase/magnitude pairs */
|
/* Split out the coefficient indexes into phase/magnitude pairs */
|
||||||
idx = 255 + av_clip(lpcs[64], -255, 255);
|
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) {
|
if (s->do_apf) {
|
||||||
av_tx_uninit(&s->rdft);
|
av_tx_uninit(&s->rdft);
|
||||||
av_tx_uninit(&s->irdft);
|
av_tx_uninit(&s->irdft);
|
||||||
ff_dct_end(&s->dct);
|
av_tx_uninit(&s->dct);
|
||||||
ff_dct_end(&s->dst);
|
av_tx_uninit(&s->dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -20,17 +20,20 @@ fate-wmapro: $(FATE_WMAPRO-yes)
|
|||||||
|
|
||||||
FATE_WMAVOICE-$(call DEMDEC, ASF, WMAVOICE) += fate-wmavoice-7k
|
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: 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-7k: FUZZ = 3
|
||||||
|
|
||||||
FATE_WMAVOICE-$(call DEMDEC, ASF, WMAVOICE) += fate-wmavoice-11k
|
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: 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-11k: FUZZ = 3
|
||||||
|
|
||||||
FATE_WMAVOICE-$(call DEMDEC, ASF, WMAVOICE) += fate-wmavoice-19k
|
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: 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_ref.pcm
|
||||||
|
fate-wmavoice-19k: CMP_TARGET = 689.33
|
||||||
fate-wmavoice-19k: FUZZ = 3
|
fate-wmavoice-19k: FUZZ = 3
|
||||||
|
|
||||||
$(FATE_WMAVOICE-yes): CMP = stddev
|
$(FATE_WMAVOICE-yes): CMP = stddev
|
||||||
|
Reference in New Issue
Block a user