File: streaminfo_8c-source.html

package info (click to toggle)
libmpcdec 1.2.2-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny
  • size: 2,900 kB
  • ctags: 4,893
  • sloc: sh: 8,435; ansic: 2,735; cpp: 237; makefile: 88
file content (293 lines) | stat: -rw-r--r-- 30,611 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
<!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>libmpcdec: src/streaminfo.c Source File</title>
<link href="custom.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.4 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</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> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<div class="nav">
<a class="el" href="dir_000002.html">src</a></div>
<h1>streaminfo.c</h1><a href="streaminfo_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment">  Copyright (c) 2005, The Musepack Development Team</span>
<a name="l00003"></a>00003 <span class="comment">  All rights reserved.</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment">  Redistribution and use in source and binary forms, with or without</span>
<a name="l00006"></a>00006 <span class="comment">  modification, are permitted provided that the following conditions are</span>
<a name="l00007"></a>00007 <span class="comment">  met:</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment">  * Redistributions of source code must retain the above copyright</span>
<a name="l00010"></a>00010 <span class="comment">  notice, this list of conditions and the following disclaimer.</span>
<a name="l00011"></a>00011 <span class="comment"></span>
<a name="l00012"></a>00012 <span class="comment">  * Redistributions in binary form must reproduce the above</span>
<a name="l00013"></a>00013 <span class="comment">  copyright notice, this list of conditions and the following</span>
<a name="l00014"></a>00014 <span class="comment">  disclaimer in the documentation and/or other materials provided</span>
<a name="l00015"></a>00015 <span class="comment">  with the distribution.</span>
<a name="l00016"></a>00016 <span class="comment"></span>
<a name="l00017"></a>00017 <span class="comment">  * Neither the name of the The Musepack Development Team nor the</span>
<a name="l00018"></a>00018 <span class="comment">  names of its contributors may be used to endorse or promote</span>
<a name="l00019"></a>00019 <span class="comment">  products derived from this software without specific prior</span>
<a name="l00020"></a>00020 <span class="comment">  written permission.</span>
<a name="l00021"></a>00021 <span class="comment"></span>
<a name="l00022"></a>00022 <span class="comment">  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
<a name="l00023"></a>00023 <span class="comment">  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
<a name="l00024"></a>00024 <span class="comment">  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
<a name="l00025"></a>00025 <span class="comment">  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
<a name="l00026"></a>00026 <span class="comment">  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
<a name="l00027"></a>00027 <span class="comment">  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
<a name="l00028"></a>00028 <span class="comment">  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
<a name="l00029"></a>00029 <span class="comment">  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
<a name="l00030"></a>00030 <span class="comment">  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
<a name="l00031"></a>00031 <span class="comment">  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
<a name="l00032"></a>00032 <span class="comment">  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
<a name="l00033"></a>00033 <span class="comment">*/</span>
<a name="l00034"></a>00034 
<a name="l00037"></a>00037 
<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;<a class="code" href="mpcdec_8h.html">mpcdec/mpcdec.h</a>&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;<a class="code" href="internal_8h.html">mpcdec/internal.h</a>&gt;</span>
<a name="l00040"></a>00040 
<a name="l00041"></a>00041 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *
<a name="l00042"></a>00042 Stringify(mpc_uint32_t profile) <span class="comment">// profile is 0...15, where 7...13 is used</span>
<a name="l00043"></a>00043 {
<a name="l00044"></a>00044     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> na[] = <span class="stringliteral">"n.a."</span>;
<a name="l00045"></a>00045     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *Names[] = {
<a name="l00046"></a>00046         na, <span class="stringliteral">"'Unstable/Experimental'"</span>, na, na,
<a name="l00047"></a>00047         na, <span class="stringliteral">"'quality 0'"</span>, <span class="stringliteral">"'quality 1'"</span>, <span class="stringliteral">"'Telephone'"</span>,
<a name="l00048"></a>00048         <span class="stringliteral">"'Thumb'"</span>, <span class="stringliteral">"'Radio'"</span>, <span class="stringliteral">"'Standard'"</span>, <span class="stringliteral">"'Xtreme'"</span>,
<a name="l00049"></a>00049         <span class="stringliteral">"'Insane'"</span>, <span class="stringliteral">"'BrainDead'"</span>, <span class="stringliteral">"'quality 9'"</span>, <span class="stringliteral">"'quality 10'"</span>
<a name="l00050"></a>00050     };
<a name="l00051"></a>00051 
<a name="l00052"></a>00052     <span class="keywordflow">return</span> profile &gt;= <span class="keyword">sizeof</span>(Names) / <span class="keyword">sizeof</span>(*Names) ? na : Names[profile];
<a name="l00053"></a>00053 }
<a name="l00054"></a>00054 
<a name="l00055"></a>00055 <span class="keywordtype">void</span>
<a name="l00056"></a><a class="code" href="streaminfo_8c.html#a1">00056</a> <a class="code" href="mpcdec_8h.html#a9">mpc_streaminfo_init</a>(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si)
<a name="l00057"></a>00057 {
<a name="l00058"></a>00058     memset(si, 0, <span class="keyword">sizeof</span>(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a>));
<a name="l00059"></a>00059 }
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 <span class="comment">// read information from SV8 header</span>
<a name="l00062"></a>00062 <span class="comment">// not yet implemented</span>
<a name="l00063"></a>00063 <span class="keyword">static</span> mpc_int32_t
<a name="l00064"></a>00064 streaminfo_read_header_sv8(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si, <a class="code" href="structmpc__reader__t.html">mpc_reader</a> * fp)
<a name="l00065"></a>00065 {
<a name="l00066"></a>00066     (void) si;
<a name="l00067"></a>00067     (void) fp;
<a name="l00068"></a>00068     <span class="keywordflow">return</span> 0;
<a name="l00069"></a>00069 }
<a name="l00070"></a>00070 
<a name="l00072"></a>00072 <span class="keyword">static</span> mpc_int32_t
<a name="l00073"></a>00073 streaminfo_read_header_sv7(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si, mpc_uint32_t HeaderData[8])
<a name="l00074"></a>00074 {
<a name="l00075"></a>00075     <span class="keyword">const</span> mpc_int32_t samplefreqs[4] = { 44100, 48000, 37800, 32000 };
<a name="l00076"></a>00076 
<a name="l00077"></a>00077     <span class="comment">//mpc_uint32_t    HeaderData [8];</span>
<a name="l00078"></a>00078     mpc_uint16_t Estimatedpeak_title = 0;
<a name="l00079"></a>00079 
<a name="l00080"></a>00080     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &gt; 0x71) {
<a name="l00081"></a>00081         <span class="comment">//        Update (si-&gt;stream_version);</span>
<a name="l00082"></a>00082         <span class="keywordflow">return</span> 0;
<a name="l00083"></a>00083     }
<a name="l00084"></a>00084 
<a name="l00085"></a>00085     <span class="comment">/*</span>
<a name="l00086"></a>00086 <span class="comment">       if ( !fp-&gt;seek ( si-&gt;header_position ) )         // seek to header start</span>
<a name="l00087"></a>00087 <span class="comment">       return ERROR_CODE_FILE;</span>
<a name="l00088"></a>00088 <span class="comment">       if ( fp-&gt;read ( HeaderData, sizeof HeaderData) != sizeof HeaderData )</span>
<a name="l00089"></a>00089 <span class="comment">       return ERROR_CODE_FILE;</span>
<a name="l00090"></a>00090 <span class="comment">     */</span>
<a name="l00091"></a>00091 
<a name="l00092"></a>00092     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_4">bitrate</a> = 0;
<a name="l00093"></a>00093     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_6">frames</a> = HeaderData[1];
<a name="l00094"></a>00094     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_9">is</a> = 0;
<a name="l00095"></a>00095     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_10">ms</a> = (HeaderData[2] &gt;&gt; 30) &amp; 0x0001;
<a name="l00096"></a>00096     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_8">max_band</a> = (HeaderData[2] &gt;&gt; 24) &amp; 0x003F;
<a name="l00097"></a>00097     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_11">block_size</a> = 1;
<a name="l00098"></a>00098     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_12">profile</a> = (HeaderData[2] &lt;&lt; 8) &gt;&gt; 28;
<a name="l00099"></a>00099     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_13">profile_name</a> = Stringify(si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_12">profile</a>);
<a name="l00100"></a>00100     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_0">sample_freq</a> = samplefreqs[(HeaderData[2] &gt;&gt; 16) &amp; 0x0003];
<a name="l00101"></a>00101     Estimatedpeak_title = (mpc_uint16_t) (HeaderData[2] &amp; 0xFFFF);   <span class="comment">// read the ReplayGain data</span>
<a name="l00102"></a>00102     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_0">gain_title</a> = (mpc_uint16_t) ((HeaderData[3] &gt;&gt; 16) &amp; 0xFFFF);
<a name="l00103"></a>00103     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_3">peak_title</a> = (mpc_uint16_t) (HeaderData[3] &amp; 0xFFFF);
<a name="l00104"></a>00104     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_1">gain_album</a> = (mpc_uint16_t) ((HeaderData[4] &gt;&gt; 16) &amp; 0xFFFF);
<a name="l00105"></a>00105     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_2">peak_album</a> = (mpc_uint16_t) (HeaderData[4] &amp; 0xFFFF);
<a name="l00106"></a>00106     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_0">is_true_gapless</a> = (HeaderData[5] &gt;&gt; 31) &amp; 0x0001; <span class="comment">// true gapless: used?</span>
<a name="l00107"></a>00107     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_1">last_frame_samples</a> = (HeaderData[5] &gt;&gt; 20) &amp; 0x07FF;  <span class="comment">// true gapless: valid samples for last frame</span>
<a name="l00108"></a>00108     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> = (HeaderData[6] &gt;&gt; 24) &amp; 0x00FF;
<a name="l00109"></a>00109 
<a name="l00110"></a>00110     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> == 0) {
<a name="l00111"></a>00111         sprintf(si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_3">encoder</a>, <span class="stringliteral">"Buschmann 1.7.0...9, Klemm 0.90...1.05"</span>);
<a name="l00112"></a>00112     }
<a name="l00113"></a>00113     <span class="keywordflow">else</span> {
<a name="l00114"></a>00114         <span class="keywordflow">switch</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> % 10) {
<a name="l00115"></a>00115         <span class="keywordflow">case</span> 0:
<a name="l00116"></a>00116             sprintf(si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_3">encoder</a>, <span class="stringliteral">"Release %u.%u"</span>, si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> / 100,
<a name="l00117"></a>00117                     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> / 10 % 10);
<a name="l00118"></a>00118             <span class="keywordflow">break</span>;
<a name="l00119"></a>00119         <span class="keywordflow">case</span> 2:
<a name="l00120"></a>00120         <span class="keywordflow">case</span> 4:
<a name="l00121"></a>00121         <span class="keywordflow">case</span> 6:
<a name="l00122"></a>00122         <span class="keywordflow">case</span> 8:
<a name="l00123"></a>00123             sprintf(si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_3">encoder</a>, <span class="stringliteral">"Beta %u.%02u"</span>, si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> / 100,
<a name="l00124"></a>00124                     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> % 100);
<a name="l00125"></a>00125             <span class="keywordflow">break</span>;
<a name="l00126"></a>00126         <span class="keywordflow">default</span>:
<a name="l00127"></a>00127             sprintf(si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_3">encoder</a>, <span class="stringliteral">"--Alpha-- %u.%02u"</span>,
<a name="l00128"></a>00128                     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> / 100, si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> % 100);
<a name="l00129"></a>00129             <span class="keywordflow">break</span>;
<a name="l00130"></a>00130         }
<a name="l00131"></a>00131     }
<a name="l00132"></a>00132 
<a name="l00133"></a>00133     <span class="comment">//    if ( si-&gt;peak_title == 0 )                                      // there is no correct peak_title contained within header</span>
<a name="l00134"></a>00134     <span class="comment">//        si-&gt;peak_title = (mpc_uint16_t)(Estimatedpeak_title * 1.18);</span>
<a name="l00135"></a>00135     <span class="comment">//    if ( si-&gt;peak_album == 0 )</span>
<a name="l00136"></a>00136     <span class="comment">//        si-&gt;peak_album = si-&gt;peak_title;                          // no correct peak_album, use peak_title</span>
<a name="l00137"></a>00137 
<a name="l00138"></a>00138     <span class="comment">//si-&gt;sample_freq    = 44100;                                     // AB: used by all files up to SV7</span>
<a name="l00139"></a>00139     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_1">channels</a> = 2;
<a name="l00140"></a>00140 
<a name="l00141"></a>00141     <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a0">ERROR_CODE_OK</a>;
<a name="l00142"></a>00142 }
<a name="l00143"></a>00143 
<a name="l00144"></a>00144 <span class="comment">// read information from SV4-SV6 header</span>
<a name="l00145"></a>00145 <span class="keyword">static</span> mpc_int32_t
<a name="l00146"></a>00146 streaminfo_read_header_sv6(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si, mpc_uint32_t HeaderData[8])
<a name="l00147"></a>00147 {
<a name="l00148"></a>00148     <span class="comment">//mpc_uint32_t    HeaderData [8];</span>
<a name="l00149"></a>00149 
<a name="l00150"></a>00150     <span class="comment">/*</span>
<a name="l00151"></a>00151 <span class="comment">       if ( !fp-&gt;seek (  si-&gt;header_position ) )         // seek to header start</span>
<a name="l00152"></a>00152 <span class="comment">       return ERROR_CODE_FILE;</span>
<a name="l00153"></a>00153 <span class="comment">       if ( fp-&gt;read ( HeaderData, sizeof HeaderData ) != sizeof HeaderData )</span>
<a name="l00154"></a>00154 <span class="comment">       return ERROR_CODE_FILE;</span>
<a name="l00155"></a>00155 <span class="comment">     */</span>
<a name="l00156"></a>00156 
<a name="l00157"></a>00157     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_4">bitrate</a> = (HeaderData[0] &gt;&gt; 23) &amp; 0x01FF;   <span class="comment">// read the file-header (SV6 and below)</span>
<a name="l00158"></a>00158     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_9">is</a> = (HeaderData[0] &gt;&gt; 22) &amp; 0x0001;
<a name="l00159"></a>00159     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_10">ms</a> = (HeaderData[0] &gt;&gt; 21) &amp; 0x0001;
<a name="l00160"></a>00160     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> = (HeaderData[0] &gt;&gt; 11) &amp; 0x03FF;
<a name="l00161"></a>00161     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_8">max_band</a> = (HeaderData[0] &gt;&gt; 6) &amp; 0x001F;
<a name="l00162"></a>00162     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_11">block_size</a> = (HeaderData[0]) &amp; 0x003F;
<a name="l00163"></a>00163     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_12">profile</a> = 0;
<a name="l00164"></a>00164     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_13">profile_name</a> = Stringify((mpc_uint32_t) (-1));
<a name="l00165"></a>00165     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &gt;= 5)
<a name="l00166"></a>00166         si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_6">frames</a> = HeaderData[1]; <span class="comment">// 32 bit</span>
<a name="l00167"></a>00167     <span class="keywordflow">else</span>
<a name="l00168"></a>00168         si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_6">frames</a> = (HeaderData[1] &gt;&gt; 16); <span class="comment">// 16 bit</span>
<a name="l00169"></a>00169 
<a name="l00170"></a>00170     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_0">gain_title</a> = 0;          <span class="comment">// not supported</span>
<a name="l00171"></a>00171     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_3">peak_title</a> = 0;
<a name="l00172"></a>00172     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_1">gain_album</a> = 0;
<a name="l00173"></a>00173     si-&gt;<a class="code" href="structmpc__streaminfo.html#z2_2">peak_album</a> = 0;
<a name="l00174"></a>00174 
<a name="l00175"></a>00175     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_1">last_frame_samples</a> = 0;
<a name="l00176"></a>00176     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_0">is_true_gapless</a> = 0;
<a name="l00177"></a>00177 
<a name="l00178"></a>00178     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_2">encoder_version</a> = 0;
<a name="l00179"></a>00179     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_3">encoder</a>[0] = <span class="charliteral">'\0'</span>;
<a name="l00180"></a>00180 
<a name="l00181"></a>00181     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> == 7)
<a name="l00182"></a>00182         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a2">ERROR_CODE_SV7BETA</a>;  <span class="comment">// are there any unsupported parameters used?</span>
<a name="l00183"></a>00183     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_4">bitrate</a> != 0)
<a name="l00184"></a>00184         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a3">ERROR_CODE_CBR</a>;
<a name="l00185"></a>00185     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_9">is</a> != 0)
<a name="l00186"></a>00186         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a4">ERROR_CODE_IS</a>;
<a name="l00187"></a>00187     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_11">block_size</a> != 1)
<a name="l00188"></a>00188         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a5">ERROR_CODE_BLOCKSIZE</a>;
<a name="l00189"></a>00189 
<a name="l00190"></a>00190     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &lt; 6) <span class="comment">// Bugfix: last frame was invalid for up to SV5</span>
<a name="l00191"></a>00191         si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_6">frames</a> -= 1;
<a name="l00192"></a>00192 
<a name="l00193"></a>00193     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_0">sample_freq</a> = 44100;     <span class="comment">// AB: used by all files up to SV7</span>
<a name="l00194"></a>00194     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_1">channels</a> = 2;
<a name="l00195"></a>00195 
<a name="l00196"></a>00196     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &lt; 4 || si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &gt; 7)
<a name="l00197"></a>00197         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a6">ERROR_CODE_INVALIDSV</a>;
<a name="l00198"></a>00198 
<a name="l00199"></a>00199     <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a0">ERROR_CODE_OK</a>;
<a name="l00200"></a>00200 }
<a name="l00201"></a>00201 
<a name="l00202"></a>00202 <span class="comment">// reads file header and tags</span>
<a name="l00203"></a>00203 mpc_int32_t
<a name="l00204"></a><a class="code" href="streaminfo_8c.html#a5">00204</a> <a class="code" href="mpcdec_8h.html#a10">mpc_streaminfo_read</a>(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si, <a class="code" href="structmpc__reader__t.html">mpc_reader</a> * r)
<a name="l00205"></a>00205 {
<a name="l00206"></a>00206     mpc_uint32_t HeaderData[8];
<a name="l00207"></a>00207     mpc_int32_t Error = 0;
<a name="l00208"></a>00208 
<a name="l00209"></a>00209     <span class="comment">// get header position</span>
<a name="l00210"></a>00210     <span class="keywordflow">if</span> ((si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_2">header_position</a> = <a class="code" href="internal_8h.html#a2">JumpID3v2</a>(r)) &lt; 0) {
<a name="l00211"></a>00211         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a1">ERROR_CODE_FILE</a>;
<a name="l00212"></a>00212     }
<a name="l00213"></a>00213     <span class="comment">// seek to first byte of mpc data</span>
<a name="l00214"></a>00214     <span class="keywordflow">if</span> (!r-&gt;<a class="code" href="structmpc__reader__t.html#o1">seek</a>(r-&gt;<a class="code" href="structmpc__reader__t.html#o5">data</a>, si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_2">header_position</a>)) {
<a name="l00215"></a>00215         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a1">ERROR_CODE_FILE</a>;
<a name="l00216"></a>00216     }
<a name="l00217"></a>00217     <span class="keywordflow">if</span> (r-&gt;<a class="code" href="structmpc__reader__t.html#o0">read</a>(r-&gt;<a class="code" href="structmpc__reader__t.html#o5">data</a>, HeaderData, 8 * 4) != 8 * 4) {
<a name="l00218"></a>00218         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a1">ERROR_CODE_FILE</a>;
<a name="l00219"></a>00219     }
<a name="l00220"></a>00220     <span class="keywordflow">if</span> (!r-&gt;<a class="code" href="structmpc__reader__t.html#o1">seek</a>(r-&gt;<a class="code" href="structmpc__reader__t.html#o5">data</a>, si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_2">header_position</a> + 6 * 4)) {
<a name="l00221"></a>00221         <span class="keywordflow">return</span> <a class="code" href="mpcdec_8h.html#a1">ERROR_CODE_FILE</a>;
<a name="l00222"></a>00222     }
<a name="l00223"></a>00223 
<a name="l00224"></a>00224     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_5">total_file_length</a> = r-&gt;<a class="code" href="structmpc__reader__t.html#o3">get_size</a>(r-&gt;<a class="code" href="structmpc__reader__t.html#o5">data</a>);
<a name="l00225"></a>00225     si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_4">tag_offset</a> = si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_5">total_file_length</a>;
<a name="l00226"></a>00226     <span class="keywordflow">if</span> (memcmp(HeaderData, <span class="stringliteral">"MP+"</span>, 3) == 0) {
<a name="l00227"></a>00227 <span class="preprocessor">#ifndef MPC_LITTLE_ENDIAN</span>
<a name="l00228"></a>00228 <span class="preprocessor"></span>        mpc_uint32_t ptr;
<a name="l00229"></a>00229         <span class="keywordflow">for</span> (ptr = 0; ptr &lt; 8; ptr++) {
<a name="l00230"></a>00230             HeaderData[ptr] = mpc_swap32(HeaderData[ptr]);
<a name="l00231"></a>00231         }
<a name="l00232"></a>00232 <span class="preprocessor">#endif</span>
<a name="l00233"></a>00233 <span class="preprocessor"></span>        si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> = HeaderData[0] &gt;&gt; 24;
<a name="l00234"></a>00234 
<a name="l00235"></a>00235         <span class="comment">// stream version 8</span>
<a name="l00236"></a>00236         <span class="keywordflow">if</span> ((si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &amp; 15) &gt;= 8) {
<a name="l00237"></a>00237             Error = streaminfo_read_header_sv8(si, r);
<a name="l00238"></a>00238         }
<a name="l00239"></a>00239         <span class="comment">// stream version 7</span>
<a name="l00240"></a>00240         <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_3">stream_version</a> &amp; 15) == 7) {
<a name="l00241"></a>00241             Error = streaminfo_read_header_sv7(si, HeaderData);
<a name="l00242"></a>00242         }
<a name="l00243"></a>00243     }
<a name="l00244"></a>00244     <span class="keywordflow">else</span> {
<a name="l00245"></a>00245         <span class="comment">// stream version 4-6</span>
<a name="l00246"></a>00246         Error = streaminfo_read_header_sv6(si, HeaderData);
<a name="l00247"></a>00247     }
<a name="l00248"></a>00248 
<a name="l00249"></a>00249     <span class="comment">// estimation, exact value needs too much time</span>
<a name="l00250"></a>00250     si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_7">pcm_samples</a> = 1152 * si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_6">frames</a> - 576;
<a name="l00251"></a>00251 
<a name="l00252"></a>00252     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_7">pcm_samples</a> &gt; 0) {
<a name="l00253"></a>00253         si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_5">average_bitrate</a> =
<a name="l00254"></a>00254             (si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_4">tag_offset</a> -
<a name="l00255"></a>00255              si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_2">header_position</a>) * 8.0 * si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_0">sample_freq</a> / si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_7">pcm_samples</a>;
<a name="l00256"></a>00256     }
<a name="l00257"></a>00257     <span class="keywordflow">else</span> {
<a name="l00258"></a>00258         si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_5">average_bitrate</a> = 0;
<a name="l00259"></a>00259     }
<a name="l00260"></a>00260 
<a name="l00261"></a>00261     <span class="keywordflow">return</span> Error;
<a name="l00262"></a>00262 }
<a name="l00263"></a>00263 
<a name="l00264"></a>00264 <span class="keywordtype">double</span>
<a name="l00265"></a><a class="code" href="streaminfo_8c.html#a6">00265</a> <a class="code" href="mpcdec_8h.html#a11">mpc_streaminfo_get_length</a>(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si)
<a name="l00266"></a>00266 {
<a name="l00267"></a>00267     <span class="keywordflow">return</span> (<span class="keywordtype">double</span>)<a class="code" href="mpcdec_8h.html#a12">mpc_streaminfo_get_length_samples</a>(si) /
<a name="l00268"></a>00268         (double)si-&gt;sample_freq;
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270 
<a name="l00271"></a>00271 mpc_int64_t
<a name="l00272"></a><a class="code" href="streaminfo_8c.html#a7">00272</a> <a class="code" href="mpcdec_8h.html#a12">mpc_streaminfo_get_length_samples</a>(<a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> * si)
<a name="l00273"></a>00273 {
<a name="l00274"></a>00274     mpc_int64_t samples = (mpc_int64_t) si-&gt;<a class="code" href="structmpc__streaminfo.html#z1_6">frames</a> * MPC_FRAME_LENGTH;
<a name="l00275"></a>00275     <span class="keywordflow">if</span> (si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_0">is_true_gapless</a>) {
<a name="l00276"></a>00276         samples -= (MPC_FRAME_LENGTH - si-&gt;<a class="code" href="structmpc__streaminfo.html#z3_1">last_frame_samples</a>);
<a name="l00277"></a>00277     }
<a name="l00278"></a>00278     <span class="keywordflow">else</span> {
<a name="l00279"></a>00279         samples -= MPC_DECODER_SYNTH_DELAY;
<a name="l00280"></a>00280     }
<a name="l00281"></a>00281     <span class="keywordflow">return</span> samples;
<a name="l00282"></a>00282 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 23 16:35:24 2005 for libmpcdec by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address>
</body>
</html>