Rev 1905 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1905 | serge | 1 | /* |
2 | parse: spawned from common; clustering around stream/frame parsing |
||
3 | |||
3960 | Serge | 4 | copyright ?-2012 by the mpg123 project - free software under the terms of the LGPL 2.1 |
1905 | serge | 5 | see COPYING and AUTHORS files in distribution or http://mpg123.org |
6 | initially written by Michael Hipp & Thomas Orgis |
||
7 | */ |
||
8 | |||
9 | #include "mpg123lib_intern.h" |
||
10 | |||
11 | #include |
||
12 | #include |
||
13 | |||
14 | #include "getbits.h" |
||
15 | |||
3960 | Serge | 16 | #if defined (WANT_WIN32_SOCKETS) |
17 | #include |
||
18 | #include |
||
19 | #endif |
||
1905 | serge | 20 | |
21 | /* a limit for number of frames in a track; beyond that unsigned long may not be enough to hold byte addresses */ |
||
22 | #ifdef HAVE_LIMITS_H |
||
23 | #include |
||
24 | #endif |
||
25 | #ifndef ULONG_MAX |
||
26 | /* hm, is this portable across preprocessors? */ |
||
27 | #define ULONG_MAX ((unsigned long)-1) |
||
28 | #endif |
||
29 | #define TRACK_MAX_FRAMES ULONG_MAX/4/1152 |
||
30 | |||
3960 | Serge | 31 | #include "mpeghead.h" |
32 | |||
1905 | serge | 33 | #include "debug.h" |
34 | |||
35 | #define bsbufid(fr) (fr)->bsbuf==(fr)->bsspace[0] ? 0 : ((fr)->bsbuf==fr->bsspace[1] ? 1 : ( (fr)->bsbuf==(fr)->bsspace[0]+512 ? 2 : ((fr)->bsbuf==fr->bsspace[1]+512 ? 3 : -1) ) ) |
||
36 | |||
3960 | Serge | 37 | /* PARSE_GOOD and PARSE_BAD have to be 1 and 0 (TRUE and FALSE), others can vary. */ |
38 | enum parse_codes |
||
39 | { |
||
40 | PARSE_MORE = MPG123_NEED_MORE |
||
41 | ,PARSE_ERR = MPG123_ERR |
||
42 | ,PARSE_END = 10 /* No more audio data to find. */ |
||
43 | ,PARSE_GOOD = 1 /* Everything's fine. */ |
||
44 | ,PARSE_BAD = 0 /* Not fine (invalid data). */ |
||
45 | ,PARSE_RESYNC = 2 /* Header not good, go into resync. */ |
||
46 | ,PARSE_AGAIN = 3 /* Really start over, throw away and read a new header, again. */ |
||
47 | }; |
||
1905 | serge | 48 | |
49 | /* bitrates for [mpeg1/2][layer] */ |
||
50 | static const int tabsel_123[2][3][16] = |
||
51 | { |
||
52 | { |
||
53 | {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, |
||
54 | {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, |
||
55 | {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} |
||
56 | }, |
||
57 | { |
||
58 | {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, |
||
59 | {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, |
||
60 | {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} |
||
61 | } |
||
62 | }; |
||
63 | |||
3960 | Serge | 64 | static const long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 }; |
1905 | serge | 65 | |
3960 | Serge | 66 | static int decode_header(mpg123_handle *fr,unsigned long newhead, int *freeformat_count); |
67 | static int skip_junk(mpg123_handle *fr, unsigned long *newheadp, long *headcount); |
||
68 | static int do_readahead(mpg123_handle *fr, unsigned long newhead); |
||
69 | static int wetwork(mpg123_handle *fr, unsigned long *newheadp); |
||
1905 | serge | 70 | |
71 | /* These two are to be replaced by one function that gives all the frame parameters (for outsiders).*/ |
||
3960 | Serge | 72 | /* Those functions are unsafe regarding bad arguments (inside the mpg123_handle), but just returning anything would also be unsafe, the caller code has to be trusted. */ |
1905 | serge | 73 | |
74 | int frame_bitrate(mpg123_handle *fr) |
||
75 | { |
||
76 | return tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index]; |
||
77 | } |
||
78 | |||
79 | long frame_freq(mpg123_handle *fr) |
||
80 | { |
||
81 | return freqs[fr->sampling_frequency]; |
||
82 | } |
||
83 | |||
84 | /* compiler is smart enought to inline this one or should I really do it as macro...? */ |
||
3960 | Serge | 85 | static int head_check(unsigned long head) |
1905 | serge | 86 | { |
87 | if |
||
88 | ( |
||
3960 | Serge | 89 | ((head & HDR_SYNC) != HDR_SYNC) |
1905 | serge | 90 | || |
91 | /* layer: 01,10,11 is 1,2,3; 00 is reserved */ |
||
3960 | Serge | 92 | (!(HDR_LAYER_VAL(head))) |
1905 | serge | 93 | || |
94 | /* 1111 means bad bitrate */ |
||
3960 | Serge | 95 | (HDR_BITRATE_VAL(head) == 0xf) |
1905 | serge | 96 | || |
97 | /* sampling freq: 11 is reserved */ |
||
3960 | Serge | 98 | (HDR_SAMPLERATE_VAL(head) == 0x3) |
1905 | serge | 99 | /* here used to be a mpeg 2.5 check... re-enabled 2.5 decoding due to lack of evidence that it is really not good */ |
100 | ) |
||
101 | { |
||
102 | return FALSE; |
||
103 | } |
||
104 | /* if no check failed, the header is valid (hopefully)*/ |
||
105 | else |
||
106 | { |
||
107 | return TRUE; |
||
108 | } |
||
109 | } |
||
110 | |||
111 | static int check_lame_tag(mpg123_handle *fr) |
||
112 | { |
||
113 | /* |
||
114 | going to look for Xing or Info at some position after the header |
||
115 | MPEG 1 MPEG 2/2.5 (LSF) |
||
116 | Stereo, Joint Stereo, Dual Channel 32 17 |
||
117 | Mono 17 9 |
||
118 | |||
119 | Also, how to avoid false positives? I guess I should interpret more of the header to rule that out(?). |
||
120 | I hope that ensuring all zeros until tag start is enough. |
||
121 | */ |
||
122 | int lame_offset = (fr->stereo == 2) ? (fr->lsf ? 17 : 32 ) : (fr->lsf ? 9 : 17); |
||
123 | |||
3960 | Serge | 124 | if(fr->p.flags & MPG123_IGNORE_INFOFRAME) return 0; |
125 | |||
126 | /* Note: CRC or not, that does not matter here. */ |
||
1905 | serge | 127 | if(fr->framesize >= 120+lame_offset) /* traditional Xing header is 120 bytes */ |
128 | { |
||
129 | int i; |
||
130 | int lame_type = 0; |
||
131 | debug("do we have lame tag?"); |
||
132 | /* only search for tag when all zero before it (apart from checksum) */ |
||
133 | for(i=2; i < lame_offset; ++i) if(fr->bsbuf[i] != 0) break; |
||
134 | if(i == lame_offset) |
||
135 | { |
||
136 | debug("possibly..."); |
||
137 | if |
||
138 | ( |
||
139 | (fr->bsbuf[lame_offset] == 'I') |
||
140 | && (fr->bsbuf[lame_offset+1] == 'n') |
||
141 | && (fr->bsbuf[lame_offset+2] == 'f') |
||
142 | && (fr->bsbuf[lame_offset+3] == 'o') |
||
143 | ) |
||
144 | { |
||
145 | lame_type = 1; /* We still have to see what there is */ |
||
146 | } |
||
147 | else if |
||
148 | ( |
||
149 | (fr->bsbuf[lame_offset] == 'X') |
||
150 | && (fr->bsbuf[lame_offset+1] == 'i') |
||
151 | && (fr->bsbuf[lame_offset+2] == 'n') |
||
152 | && (fr->bsbuf[lame_offset+3] == 'g') |
||
153 | ) |
||
154 | { |
||
155 | lame_type = 2; |
||
156 | fr->vbr = MPG123_VBR; /* Xing header means always VBR */ |
||
157 | } |
||
158 | if(lame_type) |
||
159 | { |
||
160 | unsigned long xing_flags; |
||
161 | |||
162 | /* we have one of these headers... */ |
||
163 | if(VERBOSE2) fprintf(stderr, "Note: Xing/Lame/Info header detected\n"); |
||
164 | /* now interpret the Xing part, I have 120 bytes total for sure */ |
||
165 | /* there are 4 bytes for flags, but only the last byte contains known ones */ |
||
166 | lame_offset += 4; /* now first byte after Xing/Name */ |
||
167 | /* 4 bytes dword for flags */ |
||
168 | #define make_long(a, o) ((((unsigned long) a[o]) << 24) | (((unsigned long) a[o+1]) << 16) | (((unsigned long) a[o+2]) << 8) | ((unsigned long) a[o+3])) |
||
169 | /* 16 bit */ |
||
170 | #define make_short(a,o) ((((unsigned short) a[o]) << 8) | ((unsigned short) a[o+1])) |
||
171 | xing_flags = make_long(fr->bsbuf, lame_offset); |
||
172 | lame_offset += 4; |
||
173 | debug1("Xing: flags 0x%08lx", xing_flags); |
||
174 | if(xing_flags & 1) /* frames */ |
||
175 | { |
||
3960 | Serge | 176 | if(fr->p.flags & MPG123_IGNORE_STREAMLENGTH) |
1905 | serge | 177 | { |
3960 | Serge | 178 | if(VERBOSE3) |
179 | fprintf(stderr, "Note: Ignoring Xing frames because of MPG123_IGNORE_STREAMLENGTH\n"); |
||
1905 | serge | 180 | } |
3960 | Serge | 181 | else |
182 | { |
||
183 | fr->track_frames = (off_t) make_long(fr->bsbuf, lame_offset); |
||
184 | if(fr->track_frames > TRACK_MAX_FRAMES) fr->track_frames = 0; /* endless stream? */ |
||
185 | #ifdef GAPLESS |
||
186 | /* All or nothing: Only if encoder delay/padding is known we'll cut samples for gapless. */ |
||
187 | if(fr->p.flags & MPG123_GAPLESS) |
||
188 | frame_gapless_init(fr, fr->track_frames, 0, 0); |
||
189 | #endif |
||
190 | if(VERBOSE3) fprintf(stderr, "Note: Xing: %lu frames\n", (long unsigned)fr->track_frames); |
||
191 | } |
||
192 | |||
1905 | serge | 193 | lame_offset += 4; |
194 | } |
||
195 | if(xing_flags & 0x2) /* bytes */ |
||
196 | { |
||
3960 | Serge | 197 | if(fr->p.flags & MPG123_IGNORE_STREAMLENGTH) |
198 | { |
||
199 | if(VERBOSE3) |
||
200 | fprintf(stderr, "Note: Ignoring Xing bytes because of MPG123_IGNORE_STREAMLENGTH\n"); |
||
201 | } |
||
1905 | serge | 202 | else |
203 | { |
||
3960 | Serge | 204 | unsigned long xing_bytes = make_long(fr->bsbuf, lame_offset); /* We assume that this is the _total_ size of the file, including Xing frame ... and ID3 frames... |
205 | It's not that clearly documented... */ |
||
206 | if(fr->rdat.filelen < 1) |
||
207 | fr->rdat.filelen = (off_t) xing_bytes; /* One could start caring for overflow here. */ |
||
208 | else |
||
1905 | serge | 209 | { |
3960 | Serge | 210 | if((off_t) xing_bytes != fr->rdat.filelen && NOQUIET) |
211 | { |
||
212 | double diff = 1.0/fr->rdat.filelen * (fr->rdat.filelen - (off_t)xing_bytes); |
||
213 | if(diff < 0.) diff = -diff; |
||
1905 | serge | 214 | |
3960 | Serge | 215 | if(VERBOSE3) |
216 | fprintf(stderr, "Note: Xing stream size %lu differs by %f%% from determined/given file size!\n", xing_bytes, diff); |
||
1905 | serge | 217 | |
3960 | Serge | 218 | if(diff > 1.) |
219 | fprintf(stderr, "Warning: Xing stream size off by more than 1%%, fuzzy seeking may be even more fuzzy than by design!\n"); |
||
220 | } |
||
1905 | serge | 221 | } |
3960 | Serge | 222 | |
223 | if(VERBOSE3) |
||
224 | fprintf(stderr, "Note: Xing: %lu bytes\n", (long unsigned)xing_bytes); |
||
1905 | serge | 225 | } |
226 | |||
227 | lame_offset += 4; |
||
228 | } |
||
229 | if(xing_flags & 0x4) /* TOC */ |
||
230 | { |
||
231 | frame_fill_toc(fr, fr->bsbuf+lame_offset); |
||
232 | lame_offset += 100; /* just skip */ |
||
233 | } |
||
234 | if(xing_flags & 0x8) /* VBR quality */ |
||
235 | { |
||
236 | if(VERBOSE3) |
||
237 | { |
||
238 | unsigned long xing_quality = make_long(fr->bsbuf, lame_offset); |
||
239 | fprintf(stderr, "Note: Xing: quality = %lu\n", (long unsigned)xing_quality); |
||
240 | } |
||
241 | lame_offset += 4; |
||
242 | } |
||
243 | /* I guess that either 0 or LAME extra data follows */ |
||
244 | if(fr->bsbuf[lame_offset] != 0) |
||
245 | { |
||
246 | unsigned char lame_vbr; |
||
247 | float replay_gain[2] = {0,0}; |
||
248 | float peak = 0; |
||
249 | float gain_offset = 0; /* going to be +6 for old lame that used 83dB */ |
||
250 | char nb[10]; |
||
251 | memcpy(nb, fr->bsbuf+lame_offset, 9); |
||
252 | nb[9] = 0; |
||
253 | if(VERBOSE3) fprintf(stderr, "Note: Info: Encoder: %s\n", nb); |
||
254 | if(!strncmp("LAME", nb, 4)) |
||
255 | { |
||
3960 | Serge | 256 | /* Lame versions before 3.95.1 used 83 dB reference level, later versions 89 dB. |
257 | We stick with 89 dB as being "normal", adding 6 dB. */ |
||
258 | unsigned int major, minor; |
||
259 | char rest[6]; |
||
260 | rest[0] = 0; |
||
261 | if(sscanf(nb+4, "%u.%u%s", &major, &minor, rest) >= 2) |
||
262 | { |
||
263 | debug3("LAME: %u/%u/%s", major, minor, rest); |
||
264 | /* We cannot detect LAME 3.95 reliably (same version string as 3.95.1), so this is a blind spot. |
||
265 | Everything < 3.95 is safe, though. */ |
||
266 | if(major < 3 || (major == 3 && minor < 95)) /* || (major == 3 && minor == 95 && rest[0] == 0)) */ |
||
267 | { |
||
268 | gain_offset = 6; |
||
269 | if(VERBOSE3) fprintf(stderr, "Note: Info: Old LAME detected, using ReplayGain preamp of %f dB.\n", gain_offset); |
||
270 | } |
||
271 | } |
||
272 | else if(VERBOSE3) fprintf(stderr, "Note: Info: Cannot determine LAME version.\n"); |
||
1905 | serge | 273 | } |
274 | lame_offset += 9; |
||
275 | /* the 4 big bits are tag revision, the small bits vbr method */ |
||
276 | lame_vbr = fr->bsbuf[lame_offset] & 15; |
||
277 | if(VERBOSE3) |
||
278 | { |
||
279 | fprintf(stderr, "Note: Info: rev %u\n", fr->bsbuf[lame_offset] >> 4); |
||
280 | fprintf(stderr, "Note: Info: vbr mode %u\n", lame_vbr); |
||
281 | } |
||
282 | lame_offset += 1; |
||
283 | switch(lame_vbr) |
||
284 | { |
||
285 | /* from rev1 proposal... not sure if all good in practice */ |
||
286 | case 1: |
||
287 | case 8: fr->vbr = MPG123_CBR; break; |
||
288 | case 2: |
||
289 | case 9: fr->vbr = MPG123_ABR; break; |
||
290 | default: fr->vbr = MPG123_VBR; /* 00==unknown is taken as VBR */ |
||
291 | } |
||
292 | /* skipping: lowpass filter value */ |
||
293 | lame_offset += 1; |
||
294 | /* replaygain */ |
||
295 | /* 32bit float: peak amplitude -- why did I parse it as int before??*/ |
||
296 | /* Ah, yes, lame seems to store it as int since some day in 2003; I've only seen zeros anyway until now, bah! */ |
||
297 | if |
||
298 | ( |
||
299 | (fr->bsbuf[lame_offset] != 0) |
||
300 | || (fr->bsbuf[lame_offset+1] != 0) |
||
301 | || (fr->bsbuf[lame_offset+2] != 0) |
||
302 | || (fr->bsbuf[lame_offset+3] != 0) |
||
303 | ) |
||
304 | { |
||
305 | debug("Wow! Is there _really_ a non-zero peak value? Now is it stored as float or int - how should I know?"); |
||
306 | /* byte*peak_bytes = (byte*) &peak; |
||
307 | ... endianess ... just copy bytes to avoid floating point operation on unaligned memory? |
||
308 | peak_bytes[0] = ... |
||
309 | peak = *(float*) (fr->bsbuf+lame_offset); */ |
||
310 | } |
||
311 | if(VERBOSE3) fprintf(stderr, "Note: Info: peak = %f (I won't use this)\n", peak); |
||
312 | peak = 0; /* until better times arrived */ |
||
313 | lame_offset += 4; |
||
314 | /* |
||
315 | ReplayGain values - lame only writes radio mode gain... |
||
316 | 16bit gain, 3 bits name, 3 bits originator, sign (1=-, 0=+), dB value*10 in 9 bits (fixed point) |
||
317 | ignore the setting if name or originator == 000! |
||
318 | radio 0 0 1 0 1 1 1 0 0 1 1 1 1 1 0 1 |
||
319 | audiophile 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 |
||
320 | */ |
||
321 | |||
322 | for(i =0; i < 2; ++i) |
||
323 | { |
||
324 | unsigned char origin = (fr->bsbuf[lame_offset] >> 2) & 0x7; /* the 3 bits after that... */ |
||
325 | if(origin != 0) |
||
326 | { |
||
327 | unsigned char gt = fr->bsbuf[lame_offset] >> 5; /* only first 3 bits */ |
||
328 | if(gt == 1) gt = 0; /* radio */ |
||
329 | else if(gt == 2) gt = 1; /* audiophile */ |
||
330 | else continue; |
||
331 | /* get the 9 bits into a number, divide by 10, multiply sign... happy bit banging */ |
||
3960 | Serge | 332 | replay_gain[gt] = (float) ((fr->bsbuf[lame_offset] & 0x2) ? -0.1 : 0.1) * (make_short(fr->bsbuf, lame_offset) & 0x1ff); |
333 | /* If this is an automatic value from LAME (or whatever), the automatic gain offset applies. |
||
334 | If a user or whoever set the value, do not touch it! 011 is automatic origin. */ |
||
335 | if(origin == 3) replay_gain[gt] += gain_offset; |
||
1905 | serge | 336 | } |
337 | lame_offset += 2; |
||
338 | } |
||
339 | if(VERBOSE3) |
||
340 | { |
||
341 | fprintf(stderr, "Note: Info: Radio Gain = %03.1fdB\n", replay_gain[0]); |
||
342 | fprintf(stderr, "Note: Info: Audiophile Gain = %03.1fdB\n", replay_gain[1]); |
||
343 | } |
||
344 | for(i=0; i < 2; ++i) |
||
345 | { |
||
346 | if(fr->rva.level[i] <= 0) |
||
347 | { |
||
348 | fr->rva.peak[i] = 0; /* at some time the parsed peak should be used */ |
||
349 | fr->rva.gain[i] = replay_gain[i]; |
||
350 | fr->rva.level[i] = 0; |
||
351 | } |
||
352 | } |
||
353 | lame_offset += 1; /* skipping encoding flags byte */ |
||
354 | if(fr->vbr == MPG123_ABR) |
||
355 | { |
||
356 | fr->abr_rate = fr->bsbuf[lame_offset]; |
||
357 | if(VERBOSE3) fprintf(stderr, "Note: Info: ABR rate = %u\n", fr->abr_rate); |
||
358 | } |
||
359 | lame_offset += 1; |
||
360 | /* encoder delay and padding, two 12 bit values... lame does write them from int ...*/ |
||
361 | if(VERBOSE3) |
||
362 | fprintf(stderr, "Note: Encoder delay = %i; padding = %i\n", |
||
363 | ((((int) fr->bsbuf[lame_offset]) << 4) | (((int) fr->bsbuf[lame_offset+1]) >> 4)), |
||
364 | (((((int) fr->bsbuf[lame_offset+1]) << 8) | (((int) fr->bsbuf[lame_offset+2]))) & 0xfff) ); |
||
365 | #ifdef GAPLESS |
||
366 | if(fr->p.flags & MPG123_GAPLESS) |
||
367 | { |
||
3960 | Serge | 368 | off_t skipbegin = ((((int) fr->bsbuf[lame_offset]) << 4) | (((int) fr->bsbuf[lame_offset+1]) >> 4)); |
369 | off_t skipend = (((((int) fr->bsbuf[lame_offset+1]) << 8) | (((int) fr->bsbuf[lame_offset+2]))) & 0xfff); |
||
370 | frame_gapless_init(fr, fr->track_frames, skipbegin, skipend); |
||
1905 | serge | 371 | } |
372 | #endif |
||
373 | } |
||
374 | /* switch buffer back ... */ |
||
375 | fr->bsbuf = fr->bsspace[fr->bsnum]+512; |
||
376 | fr->bsnum = (fr->bsnum + 1) & 1; |
||
377 | return 1; /* got it! */ |
||
378 | } |
||
379 | } |
||
380 | } |
||
381 | return 0; /* no lame tag */ |
||
382 | } |
||
383 | |||
384 | /* Just tell if the header is some mono. */ |
||
385 | static int header_mono(unsigned long newhead) |
||
386 | { |
||
3960 | Serge | 387 | return HDR_CHANNEL_VAL(newhead) == MPG_MD_MONO ? TRUE : FALSE; |
1905 | serge | 388 | } |
389 | |||
3960 | Serge | 390 | /* true if the two headers will work with the same decoding routines */ |
391 | static int head_compatible(unsigned long fred, unsigned long bret) |
||
1905 | serge | 392 | { |
3960 | Serge | 393 | return ( (fred & HDR_CMPMASK) == (bret & HDR_CMPMASK) |
394 | && header_mono(fred) == header_mono(bret) ); |
||
395 | } |
||
1905 | serge | 396 | |
3960 | Serge | 397 | static void halfspeed_prepare(mpg123_handle *fr) |
398 | { |
||
399 | /* save for repetition */ |
||
400 | if(fr->p.halfspeed && fr->lay == 3) |
||
401 | { |
||
402 | debug("halfspeed - reusing old bsbuf "); |
||
403 | memcpy (fr->ssave, fr->bsbuf, fr->ssize); |
||
404 | } |
||
405 | } |
||
406 | |||
407 | /* If this returns 1, the next frame is the repetition. */ |
||
408 | static int halfspeed_do(mpg123_handle *fr) |
||
409 | { |
||
1905 | serge | 410 | /* Speed-down hack: Play it again, Sam (the frame, I mean). */ |
411 | if (fr->p.halfspeed) |
||
412 | { |
||
413 | if(fr->halfphase) /* repeat last frame */ |
||
414 | { |
||
415 | debug("repeat!"); |
||
416 | fr->to_decode = fr->to_ignore = TRUE; |
||
417 | --fr->halfphase; |
||
418 | fr->bitindex = 0; |
||
419 | fr->wordpointer = (unsigned char *) fr->bsbuf; |
||
420 | if(fr->lay == 3) memcpy (fr->bsbuf, fr->ssave, fr->ssize); |
||
421 | if(fr->error_protection) fr->crc = getbits(fr, 16); /* skip crc */ |
||
422 | return 1; |
||
423 | } |
||
424 | else |
||
425 | { |
||
426 | fr->halfphase = fr->p.halfspeed - 1; |
||
427 | } |
||
428 | } |
||
3960 | Serge | 429 | return 0; |
430 | } |
||
1905 | serge | 431 | |
3960 | Serge | 432 | /* |
433 | Temporary macro until we got this worked out. |
||
434 | Idea is to filter out special return values that shall trigger direct jumps to end / resync / read again. |
||
435 | Particularily, the generic ret==PARSE_BAD==0 and ret==PARSE_GOOD==1 are not affected. |
||
436 | */ |
||
437 | #define JUMP_CONCLUSION(ret) \ |
||
438 | { \ |
||
439 | if(ret < 0){ debug1("%s", ret == MPG123_NEED_MORE ? "need more" : "read error"); goto read_frame_bad; } \ |
||
440 | else if(ret == PARSE_AGAIN) goto read_again; \ |
||
441 | else if(ret == PARSE_RESYNC) goto init_resync; \ |
||
442 | else if(ret == PARSE_END) goto read_frame_bad; \ |
||
443 | } |
||
444 | |||
445 | /* |
||
446 | That's a big one: read the next frame. 1 is success, <= 0 is some error |
||
447 | Special error READER_MORE means: Please feed more data and try again. |
||
448 | */ |
||
449 | int read_frame(mpg123_handle *fr) |
||
450 | { |
||
451 | /* TODO: rework this thing */ |
||
452 | int freeformat_count = 0; |
||
453 | unsigned long newhead; |
||
454 | off_t framepos; |
||
455 | int ret; |
||
456 | /* stuff that needs resetting if complete frame reading fails */ |
||
457 | int oldsize = fr->framesize; |
||
458 | int oldphase = fr->halfphase; |
||
459 | |||
460 | /* The counter for the search-first-header loop. |
||
461 | It is persistent outside the loop to prevent seemingly endless loops |
||
462 | when repeatedly headers are found that do not have valid followup headers. */ |
||
463 | long headcount = 0; |
||
464 | |||
465 | fr->fsizeold=fr->framesize; /* for Layer3 */ |
||
466 | |||
467 | if(halfspeed_do(fr) == 1) return 1; |
||
468 | |||
1905 | serge | 469 | read_again: |
3960 | Serge | 470 | /* In case we are looping to find a valid frame, discard any buffered data before the current position. |
471 | This is essential to prevent endless looping, always going back to the beginning when feeder buffer is exhausted. */ |
||
472 | if(fr->rd->forget != NULL) fr->rd->forget(fr); |
||
1905 | serge | 473 | |
3960 | Serge | 474 | debug2("trying to get frame %"OFF_P" at %"OFF_P, (off_p)fr->num+1, (off_p)fr->rd->tell(fr)); |
475 | if((ret = fr->rd->head_read(fr,&newhead)) <= 0){ debug1("need more? (%i)", ret); goto read_frame_bad;} |
||
476 | |||
1905 | serge | 477 | init_resync: |
478 | |||
479 | fr->header_change = 2; /* output format change is possible... */ |
||
480 | if(fr->oldhead) /* check a following header for change */ |
||
481 | { |
||
482 | if(fr->oldhead == newhead) fr->header_change = 0; |
||
483 | else |
||
3960 | Serge | 484 | /* Headers that match in this test behave the same for the outside world. |
485 | namely: same decoding routines, same amount of decoded data. */ |
||
486 | if(head_compatible(fr->oldhead, newhead)) |
||
487 | fr->header_change = 1; |
||
1905 | serge | 488 | } |
489 | |||
490 | #ifdef SKIP_JUNK |
||
3960 | Serge | 491 | if(!fr->firsthead && !head_check(newhead)) |
492 | { |
||
493 | ret = skip_junk(fr, &newhead, &headcount); |
||
494 | JUMP_CONCLUSION(ret); |
||
495 | } |
||
1905 | serge | 496 | #endif |
497 | |||
3960 | Serge | 498 | ret = head_check(newhead); |
499 | if(ret) ret = decode_header(fr, newhead, &freeformat_count); |
||
1905 | serge | 500 | |
3960 | Serge | 501 | JUMP_CONCLUSION(ret); /* That only continues for ret == PARSE_BAD or PARSE_GOOD. */ |
502 | if(ret == PARSE_BAD) |
||
503 | { /* Header was not good. */ |
||
504 | ret = wetwork(fr, &newhead); /* Messy stuff, handle junk, resync ... */ |
||
505 | JUMP_CONCLUSION(ret); |
||
506 | /* Normally, we jumped already. If for some reason everything's fine to continue, do continue. */ |
||
507 | if(ret != PARSE_GOOD) goto read_frame_bad; |
||
1905 | serge | 508 | } |
509 | |||
3960 | Serge | 510 | if(!fr->firsthead) |
1905 | serge | 511 | { |
3960 | Serge | 512 | ret = do_readahead(fr, newhead); |
513 | /* readahead can fail mit NEED_MORE, in which case we must also make the just read header available again for next go */ |
||
514 | if(ret < 0) fr->rd->back_bytes(fr, 4); |
||
515 | JUMP_CONCLUSION(ret); |
||
1905 | serge | 516 | } |
517 | |||
3960 | Serge | 518 | /* Now we should have our valid header and proceed to reading the frame. */ |
1905 | serge | 519 | |
520 | /* if filepos is invalid, so is framepos */ |
||
521 | framepos = fr->rd->tell(fr) - 4; |
||
522 | /* flip/init buffer for Layer 3 */ |
||
523 | { |
||
524 | unsigned char *newbuf = fr->bsspace[fr->bsnum]+512; |
||
525 | /* read main data into memory */ |
||
526 | if((ret=fr->rd->read_frame_body(fr,newbuf,fr->framesize))<0) |
||
527 | { |
||
528 | /* if failed: flip back */ |
||
529 | debug("need more?"); |
||
530 | goto read_frame_bad; |
||
531 | } |
||
532 | fr->bsbufold = fr->bsbuf; |
||
533 | fr->bsbuf = newbuf; |
||
534 | } |
||
535 | fr->bsnum = (fr->bsnum + 1) & 1; |
||
536 | |||
537 | if(!fr->firsthead) |
||
538 | { |
||
539 | fr->firsthead = newhead; /* _now_ it's time to store it... the first real header */ |
||
540 | /* This is the first header of our current stream segment. |
||
541 | It is only the actual first header of the whole stream when fr->num is still below zero! |
||
542 | Think of resyncs where firsthead has been reset for format flexibility. */ |
||
543 | if(fr->num < 0) |
||
544 | { |
||
545 | fr->audio_start = framepos; |
||
546 | /* Only check for LAME tag at beginning of whole stream |
||
547 | ... when there indeed is one in between, it's the user's problem. */ |
||
548 | if(fr->lay == 3 && check_lame_tag(fr) == 1) |
||
549 | { /* ...in practice, Xing/LAME tags are layer 3 only. */ |
||
550 | if(fr->rd->forget != NULL) fr->rd->forget(fr); |
||
551 | |||
552 | fr->oldhead = 0; |
||
553 | goto read_again; |
||
554 | } |
||
555 | /* now adjust volume */ |
||
556 | do_rva(fr); |
||
557 | } |
||
558 | |||
559 | debug2("fr->firsthead: %08lx, audio_start: %li", fr->firsthead, (long int)fr->audio_start); |
||
560 | } |
||
561 | |||
562 | fr->bitindex = 0; |
||
563 | fr->wordpointer = (unsigned char *) fr->bsbuf; |
||
564 | /* Question: How bad does the floating point value get with repeated recomputation? |
||
565 | Also, considering that we can play the file or parts of many times. */ |
||
566 | if(++fr->mean_frames != 0) |
||
567 | { |
||
568 | fr->mean_framesize = ((fr->mean_frames-1)*fr->mean_framesize+compute_bpf(fr)) / fr->mean_frames ; |
||
569 | } |
||
570 | ++fr->num; /* 0 for first frame! */ |
||
3960 | Serge | 571 | debug4("Frame %"OFF_P" %08lx %i, next filepos=%"OFF_P, |
572 | (off_p)fr->num, newhead, fr->framesize, (off_p)fr->rd->tell(fr)); |
||
573 | if(!(fr->state_flags & FRAME_FRANKENSTEIN) && ( |
||
574 | (fr->track_frames > 0 && fr->num >= fr->track_frames) |
||
575 | #ifdef GAPLESS |
||
576 | || (fr->gapless_frames > 0 && fr->num >= fr->gapless_frames) |
||
577 | #endif |
||
578 | )) |
||
1905 | serge | 579 | { |
3960 | Serge | 580 | fr->state_flags |= FRAME_FRANKENSTEIN; |
581 | if(NOQUIET) fprintf(stderr, "\nWarning: Encountered more data after announced end of track (frame %"OFF_P"/%"OFF_P"). Frankenstein!\n", (off_p)fr->num, |
||
582 | #ifdef GAPLESS |
||
583 | fr->gapless_frames > 0 ? (off_p)fr->gapless_frames : |
||
584 | #endif |
||
585 | (off_p)fr->track_frames); |
||
1905 | serge | 586 | } |
587 | |||
3960 | Serge | 588 | halfspeed_prepare(fr); |
589 | |||
1905 | serge | 590 | /* index the position */ |
3960 | Serge | 591 | fr->input_offset = framepos; |
1905 | serge | 592 | #ifdef FRAME_INDEX |
593 | /* Keep track of true frame positions in our frame index. |
||
594 | but only do so when we are sure that the frame number is accurate... */ |
||
3960 | Serge | 595 | if((fr->state_flags & FRAME_ACCURATE) && FI_NEXT(fr->index, fr->num)) |
1905 | serge | 596 | fi_add(&fr->index, framepos); |
597 | #endif |
||
598 | |||
599 | if(fr->silent_resync > 0) --fr->silent_resync; |
||
600 | |||
601 | if(fr->rd->forget != NULL) fr->rd->forget(fr); |
||
602 | |||
603 | fr->to_decode = fr->to_ignore = TRUE; |
||
604 | if(fr->error_protection) fr->crc = getbits(fr, 16); /* skip crc */ |
||
605 | |||
3960 | Serge | 606 | fr->oldhead = newhead; |
607 | |||
1905 | serge | 608 | return 1; |
609 | read_frame_bad: |
||
3960 | Serge | 610 | /* Also if we searched for valid data in vein, we can forget skipped data. |
611 | Otherwise, the feeder would hold every dead old byte in memory until the first valid frame! */ |
||
612 | if(fr->rd->forget != NULL) fr->rd->forget(fr); |
||
613 | |||
1905 | serge | 614 | fr->silent_resync = 0; |
615 | if(fr->err == MPG123_OK) fr->err = MPG123_ERR_READER; |
||
616 | fr->framesize = oldsize; |
||
617 | fr->halfphase = oldphase; |
||
3960 | Serge | 618 | /* That return code might be inherited from some feeder action, or reader error. */ |
1905 | serge | 619 | return ret; |
620 | } |
||
621 | |||
622 | |||
623 | /* |
||
624 | * read ahead and find the next MPEG header, to guess framesize |
||
3960 | Serge | 625 | * return value: success code |
626 | * PARSE_GOOD: found a valid frame size (stored in the handle). |
||
627 | * <0: error codes, possibly from feeder buffer (NEED_MORE) |
||
628 | * PARSE_BAD: cannot get the framesize for some reason and shall silentry try the next possible header (if this is no free format stream after all...) |
||
1905 | serge | 629 | */ |
3960 | Serge | 630 | static int guess_freeformat_framesize(mpg123_handle *fr) |
1905 | serge | 631 | { |
632 | long i; |
||
633 | int ret; |
||
634 | unsigned long head; |
||
635 | if(!(fr->rdat.flags & (READER_SEEKABLE|READER_BUFFERED))) |
||
636 | { |
||
637 | if(NOQUIET) error("Cannot look for freeformat frame size with non-seekable and non-buffered stream!"); |
||
3960 | Serge | 638 | |
639 | return PARSE_BAD; |
||
1905 | serge | 640 | } |
641 | if((ret=fr->rd->head_read(fr,&head))<=0) |
||
3960 | Serge | 642 | return ret; |
1905 | serge | 643 | |
644 | /* We are already 4 bytes into it */ |
||
3960 | Serge | 645 | for(i=4;i |
646 | { |
||
647 | if((ret=fr->rd->head_shift(fr,&head))<=0) return ret; |
||
648 | |||
649 | /* No head_check needed, the mask contains all relevant bits. */ |
||
650 | if((head & HDR_SAMEMASK) == (fr->oldhead & HDR_SAMEMASK)) |
||
1905 | serge | 651 | { |
3960 | Serge | 652 | fr->rd->back_bytes(fr,i+1); |
653 | fr->framesize = i-3; |
||
654 | return PARSE_GOOD; /* Success! */ |
||
1905 | serge | 655 | } |
656 | } |
||
657 | fr->rd->back_bytes(fr,i); |
||
3960 | Serge | 658 | return PARSE_BAD; |
1905 | serge | 659 | } |
660 | |||
661 | |||
662 | /* |
||
663 | * decode a header and write the information |
||
664 | * into the frame structure |
||
3960 | Serge | 665 | * Return values are compatible with those of read_frame, namely: |
666 | * 1: success |
||
667 | * 0: no valid header |
||
668 | * <0: some error |
||
669 | * You are required to do a head_check() before calling! |
||
1905 | serge | 670 | */ |
3960 | Serge | 671 | static int decode_header(mpg123_handle *fr,unsigned long newhead, int *freeformat_count) |
1905 | serge | 672 | { |
3960 | Serge | 673 | #ifdef DEBUG /* Do not waste cycles checking the header twice all the time. */ |
1905 | serge | 674 | if(!head_check(newhead)) |
675 | { |
||
3960 | Serge | 676 | error1("trying to decode obviously invalid header 0x%08lx", newhead); |
1905 | serge | 677 | } |
3960 | Serge | 678 | #endif |
679 | if(HDR_VERSION_VAL(newhead) & 0x2) |
||
1905 | serge | 680 | { |
3960 | Serge | 681 | fr->lsf = (HDR_VERSION_VAL(newhead) & 0x1) ? 0 : 1; |
1905 | serge | 682 | fr->mpeg25 = 0; |
683 | } |
||
684 | else |
||
685 | { |
||
686 | fr->lsf = 1; |
||
687 | fr->mpeg25 = 1; |
||
688 | } |
||
689 | |||
690 | if( (fr->p.flags & MPG123_NO_RESYNC) || !fr->oldhead |
||
3960 | Serge | 691 | || (HDR_VERSION_VAL(fr->oldhead) != HDR_VERSION_VAL(newhead)) ) |
1905 | serge | 692 | { |
693 | /* If "tryresync" is false, assume that certain |
||
694 | parameters do not change within the stream! |
||
695 | Force an update if lsf or mpeg25 settings |
||
696 | have changed. */ |
||
3960 | Serge | 697 | fr->lay = 4 - HDR_LAYER_VAL(newhead); |
1905 | serge | 698 | if(fr->mpeg25) |
3960 | Serge | 699 | fr->sampling_frequency = 6 + HDR_SAMPLERATE_VAL(newhead); |
1905 | serge | 700 | else |
3960 | Serge | 701 | fr->sampling_frequency = HDR_SAMPLERATE_VAL(newhead) + (fr->lsf*3); |
1905 | serge | 702 | } |
703 | |||
704 | #ifdef DEBUG |
||
3960 | Serge | 705 | /* seen a file where this varies (old lame tag without crc, track with crc) */ |
706 | if((HDR_CRC_VAL(newhead)^0x1) != fr->error_protection) debug("changed crc bit!"); |
||
1905 | serge | 707 | #endif |
3960 | Serge | 708 | fr->error_protection = HDR_CRC_VAL(newhead)^0x1; |
709 | fr->bitrate_index = HDR_BITRATE_VAL(newhead); |
||
710 | fr->padding = HDR_PADDING_VAL(newhead); |
||
711 | fr->extension = HDR_PRIVATE_VAL(newhead); |
||
712 | fr->mode = HDR_CHANNEL_VAL(newhead); |
||
713 | fr->mode_ext = HDR_CHANEX_VAL(newhead); |
||
714 | fr->copyright = HDR_COPYRIGHT_VAL(newhead); |
||
715 | fr->original = HDR_ORIGINAL_VAL(newhead); |
||
716 | fr->emphasis = HDR_EMPHASIS_VAL(newhead); |
||
717 | fr->freeformat = !(newhead & HDR_BITRATE); |
||
1905 | serge | 718 | |
3960 | Serge | 719 | fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; |
1905 | serge | 720 | |
721 | /* we can't use tabsel_123 for freeformat, so trying to guess framesize... */ |
||
722 | if(fr->freeformat) |
||
723 | { |
||
724 | /* when we first encounter the frame with freeformat, guess framesize */ |
||
725 | if(fr->freeformat_framesize < 0) |
||
726 | { |
||
3960 | Serge | 727 | int ret; |
728 | *freeformat_count += 1; |
||
729 | if(*freeformat_count > 5) |
||
1905 | serge | 730 | { |
3960 | Serge | 731 | if(VERBOSE3) error("You fooled me too often. Refusing to guess free format frame size _again_."); |
732 | return PARSE_BAD; |
||
733 | } |
||
734 | ret = guess_freeformat_framesize(fr); |
||
735 | if(ret == PARSE_GOOD) |
||
736 | { |
||
1905 | serge | 737 | fr->freeformat_framesize = fr->framesize - fr->padding; |
3960 | Serge | 738 | if(VERBOSE2) |
739 | fprintf(stderr, "Note: free format frame size %li\n", fr->freeformat_framesize); |
||
1905 | serge | 740 | } |
741 | else |
||
742 | { |
||
3960 | Serge | 743 | if(ret == MPG123_NEED_MORE) |
744 | debug("Need more data to guess free format frame size."); |
||
745 | else if(VERBOSE3) |
||
746 | error("Encountered free format header, but failed to guess frame size."); |
||
747 | |||
748 | return ret; |
||
1905 | serge | 749 | } |
750 | } |
||
751 | /* freeformat should be CBR, so the same framesize can be used at the 2nd reading or later */ |
||
752 | else |
||
753 | { |
||
754 | fr->framesize = fr->freeformat_framesize + fr->padding; |
||
755 | } |
||
756 | } |
||
757 | |||
758 | switch(fr->lay) |
||
759 | { |
||
760 | #ifndef NO_LAYER1 |
||
761 | case 1: |
||
762 | fr->do_layer = do_layer1; |
||
763 | if(!fr->freeformat) |
||
764 | { |
||
765 | fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; |
||
766 | fr->framesize /= freqs[fr->sampling_frequency]; |
||
767 | fr->framesize = ((fr->framesize+fr->padding)<<2)-4; |
||
768 | } |
||
769 | break; |
||
770 | #endif |
||
771 | #ifndef NO_LAYER2 |
||
772 | case 2: |
||
773 | fr->do_layer = do_layer2; |
||
774 | if(!fr->freeformat) |
||
775 | { |
||
776 | debug2("bitrate index: %i (%i)", fr->bitrate_index, tabsel_123[fr->lsf][1][fr->bitrate_index] ); |
||
777 | fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; |
||
778 | fr->framesize /= freqs[fr->sampling_frequency]; |
||
779 | fr->framesize += fr->padding - 4; |
||
780 | } |
||
781 | break; |
||
782 | #endif |
||
783 | #ifndef NO_LAYER3 |
||
784 | case 3: |
||
785 | fr->do_layer = do_layer3; |
||
786 | if(fr->lsf) |
||
787 | fr->ssize = (fr->stereo == 1) ? 9 : 17; |
||
788 | else |
||
789 | fr->ssize = (fr->stereo == 1) ? 17 : 32; |
||
790 | |||
791 | if(fr->error_protection) |
||
792 | fr->ssize += 2; |
||
793 | |||
794 | if(!fr->freeformat) |
||
795 | { |
||
796 | fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; |
||
797 | fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf); |
||
798 | fr->framesize = fr->framesize + fr->padding - 4; |
||
799 | } |
||
800 | break; |
||
801 | #endif |
||
802 | default: |
||
803 | if(NOQUIET) error1("Layer type %i not supported in this build!", fr->lay); |
||
804 | |||
3960 | Serge | 805 | return PARSE_BAD; |
1905 | serge | 806 | } |
807 | if (fr->framesize > MAXFRAMESIZE) |
||
808 | { |
||
809 | if(NOQUIET) error1("Frame size too big: %d", fr->framesize+4-fr->padding); |
||
810 | |||
3960 | Serge | 811 | return PARSE_BAD; |
1905 | serge | 812 | } |
3960 | Serge | 813 | return PARSE_GOOD; |
1905 | serge | 814 | } |
815 | |||
816 | void set_pointer(mpg123_handle *fr, long backstep) |
||
817 | { |
||
818 | fr->wordpointer = fr->bsbuf + fr->ssize - backstep; |
||
819 | if (backstep) |
||
820 | memcpy(fr->wordpointer,fr->bsbufold+fr->fsizeold-backstep,backstep); |
||
821 | |||
822 | fr->bitindex = 0; |
||
823 | } |
||
824 | |||
825 | /********************************/ |
||
826 | |||
827 | double compute_bpf(mpg123_handle *fr) |
||
828 | { |
||
829 | double bpf; |
||
830 | |||
831 | switch(fr->lay) |
||
832 | { |
||
833 | case 1: |
||
834 | bpf = tabsel_123[fr->lsf][0][fr->bitrate_index]; |
||
835 | bpf *= 12000.0 * 4.0; |
||
836 | bpf /= freqs[fr->sampling_frequency] <<(fr->lsf); |
||
837 | break; |
||
838 | case 2: |
||
839 | case 3: |
||
840 | bpf = tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index]; |
||
841 | bpf *= 144000; |
||
842 | bpf /= freqs[fr->sampling_frequency] << (fr->lsf); |
||
843 | break; |
||
844 | default: |
||
845 | bpf = 1.0; |
||
846 | } |
||
847 | |||
848 | return bpf; |
||
849 | } |
||
850 | |||
3960 | Serge | 851 | int attribute_align_arg mpg123_spf(mpg123_handle *mh) |
852 | { |
||
853 | if(mh == NULL) return MPG123_ERR; |
||
854 | |||
855 | return spf(mh); |
||
856 | } |
||
857 | |||
1905 | serge | 858 | double attribute_align_arg mpg123_tpf(mpg123_handle *fr) |
859 | { |
||
860 | static int bs[4] = { 0,384,1152,1152 }; |
||
861 | double tpf; |
||
862 | if(fr == NULL) return -1; |
||
863 | |||
864 | tpf = (double) bs[fr->lay]; |
||
865 | tpf /= freqs[fr->sampling_frequency] << (fr->lsf); |
||
866 | return tpf; |
||
867 | } |
||
868 | |||
869 | int attribute_align_arg mpg123_position(mpg123_handle *fr, off_t no, off_t buffsize, |
||
870 | off_t *current_frame, off_t *frames_left, |
||
871 | double *current_seconds, double *seconds_left) |
||
872 | { |
||
873 | double tpf; |
||
874 | double dt = 0.0; |
||
875 | off_t cur, left; |
||
876 | double curs, lefts; |
||
877 | |||
878 | if(!fr || !fr->rd) /* Isn't this too paranoid? */ |
||
879 | { |
||
880 | debug("reader troubles!"); |
||
881 | return MPG123_ERR; |
||
882 | } |
||
883 | |||
884 | no += fr->num; /* no starts out as offset */ |
||
885 | cur = no; |
||
886 | tpf = mpg123_tpf(fr); |
||
887 | if(buffsize > 0 && fr->af.rate > 0 && fr->af.channels > 0) |
||
888 | { |
||
889 | dt = (double) buffsize / fr->af.rate / fr->af.channels; |
||
890 | if(fr->af.encoding & MPG123_ENC_16) dt *= 0.5; |
||
891 | } |
||
892 | |||
893 | left = 0; |
||
894 | |||
895 | if((fr->track_frames != 0) && (fr->track_frames >= fr->num)) left = no < fr->track_frames ? fr->track_frames - no : 0; |
||
896 | else |
||
897 | if(fr->rdat.filelen >= 0) |
||
898 | { |
||
899 | double bpf; |
||
900 | off_t t = fr->rd->tell(fr); |
||
901 | bpf = fr->mean_framesize ? fr->mean_framesize : compute_bpf(fr); |
||
902 | left = (off_t)((double)(fr->rdat.filelen-t)/bpf); |
||
903 | /* no can be different for prophetic purposes, file pointer is always associated with fr->num! */ |
||
904 | if(fr->num != no) |
||
905 | { |
||
906 | if(fr->num > no) left += fr->num - no; |
||
907 | else |
||
908 | { |
||
909 | if(left >= (no - fr->num)) left -= no - fr->num; |
||
910 | else left = 0; /* uh, oh! */ |
||
911 | } |
||
912 | } |
||
913 | /* I totally don't understand why we should re-estimate the given correct(?) value */ |
||
914 | /* fr->num = (unsigned long)((double)t/bpf); */ |
||
915 | } |
||
916 | |||
917 | /* beginning with 0 or 1?*/ |
||
918 | curs = (double) no*tpf-dt; |
||
919 | lefts = (double)left*tpf+dt; |
||
920 | #if 0 |
||
921 | curs = curs < 0 ? 0.0 : curs; |
||
922 | #endif |
||
923 | if(left < 0 || lefts < 0) |
||
924 | { /* That is the case for non-seekable streams. */ |
||
925 | left = 0; |
||
926 | lefts = 0.0; |
||
927 | } |
||
928 | if(current_frame != NULL) *current_frame = cur; |
||
929 | if(frames_left != NULL) *frames_left = left; |
||
930 | if(current_seconds != NULL) *current_seconds = curs; |
||
931 | if(seconds_left != NULL) *seconds_left = lefts; |
||
932 | return MPG123_OK; |
||
933 | } |
||
934 | |||
935 | int get_songlen(mpg123_handle *fr,int no) |
||
936 | { |
||
937 | double tpf; |
||
938 | |||
939 | if(!fr) |
||
940 | return 0; |
||
941 | |||
942 | if(no < 0) { |
||
943 | if(!fr->rd || fr->rdat.filelen < 0) |
||
944 | return 0; |
||
945 | no = (int) ((double) fr->rdat.filelen / compute_bpf(fr)); |
||
946 | } |
||
947 | |||
948 | tpf = mpg123_tpf(fr); |
||
949 | return (int) (no*tpf); |
||
950 | } |
||
3960 | Serge | 951 | |
952 | /* first attempt of read ahead check to find the real first header; cannot believe what junk is out there! */ |
||
953 | static int do_readahead(mpg123_handle *fr, unsigned long newhead) |
||
954 | { |
||
955 | unsigned long nexthead = 0; |
||
956 | int hd = 0; |
||
957 | off_t start, oret; |
||
958 | int ret; |
||
959 | |||
960 | if( ! (!fr->firsthead && fr->rdat.flags & (READER_SEEKABLE|READER_BUFFERED)) ) |
||
961 | return PARSE_GOOD; |
||
962 | |||
963 | start = fr->rd->tell(fr); |
||
964 | |||
965 | debug2("doing ahead check with BPF %d at %"OFF_P, fr->framesize+4, (off_p)start); |
||
966 | /* step framesize bytes forward and read next possible header*/ |
||
967 | if((oret=fr->rd->skip_bytes(fr, fr->framesize))<0) |
||
968 | { |
||
969 | if(oret==READER_ERROR && NOQUIET) error("cannot seek!"); |
||
970 | |||
971 | return oret == MPG123_NEED_MORE ? PARSE_MORE : PARSE_ERR; |
||
972 | } |
||
973 | |||
974 | /* Read header, seek back. */ |
||
975 | hd = fr->rd->head_read(fr,&nexthead); |
||
976 | if( fr->rd->back_bytes(fr, fr->rd->tell(fr)-start) < 0 ) |
||
977 | { |
||
978 | if(NOQUIET) error("Cannot seek back!"); |
||
979 | |||
980 | return PARSE_ERR; |
||
981 | } |
||
982 | if(hd == MPG123_NEED_MORE) return PARSE_MORE; |
||
983 | |||
984 | debug1("After fetching next header, at %"OFF_P, (off_p)fr->rd->tell(fr)); |
||
985 | if(!hd) |
||
986 | { |
||
987 | if(NOQUIET) warning("Cannot read next header, a one-frame stream? Duh..."); |
||
988 | return PARSE_END; |
||
989 | } |
||
990 | |||
991 | debug2("does next header 0x%08lx match first 0x%08lx?", nexthead, newhead); |
||
992 | if(!head_check(nexthead) || !head_compatible(newhead, nexthead)) |
||
993 | { |
||
994 | debug("No, the header was not valid, start from beginning..."); |
||
995 | fr->oldhead = 0; /* start over */ |
||
996 | /* try next byte for valid header */ |
||
997 | if((ret=fr->rd->back_bytes(fr, 3))<0) |
||
998 | { |
||
999 | if(NOQUIET) error("Cannot seek 3 bytes back!"); |
||
1000 | |||
1001 | return PARSE_ERR; |
||
1002 | } |
||
1003 | return PARSE_AGAIN; |
||
1004 | } |
||
1005 | else return PARSE_GOOD; |
||
1006 | } |
||
1007 | |||
1008 | static int handle_id3v2(mpg123_handle *fr, unsigned long newhead) |
||
1009 | { |
||
1010 | int ret; |
||
1011 | fr->oldhead = 0; /* Think about that. Used to be present only for skipping of junk, not resync-style wetwork. */ |
||
1012 | ret = parse_new_id3(fr, newhead); |
||
1013 | if (ret < 0) return ret; |
||
1014 | #ifndef NO_ID3V2 |
||
1015 | else if(ret > 0){ debug("got ID3v2"); fr->metaflags |= MPG123_NEW_ID3|MPG123_ID3; } |
||
1016 | else debug("no useful ID3v2"); |
||
1017 | #endif |
||
1018 | return PARSE_AGAIN; |
||
1019 | } |
||
1020 | |||
1021 | /* watch out for junk/tags on beginning of stream by invalid header */ |
||
1022 | static int skip_junk(mpg123_handle *fr, unsigned long *newheadp, long *headcount) |
||
1023 | { |
||
1024 | int ret; |
||
1025 | int freeformat_count = 0; |
||
1026 | long limit = 65536; |
||
1027 | unsigned long newhead = *newheadp; |
||
1028 | /* check for id3v2; first three bytes (of 4) are "ID3" */ |
||
1029 | if((newhead & (unsigned long) 0xffffff00) == (unsigned long) 0x49443300) |
||
1030 | { |
||
1031 | return handle_id3v2(fr, newhead); |
||
1032 | } |
||
1033 | else if(VERBOSE2 && fr->silent_resync == 0) fprintf(stderr,"Note: Junk at the beginning (0x%08lx)\n",newhead); |
||
1034 | |||
1035 | /* I even saw RIFF headers at the beginning of MPEG streams ;( */ |
||
1036 | if(newhead == ('R'<<24)+('I'<<16)+('F'<<8)+'F') |
||
1037 | { |
||
1038 | if(VERBOSE2 && fr->silent_resync == 0) fprintf(stderr, "Note: Looks like a RIFF header.\n"); |
||
1039 | |||
1040 | if((ret=fr->rd->head_read(fr,&newhead))<=0) return ret; |
||
1041 | |||
1042 | while(newhead != ('d'<<24)+('a'<<16)+('t'<<8)+'a') |
||
1043 | { |
||
1044 | if((ret=fr->rd->head_shift(fr,&newhead))<=0) return ret; |
||
1045 | } |
||
1046 | if((ret=fr->rd->head_read(fr,&newhead))<=0) return ret; |
||
1047 | |||
1048 | if(VERBOSE2 && fr->silent_resync == 0) fprintf(stderr,"Note: Skipped RIFF header!\n"); |
||
1049 | |||
1050 | fr->oldhead = 0; |
||
1051 | *newheadp = newhead; |
||
1052 | return PARSE_AGAIN; |
||
1053 | } |
||
1054 | |||
1055 | /* |
||
1056 | Unhandled junk... just continue search for a header, stepping in single bytes through next 64K. |
||
1057 | This is rather identical to the resync loop. |
||
1058 | */ |
||
1059 | debug("searching for header..."); |
||
1060 | *newheadp = 0; /* Invalidate the external value. */ |
||
1061 | ret = 0; /* We will check the value after the loop. */ |
||
1062 | |||
1063 | /* We prepare for at least the 64K bytes as usual, unless |
||
1064 | user explicitly wanted more (even infinity). Never less. */ |
||
1065 | if(fr->p.resync_limit < 0 || fr->p.resync_limit > limit) |
||
1066 | limit = fr->p.resync_limit; |
||
1067 | |||
1068 | do |
||
1069 | { |
||
1070 | ++(*headcount); |
||
1071 | if(limit >= 0 && *headcount >= limit) break; |
||
1072 | |||
1073 | if((ret=fr->rd->head_shift(fr,&newhead))<=0) return ret; |
||
1074 | |||
1075 | if(head_check(newhead) && (ret=decode_header(fr, newhead, &freeformat_count))) break; |
||
1076 | } while(1); |
||
1077 | if(ret<0) return ret; |
||
1078 | |||
1079 | if(limit >= 0 && *headcount >= limit) |
||
1080 | { |
||
1081 | if(NOQUIET) error1("Giving up searching valid MPEG header after %li bytes of junk.", *headcount); |
||
1082 | return PARSE_END; |
||
1083 | } |
||
1084 | else debug1("hopefully found one at %"OFF_P, (off_p)fr->rd->tell(fr)); |
||
1085 | |||
1086 | /* If the new header ist good, it is already decoded. */ |
||
1087 | *newheadp = newhead; |
||
1088 | return PARSE_GOOD; |
||
1089 | } |
||
1090 | |||
1091 | /* The newhead is bad, so let's check if it is something special, otherwise just resync. */ |
||
1092 | static int wetwork(mpg123_handle *fr, unsigned long *newheadp) |
||
1093 | { |
||
1094 | int ret = PARSE_ERR; |
||
1095 | unsigned long newhead = *newheadp; |
||
1096 | *newheadp = 0; |
||
1097 | |||
1098 | /* Classic ID3 tags. Read, then start parsing again. */ |
||
1099 | if((newhead & 0xffffff00) == ('T'<<24)+('A'<<16)+('G'<<8)) |
||
1100 | { |
||
1101 | fr->id3buf[0] = (unsigned char) ((newhead >> 24) & 0xff); |
||
1102 | fr->id3buf[1] = (unsigned char) ((newhead >> 16) & 0xff); |
||
1103 | fr->id3buf[2] = (unsigned char) ((newhead >> 8) & 0xff); |
||
1104 | fr->id3buf[3] = (unsigned char) ( newhead & 0xff); |
||
1105 | |||
1106 | if((ret=fr->rd->fullread(fr,fr->id3buf+4,124)) < 0) return ret; |
||
1107 | |||
1108 | fr->metaflags |= MPG123_NEW_ID3|MPG123_ID3; |
||
1109 | fr->rdat.flags |= READER_ID3TAG; /* that marks id3v1 */ |
||
1110 | if(VERBOSE3) fprintf(stderr,"Note: Skipped ID3v1 tag.\n"); |
||
1111 | |||
1112 | return PARSE_AGAIN; |
||
1113 | } |
||
1114 | /* This is similar to initial junk skipping code... */ |
||
1115 | /* Check for id3v2; first three bytes (of 4) are "ID3" */ |
||
1116 | if((newhead & (unsigned long) 0xffffff00) == (unsigned long) 0x49443300) |
||
1117 | { |
||
1118 | return handle_id3v2(fr, newhead); |
||
1119 | } |
||
1120 | else if(NOQUIET && fr->silent_resync == 0) |
||
1121 | { |
||
1122 | fprintf(stderr,"Note: Illegal Audio-MPEG-Header 0x%08lx at offset %"OFF_P".\n", |
||
1123 | newhead, (off_p)fr->rd->tell(fr)-4); |
||
1124 | } |
||
1125 | |||
1126 | /* Now we got something bad at hand, try to recover. */ |
||
1127 | |||
1128 | if(NOQUIET && (newhead & 0xffffff00) == ('b'<<24)+('m'<<16)+('p'<<8)) fprintf(stderr,"Note: Could be a BMP album art.\n"); |
||
1129 | |||
1130 | if( !(fr->p.flags & MPG123_NO_RESYNC) ) |
||
1131 | { |
||
1132 | long try = 0; |
||
1133 | long limit = fr->p.resync_limit; |
||
1134 | |||
1135 | /* If a resync is needed the bitreservoir of previous frames is no longer valid */ |
||
1136 | fr->bitreservoir = 0; |
||
1137 | |||
1138 | if(NOQUIET && fr->silent_resync == 0) fprintf(stderr, "Note: Trying to resync...\n"); |
||
1139 | |||
1140 | do /* ... shift the header with additional single bytes until be found something that could be a header. */ |
||
1141 | { |
||
1142 | ++try; |
||
1143 | if(limit >= 0 && try >= limit) break; |
||
1144 | |||
1145 | if((ret=fr->rd->head_shift(fr,&newhead)) <= 0) |
||
1146 | { |
||
1147 | *newheadp = newhead; |
||
1148 | if(NOQUIET) fprintf (stderr, "Note: Hit end of (available) data during resync.\n"); |
||
1149 | |||
1150 | return ret ? ret : PARSE_END; |
||
1151 | } |
||
1152 | if(VERBOSE3) debug3("resync try %li at %"OFF_P", got newhead 0x%08lx", try, (off_p)fr->rd->tell(fr), newhead); |
||
1153 | } while(!head_check(newhead)); |
||
1154 | |||
1155 | *newheadp = newhead; |
||
1156 | if(NOQUIET && fr->silent_resync == 0) fprintf (stderr, "Note: Skipped %li bytes in input.\n", try); |
||
1157 | |||
1158 | /* Now we either got something that could be a header, or we gave up. */ |
||
1159 | if(limit >= 0 && try >= limit) |
||
1160 | { |
||
1161 | if(NOQUIET) |
||
1162 | error1("Giving up resync after %li bytes - your stream is not nice... (maybe increasing resync limit could help).", try); |
||
1163 | |||
1164 | fr->err = MPG123_RESYNC_FAIL; |
||
1165 | return PARSE_ERR; |
||
1166 | } |
||
1167 | else |
||
1168 | { |
||
1169 | debug1("Found possibly valid header 0x%lx... unsetting firsthead to reinit stream.", newhead); |
||
1170 | fr->firsthead = 0; |
||
1171 | fr->oldhead = 0; |
||
1172 | return PARSE_RESYNC; |
||
1173 | } |
||
1174 | } |
||
1175 | else |
||
1176 | { |
||
1177 | if(NOQUIET) error("not attempting to resync..."); |
||
1178 | |||
1179 | fr->err = MPG123_OUT_OF_SYNC; |
||
1180 | return PARSE_ERR; |
||
1181 | } |
||
1182 | /* Control never goes here... we return before that. */ |
||
1183 | }=>8))><8))>16)+('p'<<8))><16)+('p'<<8))>24)+('m'<<16)+('p'<<8))><24)+('m'<<16)+('p'<<8))>>8)) |