/src/libsndfile/src/G72x/g721.c
Line | Count | Source |
1 | | /* |
2 | | * This source code is a product of Sun Microsystems, Inc. and is provided |
3 | | * for unrestricted use. Users may copy or modify this source code without |
4 | | * charge. |
5 | | * |
6 | | * SUN SOURCE CODE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING |
7 | | * THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR |
8 | | * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. |
9 | | * |
10 | | * Sun source code is provided with no support and without any obligation on |
11 | | * the part of Sun Microsystems, Inc. to assist in its use, correction, |
12 | | * modification or enhancement. |
13 | | * |
14 | | * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE |
15 | | * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS SOFTWARE |
16 | | * OR ANY PART THEREOF. |
17 | | * |
18 | | * In no event will Sun Microsystems, Inc. be liable for any lost revenue |
19 | | * or profits or other special, indirect and consequential damages, even if |
20 | | * Sun has been advised of the possibility of such damages. |
21 | | * |
22 | | * Sun Microsystems, Inc. |
23 | | * 2550 Garcia Avenue |
24 | | * Mountain View, California 94043 |
25 | | */ |
26 | | |
27 | | /* |
28 | | * g721.c |
29 | | * |
30 | | * Description: |
31 | | * |
32 | | * g721_encoder (), g721_decoder () |
33 | | * |
34 | | * These routines comprise an implementation of the CCITT G.721 ADPCM |
35 | | * coding algorithm. Essentially, this implementation is identical to |
36 | | * the bit level description except for a few deviations which |
37 | | * take advantage of work station attributes, such as hardware 2's |
38 | | * complement arithmetic and large memory. Specifically, certain time |
39 | | * consuming operations such as multiplications are replaced |
40 | | * with lookup tables and software 2's complement operations are |
41 | | * replaced with hardware 2's complement. |
42 | | * |
43 | | * The deviation from the bit level specification (lookup tables) |
44 | | * preserves the bit level performance specifications. |
45 | | * |
46 | | * As outlined in the G.721 Recommendation, the algorithm is broken |
47 | | * down into modules. Each section of code below is preceded by |
48 | | * the name of the module which it is implementing. |
49 | | * |
50 | | */ |
51 | | |
52 | | #include "g72x.h" |
53 | | #include "g72x_priv.h" |
54 | | |
55 | | static short qtab_721 [7] = { -124, 80, 178, 246, 300, 349, 400 } ; |
56 | | /* |
57 | | * Maps G.721 code word to reconstructed scale factor normalized log |
58 | | * magnitude values. |
59 | | */ |
60 | | static short _dqlntab [16] = { -2048, 4, 135, 213, 273, 323, 373, 425, |
61 | | 425, 373, 323, 273, 213, 135, 4, -2048 } ; |
62 | | |
63 | | /* Maps G.721 code word to log of scale factor multiplier. */ |
64 | | static short _witab [16] = { -12, 18, 41, 64, 112, 198, 355, 1122, |
65 | | 1122, 355, 198, 112, 64, 41, 18, -12 } ; |
66 | | /* |
67 | | * Maps G.721 code words to a set of values whose long and short |
68 | | * term averages are computed and then compared to give an indication |
69 | | * how stationary (steady state) the signal is. |
70 | | */ |
71 | | static short _fitab [16] = { 0, 0, 0, 0x200, 0x200, 0x200, 0x600, 0xE00, |
72 | | 0xE00, 0x600, 0x200, 0x200, 0x200, 0, 0, 0 } ; |
73 | | |
74 | | /* |
75 | | * g721_encoder () |
76 | | * |
77 | | * Encodes the input vale of linear PCM, A-law or u-law data sl and returns |
78 | | * the resulting code. -1 is returned for unknown input coding value. |
79 | | */ |
80 | | int |
81 | | g721_encoder ( |
82 | | int sl, |
83 | | G72x_STATE *state_ptr) |
84 | 0 | { |
85 | 0 | short sezi, se, sez ; /* ACCUM */ |
86 | 0 | short d ; /* SUBTA */ |
87 | 0 | short sr ; /* ADDB */ |
88 | 0 | short y ; /* MIX */ |
89 | 0 | short dqsez ; /* ADDC */ |
90 | 0 | short dq, i ; |
91 | | |
92 | | /* linearize input sample to 14-bit PCM */ |
93 | 0 | sl >>= 2 ; /* 14-bit dynamic range */ |
94 | |
|
95 | 0 | sezi = predictor_zero (state_ptr) ; |
96 | 0 | sez = sezi >> 1 ; |
97 | 0 | se = (sezi + predictor_pole (state_ptr)) >> 1 ; /* estimated signal */ |
98 | |
|
99 | 0 | d = sl - se ; /* estimation difference */ |
100 | | |
101 | | /* quantize the prediction difference */ |
102 | 0 | y = step_size (state_ptr) ; /* quantizer step size */ |
103 | 0 | i = quantize (d, y, qtab_721, 7) ; /* i = ADPCM code */ |
104 | |
|
105 | 0 | dq = reconstruct (i & 8, _dqlntab [i], y) ; /* quantized est diff */ |
106 | |
|
107 | 0 | sr = (dq < 0) ? se - (dq & 0x3FFF) : se + dq ; /* reconst. signal */ |
108 | |
|
109 | 0 | dqsez = sr + sez - se ; /* pole prediction diff. */ |
110 | |
|
111 | 0 | update (4, y, arith_shift_left (_witab [i], 5), _fitab [i], dq, sr, dqsez, state_ptr) ; |
112 | |
|
113 | 0 | return i ; |
114 | 0 | } |
115 | | |
116 | | /* |
117 | | * g721_decoder () |
118 | | * |
119 | | * Description: |
120 | | * |
121 | | * Decodes a 4-bit code of G.721 encoded data of i and |
122 | | * returns the resulting linear PCM, A-law or u-law value. |
123 | | * return -1 for unknown out_coding value. |
124 | | */ |
125 | | int |
126 | | g721_decoder ( |
127 | | int i, |
128 | | G72x_STATE *state_ptr) |
129 | 523k | { |
130 | 523k | short sezi, sei, sez, se ; /* ACCUM */ |
131 | 523k | short y ; /* MIX */ |
132 | 523k | short sr ; /* ADDB */ |
133 | 523k | short dq ; |
134 | 523k | short dqsez ; |
135 | | |
136 | 523k | i &= 0x0f ; /* mask to get proper bits */ |
137 | 523k | sezi = predictor_zero (state_ptr) ; |
138 | 523k | sez = sezi >> 1 ; |
139 | 523k | sei = sezi + predictor_pole (state_ptr) ; |
140 | 523k | se = sei >> 1 ; /* se = estimated signal */ |
141 | | |
142 | 523k | y = step_size (state_ptr) ; /* dynamic quantizer step size */ |
143 | | |
144 | 523k | dq = reconstruct (i & 0x08, _dqlntab [i], y) ; /* quantized diff. */ |
145 | | |
146 | 523k | sr = (dq < 0) ? (se - (dq & 0x3FFF)) : se + dq ; /* reconst. signal */ |
147 | | |
148 | 523k | dqsez = sr - se + sez ; /* pole prediction diff. */ |
149 | | |
150 | 523k | update (4, y, arith_shift_left (_witab [i], 5), _fitab [i], dq, sr, dqsez, state_ptr) ; |
151 | | |
152 | | /* sr was 14-bit dynamic range */ |
153 | 523k | return arith_shift_left (sr, 2) ; |
154 | 523k | } |
155 | | |