📄 g711_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>audio/G711.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.4.1 --><div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div><div class="nav"><a class="el" href="dir_000000.html">audio</a></div><h1>G711.cpp</h1><a href="G711_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 00025 <span class="preprocessor">#include "<a class="code" href="common_8h.html">common.h</a>"</span>00026 <span class="preprocessor">#include "<a class="code" href="G711_8h.html">G711.h</a>"</span>00027 00028 00029 <span class="comment">/*</span>00030 <span class="comment">Members of class G711</span>00031 <span class="comment">*/</span>00032 00033 <a name="l00034"></a><a class="code" href="classG711.html#e0">00034</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga0">uint8</a> <a class="code" href="classG711.html#e0">G711::ALawEncode</a>(int16 pcm16)00035 {00036 <span class="keywordtype">int</span> p = pcm16;00037 <a class="code" href="group__integers.html#ga6">uint</a> a; <span class="comment">// A-law value we are forming</span>00038 <span class="keywordflow">if</span>(p<0)00039 {00040 <span class="comment">// -ve value</span>00041 <span class="comment">// Note, ones compliment is used here as this keeps encoding symetrical</span>00042 <span class="comment">// and equal spaced around zero cross-over, (it also matches the standard).</span>00043 p = ~p;00044 a = 0x00; <span class="comment">// sign = 0</span>00045 }00046 <span class="keywordflow">else</span>00047 {00048 <span class="comment">// +ve value</span>00049 a = 0x80; <span class="comment">// sign = 1</span>00050 }00051 00052 <span class="comment">// Calculate segment and interval numbers</span>00053 p >>= 4;00054 <span class="keywordflow">if</span>(p>=0x20)00055 {00056 <span class="keywordflow">if</span>(p>=0x100)00057 {00058 p >>= 4;00059 a += 0x40;00060 }00061 <span class="keywordflow">if</span>(p>=0x40)00062 {00063 p >>= 2;00064 a += 0x20;00065 }00066 <span class="keywordflow">if</span>(p>=0x20)00067 {00068 p >>= 1;00069 a += 0x10;00070 }00071 }00072 <span class="comment">// a&0x70 now holds segment value and 'p' the interval number</span>00073 00074 a += p; <span class="comment">// a now equal to encoded A-law value</span>00075 00076 <span class="keywordflow">return</span> a^0x55; <span class="comment">// A-law has alternate bits inverted for transmission</span>00077 }00078 00079 <a name="l00080"></a><a class="code" href="classG711.html#e1">00080</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <span class="keywordtype">int</span> <a class="code" href="classG711.html#e1">G711::ALawDecode</a>(uint8 alaw)00081 {00082 alaw ^= 0x55; <span class="comment">// A-law has alternate bits inverted for transmission</span>00083 00084 <a class="code" href="group__integers.html#ga6">uint</a> sign = alaw&0x80;00085 00086 <span class="keywordtype">int</span> linear = alaw&0x1f;00087 linear <<= 4;00088 linear += 8; <span class="comment">// Add a 'half' bit (0x08) to place PCM value in middle of range</span>00089 00090 alaw &= 0x7f;00091 <span class="keywordflow">if</span>(alaw>=0x20)00092 {00093 linear |= 0x100; <span class="comment">// Put in MSB</span>00094 <a class="code" href="group__integers.html#ga6">uint</a> shift = (alaw>>4)-1;00095 linear <<= shift;00096 }00097 00098 <span class="keywordflow">if</span>(!sign)00099 <span class="keywordflow">return</span> -linear;00100 <span class="keywordflow">else</span>00101 <span class="keywordflow">return</span> linear;00102 }00103 00104 <a name="l00105"></a><a class="code" href="classG711.html#e2">00105</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga0">uint8</a> <a class="code" href="classG711.html#e2">G711::ULawEncode</a>(int16 pcm16)00106 {00107 <span class="keywordtype">int</span> p = pcm16;00108 <a class="code" href="group__integers.html#ga6">uint</a> u; <span class="comment">// u-law value we are forming</span>00109 00110 <span class="keywordflow">if</span>(p<0)00111 {00112 <span class="comment">// -ve value</span>00113 <span class="comment">// Note, ones compliment is used here as this keeps encoding symetrical</span>00114 <span class="comment">// and equal spaced around zero cross-over, (it also matches the standard).</span>00115 p = ~p;00116 u = 0x80^0x10^0xff; <span class="comment">// Sign bit = 1 (^0x10 because this will get inverted later) ^0xff to invert final u-Law code</span>00117 }00118 <span class="keywordflow">else</span>00119 {00120 <span class="comment">// +ve value</span>00121 u = 0x00^0x10^0xff; <span class="comment">// Sign bit = 0 (-0x10 because this amount extra will get added later) ^0xff to invert final u-Law code</span>00122 }00123 00124 p += 0x84; <span class="comment">// Add uLaw bias</span>00125 00126 <span class="keywordflow">if</span>(p>0x7f00)00127 p = 0x7f00; <span class="comment">// Clip to 15 bits</span>00128 00129 <span class="comment">// Calculate segment and interval numbers</span>00130 p >>= 3; <span class="comment">// Shift down to 13bit</span>00131 <span class="keywordflow">if</span>(p>=0x100)00132 {00133 p >>= 4;00134 u ^= 0x40;00135 }00136 <span class="keywordflow">if</span>(p>=0x40)00137 {00138 p >>= 2;00139 u ^= 0x20;00140 }00141 <span class="keywordflow">if</span>(p>=0x20)00142 {00143 p >>= 1;00144 u ^= 0x10;00145 }00146 <span class="comment">// (u^0x10)&0x70 now equal to the segment value and 'p' the interval number (^0x10)</span>00147 00148 u ^= p; <span class="comment">// u now equal to encoded u-law value (with all bits inverted)</span>00149 00150 <span class="keywordflow">return</span> u;00151 }00152 00153 <a name="l00154"></a><a class="code" href="classG711.html#e3">00154</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <span class="keywordtype">int</span> <a class="code" href="classG711.html#e3">G711::ULawDecode</a>(uint8 ulaw)00155 {00156 ulaw ^= 0xff; <span class="comment">// u-law has all bits inverted for transmission</span>00157 00158 <span class="keywordtype">int</span> linear = ulaw&0x0f;00159 linear <<= 3;00160 linear |= 0x84; <span class="comment">// Set MSB (0x80) and a 'half' bit (0x04) to place PCM value in middle of range</span>00161 00162 <a class="code" href="group__integers.html#ga6">uint</a> shift = ulaw>>4;00163 shift &= 7;00164 linear <<= shift;00165 00166 linear -= 0x84; <span class="comment">// Subract uLaw bias</span>00167 00168 <span class="keywordflow">if</span>(ulaw&0x80)00169 <span class="keywordflow">return</span> -linear;00170 <span class="keywordflow">else</span>00171 <span class="keywordflow">return</span> linear;00172 }00173 00174 <a name="l00175"></a><a class="code" href="classG711.html#e4">00175</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga0">uint8</a> <a class="code" href="classG711.html#e4">G711::ALawToULaw</a>(uint8 alaw)00176 {00177 <a class="code" href="group__integers.html#ga0">uint8</a> sign=alaw&0x80;00178 alaw ^= sign;00179 alaw ^= 0x55;00180 <a class="code" href="group__integers.html#ga6">uint</a> ulaw;00181 <span class="keywordflow">if</span>(alaw<45)00182 {00183 <span class="keywordflow">if</span>(alaw<24)00184 ulaw = (alaw<8) ? (alaw<<1)+1 : alaw+8;00185 <span class="keywordflow">else</span>00186 ulaw = (alaw<32) ? (alaw>>1)+20 : alaw+4;00187 }00188 <span class="keywordflow">else</span>00189 {00190 <span class="keywordflow">if</span>(alaw<63)00191 ulaw = (alaw<47) ? alaw+3 : alaw+2;00192 <span class="keywordflow">else</span>00193 ulaw = (alaw<79) ? alaw+1 : alaw;00194 }00195 ulaw ^= sign;00196 <span class="keywordflow">return</span> ulaw^0x7f;00197 }00198 00199 <a name="l00200"></a><a class="code" href="classG711.html#e5">00200</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga0">uint8</a> <a class="code" href="classG711.html#e5">G711::ULawToALaw</a>(uint8 ulaw)00201 {00202 <a class="code" href="group__integers.html#ga0">uint8</a> sign=ulaw&0x80;00203 ulaw ^= sign;00204 ulaw ^= 0x7f;00205 <a class="code" href="group__integers.html#ga6">uint</a> alaw;00206 <span class="keywordflow">if</span>(ulaw<48)00207 {00208 <span class="keywordflow">if</span>(ulaw<=32)00209 alaw = (ulaw<=15) ? ulaw>>1 : ulaw-8;00210 <span class="keywordflow">else</span>00211 alaw = (ulaw<=35) ? (ulaw<<1)-40 : ulaw-4;00212 }00213 <span class="keywordflow">else</span>00214 {00215 <span class="keywordflow">if</span>(ulaw<=63)00216 alaw = (ulaw==48) ? ulaw-3 : ulaw-2;00217 <span class="keywordflow">else</span>00218 alaw = (ulaw<=79) ? ulaw-1 : ulaw;00219 }00220 alaw ^= sign;00221 <span class="keywordflow">return</span> alaw^0x55;00222 }00223 00224 <a name="l00225"></a><a class="code" href="classG711.html#e6">00225</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga6">uint</a> <a class="code" href="classG711.html#e0">G711::ALawEncode</a>(uint8* dst, int16* src, uint srcSize)00226 {00227 srcSize >>= 1;00228 <a class="code" href="group__integers.html#ga0">uint8</a>* end = dst+srcSize;00229 <span class="keywordflow">while</span>(dst<end)00230 *dst++ = <a class="code" href="classG711.html#e0">ALawEncode</a>(*src++);00231 <span class="keywordflow">return</span> srcSize;00232 }00233 00234 <a name="l00235"></a><a class="code" href="classG711.html#e7">00235</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga6">uint</a> <a class="code" href="classG711.html#e1">G711::ALawDecode</a>(int16* dst, <span class="keyword">const</span> uint8* src, uint srcSize)00236 {00237 <a class="code" href="group__integers.html#ga4">int16</a>* end = dst+srcSize;00238 <span class="keywordflow">while</span>(dst<end)00239 *dst++ = <a class="code" href="classG711.html#e1">ALawDecode</a>(*src++);00240 <span class="keywordflow">return</span> srcSize<<1;00241 }00242 00243 <a name="l00244"></a><a class="code" href="classG711.html#e8">00244</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga6">uint</a> <a class="code" href="classG711.html#e2">G711::ULawEncode</a>(uint8* dst, int16* src, uint srcSize)00245 {00246 srcSize >>= 1;00247 <a class="code" href="group__integers.html#ga0">uint8</a>* end = dst+srcSize;00248 <span class="keywordflow">while</span>(dst<end)00249 *dst++ = <a class="code" href="classG711.html#e2">ULawEncode</a>(*src++);00250 <span class="keywordflow">return</span> srcSize;00251 }00252 00253 <a name="l00254"></a><a class="code" href="classG711.html#e9">00254</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga6">uint</a> <a class="code" href="classG711.html#e3">G711::ULawDecode</a>(int16* dst, <span class="keyword">const</span> uint8* src, uint srcSize)00255 {00256 <a class="code" href="group__integers.html#ga4">int16</a>* end = dst+srcSize;00257 <span class="keywordflow">while</span>(dst<end)00258 *dst++ = <a class="code" href="classG711.html#e3">ULawDecode</a>(*src++);00259 <span class="keywordflow">return</span> srcSize<<1;00260 }00261 00262 <a name="l00263"></a><a class="code" href="classG711.html#e10">00263</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga6">uint</a> <a class="code" href="classG711.html#e4">G711::ALawToULaw</a>(uint8* dst, <span class="keyword">const</span> uint8* src, uint srcSize)00264 {00265 <a class="code" href="group__integers.html#ga0">uint8</a>* end = dst+srcSize;00266 <span class="keywordflow">while</span>(dst<end)00267 *dst++ = <a class="code" href="classG711.html#e4">ALawToULaw</a>(*src++);00268 <span class="keywordflow">return</span> srcSize;00269 }00270 00271 <a name="l00272"></a><a class="code" href="classG711.html#e11">00272</a> <a class="code" href="common_8h.html#a2">EXPORT</a> <a class="code" href="group__integers.html#ga6">uint</a> <a class="code" href="classG711.html#e5">G711::ULawToALaw</a>(uint8* dst, <span class="keyword">const</span> uint8* src, uint srcSize)00273 {00274 <a class="code" href="group__integers.html#ga0">uint8</a>* end = dst+srcSize;00275 <span class="keywordflow">while</span>(dst<end)00276 *dst++ = <a class="code" href="classG711.html#e5">ULawToALaw</a>(*src++);00277 <span class="keywordflow">return</span> srcSize;00278 }</pre></div><HR><ADDRESS STYLE="align: right;"><SMALL>Generated by <A HREF="http://www.doxygen.org/index.html"><IMG SRC="doxygen.png" ALT="doxygen" ALIGN="middle" BORDER="0"></A> 1.4.1</SMALL></ADDRESS></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -