Fix the fixed-point MDCT and FFT tests so that they actually compile and work.
Also, use LFG from libavutil instead of random(). Originally committed as revision 25955 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		
							parent
							
								
									a8d2b06b7c
								
							
						
					
					
						commit
						228315bbd3
					
				@ -1280,14 +1280,15 @@ static av_cold int AC3_encode_close(AVCodecContext *avctx)
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
#ifdef TEST
 | 
			
		||||
/*************************************************************************/
 | 
			
		||||
/* TEST */
 | 
			
		||||
 | 
			
		||||
#undef random
 | 
			
		||||
#define FN (N/4)
 | 
			
		||||
#include "libavutil/lfg.h"
 | 
			
		||||
 | 
			
		||||
void fft_test(void)
 | 
			
		||||
#define FN (MDCT_SAMPLES/4)
 | 
			
		||||
 | 
			
		||||
static void fft_test(AVLFG *lfg)
 | 
			
		||||
{
 | 
			
		||||
    IComplex in[FN], in1[FN];
 | 
			
		||||
    int k, n, i;
 | 
			
		||||
@ -1296,8 +1297,8 @@ void fft_test(void)
 | 
			
		||||
    /* FFT test */
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<FN;i++) {
 | 
			
		||||
        in[i].re = random() % 65535 - 32767;
 | 
			
		||||
        in[i].im = random() % 65535 - 32767;
 | 
			
		||||
        in[i].re = av_lfg_get(lfg) % 65535 - 32767;
 | 
			
		||||
        in[i].im = av_lfg_get(lfg) % 65535 - 32767;
 | 
			
		||||
        in1[i] = in[i];
 | 
			
		||||
    }
 | 
			
		||||
    fft(in, 7);
 | 
			
		||||
@ -1311,67 +1312,62 @@ void fft_test(void)
 | 
			
		||||
            sum_re += in1[n].re * cos(a) - in1[n].im * sin(a);
 | 
			
		||||
            sum_im += in1[n].re * sin(a) + in1[n].im * cos(a);
 | 
			
		||||
        }
 | 
			
		||||
        printf("%3d: %6d,%6d %6.0f,%6.0f\n",
 | 
			
		||||
        av_log(NULL, AV_LOG_DEBUG, "%3d: %6d,%6d %6.0f,%6.0f\n",
 | 
			
		||||
               k, in[k].re, in[k].im, sum_re / FN, sum_im / FN);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mdct_test(void)
 | 
			
		||||
static void mdct_test(AVLFG *lfg)
 | 
			
		||||
{
 | 
			
		||||
    int16_t input[N];
 | 
			
		||||
    int32_t output[N/2];
 | 
			
		||||
    float input1[N];
 | 
			
		||||
    float output1[N/2];
 | 
			
		||||
    int16_t input[MDCT_SAMPLES];
 | 
			
		||||
    int32_t output[AC3_MAX_COEFS];
 | 
			
		||||
    float input1[MDCT_SAMPLES];
 | 
			
		||||
    float output1[AC3_MAX_COEFS];
 | 
			
		||||
    float s, a, err, e, emax;
 | 
			
		||||
    int i, k, n;
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<N;i++) {
 | 
			
		||||
        input[i] = (random() % 65535 - 32767) * 9 / 10;
 | 
			
		||||
    for(i=0;i<MDCT_SAMPLES;i++) {
 | 
			
		||||
        input[i] = (av_lfg_get(lfg) % 65535 - 32767) * 9 / 10;
 | 
			
		||||
        input1[i] = input[i];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    mdct512(output, input);
 | 
			
		||||
 | 
			
		||||
    /* do it by hand */
 | 
			
		||||
    for(k=0;k<N/2;k++) {
 | 
			
		||||
    for(k=0;k<AC3_MAX_COEFS;k++) {
 | 
			
		||||
        s = 0;
 | 
			
		||||
        for(n=0;n<N;n++) {
 | 
			
		||||
            a = (2*M_PI*(2*n+1+N/2)*(2*k+1) / (4 * N));
 | 
			
		||||
        for(n=0;n<MDCT_SAMPLES;n++) {
 | 
			
		||||
            a = (2*M_PI*(2*n+1+MDCT_SAMPLES/2)*(2*k+1) / (4 * MDCT_SAMPLES));
 | 
			
		||||
            s += input1[n] * cos(a);
 | 
			
		||||
        }
 | 
			
		||||
        output1[k] = -2 * s / N;
 | 
			
		||||
        output1[k] = -2 * s / MDCT_SAMPLES;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    err = 0;
 | 
			
		||||
    emax = 0;
 | 
			
		||||
    for(i=0;i<N/2;i++) {
 | 
			
		||||
        printf("%3d: %7d %7.0f\n", i, output[i], output1[i]);
 | 
			
		||||
    for(i=0;i<AC3_MAX_COEFS;i++) {
 | 
			
		||||
        av_log(NULL, AV_LOG_DEBUG, "%3d: %7d %7.0f\n", i, output[i], output1[i]);
 | 
			
		||||
        e = output[i] - output1[i];
 | 
			
		||||
        if (e > emax)
 | 
			
		||||
            emax = e;
 | 
			
		||||
        err += e * e;
 | 
			
		||||
    }
 | 
			
		||||
    printf("err2=%f emax=%f\n", err / (N/2), emax);
 | 
			
		||||
    av_log(NULL, AV_LOG_DEBUG, "err2=%f emax=%f\n", err / AC3_MAX_COEFS, emax);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void test_ac3(void)
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
    AC3EncodeContext ctx;
 | 
			
		||||
    unsigned char frame[AC3_MAX_CODED_FRAME_SIZE];
 | 
			
		||||
    int16_t samples[AC3_FRAME_SIZE];
 | 
			
		||||
    int ret, i;
 | 
			
		||||
    AVLFG lfg;
 | 
			
		||||
 | 
			
		||||
    AC3_encode_init(&ctx, 44100, 64000, 1);
 | 
			
		||||
    av_log_set_level(AV_LOG_DEBUG);
 | 
			
		||||
    mdct_init(9);
 | 
			
		||||
 | 
			
		||||
    fft_test();
 | 
			
		||||
    mdct_test();
 | 
			
		||||
    fft_test(&lfg);
 | 
			
		||||
    mdct_test(&lfg);
 | 
			
		||||
 | 
			
		||||
    for(i=0;i<AC3_FRAME_SIZE;i++)
 | 
			
		||||
        samples[i] = (int)(sin(2*M_PI*i*1000.0/44100) * 10000);
 | 
			
		||||
    ret = AC3_encode_frame(&ctx, frame, samples);
 | 
			
		||||
    printf("ret=%d\n", ret);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* TEST */
 | 
			
		||||
 | 
			
		||||
AVCodec ac3_encoder = {
 | 
			
		||||
    "ac3",
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user