annotate liba52/test.c @ 8763:19e96e60a3d0

Speed optimizations (runs twise as fast) and bugfix (wrong cutoff frequency buffer over run noise and garbeled output when wrong input format)
author anders
date Sat, 04 Jan 2003 06:19:25 +0000
parents 0cc94b1eec0f
children 4e7d8679d6d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
1
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
2 // liba52 sample by A'rpi/ESP-team
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
3 // reads ac3 stream form stdin, decodes and downmix to s16 stereo pcm and
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
4 // writes it to stdout. resulting stream playbackable with sox:
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
5 // play -c 2 -r 48000 out.sw
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
6
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
7 //#define TIMING //needs Pentium or newer
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
8
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
9 #include <stdio.h>
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
10 #include <stdlib.h>
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
11 #include <inttypes.h>
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
12
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
13 #include "a52.h"
3908
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
14 #include "mm_accel.h"
3579
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
15 #include "../cpudetect.h"
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
16
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
17 static sample_t * samples;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
18 static a52_state_t state;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
19 static uint8_t buf[3840];
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
20 static int buf_size=0;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
21
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
22 static int16_t out_buf[6*256*6];
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
23
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
24 #ifdef TIMING
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
25 static inline long long rdtsc()
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
26 {
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
27 long long l;
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
28 asm volatile( "rdtsc\n\t"
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
29 : "=A" (l)
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
30 );
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
31 // printf("%d\n", int(l/1000));
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
32 return l;
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
33 }
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
34
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
35 #define STARTTIMING t=rdtsc();
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
36 #define ENDTIMING sum+=rdtsc()-t; t=rdtsc();
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
37 #else
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
38 #define STARTTIMING ;
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
39 #define ENDTIMING ;
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
40 #endif
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
41
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
42
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
43 int main(){
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
44 int accel=0;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
45 int sample_rate=0;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
46 int bit_rate=0;
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
47 #ifdef TIMING
3511
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
48 long long t, sum=0, min=256*256*256*64;
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
49 #endif
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
50
3579
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
51 FILE *temp= stdout;
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
52 stdout= stderr; //EVIL HACK FIXME
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
53 GetCpuCaps(&gCpuCaps);
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
54 stdout= temp;
3908
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
55 // gCpuCaps.hasMMX=0;
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
56 // gCpuCaps.hasSSE=0;
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
57 if(gCpuCaps.hasMMX) accel |= MM_ACCEL_X86_MMX;
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
58 if(gCpuCaps.hasMMX2) accel |= MM_ACCEL_X86_MMXEXT;
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
59 if(gCpuCaps.hasSSE) accel |= MM_ACCEL_X86_SSE;
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
60 if(gCpuCaps.has3DNow) accel |= MM_ACCEL_X86_3DNOW;
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
61 // if(gCpuCaps.has3DNowExt) accel |= MM_ACCEL_X86_3DNOWEXT;
3579
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
62
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
63 samples = a52_init (accel);
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
64 if (samples == NULL) {
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
65 fprintf (stderr, "A52 init failed\n");
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
66 return 1;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
67 }
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
68
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
69 while(1){
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
70 int length,i;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
71 int16_t *s16;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
72 sample_t level=1, bias=384;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
73 int flags=0;
3565
7f7991864b96 use resample.c functions
arpi
parents: 3511
diff changeset
74 int channels=0;
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
75
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
76 while(buf_size<7){
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
77 int c=getchar();
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
78 if(c<0) goto eof;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
79 buf[buf_size++]=c;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
80 }
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
81 STARTTIMING
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
82 length = a52_syncinfo (buf, &flags, &sample_rate, &bit_rate);
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
83 ENDTIMING
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
84 if(!length){
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
85 // bad file => resync
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
86 memcpy(buf,buf+1,6);
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
87 --buf_size;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
88 continue;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
89 }
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
90 fprintf(stderr,"sync. %d bytes 0x%X %d Hz %d kbit\n",length,flags,sample_rate,bit_rate);
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
91 while(buf_size<length){
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
92 buf[buf_size++]=getchar();
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
93 }
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
94
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
95 buf_size=0;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
96
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
97 // decode:
3908
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
98 flags=A52_STEREO; //A52_STEREO; //A52_DOLBY; //A52_STEREO; // A52_DOLBY // A52_2F2R // A52_3F2R | A52_LFE
3565
7f7991864b96 use resample.c functions
arpi
parents: 3511
diff changeset
99 channels=2;
7f7991864b96 use resample.c functions
arpi
parents: 3511
diff changeset
100
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
101 flags |= A52_ADJUST_LEVEL;
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
102 STARTTIMING
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
103 if (a52_frame (&state, buf, &flags, &level, bias))
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
104 { fprintf(stderr,"error at decoding\n"); continue; }
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
105 ENDTIMING
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
106
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
107 // a52_dynrng (&state, NULL, NULL); // disable dynamic range compensation
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
108
3579
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
109 STARTTIMING
3908
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
110 a52_resample_init(accel,flags,channels);
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
111 s16 = out_buf;
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
112 for (i = 0; i < 6; i++) {
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
113 if (a52_block (&state, samples))
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
114 { fprintf(stderr,"error at sampling\n"); break; }
3565
7f7991864b96 use resample.c functions
arpi
parents: 3511
diff changeset
115 // float->int + channels interleaving:
7f7991864b96 use resample.c functions
arpi
parents: 3511
diff changeset
116 s16+=a52_resample(samples,s16);
3579
831860fada69 runtime cpu detection for the idct
michael
parents: 3565
diff changeset
117 ENDTIMING
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
118 }
3511
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
119 #ifdef TIMING
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
120 if(sum<min) min=sum;
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
121 sum=0;
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
122 #endif
3908
0cc94b1eec0f runtime cpudetect in liba52 way
michael
parents: 3579
diff changeset
123 fwrite(out_buf,6*256*2*channels,1,stdout);
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
124
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
125 }
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
126
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
127 eof:
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
128 #ifdef TIMING
3511
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
129 fprintf(stderr, "%4.4fk cycles ",min/1000.0);
70a686041bbe better benchmarking
michael
parents: 3507
diff changeset
130 sum=0;
3507
a57fce4ac936 benchmarking code (#define TIMING)
michael
parents: 3396
diff changeset
131 #endif
3396
098634f41331 sample program for testing liba52
arpi
parents:
diff changeset
132 }