1362 lines
82 KiB
HTML
Executable File
1362 lines
82 KiB
HTML
Executable File
<!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>libmusepack: src/mpc_decoder.c Source File</title>
|
||
<link href="custom.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="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="globals.html">File Members</a> | <a class="qindex" href="pages.html">Related Pages</a></div>
|
||
<div class="nav">
|
||
<a class="el" href="dir_000002.html">src</a></div>
|
||
<h1>mpc_decoder.c</h1><a href="mpc__decoder_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*</span>
|
||
00002 <span class="comment"> Copyright (c) 2005, The Musepack Development Team</span>
|
||
00003 <span class="comment"> All rights reserved.</span>
|
||
00004 <span class="comment"></span>
|
||
00005 <span class="comment"> Redistribution and use in source and binary forms, with or without</span>
|
||
00006 <span class="comment"> modification, are permitted provided that the following conditions are</span>
|
||
00007 <span class="comment"> met:</span>
|
||
00008 <span class="comment"></span>
|
||
00009 <span class="comment"> * Redistributions of source code must retain the above copyright</span>
|
||
00010 <span class="comment"> notice, this list of conditions and the following disclaimer.</span>
|
||
00011 <span class="comment"></span>
|
||
00012 <span class="comment"> * Redistributions in binary form must reproduce the above</span>
|
||
00013 <span class="comment"> copyright notice, this list of conditions and the following</span>
|
||
00014 <span class="comment"> disclaimer in the documentation and/or other materials provided</span>
|
||
00015 <span class="comment"> with the distribution.</span>
|
||
00016 <span class="comment"></span>
|
||
00017 <span class="comment"> * Neither the name of the The Musepack Development Team nor the</span>
|
||
00018 <span class="comment"> names of its contributors may be used to endorse or promote</span>
|
||
00019 <span class="comment"> products derived from this software without specific prior</span>
|
||
00020 <span class="comment"> written permission.</span>
|
||
00021 <span class="comment"></span>
|
||
00022 <span class="comment"> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
|
||
00023 <span class="comment"> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
|
||
00024 <span class="comment"> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
|
||
00025 <span class="comment"> A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
|
||
00026 <span class="comment"> OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
|
||
00027 <span class="comment"> SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
|
||
00028 <span class="comment"> LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
|
||
00029 <span class="comment"> DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
|
||
00030 <span class="comment"> THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
|
||
00031 <span class="comment"> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
|
||
00032 <span class="comment"> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
|
||
00033 <span class="comment">*/</span>
|
||
00034
|
||
00037
|
||
00038 <span class="preprocessor">#include "<a class="code" href="musepack_8h.html">musepack/musepack.h</a>"</span>
|
||
00039 <span class="preprocessor">#include "musepack/internal.h"</span>
|
||
00040 <span class="preprocessor">#include "<a class="code" href="requant_8h.html">musepack/requant.h</a>"</span>
|
||
00041 <span class="preprocessor">#include "<a class="code" href="huffman_8h.html">musepack/huffman.h</a>"</span>
|
||
00042
|
||
00043 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00044 <span class="comment">// types</span>
|
||
00045 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00046 <span class="keyword">enum</span>
|
||
00047 {
|
||
00048 EQ_TAP = 13, <span class="comment">// length of FIR filter for EQ</span>
|
||
00049 DELAY = ((EQ_TAP + 1) / 2), <span class="comment">// delay of FIR</span>
|
||
00050 FIR_BANDS = 4, <span class="comment">// number of subbands to be FIR filtered</span>
|
||
00051 MEMSIZE = MPC_DECODER_MEMSIZE, <span class="comment">// overall buffer size</span>
|
||
00052 MEMSIZE2 = (MEMSIZE/2), <span class="comment">// size of one buffer</span>
|
||
00053 MEMMASK = (MEMSIZE-1)
|
||
00054 };
|
||
00055
|
||
00056 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00057 <span class="comment">// forward declarations</span>
|
||
00058 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00059 <span class="keywordtype">void</span> <a class="code" href="huffman_8h.html#a2">mpc_decoder_init_huffman_sv6</a>(mpc_decoder *d);
|
||
00060 <span class="keywordtype">void</span> <a class="code" href="huffman_8h.html#a4">mpc_decoder_init_huffman_sv7</a>(mpc_decoder *d);
|
||
00061 <span class="keywordtype">void</span> mpc_decoder_read_bitstream_sv6(mpc_decoder *d);
|
||
00062 <span class="keywordtype">void</span> mpc_decoder_read_bitstream_sv7(mpc_decoder *d);
|
||
00063 <span class="keywordtype">void</span> mpc_decoder_update_buffer(mpc_decoder *d, mpc_uint32_t RING);
|
||
00064 BOOL <a class="code" href="musepack_8h.html#a17">mpc_decoder_seek_sample</a>(mpc_decoder *d, mpc_int64_t destsample);
|
||
00065 <span class="keywordtype">void</span> mpc_decoder_requantisierung(mpc_decoder *d, <span class="keyword">const</span> mpc_int32_t Last_Band);
|
||
00066
|
||
00067 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00068 <span class="comment">// utility functions</span>
|
||
00069 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00070 <span class="keyword">static</span> mpc_int32_t f_read(mpc_decoder *d, <span class="keywordtype">void</span> *ptr, size_t size)
|
||
00071 {
|
||
00072 <span class="keywordflow">return</span> d->r->read(d->r->data, ptr, size);
|
||
00073 };
|
||
00074
|
||
00075 <span class="keyword">static</span> BOOL f_seek(mpc_decoder *d, mpc_int32_t offset)
|
||
00076 {
|
||
00077 <span class="keywordflow">return</span> d->r->seek(d->r->data, offset);
|
||
00078 };
|
||
00079
|
||
00080 <span class="keyword">static</span> mpc_int32_t f_read_dword(mpc_decoder *d, mpc_uint32_t * ptr, mpc_uint32_t count)
|
||
00081 {
|
||
00082 count = f_read(d, ptr, count << 2) >> 2;
|
||
00083 <span class="preprocessor">#ifndef MPC_LITTLE_ENDIAN</span>
|
||
00084 <span class="preprocessor"></span> mpc_uint32_t n;
|
||
00085 <span class="keywordflow">for</span>(n = 0; n< count; n++) {
|
||
00086 ptr[n] = swap32(ptr[n]);
|
||
00087 }
|
||
00088 <span class="preprocessor">#endif</span>
|
||
00089 <span class="preprocessor"></span> <span class="keywordflow">return</span> count;
|
||
00090 }
|
||
00091
|
||
00092 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00093 <span class="comment">// huffman & bitstream functions</span>
|
||
00094 <span class="comment">//------------------------------------------------------------------------------</span>
|
||
00095 <span class="keyword">static</span> <span class="keyword">const</span> mpc_uint32_t mask [33] = {
|
||
00096 0x00000000, 0x00000001, 0x00000003, 0x00000007,
|
||
00097 0x0000000F, 0x0000001F, 0x0000003F, 0x0000007F,
|
||
00098 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
|
||
00099 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF,
|
||
00100 0x0000FFFF, 0x0001FFFF, 0x0003FFFF, 0x0007FFFF,
|
||
00101 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
|
||
00102 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF,
|
||
00103 0x0FFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF,
|
||
00104 0xFFFFFFFF
|
||
00105 };
|
||
00106
|
||
00107 <span class="comment">/* F U N C T I O N S */</span>
|
||
00108
|
||
00109 <span class="comment">// resets bitstream decoding</span>
|
||
00110 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
00111 mpc_decoder_reset_bitstream_decode(mpc_decoder *d)
|
||
00112 {
|
||
00113 d->dword = 0;
|
||
00114 d->pos = 0;
|
||
00115 d->Zaehler = 0;
|
||
00116 d->WordsRead = 0;
|
||
00117 }
|
||
00118
|
||
00119 <span class="comment">// reports the number of read bits</span>
|
||
00120 <span class="keyword">static</span> mpc_uint32_t
|
||
00121 mpc_decoder_bits_read(mpc_decoder *d)
|
||
00122 {
|
||
00123 <span class="keywordflow">return</span> 32 * d->WordsRead + d->pos;
|
||
00124 }
|
||
00125
|
||
00126 <span class="comment">// read desired number of bits out of the bitstream</span>
|
||
00127 <span class="keyword">static</span> mpc_uint32_t
|
||
00128 mpc_decoder_bitstream_read(mpc_decoder *d, <span class="keyword">const</span> mpc_uint32_t bits)
|
||
00129 {
|
||
00130 mpc_uint32_t out = d->dword;
|
||
00131
|
||
00132 d->pos += bits;
|
||
00133
|
||
00134 <span class="keywordflow">if</span> (d->pos < 32) {
|
||
00135 out >>= (32 - d->pos);
|
||
00136 }
|
||
00137 <span class="keywordflow">else</span> {
|
||
00138 d->dword = d->Speicher[d->Zaehler = (d->Zaehler + 1) & MEMMASK];
|
||
00139 d->pos -= 32;
|
||
00140 <span class="keywordflow">if</span> (d->pos) {
|
||
00141 out <<= d->pos;
|
||
00142 out |= d->dword >> (32 - d->pos);
|
||
00143 }
|
||
00144 ++(d->WordsRead);
|
||
00145 }
|
||
00146
|
||
00147 <span class="keywordflow">return</span> out & mask[bits];
|
||
00148 }
|
||
00149
|
||
00150 <span class="comment">// decode SCFI-bundle (sv4,5,6)</span>
|
||
00151 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
00152 mpc_decoder_scfi_bundle_read(
|
||
00153 mpc_decoder *d,
|
||
00154 <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>* Table, mpc_int32_t* SCFI, mpc_int32_t* DSCF)
|
||
00155 {
|
||
00156 <span class="comment">// load preview and decode</span>
|
||
00157 mpc_uint32_t code = d->dword << d->pos;
|
||
00158 <span class="keywordflow">if</span> (d->pos > 26) {
|
||
00159 code |= d->Speicher[(d->Zaehler + 1) & MEMMASK] >> (32 - d->pos);
|
||
00160 }
|
||
00161 <span class="keywordflow">while</span> (code < Table->Code) {
|
||
00162 Table++;
|
||
00163 }
|
||
00164
|
||
00165 <span class="comment">// set the new position within bitstream without performing a dummy-read</span>
|
||
00166 <span class="keywordflow">if</span> ((d->pos += Table->Length) >= 32) {
|
||
00167 d->pos -= 32;
|
||
00168 d->dword = d->Speicher[d->Zaehler = (d->Zaehler+1) & MEMMASK];
|
||
00169 ++(d->WordsRead);
|
||
00170 }
|
||
00171
|
||
00172 *SCFI = Table->Value >> 1;
|
||
00173 *DSCF = Table->Value & 1;
|
||
00174 }
|
||
00175
|
||
00176 <span class="keyword">static</span> <span class="keywordtype">int</span>
|
||
00177 mpc_decoder_huffman_typ_cmpfn(<span class="keyword">const</span> <span class="keywordtype">void</span>* p1, <span class="keyword">const</span> <span class="keywordtype">void</span>* p2)
|
||
00178 {
|
||
00179 <span class="keywordflow">if</span> (((<a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>*) p1)->Code < ((HuffmanTyp*) p2)->Code ) <span class="keywordflow">return</span> +1;
|
||
00180 <span class="keywordflow">if</span> (((<a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>*) p1)->Code > ((<a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>*) p2)->Code ) return -1;
|
||
00181 return 0;
|
||
00182 }
|
||
00183
|
||
00184 <span class="comment">// sort huffman-tables by codeword</span>
|
||
00185 <span class="comment">// offset resulting value</span>
|
||
00186 <span class="keywordtype">void</span>
|
||
<a name="l00187"></a><a class="code" href="mpc__decoder_8c.html#a23">00187</a> mpc_decoder_resort_huff_tables(
|
||
00188 const mpc_uint32_t elements, <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>* Table, const mpc_int32_t offset )
|
||
00189 {
|
||
00190 mpc_uint32_t i;
|
||
00191
|
||
00192 <span class="keywordflow">for</span> ( i = 0; i < elements; i++ ) {
|
||
00193 Table[i].Code <<= 32 - Table[i].Length;
|
||
00194 Table[i].Value = i - offset;
|
||
00195 }
|
||
00196 qsort(Table, elements, <span class="keyword">sizeof</span>(*Table), mpc_decoder_huffman_typ_cmpfn);
|
||
00197 }
|
||
00198
|
||
00199 <span class="comment">// basic huffman decoding routine</span>
|
||
00200 <span class="comment">// works with maximum lengths up to 14</span>
|
||
00201 <span class="keyword">static</span> mpc_int32_t
|
||
00202 mpc_decoder_huffman_decode(mpc_decoder *d, <span class="keyword">const</span> <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a> *Table)
|
||
00203 {
|
||
00204 <span class="comment">// load preview and decode</span>
|
||
00205 mpc_uint32_t code = d->dword << d->pos;
|
||
00206 <span class="keywordflow">if</span> (d->pos > 18) {
|
||
00207 code |= d->Speicher[(d->Zaehler + 1) & MEMMASK] >> (32 - d->pos);
|
||
00208 }
|
||
00209 <span class="keywordflow">while</span> (code < Table->Code) {
|
||
00210 Table++;
|
||
00211 }
|
||
00212
|
||
00213 <span class="comment">// set the new position within bitstream without performing a dummy-read</span>
|
||
00214 <span class="keywordflow">if</span> ((d->pos += Table->Length) >= 32) {
|
||
00215 d->pos -= 32;
|
||
00216 d->dword = d->Speicher[d->Zaehler = (d->Zaehler + 1) & MEMMASK];
|
||
00217 ++(d->WordsRead);
|
||
00218 }
|
||
00219
|
||
00220 <span class="keywordflow">return</span> Table->Value;
|
||
00221 }
|
||
00222
|
||
00223 <span class="comment">// faster huffman through previewing less bits</span>
|
||
00224 <span class="comment">// works with maximum lengths up to 10</span>
|
||
00225 <span class="keyword">static</span> mpc_int32_t
|
||
00226 mpc_decoder_huffman_decode_fast(mpc_decoder *d, <span class="keyword">const</span> <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>* Table)
|
||
00227 {
|
||
00228 <span class="comment">// load preview and decode</span>
|
||
00229 mpc_uint32_t code = d->dword << d->pos;
|
||
00230 <span class="keywordflow">if</span> (d->pos > 22) {
|
||
00231 code |= d->Speicher[(d->Zaehler + 1) & MEMMASK] >> (32 - d->pos);
|
||
00232 }
|
||
00233 <span class="keywordflow">while</span> (code < Table->Code) {
|
||
00234 Table++;
|
||
00235 }
|
||
00236
|
||
00237 <span class="comment">// set the new position within bitstream without performing a dummy-read</span>
|
||
00238 <span class="keywordflow">if</span> ((d->pos += Table->Length) >= 32) {
|
||
00239 d->pos -= 32;
|
||
00240 d->dword = d->Speicher[d->Zaehler = (d->Zaehler + 1) & MEMMASK];
|
||
00241 ++(d->WordsRead);
|
||
00242 }
|
||
00243
|
||
00244 <span class="keywordflow">return</span> Table->Value;
|
||
00245 }
|
||
00246
|
||
00247 <span class="comment">// even faster huffman through previewing even less bits</span>
|
||
00248 <span class="comment">// works with maximum lengths up to 5</span>
|
||
00249 <span class="keyword">static</span> mpc_int32_t
|
||
00250 mpc_decoder_huffman_decode_faster(mpc_decoder *d, <span class="keyword">const</span> <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a>* Table)
|
||
00251 {
|
||
00252 <span class="comment">// load preview and decode</span>
|
||
00253 mpc_uint32_t code = d->dword << d->pos;
|
||
00254 <span class="keywordflow">if</span> (d->pos > 27) {
|
||
00255 code |= d->Speicher[(d->Zaehler + 1) & MEMMASK] >> (32 - d->pos);
|
||
00256 }
|
||
00257 <span class="keywordflow">while</span> (code < Table->Code) {
|
||
00258 Table++;
|
||
00259 }
|
||
00260
|
||
00261 <span class="comment">// set the new position within bitstream without performing a dummy-read</span>
|
||
00262 <span class="keywordflow">if</span> ((d->pos += Table->Length) >= 32) {
|
||
00263 d->pos -= 32;
|
||
00264 d->dword = d->Speicher[d->Zaehler = (d->Zaehler + 1) & MEMMASK];
|
||
00265 ++(d->WordsRead);
|
||
00266 }
|
||
00267
|
||
00268 <span class="keywordflow">return</span> Table->Value;
|
||
00269 }
|
||
00270
|
||
00271 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
00272 mpc_decoder_reset_v(mpc_decoder *d)
|
||
00273 {
|
||
00274 memset(d->V_L, 0, <span class="keyword">sizeof</span> d->V_L);
|
||
00275 memset(d->V_R, 0, <span class="keyword">sizeof</span> d->V_R);
|
||
00276 }
|
||
00277
|
||
00278 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
00279 mpc_decoder_reset_synthesis(mpc_decoder *d)
|
||
00280 {
|
||
00281 mpc_decoder_reset_v(d);
|
||
00282 }
|
||
00283
|
||
00284 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
00285 mpc_decoder_reset_y(mpc_decoder *d)
|
||
00286 {
|
||
00287 memset(d->Y_L, 0, <span class="keyword">sizeof</span> d->Y_L);
|
||
00288 memset(d->Y_R, 0, <span class="keyword">sizeof</span> d->Y_R);
|
||
00289 }
|
||
00290
|
||
00291 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
00292 mpc_decoder_reset_globals(mpc_decoder *d)
|
||
00293 {
|
||
00294 mpc_decoder_reset_bitstream_decode(d);
|
||
00295
|
||
00296 d->DecodedFrames = 0;
|
||
00297 d->StreamVersion = 0;
|
||
00298 d->MS_used = 0;
|
||
00299
|
||
00300 memset(d->Y_L , 0, <span class="keyword">sizeof</span> d->Y_L );
|
||
00301 memset(d->Y_R , 0, <span class="keyword">sizeof</span> d->Y_R );
|
||
00302 memset(d->SCF_Index_L , 0, <span class="keyword">sizeof</span> d->SCF_Index_L );
|
||
00303 memset(d->SCF_Index_R , 0, <span class="keyword">sizeof</span> d->SCF_Index_R );
|
||
00304 memset(d->Res_L , 0, <span class="keyword">sizeof</span> d->Res_L );
|
||
00305 memset(d->Res_R , 0, <span class="keyword">sizeof</span> d->Res_R );
|
||
00306 memset(d->SCFI_L , 0, <span class="keyword">sizeof</span> d->SCFI_L );
|
||
00307 memset(d->SCFI_R , 0, <span class="keyword">sizeof</span> d->SCFI_R );
|
||
00308 memset(d->DSCF_Flag_L , 0, <span class="keyword">sizeof</span> d->DSCF_Flag_L );
|
||
00309 memset(d->DSCF_Flag_R , 0, <span class="keyword">sizeof</span> d->DSCF_Flag_R );
|
||
00310 memset(d->DSCF_Reference_L, 0, <span class="keyword">sizeof</span> d->DSCF_Reference_L );
|
||
00311 memset(d->DSCF_Reference_R, 0, <span class="keyword">sizeof</span> d->DSCF_Reference_R );
|
||
00312 memset(d->Q , 0, <span class="keyword">sizeof</span> d->Q );
|
||
00313 memset(d->MS_Flag , 0, <span class="keyword">sizeof</span> d->MS_Flag );
|
||
00314 }
|
||
00315
|
||
00316 <span class="keyword">static</span> mpc_uint32_t
|
||
00317 mpc_decoder_decode_internal(mpc_decoder *d, MPC_SAMPLE_FORMAT *buffer)
|
||
00318 {
|
||
00319 mpc_uint32_t output_frame_length = MPC_FRAME_LENGTH;
|
||
00320
|
||
00321 mpc_uint32_t FrameBitCnt = 0;
|
||
00322
|
||
00323 <span class="keywordflow">if</span> (d->DecodedFrames >= d->OverallFrames) {
|
||
00324 <span class="keywordflow">return</span> (mpc_uint32_t)(-1); <span class="comment">// end of file -> abort decoding</span>
|
||
00325 }
|
||
00326
|
||
00327 <span class="comment">// read jump-info for validity check of frame</span>
|
||
00328 d->FwdJumpInfo = mpc_decoder_bitstream_read(d, 20);
|
||
00329
|
||
00330 d->ActDecodePos = (d->Zaehler << 5) + d->pos;
|
||
00331
|
||
00332 <span class="comment">// decode data and check for validity of frame</span>
|
||
00333 FrameBitCnt = mpc_decoder_bits_read(d);
|
||
00334 <span class="keywordflow">switch</span> (d->StreamVersion) {
|
||
00335 <span class="keywordflow">case</span> 0x04:
|
||
00336 <span class="keywordflow">case</span> 0x05:
|
||
00337 <span class="keywordflow">case</span> 0x06:
|
||
00338 mpc_decoder_read_bitstream_sv6(d);
|
||
00339 <span class="keywordflow">break</span>;
|
||
00340 <span class="keywordflow">case</span> 0x07:
|
||
00341 <span class="keywordflow">case</span> 0x17:
|
||
00342 mpc_decoder_read_bitstream_sv7(d);
|
||
00343 <span class="keywordflow">break</span>;
|
||
00344 <span class="keywordflow">default</span>:
|
||
00345 <span class="keywordflow">return</span> (mpc_uint32_t)(-1);
|
||
00346 }
|
||
00347 d->FrameWasValid = mpc_decoder_bits_read(d) - FrameBitCnt == d->FwdJumpInfo;
|
||
00348
|
||
00349 <span class="comment">// synthesize signal</span>
|
||
00350 mpc_decoder_requantisierung(d, d->Max_Band);
|
||
00351
|
||
00352 <span class="comment">//if ( d->EQ_activated && PluginSettings.EQbyMPC )</span>
|
||
00353 <span class="comment">// perform_EQ ();</span>
|
||
00354
|
||
00355 mpc_decoder_synthese_filter_float(d, buffer);
|
||
00356
|
||
00357 d->DecodedFrames++;
|
||
00358
|
||
00359 <span class="comment">// cut off first MPC_DECODER_SYNTH_DELAY zero-samples</span>
|
||
00360 <span class="keywordflow">if</span> (d->DecodedFrames == d->OverallFrames && d->StreamVersion >= 6) {
|
||
00361 <span class="comment">// reconstruct exact filelength</span>
|
||
00362 mpc_int32_t mod_block = mpc_decoder_bitstream_read(d, 11);
|
||
00363 mpc_int32_t FilterDecay;
|
||
00364
|
||
00365 <span class="keywordflow">if</span> (mod_block == 0) {
|
||
00366 <span class="comment">// Encoder bugfix</span>
|
||
00367 mod_block = 1152;
|
||
00368 }
|
||
00369 FilterDecay = (mod_block + MPC_DECODER_SYNTH_DELAY) % MPC_FRAME_LENGTH;
|
||
00370
|
||
00371 <span class="comment">// additional FilterDecay samples are needed for decay of synthesis filter</span>
|
||
00372 <span class="keywordflow">if</span> (MPC_DECODER_SYNTH_DELAY + mod_block >= MPC_FRAME_LENGTH) {
|
||
00373
|
||
00374 <span class="comment">// **********************************************************************</span>
|
||
00375 <span class="comment">// Rhoades 4/16/2002</span>
|
||
00376 <span class="comment">// Commented out are blocks of code which cause gapless playback to fail.</span>
|
||
00377 <span class="comment">// Temporary fix...</span>
|
||
00378 <span class="comment">// **********************************************************************</span>
|
||
00379
|
||
00380 <span class="keywordflow">if</span> (!d->TrueGaplessPresent) {
|
||
00381 mpc_decoder_reset_y(d);
|
||
00382 }
|
||
00383 <span class="keywordflow">else</span> {
|
||
00384 <span class="comment">//if ( MPC_FRAME_LENGTH != d->LastValidSamples ) {</span>
|
||
00385 mpc_decoder_bitstream_read(d, 20);
|
||
00386 mpc_decoder_read_bitstream_sv7(d);
|
||
00387 mpc_decoder_requantisierung(d, d->Max_Band);
|
||
00388 <span class="comment">//FilterDecay = d->LastValidSamples;</span>
|
||
00389 <span class="comment">//}</span>
|
||
00390 <span class="comment">//else {</span>
|
||
00391 <span class="comment">//FilterDecay = 0;</span>
|
||
00392 <span class="comment">//}</span>
|
||
00393 }
|
||
00394
|
||
00395 mpc_decoder_synthese_filter_float(d, buffer + 2304);
|
||
00396
|
||
00397 output_frame_length = MPC_FRAME_LENGTH + FilterDecay;
|
||
00398 }
|
||
00399 <span class="keywordflow">else</span> { <span class="comment">// there are only FilterDecay samples needed for this frame</span>
|
||
00400 output_frame_length = FilterDecay;
|
||
00401 }
|
||
00402 }
|
||
00403
|
||
00404 <span class="keywordflow">if</span> (d->samples_to_skip) {
|
||
00405 <span class="keywordflow">if</span> (output_frame_length < d->samples_to_skip) {
|
||
00406 d->samples_to_skip -= output_frame_length;
|
||
00407 output_frame_length = 0;
|
||
00408 }
|
||
00409 <span class="keywordflow">else</span> {
|
||
00410 output_frame_length -= d->samples_to_skip;
|
||
00411 memmove(
|
||
00412 buffer,
|
||
00413 buffer + d->samples_to_skip * 2,
|
||
00414 output_frame_length * 2 * sizeof (MPC_SAMPLE_FORMAT));
|
||
00415 d->samples_to_skip = 0;
|
||
00416 }
|
||
00417 }
|
||
00418
|
||
00419 <span class="keywordflow">return</span> output_frame_length;
|
||
00420 }
|
||
00421
|
||
<a name="l00422"></a><a class="code" href="mpc__decoder_8c.html#a32">00422</a> mpc_uint32_t <a class="code" href="musepack_8h.html#a16">mpc_decoder_decode</a>(
|
||
00423 mpc_decoder *d,
|
||
00424 MPC_SAMPLE_FORMAT *buffer,
|
||
00425 mpc_uint32_t *vbr_update_acc,
|
||
00426 mpc_uint32_t *vbr_update_bits)
|
||
00427 {
|
||
00428 <span class="keywordflow">for</span>(;;)
|
||
00429 {
|
||
00430 <span class="comment">//const mpc_int32_t MaxBrokenFrames = 0; // PluginSettings.MaxBrokenFrames</span>
|
||
00431
|
||
00432 mpc_uint32_t RING = d->Zaehler;
|
||
00433 mpc_int32_t vbr_ring = (RING << 5) + d->pos;
|
||
00434
|
||
00435 mpc_uint32_t valid_samples = mpc_decoder_decode_internal(d, buffer);
|
||
00436
|
||
00437 <span class="keywordflow">if</span> (valid_samples == (mpc_uint32_t)(-1) ) {
|
||
00438 <span class="keywordflow">return</span> 0;
|
||
00439 }
|
||
00440
|
||
00441 <span class="comment">/**************** ERROR CONCEALMENT *****************/</span>
|
||
00442 <span class="keywordflow">if</span> (d->FrameWasValid == 0 ) {
|
||
00443 <span class="comment">// error occurred in bitstream</span>
|
||
00444 <span class="keywordflow">return</span> (mpc_uint32_t)(-1);
|
||
00445 }
|
||
00446 <span class="keywordflow">else</span> {
|
||
00447 <span class="keywordflow">if</span> (vbr_update_acc && vbr_update_bits) {
|
||
00448 (*vbr_update_acc) ++;
|
||
00449 vbr_ring = (d->Zaehler << 5) + d->pos - vbr_ring;
|
||
00450 <span class="keywordflow">if</span> (vbr_ring < 0) {
|
||
00451 vbr_ring += 524288;
|
||
00452 }
|
||
00453 (*vbr_update_bits) += vbr_ring;
|
||
00454 }
|
||
00455
|
||
00456 }
|
||
00457 mpc_decoder_update_buffer(d, RING);
|
||
00458
|
||
00459 <span class="keywordflow">if</span> (valid_samples > 0) {
|
||
00460 <span class="keywordflow">return</span> valid_samples;
|
||
00461 }
|
||
00462 }
|
||
00463 }
|
||
00464
|
||
00465 <span class="keywordtype">void</span>
|
||
00466 mpc_decoder_requantisierung(mpc_decoder *d, <span class="keyword">const</span> mpc_int32_t Last_Band)
|
||
00467 {
|
||
00468 mpc_int32_t Band;
|
||
00469 mpc_int32_t n;
|
||
00470 MPC_SAMPLE_FORMAT facL;
|
||
00471 MPC_SAMPLE_FORMAT facR;
|
||
00472 MPC_SAMPLE_FORMAT templ;
|
||
00473 MPC_SAMPLE_FORMAT tempr;
|
||
00474 MPC_SAMPLE_FORMAT* YL;
|
||
00475 MPC_SAMPLE_FORMAT* YR;
|
||
00476 mpc_int32_t* L;
|
||
00477 mpc_int32_t* R;
|
||
00478
|
||
00479 <span class="preprocessor">#ifdef MPC_FIXED_POINT</span>
|
||
00480 <span class="preprocessor"></span><span class="preprocessor">#if MPC_FIXED_POINT_FRACTPART == 14</span>
|
||
00481 <span class="preprocessor"></span><span class="preprocessor">#define MPC_MULTIPLY_SCF(CcVal, SCF_idx) \</span>
|
||
00482 <span class="preprocessor"> MPC_MULTIPLY_EX(CcVal, d->SCF[SCF_idx], d->SCF_shift[SCF_idx])</span>
|
||
00483 <span class="preprocessor"></span><span class="preprocessor">#else</span>
|
||
00484 <span class="preprocessor"></span>
|
||
00485 <span class="preprocessor">#error FIXME, Cc table is in 18.14 format</span>
|
||
00486 <span class="preprocessor"></span>
|
||
00487 <span class="preprocessor">#endif</span>
|
||
00488 <span class="preprocessor"></span><span class="preprocessor">#else</span>
|
||
00489 <span class="preprocessor"></span><span class="preprocessor">#define MPC_MULTIPLY_SCF(CcVal, SCF_idx) \</span>
|
||
00490 <span class="preprocessor"> MPC_MULTIPLY(CcVal, d->SCF[SCF_idx])</span>
|
||
00491 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
|
||
00492 <span class="preprocessor"></span> <span class="comment">// requantization and scaling of subband-samples</span>
|
||
00493 <span class="keywordflow">for</span> ( Band = 0; Band <= Last_Band; Band++ ) { <span class="comment">// setting pointers</span>
|
||
00494 YL = d->Y_L[0] + Band;
|
||
00495 YR = d->Y_R[0] + Band;
|
||
00496 L = d->Q[Band].L;
|
||
00497 R = d->Q[Band].R;
|
||
00498 <span class="comment">/************************** MS-coded **************************/</span>
|
||
00499 <span class="keywordflow">if</span> ( d->MS_Flag [Band] ) {
|
||
00500 <span class="keywordflow">if</span> ( d->Res_L [Band] ) {
|
||
00501 <span class="keywordflow">if</span> ( d->Res_R [Band] ) { <span class="comment">// M!=0, S!=0</span>
|
||
00502 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][0]);
|
||
00503 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][0]);
|
||
00504 <span class="keywordflow">for</span> ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
|
||
00505 *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
|
||
00506 *YR = templ - tempr;
|
||
00507 }
|
||
00508 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][1]);
|
||
00509 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][1]);
|
||
00510 <span class="keywordflow">for</span> ( ; n < 24; n++, YL += 32, YR += 32 ) {
|
||
00511 *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
|
||
00512 *YR = templ - tempr;
|
||
00513 }
|
||
00514 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][2]);
|
||
00515 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][2]);
|
||
00516 <span class="keywordflow">for</span> ( ; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00517 *YL = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
|
||
00518 *YR = templ - tempr;
|
||
00519 }
|
||
00520 } <span class="keywordflow">else</span> { <span class="comment">// M!=0, S==0</span>
|
||
00521 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][0]);
|
||
00522 <span class="keywordflow">for</span> ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
|
||
00523 *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00524 }
|
||
00525 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][1]);
|
||
00526 <span class="keywordflow">for</span> ( ; n < 24; n++, YL += 32, YR += 32 ) {
|
||
00527 *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00528 }
|
||
00529 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][2]);
|
||
00530 <span class="keywordflow">for</span> ( ; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00531 *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00532 }
|
||
00533 }
|
||
00534 } <span class="keywordflow">else</span> {
|
||
00535 <span class="keywordflow">if</span> (d->Res_R[Band]) <span class="comment">// M==0, S!=0</span>
|
||
00536 {
|
||
00537 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][0]);
|
||
00538 <span class="keywordflow">for</span> ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
|
||
00539 *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
|
||
00540 }
|
||
00541 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][1]);
|
||
00542 <span class="keywordflow">for</span> ( ; n < 24; n++, YL += 32, YR += 32 ) {
|
||
00543 *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
|
||
00544 }
|
||
00545 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][2]);
|
||
00546 <span class="keywordflow">for</span> ( ; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00547 *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
|
||
00548 }
|
||
00549 } <span class="keywordflow">else</span> { <span class="comment">// M==0, S==0</span>
|
||
00550 <span class="keywordflow">for</span> ( n = 0; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00551 *YR = *YL = 0;
|
||
00552 }
|
||
00553 }
|
||
00554 }
|
||
00555 }
|
||
00556 <span class="comment">/************************** LR-coded **************************/</span>
|
||
00557 <span class="keywordflow">else</span> {
|
||
00558 <span class="keywordflow">if</span> ( d->Res_L [Band] ) {
|
||
00559 <span class="keywordflow">if</span> ( d->Res_R [Band] ) { <span class="comment">// L!=0, R!=0</span>
|
||
00560 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][0]);
|
||
00561 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][0]);
|
||
00562 <span class="keywordflow">for</span> (n = 0; n < 12; n++, YL += 32, YR += 32 ) {
|
||
00563 *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00564 *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
|
||
00565 }
|
||
00566 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][1]);
|
||
00567 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][1]);
|
||
00568 <span class="keywordflow">for</span> (; n < 24; n++, YL += 32, YR += 32 ) {
|
||
00569 *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00570 *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
|
||
00571 }
|
||
00572 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][2]);
|
||
00573 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][2]);
|
||
00574 <span class="keywordflow">for</span> (; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00575 *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00576 *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
|
||
00577 }
|
||
00578 } <span class="keywordflow">else</span> { <span class="comment">// L!=0, R==0</span>
|
||
00579 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][0]);
|
||
00580 <span class="keywordflow">for</span> ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
|
||
00581 *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00582 *YR = 0;
|
||
00583 }
|
||
00584 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][1]);
|
||
00585 <span class="keywordflow">for</span> ( ; n < 24; n++, YL += 32, YR += 32 ) {
|
||
00586 *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00587 *YR = 0;
|
||
00588 }
|
||
00589 facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_L[Band][2]);
|
||
00590 <span class="keywordflow">for</span> ( ; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00591 *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
|
||
00592 *YR = 0;
|
||
00593 }
|
||
00594 }
|
||
00595 }
|
||
00596 <span class="keywordflow">else</span> {
|
||
00597 <span class="keywordflow">if</span> ( d->Res_R [Band] ) { <span class="comment">// L==0, R!=0</span>
|
||
00598 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][0]);
|
||
00599 <span class="keywordflow">for</span> ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
|
||
00600 *YL = 0;
|
||
00601 *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
|
||
00602 }
|
||
00603 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][1]);
|
||
00604 <span class="keywordflow">for</span> ( ; n < 24; n++, YL += 32, YR += 32 ) {
|
||
00605 *YL = 0;
|
||
00606 *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
|
||
00607 }
|
||
00608 facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)d->SCF_Index_R[Band][2]);
|
||
00609 <span class="keywordflow">for</span> ( ; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00610 *YL = 0;
|
||
00611 *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
|
||
00612 }
|
||
00613 } <span class="keywordflow">else</span> { <span class="comment">// L==0, R==0</span>
|
||
00614 <span class="keywordflow">for</span> ( n = 0; n < 36; n++, YL += 32, YR += 32 ) {
|
||
00615 *YR = *YL = 0;
|
||
00616 }
|
||
00617 }
|
||
00618 }
|
||
00619 }
|
||
00620 }
|
||
00621 }
|
||
00622
|
||
00623 <span class="comment">/****************************************** SV 6 ******************************************/</span>
|
||
00624 <span class="keywordtype">void</span>
|
||
00625 mpc_decoder_read_bitstream_sv6(mpc_decoder *d)
|
||
00626 {
|
||
00627 mpc_int32_t n,k;
|
||
00628 mpc_int32_t Max_used_Band=0;
|
||
00629 <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a> *Table;
|
||
00630 <span class="keyword">const</span> <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a> *x1;
|
||
00631 <span class="keyword">const</span> <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a> *x2;
|
||
00632 mpc_int32_t *L;
|
||
00633 mpc_int32_t *R;
|
||
00634 mpc_int32_t *ResL = d->Res_L;
|
||
00635 mpc_int32_t *ResR = d->Res_R;
|
||
00636
|
||
00637 <span class="comment">/************************ HEADER **************************/</span>
|
||
00638 ResL = d->Res_L;
|
||
00639 ResR = d->Res_R;
|
||
00640 <span class="keywordflow">for</span> (n=0; n <= d->Max_Band; ++n, ++ResL, ++ResR)
|
||
00641 {
|
||
00642 <span class="keywordflow">if</span> (n<11) Table = d->Region_A;
|
||
00643 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (n>=11 && n<=22) Table = d->Region_B;
|
||
00644 <span class="keywordflow">else</span> <span class="comment">/*if (n>=23)*/</span> Table = d->Region_C;
|
||
00645
|
||
00646 *ResL = d->Q_res[n][mpc_decoder_huffman_decode(d, Table)];
|
||
00647 <span class="keywordflow">if</span> (d->MS_used) {
|
||
00648 d->MS_Flag[n] = mpc_decoder_bitstream_read(d, 1);
|
||
00649 }
|
||
00650 *ResR = d->Q_res[n][mpc_decoder_huffman_decode(d, Table)];
|
||
00651
|
||
00652 <span class="comment">// only perform the following procedure up to the maximum non-zero subband</span>
|
||
00653 <span class="keywordflow">if</span> (*ResL || *ResR) Max_used_Band = n;
|
||
00654 }
|
||
00655
|
||
00656 <span class="comment">/************************* SCFI-Bundle *****************************/</span>
|
||
00657 ResL = d->Res_L;
|
||
00658 ResR = d->Res_R;
|
||
00659 for (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR) {
|
||
00660 <span class="keywordflow">if</span> (*ResL) mpc_decoder_scfi_bundle_read(d, d->SCFI_Bundle, &(d->SCFI_L[n]), &(d->DSCF_Flag_L[n]));
|
||
00661 if (*ResR) mpc_decoder_scfi_bundle_read(d, d->SCFI_Bundle, &(d->SCFI_R[n]), &(d->DSCF_Flag_R[n]));
|
||
00662 }
|
||
00663
|
||
00664 <span class="comment">/***************************** SCFI ********************************/</span>
|
||
00665 ResL = d->Res_L;
|
||
00666 ResR = d->Res_R;
|
||
00667 L = d->SCF_Index_L[0];
|
||
00668 R = d->SCF_Index_R[0];
|
||
00669 <span class="keywordflow">for</span> (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3)
|
||
00670 {
|
||
00671 <span class="keywordflow">if</span> (*ResL)
|
||
00672 {
|
||
00673 <span class="comment">/*********** DSCF ************/</span>
|
||
00674 <span class="keywordflow">if</span> (d->DSCF_Flag_L[n]==1)
|
||
00675 {
|
||
00676 L[2] = d->DSCF_Reference_L[n];
|
||
00677 switch (d->SCFI_L[n])
|
||
00678 {
|
||
00679 <span class="keywordflow">case</span> 3:
|
||
00680 L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00681 L[1] = L[0];
|
||
00682 L[2] = L[1];
|
||
00683 <span class="keywordflow">break</span>;
|
||
00684 <span class="keywordflow">case</span> 1:
|
||
00685 L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00686 L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00687 L[2] = L[1];
|
||
00688 <span class="keywordflow">break</span>;
|
||
00689 <span class="keywordflow">case</span> 2:
|
||
00690 L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00691 L[1] = L[0];
|
||
00692 L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00693 <span class="keywordflow">break</span>;
|
||
00694 <span class="keywordflow">case</span> 0:
|
||
00695 L[0] = L[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00696 L[1] = L[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00697 L[2] = L[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00698 <span class="keywordflow">break</span>;
|
||
00699 <span class="keywordflow">default</span>:
|
||
00700 <span class="keywordflow">return</span>;
|
||
00701 <span class="keywordflow">break</span>;
|
||
00702 }
|
||
00703 }
|
||
00704 <span class="comment">/************ SCF ************/</span>
|
||
00705 <span class="keywordflow">else</span>
|
||
00706 {
|
||
00707 <span class="keywordflow">switch</span> (d->SCFI_L[n])
|
||
00708 {
|
||
00709 <span class="keywordflow">case</span> 3:
|
||
00710 L[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00711 L[1] = L[0];
|
||
00712 L[2] = L[1];
|
||
00713 <span class="keywordflow">break</span>;
|
||
00714 <span class="keywordflow">case</span> 1:
|
||
00715 L[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00716 L[1] = mpc_decoder_bitstream_read(d, 6);
|
||
00717 L[2] = L[1];
|
||
00718 <span class="keywordflow">break</span>;
|
||
00719 <span class="keywordflow">case</span> 2:
|
||
00720 L[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00721 L[1] = L[0];
|
||
00722 L[2] = mpc_decoder_bitstream_read(d, 6);
|
||
00723 <span class="keywordflow">break</span>;
|
||
00724 <span class="keywordflow">case</span> 0:
|
||
00725 L[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00726 L[1] = mpc_decoder_bitstream_read(d, 6);
|
||
00727 L[2] = mpc_decoder_bitstream_read(d, 6);
|
||
00728 <span class="keywordflow">break</span>;
|
||
00729 <span class="keywordflow">default</span>:
|
||
00730 <span class="keywordflow">return</span>;
|
||
00731 <span class="keywordflow">break</span>;
|
||
00732 }
|
||
00733 }
|
||
00734 <span class="comment">// update Reference for DSCF</span>
|
||
00735 d->DSCF_Reference_L[n] = L[2];
|
||
00736 }
|
||
00737 <span class="keywordflow">if</span> (*ResR)
|
||
00738 {
|
||
00739 R[2] = d->DSCF_Reference_R[n];
|
||
00740 <span class="comment">/*********** DSCF ************/</span>
|
||
00741 if (d->DSCF_Flag_R[n]==1)
|
||
00742 {
|
||
00743 switch (d->SCFI_R[n])
|
||
00744 {
|
||
00745 <span class="keywordflow">case</span> 3:
|
||
00746 R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00747 R[1] = R[0];
|
||
00748 R[2] = R[1];
|
||
00749 <span class="keywordflow">break</span>;
|
||
00750 <span class="keywordflow">case</span> 1:
|
||
00751 R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00752 R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00753 R[2] = R[1];
|
||
00754 <span class="keywordflow">break</span>;
|
||
00755 <span class="keywordflow">case</span> 2:
|
||
00756 R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00757 R[1] = R[0];
|
||
00758 R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00759 <span class="keywordflow">break</span>;
|
||
00760 <span class="keywordflow">case</span> 0:
|
||
00761 R[0] = R[2] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00762 R[1] = R[0] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00763 R[2] = R[1] + mpc_decoder_huffman_decode_fast(d, d->DSCF_Entropie);
|
||
00764 <span class="keywordflow">break</span>;
|
||
00765 <span class="keywordflow">default</span>:
|
||
00766 <span class="keywordflow">return</span>;
|
||
00767 <span class="keywordflow">break</span>;
|
||
00768 }
|
||
00769 }
|
||
00770 <span class="comment">/************ SCF ************/</span>
|
||
00771 <span class="keywordflow">else</span>
|
||
00772 {
|
||
00773 <span class="keywordflow">switch</span> (d->SCFI_R[n])
|
||
00774 {
|
||
00775 <span class="keywordflow">case</span> 3:
|
||
00776 R[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00777 R[1] = R[0];
|
||
00778 R[2] = R[1];
|
||
00779 <span class="keywordflow">break</span>;
|
||
00780 <span class="keywordflow">case</span> 1:
|
||
00781 R[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00782 R[1] = mpc_decoder_bitstream_read(d, 6);
|
||
00783 R[2] = R[1];
|
||
00784 <span class="keywordflow">break</span>;
|
||
00785 <span class="keywordflow">case</span> 2:
|
||
00786 R[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00787 R[1] = R[0];
|
||
00788 R[2] = mpc_decoder_bitstream_read(d, 6);
|
||
00789 <span class="keywordflow">break</span>;
|
||
00790 <span class="keywordflow">case</span> 0:
|
||
00791 R[0] = mpc_decoder_bitstream_read(d, 6);
|
||
00792 R[1] = mpc_decoder_bitstream_read(d, 6);
|
||
00793 R[2] = mpc_decoder_bitstream_read(d, 6);
|
||
00794 <span class="keywordflow">break</span>;
|
||
00795 <span class="keywordflow">default</span>:
|
||
00796 <span class="keywordflow">return</span>;
|
||
00797 <span class="keywordflow">break</span>;
|
||
00798 }
|
||
00799 }
|
||
00800 <span class="comment">// update Reference for DSCF</span>
|
||
00801 d->DSCF_Reference_R[n] = R[2];
|
||
00802 }
|
||
00803 }
|
||
00804
|
||
00805 <span class="comment">/**************************** Samples ****************************/</span>
|
||
00806 ResL = d->Res_L;
|
||
00807 ResR = d->Res_R;
|
||
00808 <span class="keywordflow">for</span> (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR)
|
||
00809 {
|
||
00810 <span class="comment">// setting pointers</span>
|
||
00811 x1 = d->SampleHuff[*ResL];
|
||
00812 x2 = d->SampleHuff[*ResR];
|
||
00813 L = d->Q[n].L;
|
||
00814 R = d->Q[n].R;
|
||
00815
|
||
00816 if (x1!=NULL || x2!=NULL)
|
||
00817 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
00818 {
|
||
00819 <span class="keywordflow">if</span> (x1 != NULL) *L++ = mpc_decoder_huffman_decode_fast(d, x1);
|
||
00820 <span class="keywordflow">if</span> (x2 != NULL) *R++ = mpc_decoder_huffman_decode_fast(d, x2);
|
||
00821 }
|
||
00822
|
||
00823 <span class="keywordflow">if</span> (*ResL>7 || *ResR>7)
|
||
00824 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
00825 {
|
||
00826 <span class="keywordflow">if</span> (*ResL>7) *L++ = (mpc_int32_t)mpc_decoder_bitstream_read(d, Res_bit[*ResL]) - Dc[*ResL];
|
||
00827 <span class="keywordflow">if</span> (*ResR>7) *R++ = (mpc_int32_t)mpc_decoder_bitstream_read(d, Res_bit[*ResR]) - Dc[*ResR];
|
||
00828 }
|
||
00829 }
|
||
00830 }
|
||
00831
|
||
00832 <span class="comment">/****************************************** SV 7 ******************************************/</span>
|
||
00833 <span class="keywordtype">void</span>
|
||
00834 mpc_decoder_read_bitstream_sv7(mpc_decoder *d)
|
||
00835 {
|
||
00836 <span class="comment">// these arrays hold decoding results for bundled quantizers (3- and 5-step)</span>
|
||
00837 <span class="comment">/*static*/</span> mpc_int32_t idx30[] = { -1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0, 1};
|
||
00838 <span class="comment">/*static*/</span> mpc_int32_t idx31[] = { -1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1,-1,-1,-1, 0, 0, 0, 1, 1, 1};
|
||
00839 <span class="comment">/*static*/</span> mpc_int32_t idx32[] = { -1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||
00840 <span class="comment">/*static*/</span> mpc_int32_t idx50[] = { -2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2};
|
||
00841 <span class="comment">/*static*/</span> mpc_int32_t idx51[] = { -2,-2,-2,-2,-2,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2};
|
||
00842
|
||
00843 mpc_int32_t n,k;
|
||
00844 mpc_int32_t Max_used_Band=0;
|
||
00845 <span class="keyword">const</span> <a class="code" href="structhuffman__type__t.html">HuffmanTyp</a> *Table;
|
||
00846 mpc_int32_t idx;
|
||
00847 mpc_int32_t *L ,*R;
|
||
00848 mpc_int32_t *ResL,*ResR;
|
||
00849 mpc_uint32_t tmp;
|
||
00850
|
||
00851 <span class="comment">/***************************** Header *****************************/</span>
|
||
00852 ResL = d->Res_L;
|
||
00853 ResR = d->Res_R;
|
||
00854
|
||
00855 <span class="comment">// first subband</span>
|
||
00856 *ResL = mpc_decoder_bitstream_read(d, 4);
|
||
00857 *ResR = mpc_decoder_bitstream_read(d, 4);
|
||
00858 <span class="keywordflow">if</span> (d->MS_used && !(*ResL==0 && *ResR==0)) {
|
||
00859 d->MS_Flag[0] = mpc_decoder_bitstream_read(d, 1);
|
||
00860 }
|
||
00861
|
||
00862 <span class="comment">// consecutive subbands</span>
|
||
00863 ++ResL; ++ResR; <span class="comment">// increase pointers</span>
|
||
00864 <span class="keywordflow">for</span> (n=1; n <= d->Max_Band; ++n, ++ResL, ++ResR)
|
||
00865 {
|
||
00866 idx = mpc_decoder_huffman_decode_fast(d, d->HuffHdr);
|
||
00867 *ResL = (idx!=4) ? *(ResL-1) + idx : mpc_decoder_bitstream_read(d, 4);
|
||
00868
|
||
00869 idx = mpc_decoder_huffman_decode_fast(d, d->HuffHdr);
|
||
00870 *ResR = (idx!=4) ? *(ResR-1) + idx : mpc_decoder_bitstream_read(d, 4);
|
||
00871
|
||
00872 <span class="keywordflow">if</span> (d->MS_used && !(*ResL==0 && *ResR==0)) {
|
||
00873 d->MS_Flag[n] = mpc_decoder_bitstream_read(d, 1);
|
||
00874 }
|
||
00875
|
||
00876 <span class="comment">// only perform following procedures up to the maximum non-zero subband</span>
|
||
00877 <span class="keywordflow">if</span> (*ResL!=0 || *ResR!=0) {
|
||
00878 Max_used_Band = n;
|
||
00879 }
|
||
00880 }
|
||
00881 <span class="comment">/****************************** SCFI ******************************/</span>
|
||
00882 L = d->SCFI_L;
|
||
00883 R = d->SCFI_R;
|
||
00884 ResL = d->Res_L;
|
||
00885 ResR = d->Res_R;
|
||
00886 for (n=0; n <= Max_used_Band; ++n, ++L, ++R, ++ResL, ++ResR) {
|
||
00887 <span class="keywordflow">if</span> (*ResL) *L = mpc_decoder_huffman_decode_faster(d, d->HuffSCFI);
|
||
00888 if (*ResR) *R = mpc_decoder_huffman_decode_faster(d, d->HuffSCFI);
|
||
00889 }
|
||
00890
|
||
00891 <span class="comment">/**************************** SCF/DSCF ****************************/</span>
|
||
00892 ResL = d->Res_L;
|
||
00893 ResR = d->Res_R;
|
||
00894 L = d->SCF_Index_L[0];
|
||
00895 R = d->SCF_Index_R[0];
|
||
00896 <span class="keywordflow">for</span> (n=0; n<=Max_used_Band; ++n, ++ResL, ++ResR, L+=3, R+=3) {
|
||
00897 <span class="keywordflow">if</span> (*ResL)
|
||
00898 {
|
||
00899 L[2] = d->DSCF_Reference_L[n];
|
||
00900 switch (d->SCFI_L[n])
|
||
00901 {
|
||
00902 <span class="keywordflow">case</span> 1:
|
||
00903 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00904 L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00905 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00906 L[1] = (idx!=8) ? L[0] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00907 L[2] = L[1];
|
||
00908 <span class="keywordflow">break</span>;
|
||
00909 <span class="keywordflow">case</span> 3:
|
||
00910 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00911 L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00912 L[1] = L[0];
|
||
00913 L[2] = L[1];
|
||
00914 <span class="keywordflow">break</span>;
|
||
00915 <span class="keywordflow">case</span> 2:
|
||
00916 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00917 L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00918 L[1] = L[0];
|
||
00919 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00920 L[2] = (idx!=8) ? L[1] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00921 <span class="keywordflow">break</span>;
|
||
00922 <span class="keywordflow">case</span> 0:
|
||
00923 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00924 L[0] = (idx!=8) ? L[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00925 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00926 L[1] = (idx!=8) ? L[0] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00927 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00928 L[2] = (idx!=8) ? L[1] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00929 <span class="keywordflow">break</span>;
|
||
00930 <span class="keywordflow">default</span>:
|
||
00931 <span class="keywordflow">return</span>;
|
||
00932 <span class="keywordflow">break</span>;
|
||
00933 }
|
||
00934 <span class="comment">// update Reference for DSCF</span>
|
||
00935 d->DSCF_Reference_L[n] = L[2];
|
||
00936 }
|
||
00937 <span class="keywordflow">if</span> (*ResR)
|
||
00938 {
|
||
00939 R[2] = d->DSCF_Reference_R[n];
|
||
00940 switch (d->SCFI_R[n])
|
||
00941 {
|
||
00942 <span class="keywordflow">case</span> 1:
|
||
00943 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00944 R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00945 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00946 R[1] = (idx!=8) ? R[0] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00947 R[2] = R[1];
|
||
00948 <span class="keywordflow">break</span>;
|
||
00949 <span class="keywordflow">case</span> 3:
|
||
00950 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00951 R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00952 R[1] = R[0];
|
||
00953 R[2] = R[1];
|
||
00954 <span class="keywordflow">break</span>;
|
||
00955 <span class="keywordflow">case</span> 2:
|
||
00956 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00957 R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00958 R[1] = R[0];
|
||
00959 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00960 R[2] = (idx!=8) ? R[1] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00961 <span class="keywordflow">break</span>;
|
||
00962 <span class="keywordflow">case</span> 0:
|
||
00963 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00964 R[0] = (idx!=8) ? R[2] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00965 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00966 R[1] = (idx!=8) ? R[0] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00967 idx = mpc_decoder_huffman_decode_fast(d, d->HuffDSCF);
|
||
00968 R[2] = (idx!=8) ? R[1] + idx : mpc_decoder_bitstream_read(d, 6);
|
||
00969 <span class="keywordflow">break</span>;
|
||
00970 <span class="keywordflow">default</span>:
|
||
00971 <span class="keywordflow">return</span>;
|
||
00972 <span class="keywordflow">break</span>;
|
||
00973 }
|
||
00974 <span class="comment">// update Reference for DSCF</span>
|
||
00975 d->DSCF_Reference_R[n] = R[2];
|
||
00976 }
|
||
00977 }
|
||
00978 <span class="comment">/***************************** Samples ****************************/</span>
|
||
00979 ResL = d->Res_L;
|
||
00980 ResR = d->Res_R;
|
||
00981 L = d->Q[0].L;
|
||
00982 R = d->Q[0].R;
|
||
00983 <span class="keywordflow">for</span> (n=0; n <= Max_used_Band; ++n, ++ResL, ++ResR, L+=36, R+=36)
|
||
00984 {
|
||
00985 <span class="comment">/************** links **************/</span>
|
||
00986 <span class="keywordflow">switch</span> (*ResL)
|
||
00987 {
|
||
00988 <span class="keywordflow">case</span> -2: <span class="keywordflow">case</span> -3: <span class="keywordflow">case</span> -4: <span class="keywordflow">case</span> -5: <span class="keywordflow">case</span> -6: <span class="keywordflow">case</span> -7: <span class="keywordflow">case</span> -8: <span class="keywordflow">case</span> -9:
|
||
00989 <span class="keywordflow">case</span> -10: <span class="keywordflow">case</span> -11: <span class="keywordflow">case</span> -12: <span class="keywordflow">case</span> -13: <span class="keywordflow">case</span> -14: <span class="keywordflow">case</span> -15: <span class="keywordflow">case</span> -16: <span class="keywordflow">case</span> -17:
|
||
00990 L += 36;
|
||
00991 <span class="keywordflow">break</span>;
|
||
00992 <span class="keywordflow">case</span> -1:
|
||
00993 <span class="keywordflow">for</span> (k=0; k<36; k++ ) {
|
||
00994 tmp = <a class="code" href="synth__filter_8c.html#a8">random_int</a>(d);
|
||
00995 *L++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
|
||
00996 }
|
||
00997 <span class="keywordflow">break</span>;
|
||
00998 <span class="keywordflow">case</span> 0:
|
||
00999 L += 36;<span class="comment">// increase pointer</span>
|
||
01000 <span class="keywordflow">break</span>;
|
||
01001 <span class="keywordflow">case</span> 1:
|
||
01002 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][1];
|
||
01003 <span class="keywordflow">for</span> (k=0; k<12; ++k)
|
||
01004 {
|
||
01005 idx = mpc_decoder_huffman_decode_fast(d, Table);
|
||
01006 *L++ = idx30[idx];
|
||
01007 *L++ = idx31[idx];
|
||
01008 *L++ = idx32[idx];
|
||
01009 }
|
||
01010 <span class="keywordflow">break</span>;
|
||
01011 <span class="keywordflow">case</span> 2:
|
||
01012 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][2];
|
||
01013 <span class="keywordflow">for</span> (k=0; k<18; ++k)
|
||
01014 {
|
||
01015 idx = mpc_decoder_huffman_decode_fast(d, Table);
|
||
01016 *L++ = idx50[idx];
|
||
01017 *L++ = idx51[idx];
|
||
01018 }
|
||
01019 <span class="keywordflow">break</span>;
|
||
01020 <span class="keywordflow">case</span> 3:
|
||
01021 <span class="keywordflow">case</span> 4:
|
||
01022 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL];
|
||
01023 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01024 *L++ = mpc_decoder_huffman_decode_faster(d, Table);
|
||
01025 <span class="keywordflow">break</span>;
|
||
01026 <span class="keywordflow">case</span> 5:
|
||
01027 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL];
|
||
01028 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01029 *L++ = mpc_decoder_huffman_decode_fast(d, Table);
|
||
01030 <span class="keywordflow">break</span>;
|
||
01031 <span class="keywordflow">case</span> 6:
|
||
01032 <span class="keywordflow">case</span> 7:
|
||
01033 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResL];
|
||
01034 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01035 *L++ = mpc_decoder_huffman_decode(d, Table);
|
||
01036 <span class="keywordflow">break</span>;
|
||
01037 <span class="keywordflow">case</span> 8: <span class="keywordflow">case</span> 9: <span class="keywordflow">case</span> 10: <span class="keywordflow">case</span> 11: <span class="keywordflow">case</span> 12: <span class="keywordflow">case</span> 13: <span class="keywordflow">case</span> 14: <span class="keywordflow">case</span> 15: <span class="keywordflow">case</span> 16: <span class="keywordflow">case</span> 17:
|
||
01038 tmp = Dc[*ResL];
|
||
01039 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01040 *L++ = (mpc_int32_t)mpc_decoder_bitstream_read(d, Res_bit[*ResL]) - tmp;
|
||
01041 <span class="keywordflow">break</span>;
|
||
01042 <span class="keywordflow">default</span>:
|
||
01043 <span class="keywordflow">return</span>;
|
||
01044 }
|
||
01045 <span class="comment">/************** rechts **************/</span>
|
||
01046 <span class="keywordflow">switch</span> (*ResR)
|
||
01047 {
|
||
01048 <span class="keywordflow">case</span> -2: <span class="keywordflow">case</span> -3: <span class="keywordflow">case</span> -4: <span class="keywordflow">case</span> -5: <span class="keywordflow">case</span> -6: <span class="keywordflow">case</span> -7: <span class="keywordflow">case</span> -8: <span class="keywordflow">case</span> -9:
|
||
01049 <span class="keywordflow">case</span> -10: <span class="keywordflow">case</span> -11: <span class="keywordflow">case</span> -12: <span class="keywordflow">case</span> -13: <span class="keywordflow">case</span> -14: <span class="keywordflow">case</span> -15: <span class="keywordflow">case</span> -16: <span class="keywordflow">case</span> -17:
|
||
01050 R += 36;
|
||
01051 <span class="keywordflow">break</span>;
|
||
01052 <span class="keywordflow">case</span> -1:
|
||
01053 <span class="keywordflow">for</span> (k=0; k<36; k++ ) {
|
||
01054 tmp = <a class="code" href="synth__filter_8c.html#a8">random_int</a>(d);
|
||
01055 *R++ = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >> 8) & 0xFF) + ((tmp >> 0) & 0xFF) - 510;
|
||
01056 }
|
||
01057 <span class="keywordflow">break</span>;
|
||
01058 <span class="keywordflow">case</span> 0:
|
||
01059 R += 36;<span class="comment">// increase pointer</span>
|
||
01060 <span class="keywordflow">break</span>;
|
||
01061 <span class="keywordflow">case</span> 1:
|
||
01062 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][1];
|
||
01063 <span class="keywordflow">for</span> (k=0; k<12; ++k)
|
||
01064 {
|
||
01065 idx = mpc_decoder_huffman_decode_fast(d, Table);
|
||
01066 *R++ = idx30[idx];
|
||
01067 *R++ = idx31[idx];
|
||
01068 *R++ = idx32[idx];
|
||
01069 }
|
||
01070 <span class="keywordflow">break</span>;
|
||
01071 <span class="keywordflow">case</span> 2:
|
||
01072 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][2];
|
||
01073 <span class="keywordflow">for</span> (k=0; k<18; ++k)
|
||
01074 {
|
||
01075 idx = mpc_decoder_huffman_decode_fast(d, Table);
|
||
01076 *R++ = idx50[idx];
|
||
01077 *R++ = idx51[idx];
|
||
01078 }
|
||
01079 <span class="keywordflow">break</span>;
|
||
01080 <span class="keywordflow">case</span> 3:
|
||
01081 <span class="keywordflow">case</span> 4:
|
||
01082 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR];
|
||
01083 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01084 *R++ = mpc_decoder_huffman_decode_faster(d, Table);
|
||
01085 <span class="keywordflow">break</span>;
|
||
01086 <span class="keywordflow">case</span> 5:
|
||
01087 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR];
|
||
01088 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01089 *R++ = mpc_decoder_huffman_decode_fast(d, Table);
|
||
01090 <span class="keywordflow">break</span>;
|
||
01091 <span class="keywordflow">case</span> 6:
|
||
01092 <span class="keywordflow">case</span> 7:
|
||
01093 Table = d->HuffQ[mpc_decoder_bitstream_read(d, 1)][*ResR];
|
||
01094 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01095 *R++ = mpc_decoder_huffman_decode(d, Table);
|
||
01096 <span class="keywordflow">break</span>;
|
||
01097 <span class="keywordflow">case</span> 8: <span class="keywordflow">case</span> 9: <span class="keywordflow">case</span> 10: <span class="keywordflow">case</span> 11: <span class="keywordflow">case</span> 12: <span class="keywordflow">case</span> 13: <span class="keywordflow">case</span> 14: <span class="keywordflow">case</span> 15: <span class="keywordflow">case</span> 16: <span class="keywordflow">case</span> 17:
|
||
01098 tmp = Dc[*ResR];
|
||
01099 <span class="keywordflow">for</span> (k=0; k<36; ++k)
|
||
01100 *R++ = (mpc_int32_t)mpc_decoder_bitstream_read(d, Res_bit[*ResR]) - tmp;
|
||
01101 <span class="keywordflow">break</span>;
|
||
01102 <span class="keywordflow">default</span>:
|
||
01103 <span class="keywordflow">return</span>;
|
||
01104 }
|
||
01105 }
|
||
01106 }
|
||
01107
|
||
<a name="l01108"></a><a class="code" href="mpc__decoder_8c.html#a33">01108</a> <span class="keywordtype">void</span> <a class="code" href="musepack_8h.html#a13">mpc_decoder_setup</a>(mpc_decoder *d, mpc_reader *r)
|
||
01109 {
|
||
01110 d->r = r;
|
||
01111
|
||
01112 d->HuffQ[0][0] = 0;
|
||
01113 d->HuffQ[1][0] = 0;
|
||
01114 d->HuffQ[0][1] = d->HuffQ1[0];
|
||
01115 d->HuffQ[1][1] = d->HuffQ1[1];
|
||
01116 d->HuffQ[0][2] = d->HuffQ2[0];
|
||
01117 d->HuffQ[1][2] = d->HuffQ2[1];
|
||
01118 d->HuffQ[0][3] = d->HuffQ3[0];
|
||
01119 d->HuffQ[1][3] = d->HuffQ3[1];
|
||
01120 d->HuffQ[0][4] = d->HuffQ4[0];
|
||
01121 d->HuffQ[1][4] = d->HuffQ4[1];
|
||
01122 d->HuffQ[0][5] = d->HuffQ5[0];
|
||
01123 d->HuffQ[1][5] = d->HuffQ5[1];
|
||
01124 d->HuffQ[0][6] = d->HuffQ6[0];
|
||
01125 d->HuffQ[1][6] = d->HuffQ6[1];
|
||
01126 d->HuffQ[0][7] = d->HuffQ7[0];
|
||
01127 d->HuffQ[1][7] = d->HuffQ7[1];
|
||
01128
|
||
01129 d->SampleHuff[0] = NULL;
|
||
01130 d->SampleHuff[1] = d->Entropie_1;
|
||
01131 d->SampleHuff[2] = d->Entropie_2;
|
||
01132 d->SampleHuff[3] = d->Entropie_3;
|
||
01133 d->SampleHuff[4] = d->Entropie_4;
|
||
01134 d->SampleHuff[5] = d->Entropie_5;
|
||
01135 d->SampleHuff[6] = d->Entropie_6;
|
||
01136 d->SampleHuff[7] = d->Entropie_7;
|
||
01137 d->SampleHuff[8] = NULL;
|
||
01138 d->SampleHuff[9] = NULL;
|
||
01139 d->SampleHuff[10] = NULL;
|
||
01140 d->SampleHuff[11] = NULL;
|
||
01141 d->SampleHuff[12] = NULL;
|
||
01142 d->SampleHuff[13] = NULL;
|
||
01143 d->SampleHuff[14] = NULL;
|
||
01144 d->SampleHuff[15] = NULL;
|
||
01145 d->SampleHuff[16] = NULL;
|
||
01146 d->SampleHuff[17] = NULL;
|
||
01147
|
||
01148 d->EQ_activated = 0;
|
||
01149 d->MPCHeaderPos = 0;
|
||
01150 d->StreamVersion = 0;
|
||
01151 d->MS_used = 0;
|
||
01152 d->FwdJumpInfo = 0;
|
||
01153 d->ActDecodePos = 0;
|
||
01154 d->FrameWasValid = 0;
|
||
01155 d->OverallFrames = 0;
|
||
01156 d->DecodedFrames = 0;
|
||
01157 d->LastValidSamples = 0;
|
||
01158 d->TrueGaplessPresent = 0;
|
||
01159 d->WordsRead = 0;
|
||
01160 d->Max_Band = 0;
|
||
01161 d->SampleRate = 0;
|
||
01162 <span class="comment">// clips = 0;</span>
|
||
01163 d->__r1 = 1;
|
||
01164 d->__r2 = 1;
|
||
01165
|
||
01166 d->dword = 0;
|
||
01167 d->pos = 0;
|
||
01168 d->Zaehler = 0;
|
||
01169 d->WordsRead = 0;
|
||
01170 d->Max_Band = 0;
|
||
01171
|
||
01172 mpc_decoder_initialisiere_quantisierungstabellen(d, 1.0f);
|
||
01173 <a class="code" href="huffman_8h.html#a2">mpc_decoder_init_huffman_sv6</a>(d);
|
||
01174 <a class="code" href="huffman_8h.html#a4">mpc_decoder_init_huffman_sv7</a>(d);
|
||
01175 }
|
||
01176
|
||
01177 <span class="keyword">static</span> <span class="keywordtype">void</span> mpc_decoder_set_streaminfo(mpc_decoder *d, mpc_streaminfo *si)
|
||
01178 {
|
||
01179 mpc_decoder_reset_synthesis(d);
|
||
01180 mpc_decoder_reset_globals(d);
|
||
01181
|
||
01182 d->StreamVersion = si->stream_version;
|
||
01183 d->MS_used = si->ms;
|
||
01184 d->Max_Band = si->max_band;
|
||
01185 d->OverallFrames = si->frames;
|
||
01186 d->MPCHeaderPos = si->header_position;
|
||
01187 d->LastValidSamples = si->last_frame_samples;
|
||
01188 d->TrueGaplessPresent = si->is_true_gapless;
|
||
01189 d->SampleRate = (mpc_int32_t)si->sample_freq;
|
||
01190
|
||
01191 d->samples_to_skip = MPC_DECODER_SYNTH_DELAY;
|
||
01192 }
|
||
01193
|
||
<a name="l01194"></a><a class="code" href="mpc__decoder_8c.html#a35">01194</a> BOOL <a class="code" href="musepack_8h.html#a14">mpc_decoder_initialize</a>(mpc_decoder *d, mpc_streaminfo *si)
|
||
01195 {
|
||
01196 mpc_decoder_set_streaminfo(d, si);
|
||
01197
|
||
01198 <span class="comment">// AB: setting position to the beginning of the data-bitstream</span>
|
||
01199 <span class="keywordflow">switch</span> (d->StreamVersion) {
|
||
01200 <span class="keywordflow">case</span> 0x04: f_seek(d, 4 + d->MPCHeaderPos); d->pos = 16; <span class="keywordflow">break</span>; <span class="comment">// Geht auch <20>ber eine der Helperfunktionen</span>
|
||
01201 <span class="keywordflow">case</span> 0x05:
|
||
01202 <span class="keywordflow">case</span> 0x06: f_seek(d, 8 + d->MPCHeaderPos); d->pos = 0; <span class="keywordflow">break</span>;
|
||
01203 <span class="keywordflow">case</span> 0x07:
|
||
01204 <span class="keywordflow">case</span> 0x17: <span class="comment">/*f_seek ( 24 + d->MPCHeaderPos );*/</span> d->pos = 8; <span class="keywordflow">break</span>;
|
||
01205 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> FALSE;
|
||
01206 }
|
||
01207
|
||
01208 <span class="comment">// AB: fill buffer and initialize decoder</span>
|
||
01209 f_read_dword(d, d->Speicher, MEMSIZE );
|
||
01210 d->dword = d->Speicher[d->Zaehler = 0];
|
||
01211
|
||
01212 <span class="keywordflow">return</span> TRUE;
|
||
01213 }
|
||
01214
|
||
01215 <span class="comment">//---------------------------------------------------------------</span>
|
||
01216 <span class="comment">// will seek from the beginning of the file to the desired</span>
|
||
01217 <span class="comment">// position in ms (given by seek_needed)</span>
|
||
01218 <span class="comment">//---------------------------------------------------------------</span>
|
||
01219 <span class="preprocessor">#if 0</span>
|
||
01220 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
01221 helper1(mpc_decoder *d, mpc_uint32_t bitpos)
|
||
01222 {
|
||
01223 f_seek(d, (bitpos >> 5) * 4 + d->MPCHeaderPos);
|
||
01224 f_read_dword(d, d->Speicher, 2);
|
||
01225 d->dword = d->Speicher[d->Zaehler = 0];
|
||
01226 d->pos = bitpos & 31;
|
||
01227 }
|
||
01228 <span class="preprocessor">#endif</span>
|
||
01229 <span class="preprocessor"></span>
|
||
01230 <span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
01231 helper2(mpc_decoder *d, mpc_uint32_t bitpos)
|
||
01232 {
|
||
01233 f_seek(d, (bitpos>>5) * 4 + d->MPCHeaderPos);
|
||
01234 f_read_dword(d, d->Speicher, MEMSIZE);
|
||
01235 d->dword = d->Speicher[d->Zaehler = 0];
|
||
01236 d->pos = bitpos & 31;
|
||
01237 }
|
||
01238
|
||
01239 <span class="preprocessor">#if 0</span>
|
||
01240 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span>
|
||
01241 helper3(mpc_decoder *d, mpc_uint32_t bitpos, mpc_uint32_t* buffoffs)
|
||
01242 {
|
||
01243 d->pos = bitpos & 31;
|
||
01244 bitpos >>= 5;
|
||
01245 <span class="keywordflow">if</span> ((mpc_uint32_t)(bitpos - *buffoffs) >= MEMSIZE - 2) {
|
||
01246 *buffoffs = bitpos;
|
||
01247 f_seek(d, bitpos * 4L + d->MPCHeaderPos);
|
||
01248 f_read_dword(d, d->Speicher, MEMSIZE );
|
||
01249 }
|
||
01250 d->dword = d->Speicher[d->Zaehler = bitpos - *buffoffs ];
|
||
01251 }
|
||
01252 <span class="preprocessor">#endif</span>
|
||
01253 <span class="preprocessor"></span>
|
||
01254 <span class="keyword">static</span> mpc_uint32_t get_initial_fpos(mpc_decoder *d, mpc_uint32_t StreamVersion)
|
||
01255 {
|
||
01256 mpc_uint32_t fpos = 0;
|
||
01257 <span class="keywordflow">switch</span> ( d->StreamVersion ) { <span class="comment">// setting position to the beginning of the data-bitstream</span>
|
||
01258 <span class="keywordflow">case</span> 0x04: fpos = 48; <span class="keywordflow">break</span>;
|
||
01259 <span class="keywordflow">case</span> 0x05:
|
||
01260 <span class="keywordflow">case</span> 0x06: fpos = 64; <span class="keywordflow">break</span>;
|
||
01261 <span class="keywordflow">case</span> 0x07:
|
||
01262 <span class="keywordflow">case</span> 0x17: fpos = 200; <span class="keywordflow">break</span>;
|
||
01263 }
|
||
01264 <span class="keywordflow">return</span> fpos;
|
||
01265 }
|
||
01266
|
||
<a name="l01267"></a><a class="code" href="mpc__decoder_8c.html#a38">01267</a> BOOL <a class="code" href="musepack_8h.html#a18">mpc_decoder_seek_seconds</a>(mpc_decoder *d, <span class="keywordtype">double</span> seconds)
|
||
01268 {
|
||
01269 <span class="keywordflow">return</span> <a class="code" href="musepack_8h.html#a17">mpc_decoder_seek_sample</a>(d, (mpc_int64_t)(seconds * (<span class="keywordtype">double</span>)d->SampleRate + 0.5));
|
||
01270 }
|
||
01271
|
||
<a name="l01272"></a><a class="code" href="musepack_8h.html#a17">01272</a> BOOL <a class="code" href="musepack_8h.html#a17">mpc_decoder_seek_sample</a>(mpc_decoder *d, mpc_int64_t destsample)
|
||
01273 {
|
||
01274 mpc_uint32_t fpos;
|
||
01275 mpc_uint32_t fwd;
|
||
01276
|
||
01277 fwd = (mpc_uint32_t) (destsample / MPC_FRAME_LENGTH);
|
||
01278 d->samples_to_skip = MPC_DECODER_SYNTH_DELAY + (mpc_uint32_t)(destsample % MPC_FRAME_LENGTH);
|
||
01279
|
||
01280 memset(d->Y_L , 0, <span class="keyword">sizeof</span> d->Y_L );
|
||
01281 memset(d->Y_R , 0, <span class="keyword">sizeof</span> d->Y_R );
|
||
01282 memset(d->SCF_Index_L , 0, <span class="keyword">sizeof</span> d->SCF_Index_L );
|
||
01283 memset(d->SCF_Index_R , 0, <span class="keyword">sizeof</span> d->SCF_Index_R );
|
||
01284 memset(d->Res_L , 0, <span class="keyword">sizeof</span> d->Res_L );
|
||
01285 memset(d->Res_R , 0, <span class="keyword">sizeof</span> d->Res_R );
|
||
01286 memset(d->SCFI_L , 0, <span class="keyword">sizeof</span> d->SCFI_L );
|
||
01287 memset(d->SCFI_R , 0, <span class="keyword">sizeof</span> d->SCFI_R );
|
||
01288 memset(d->DSCF_Flag_L , 0, <span class="keyword">sizeof</span> d->DSCF_Flag_L );
|
||
01289 memset(d->DSCF_Flag_R , 0, <span class="keyword">sizeof</span> d->DSCF_Flag_R );
|
||
01290 memset(d->DSCF_Reference_L, 0, <span class="keyword">sizeof</span> d->DSCF_Reference_L );
|
||
01291 memset(d->DSCF_Reference_R, 0, <span class="keyword">sizeof</span> d->DSCF_Reference_R );
|
||
01292 memset(d->Q , 0, <span class="keyword">sizeof</span> d->Q );
|
||
01293 memset(d->MS_Flag , 0, <span class="keyword">sizeof</span> d->MS_Flag );
|
||
01294
|
||
01295 <span class="comment">// resetting synthesis filter to avoid "clicks"</span>
|
||
01296 mpc_decoder_reset_synthesis(d);
|
||
01297
|
||
01298 <span class="comment">// prevent from desired position out of allowed range</span>
|
||
01299 fwd = fwd < d->OverallFrames ? fwd : d->OverallFrames;
|
||
01300
|
||
01301 <span class="comment">// reset number of decoded frames</span>
|
||
01302 d->DecodedFrames = 0;
|
||
01303
|
||
01304 fpos = get_initial_fpos(d, d->StreamVersion);
|
||
01305 <span class="keywordflow">if</span> (fpos == 0) {
|
||
01306 <span class="keywordflow">return</span> FALSE;
|
||
01307 }
|
||
01308
|
||
01309 helper2(d, fpos);
|
||
01310
|
||
01311 <span class="comment">// read the last 32 frames before the desired position to scan the scalefactors (artifactless jumping)</span>
|
||
01312 <span class="keywordflow">for</span> ( ; d->DecodedFrames < fwd; d->DecodedFrames++ ) {
|
||
01313 mpc_uint32_t FrameBitCnt;
|
||
01314 mpc_uint32_t RING;
|
||
01315 RING = d->Zaehler;
|
||
01316 d->FwdJumpInfo = mpc_decoder_bitstream_read(d, 20); <span class="comment">// read jump-info</span>
|
||
01317 d->ActDecodePos = (d->Zaehler << 5) + d->pos;
|
||
01318 FrameBitCnt = mpc_decoder_bits_read(d); <span class="comment">// scanning the scalefactors and check for validity of frame</span>
|
||
01319 <span class="keywordflow">if</span> (d->StreamVersion >= 7) {
|
||
01320 mpc_decoder_read_bitstream_sv7(d);
|
||
01321 }
|
||
01322 <span class="keywordflow">else</span> {
|
||
01323 mpc_decoder_read_bitstream_sv6(d);
|
||
01324 }
|
||
01325 <span class="keywordflow">if</span> (mpc_decoder_bits_read(d) - FrameBitCnt != d->FwdJumpInfo ) {
|
||
01326 <span class="comment">// Box ("Bug in perform_jump");</span>
|
||
01327 <span class="keywordflow">return</span> FALSE;
|
||
01328 }
|
||
01329 <span class="comment">// update buffer</span>
|
||
01330 <span class="keywordflow">if</span> ((RING ^ d->Zaehler) & MEMSIZE2) {
|
||
01331 f_read_dword(d, d->Speicher + (RING & MEMSIZE2), MEMSIZE2);
|
||
01332 }
|
||
01333 }
|
||
01334
|
||
01335 <span class="comment">// LastBitsRead = BitsRead ();</span>
|
||
01336 <span class="comment">// LastFrame = d->DecodedFrames;</span>
|
||
01337
|
||
01338 <span class="keywordflow">return</span> TRUE;
|
||
01339 }
|
||
01340
|
||
01341 <span class="keywordtype">void</span> mpc_decoder_update_buffer(mpc_decoder *d, mpc_uint32_t RING)
|
||
01342 {
|
||
01343 <span class="keywordflow">if</span> ((RING ^ d->Zaehler) & MEMSIZE2 ) {
|
||
01344 <span class="comment">// update buffer</span>
|
||
01345 f_read_dword(d, d->Speicher + (RING & MEMSIZE2), MEMSIZE2);
|
||
01346 }
|
||
01347 }
|
||
01348
|
||
01349
|
||
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sat Jan 22 09:34:07 2005 for libmusepack 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>
|