⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g711_8cpp-source.html

📁 Tixys source code, include G.711, G.726, IMA-ADPCM etc.
💻 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&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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&lt;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 &gt;&gt;= 4;00054     <span class="keywordflow">if</span>(p&gt;=0x20)00055         {00056         <span class="keywordflow">if</span>(p&gt;=0x100)00057             {00058             p &gt;&gt;= 4;00059             a += 0x40;00060             }00061         <span class="keywordflow">if</span>(p&gt;=0x40)00062             {00063             p &gt;&gt;= 2;00064             a += 0x20;00065             }00066         <span class="keywordflow">if</span>(p&gt;=0x20)00067             {00068             p &gt;&gt;= 1;00069             a += 0x10;00070             }00071         }00072     <span class="comment">// a&amp;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&amp;0x80;00085 00086     <span class="keywordtype">int</span> linear = alaw&amp;0x1f;00087     linear &lt;&lt;= 4;00088     linear += 8;  <span class="comment">// Add a 'half' bit (0x08) to place PCM value in middle of range</span>00089 00090     alaw &amp;= 0x7f;00091     <span class="keywordflow">if</span>(alaw&gt;=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&gt;&gt;4)-1;00095         linear &lt;&lt;= 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&lt;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&gt;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 &gt;&gt;= 3;    <span class="comment">// Shift down to 13bit</span>00131     <span class="keywordflow">if</span>(p&gt;=0x100)00132         {00133         p &gt;&gt;= 4;00134         u ^= 0x40;00135         }00136     <span class="keywordflow">if</span>(p&gt;=0x40)00137         {00138         p &gt;&gt;= 2;00139         u ^= 0x20;00140         }00141     <span class="keywordflow">if</span>(p&gt;=0x20)00142         {00143         p &gt;&gt;= 1;00144         u ^= 0x10;00145         }00146     <span class="comment">// (u^0x10)&amp;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&amp;0x0f;00159     linear &lt;&lt;= 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&gt;&gt;4;00163     shift &amp;= 7;00164     linear &lt;&lt;= shift;00165 00166     linear -= 0x84; <span class="comment">// Subract uLaw bias</span>00167     00168     <span class="keywordflow">if</span>(ulaw&amp;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&amp;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&lt;45)00182         {00183         <span class="keywordflow">if</span>(alaw&lt;24)00184             ulaw = (alaw&lt;8) ? (alaw&lt;&lt;1)+1 : alaw+8;00185         <span class="keywordflow">else</span>00186             ulaw = (alaw&lt;32) ? (alaw&gt;&gt;1)+20 : alaw+4;00187         }00188     <span class="keywordflow">else</span>00189         {00190         <span class="keywordflow">if</span>(alaw&lt;63)00191             ulaw = (alaw&lt;47) ? alaw+3 : alaw+2;00192         <span class="keywordflow">else</span>00193             ulaw = (alaw&lt;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&amp;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&lt;48)00207         {00208         <span class="keywordflow">if</span>(ulaw&lt;=32)00209             alaw = (ulaw&lt;=15) ? ulaw&gt;&gt;1 : ulaw-8;00210         <span class="keywordflow">else</span>00211             alaw = (ulaw&lt;=35) ? (ulaw&lt;&lt;1)-40 : ulaw-4;00212         }00213     <span class="keywordflow">else</span>00214         {00215         <span class="keywordflow">if</span>(ulaw&lt;=63)00216             alaw = (ulaw==48) ? ulaw-3 : ulaw-2;00217         <span class="keywordflow">else</span>00218             alaw = (ulaw&lt;=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 &gt;&gt;= 1;00228     <a class="code" href="group__integers.html#ga0">uint8</a>* end = dst+srcSize;00229     <span class="keywordflow">while</span>(dst&lt;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&lt;end)00239         *dst++ = <a class="code" href="classG711.html#e1">ALawDecode</a>(*src++);00240     <span class="keywordflow">return</span> srcSize&lt;&lt;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 &gt;&gt;= 1;00247     <a class="code" href="group__integers.html#ga0">uint8</a>* end = dst+srcSize;00248     <span class="keywordflow">while</span>(dst&lt;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&lt;end)00258         *dst++ = <a class="code" href="classG711.html#e3">ULawDecode</a>(*src++);00259     <span class="keywordflow">return</span> srcSize&lt;&lt;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&lt;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&lt;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&nbsp; <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 + -