1 /*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10 #include <string.h>
11 #include "g711.h"
12 #include "g711_interface.h"
13 #include "webrtc/typedefs.h"
14
WebRtcG711_EncodeA(void * state,int16_t * speechIn,int16_t len,int16_t * encoded)15 int16_t WebRtcG711_EncodeA(void* state,
16 int16_t* speechIn,
17 int16_t len,
18 int16_t* encoded) {
19 int n;
20 uint16_t tempVal, tempVal2;
21
22 // Set and discard to avoid getting warnings
23 (void)(state = NULL);
24
25 // Sanity check of input length
26 if (len < 0) {
27 return (-1);
28 }
29
30 // Loop over all samples
31 for (n = 0; n < len; n++) {
32 tempVal = (uint16_t) linear_to_alaw(speechIn[n]);
33
34 #ifdef WEBRTC_ARCH_BIG_ENDIAN
35 if ((n & 0x1) == 1) {
36 encoded[n >> 1] |= ((uint16_t) tempVal);
37 } else {
38 encoded[n >> 1] = ((uint16_t) tempVal) << 8;
39 }
40 #else
41 if ((n & 0x1) == 1) {
42 tempVal2 |= ((uint16_t) tempVal) << 8;
43 encoded[n >> 1] |= ((uint16_t) tempVal) << 8;
44 } else {
45 tempVal2 = ((uint16_t) tempVal);
46 encoded[n >> 1] = ((uint16_t) tempVal);
47 }
48 #endif
49 }
50 return (len);
51 }
52
WebRtcG711_EncodeU(void * state,int16_t * speechIn,int16_t len,int16_t * encoded)53 int16_t WebRtcG711_EncodeU(void* state,
54 int16_t* speechIn,
55 int16_t len,
56 int16_t* encoded) {
57 int n;
58 uint16_t tempVal;
59
60 // Set and discard to avoid getting warnings
61 (void)(state = NULL);
62
63 // Sanity check of input length
64 if (len < 0) {
65 return (-1);
66 }
67
68 // Loop over all samples
69 for (n = 0; n < len; n++) {
70 tempVal = (uint16_t) linear_to_ulaw(speechIn[n]);
71
72 #ifdef WEBRTC_ARCH_BIG_ENDIAN
73 if ((n & 0x1) == 1) {
74 encoded[n >> 1] |= ((uint16_t) tempVal);
75 } else {
76 encoded[n >> 1] = ((uint16_t) tempVal) << 8;
77 }
78 #else
79 if ((n & 0x1) == 1) {
80 encoded[n >> 1] |= ((uint16_t) tempVal) << 8;
81 } else {
82 encoded[n >> 1] = ((uint16_t) tempVal);
83 }
84 #endif
85 }
86 return (len);
87 }
88
WebRtcG711_DecodeA(void * state,int16_t * encoded,int16_t len,int16_t * decoded,int16_t * speechType)89 int16_t WebRtcG711_DecodeA(void* state,
90 int16_t* encoded,
91 int16_t len,
92 int16_t* decoded,
93 int16_t* speechType) {
94 int n;
95 uint16_t tempVal;
96
97 // Set and discard to avoid getting warnings
98 (void)(state = NULL);
99
100 // Sanity check of input length
101 if (len < 0) {
102 return (-1);
103 }
104
105 for (n = 0; n < len; n++) {
106 #ifdef WEBRTC_ARCH_BIG_ENDIAN
107 if ((n & 0x1) == 1) {
108 tempVal = ((uint16_t) encoded[n >> 1] & 0xFF);
109 } else {
110 tempVal = ((uint16_t) encoded[n >> 1] >> 8);
111 }
112 #else
113 if ((n & 0x1) == 1) {
114 tempVal = (encoded[n >> 1] >> 8);
115 } else {
116 tempVal = (encoded[n >> 1] & 0xFF);
117 }
118 #endif
119 decoded[n] = (int16_t) alaw_to_linear(tempVal);
120 }
121
122 *speechType = 1;
123 return (len);
124 }
125
WebRtcG711_DecodeU(void * state,int16_t * encoded,int16_t len,int16_t * decoded,int16_t * speechType)126 int16_t WebRtcG711_DecodeU(void* state,
127 int16_t* encoded,
128 int16_t len,
129 int16_t* decoded,
130 int16_t* speechType) {
131 int n;
132 uint16_t tempVal;
133
134 // Set and discard to avoid getting warnings
135 (void)(state = NULL);
136
137 // Sanity check of input length
138 if (len < 0) {
139 return (-1);
140 }
141
142 for (n = 0; n < len; n++) {
143 #ifdef WEBRTC_ARCH_BIG_ENDIAN
144 if ((n & 0x1) == 1) {
145 tempVal = ((uint16_t) encoded[n >> 1] & 0xFF);
146 } else {
147 tempVal = ((uint16_t) encoded[n >> 1] >> 8);
148 }
149 #else
150 if ((n & 0x1) == 1) {
151 tempVal = (encoded[n >> 1] >> 8);
152 } else {
153 tempVal = (encoded[n >> 1] & 0xFF);
154 }
155 #endif
156 decoded[n] = (int16_t) ulaw_to_linear(tempVal);
157 }
158
159 *speechType = 1;
160 return (len);
161 }
162
WebRtcG711_DurationEst(void * state,const uint8_t * payload,int payload_length_bytes)163 int WebRtcG711_DurationEst(void* state,
164 const uint8_t* payload,
165 int payload_length_bytes) {
166 (void) state;
167 (void) payload;
168 /* G.711 is one byte per sample, so we can just return the number of bytes. */
169 return payload_length_bytes;
170 }
171
WebRtcG711_Version(char * version,int16_t lenBytes)172 int16_t WebRtcG711_Version(char* version, int16_t lenBytes) {
173 strncpy(version, "2.0.0", lenBytes);
174 return 0;
175 }
176