Mercurial > mplayer.hg
comparison liba52/resample_mmx.c @ 3412:21d65a4ae3c9
resample.c added - float->int conversion and channel ordering
author | arpi |
---|---|
date | Sun, 09 Dec 2001 19:23:15 +0000 |
parents | |
children | 9e1e88b3ca18 |
comparison
equal
deleted
inserted
replaced
3411:1c571bccd19a | 3412:21d65a4ae3c9 |
---|---|
1 // this code come from a52dec/libao/audio_out_oss.c | |
2 | |
3 // FIXME FIXME FIXME | |
4 | |
5 // a52_resample_init should find the requested converter (from type flags -> | |
6 // given number of channels) and set up some function pointers... | |
7 | |
8 // a52_resample() should do the conversion. | |
9 | |
10 #include <inttypes.h> | |
11 #include "a52.h" | |
12 | |
13 static inline int16_t convert (int32_t i) | |
14 { | |
15 if (i > 0x43c07fff) | |
16 return 32767; | |
17 else if (i < 0x43bf8000) | |
18 return -32768; | |
19 else | |
20 return i - 0x43c00000; | |
21 } | |
22 | |
23 static int chans=2; | |
24 static int flags=0; | |
25 | |
26 void a52_resample_init(int _flags,int _chans){ | |
27 chans=_chans; | |
28 flags=_flags; | |
29 } | |
30 | |
31 int a52_resample(float * _f, int16_t * s16) | |
32 { | |
33 int i; | |
34 int32_t * f = (int32_t *) _f; | |
35 | |
36 switch (flags) { | |
37 case A52_MONO: | |
38 for (i = 0; i < 256; i++) { | |
39 s16[5*i] = s16[5*i+1] = s16[5*i+2] = s16[5*i+3] = 0; | |
40 s16[5*i+4] = convert (f[i]); | |
41 } | |
42 break; | |
43 case A52_CHANNEL: | |
44 case A52_STEREO: | |
45 case A52_DOLBY: | |
46 for (i = 0; i < 256; i++) { | |
47 s16[2*i] = convert (f[i]); | |
48 s16[2*i+1] = convert (f[i+256]); | |
49 } | |
50 break; | |
51 case A52_3F: | |
52 for (i = 0; i < 256; i++) { | |
53 s16[5*i] = convert (f[i]); | |
54 s16[5*i+1] = convert (f[i+512]); | |
55 s16[5*i+2] = s16[5*i+3] = 0; | |
56 s16[5*i+4] = convert (f[i+256]); | |
57 } | |
58 break; | |
59 case A52_2F2R: | |
60 for (i = 0; i < 256; i++) { | |
61 s16[4*i] = convert (f[i]); | |
62 s16[4*i+1] = convert (f[i+256]); | |
63 s16[4*i+2] = convert (f[i+512]); | |
64 s16[4*i+3] = convert (f[i+768]); | |
65 } | |
66 break; | |
67 case A52_3F2R: | |
68 for (i = 0; i < 256; i++) { | |
69 s16[5*i] = convert (f[i]); | |
70 s16[5*i+1] = convert (f[i+512]); | |
71 s16[5*i+2] = convert (f[i+768]); | |
72 s16[5*i+3] = convert (f[i+1024]); | |
73 s16[5*i+4] = convert (f[i+256]); | |
74 } | |
75 break; | |
76 case A52_MONO | A52_LFE: | |
77 for (i = 0; i < 256; i++) { | |
78 s16[6*i] = s16[6*i+1] = s16[6*i+2] = s16[6*i+3] = 0; | |
79 s16[6*i+4] = convert (f[i+256]); | |
80 s16[6*i+5] = convert (f[i]); | |
81 } | |
82 break; | |
83 case A52_CHANNEL | A52_LFE: | |
84 case A52_STEREO | A52_LFE: | |
85 case A52_DOLBY | A52_LFE: | |
86 for (i = 0; i < 256; i++) { | |
87 s16[6*i] = convert (f[i+256]); | |
88 s16[6*i+1] = convert (f[i+512]); | |
89 s16[6*i+2] = s16[6*i+3] = s16[6*i+4] = 0; | |
90 s16[6*i+5] = convert (f[i]); | |
91 } | |
92 break; | |
93 case A52_3F | A52_LFE: | |
94 for (i = 0; i < 256; i++) { | |
95 s16[6*i] = convert (f[i+256]); | |
96 s16[6*i+1] = convert (f[i+768]); | |
97 s16[6*i+2] = s16[6*i+3] = 0; | |
98 s16[6*i+4] = convert (f[i+512]); | |
99 s16[6*i+5] = convert (f[i]); | |
100 } | |
101 break; | |
102 case A52_2F2R | A52_LFE: | |
103 for (i = 0; i < 256; i++) { | |
104 s16[6*i] = convert (f[i+256]); | |
105 s16[6*i+1] = convert (f[i+512]); | |
106 s16[6*i+2] = convert (f[i+768]); | |
107 s16[6*i+3] = convert (f[i+1024]); | |
108 s16[6*i+4] = 0; | |
109 s16[6*i+5] = convert (f[i]); | |
110 } | |
111 break; | |
112 case A52_3F2R | A52_LFE: | |
113 for (i = 0; i < 256; i++) { | |
114 s16[6*i] = convert (f[i+256]); | |
115 s16[6*i+1] = convert (f[i+768]); | |
116 s16[6*i+2] = convert (f[i+1024]); | |
117 s16[6*i+3] = convert (f[i+1280]); | |
118 s16[6*i+4] = convert (f[i+512]); | |
119 s16[6*i+5] = convert (f[i]); | |
120 } | |
121 break; | |
122 } | |
123 return chans*256; | |
124 } | |
125 |