summaryrefslogtreecommitdiffstats
path: root/liba52/test.c
blob: d77b716d357ea14c301a7e526b64649698ccfd06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

// liba52 sample by A'rpi/ESP-team
// reads ac3 stream form stdin, decodes and downmix to s16 stereo pcm and
// writes it to stdout.  resulting stream playbackable with sox:
//   play -c 2 -r 48000 out.sw

//#define TIMING //needs Pentium or newer 

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#include "a52.h"
#include "../cpudetect.h"

static sample_t * samples;
static a52_state_t state;
static uint8_t buf[3840];
static int buf_size=0;

static int16_t out_buf[6*256*6];

#ifdef TIMING
static inline long long rdtsc()
{
	long long l;
	asm volatile(	"rdtsc\n\t"
		: "=A" (l)
	);
//	printf("%d\n", int(l/1000));
	return l;
}

#define STARTTIMING t=rdtsc();
#define ENDTIMING sum+=rdtsc()-t; t=rdtsc();
#else
#define STARTTIMING ;
#define ENDTIMING ;
#endif


int main(){
int accel=0;
int sample_rate=0;
int bit_rate=0;
#ifdef TIMING
long long t, sum=0, min=256*256*256*64;
#endif

    FILE *temp= stdout;
    stdout= stderr; //EVIL HACK FIXME
    GetCpuCaps(&gCpuCaps);
    stdout= temp;
    
    samples = a52_init (accel);
    if (samples == NULL) {
	fprintf (stderr, "A52 init failed\n");
	return 1;
    }

while(1){
    int length,i;
    int16_t *s16;
    sample_t level=1, bias=384;
    int flags=0;
    int channels=0;

    while(buf_size<7){
	int c=getchar();
	if(c<0) goto eof;
	buf[buf_size++]=c;
    }
STARTTIMING
    length = a52_syncinfo (buf, &flags, &sample_rate, &bit_rate);
ENDTIMING
    if(!length){
	// bad file => resync
	memcpy(buf,buf+1,6);
	--buf_size;
	continue;
    }
    fprintf(stderr,"sync. %d bytes  0x%X  %d Hz  %d kbit\n",length,flags,sample_rate,bit_rate);
    while(buf_size<length){
	buf[buf_size++]=getchar();
    }
    
    buf_size=0;

    // decode:
    flags=A52_STEREO; //A52_STEREO; // A52_DOLBY // A52_2F2R // A52_3F2R | A52_LFE
    channels=2;
    
    flags |= A52_ADJUST_LEVEL;
STARTTIMING
    if (a52_frame (&state, buf, &flags, &level, bias))
	{ fprintf(stderr,"error at decoding\n"); continue; }
ENDTIMING

    // a52_dynrng (&state, NULL, NULL); // disable dynamic range compensation

STARTTIMING
    a52_resample_init(flags,channels);
    s16 = out_buf;
    for (i = 0; i < 6; i++) {
	if (a52_block (&state, samples))
	    { fprintf(stderr,"error at sampling\n"); break; }
	// float->int + channels interleaving:
	s16+=a52_resample(samples,s16);
ENDTIMING
    }
#ifdef TIMING
if(sum<min) min=sum;
sum=0;
#endif
    fwrite(out_buf,6*256*2*2,1,stdout);

}

eof:
#ifdef TIMING
fprintf(stderr, "%4.4fk cycles ",min/1000.0);
sum=0;
#endif
}