Mercurial > audlegacy-plugins
comparison src/madplug/decoder.c @ 959:b2fbf53360cf trunk
[svn] bug fix for #897
- make mp3 header parsing continue even if xing header is located first.
- if xing header does not provide enough information to calculate average bitrate, scan_file() now calculate it from frames.
author | yaz |
---|---|
date | Sat, 14 Apr 2007 22:08:50 -0700 |
parents | 3673bbab7372 |
children | 6ba4a4bfd127 |
comparison
equal
deleted
inserted
replaced
958:30e515b6e651 | 959:b2fbf53360cf |
---|---|
176 int tagsize = 0; | 176 int tagsize = 0; |
177 unsigned char buffer[BUFFER_SIZE]; | 177 unsigned char buffer[BUFFER_SIZE]; |
178 struct mad_frame frame; /* to read xing data */ | 178 struct mad_frame frame; /* to read xing data */ |
179 gboolean has_xing = FALSE; | 179 gboolean has_xing = FALSE; |
180 int bitrate_frames = 0; | 180 int bitrate_frames = 0; |
181 guint xing_bitrate = 0; | |
181 | 182 |
182 mad_stream_init(&stream); | 183 mad_stream_init(&stream); |
183 mad_header_init(&header); | 184 mad_header_init(&header); |
184 mad_frame_init(&frame); | 185 mad_frame_init(&frame); |
185 xing_init(&info->xing); | 186 xing_init(&info->xing); |
297 mad_timer_multiply(&info->duration, info->frames); | 298 mad_timer_multiply(&info->duration, info->frames); |
298 else { | 299 else { |
299 info->duration.seconds = info->tuple->length / 1000; | 300 info->duration.seconds = info->tuple->length / 1000; |
300 info->duration.fraction = info->tuple->length % 1000; | 301 info->duration.fraction = info->tuple->length % 1000; |
301 } | 302 } |
302 info->bitrate = | 303 xing_bitrate = |
303 8.0 * info->xing.bytes / | 304 8.0 * info->xing.bytes / |
304 mad_timer_count(info->duration, | 305 mad_timer_count(info->duration, |
305 MAD_UNITS_SECONDS); | 306 MAD_UNITS_SECONDS); |
306 break; | 307 #ifdef DEBUG |
308 g_message("xing: bitrate = %d", xing_bitrate); | |
309 #endif | |
310 continue; | |
307 } | 311 } |
308 } | 312 } |
309 | 313 |
310 } | 314 } |
311 else { | 315 else { |
361 } | 365 } |
362 if (stream.error != MAD_ERROR_BUFLEN) | 366 if (stream.error != MAD_ERROR_BUFLEN) |
363 break; | 367 break; |
364 } | 368 } |
365 | 369 |
366 if (info->vbr && !has_xing) | 370 if (info->vbr && xing_bitrate == 0) { |
367 info->bitrate = info->bitrate / bitrate_frames; | 371 info->bitrate = info->bitrate / bitrate_frames; |
372 #ifdef DEBUG | |
373 g_message("info->bitrate = %d", info->bitrate); | |
374 #endif | |
375 } | |
368 | 376 |
369 mad_frame_finish(&frame); | 377 mad_frame_finish(&frame); |
370 mad_header_finish(&header); | 378 mad_header_finish(&header); |
371 mad_stream_finish(&stream); | 379 mad_stream_finish(&stream); |
372 xing_finish(&info->xing); | 380 xing_finish(&info->xing); |
373 | 381 |
374 #ifdef DEBUG | 382 #ifdef DEBUG |
383 g_message("scan_file: info->frames = %d", info->frames); | |
375 g_message("e: scan_file"); | 384 g_message("e: scan_file"); |
376 #endif /* DEBUG */ | 385 #endif /* DEBUG */ |
377 return (info->frames != 0 || info->remote == TRUE); | 386 return (info->frames != 0 || info->remote == TRUE); |
378 } | 387 } |
379 | 388 |