comparison src/madplug/decoder.c @ 673:8ed0af226d0e trunk

[svn] - calculate vbr bitrate properly. - mainwin shows dynamic bitrate for vbr.
author yaz
date Mon, 19 Feb 2007 04:55:14 -0800
parents 8829833d37bc
children fadf4c18a1cf
comparison
equal deleted inserted replaced
672:ada6a5ad1851 673:8ed0af226d0e
175 int len = 0; 175 int len = 0;
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 181
181 mad_stream_init(&stream); 182 mad_stream_init(&stream);
182 mad_header_init(&header); 183 mad_header_init(&header);
183 mad_frame_init(&frame); 184 mad_frame_init(&frame);
184 xing_init(&info->xing); 185 xing_init(&info->xing);
288 } 289 }
289 else { 290 else {
290 /* perhaps we have a VRB file */ 291 /* perhaps we have a VRB file */
291 if (info->bitrate != header.bitrate) 292 if (info->bitrate != header.bitrate)
292 info->vbr = TRUE; 293 info->vbr = TRUE;
293 if (info->vbr) 294 if (info->vbr) {
294 info->bitrate += header.bitrate; 295 info->bitrate += header.bitrate;
296 bitrate_frames++;
297 }
295 /* check for changin layer/samplerate/channels */ 298 /* check for changin layer/samplerate/channels */
296 if (info->mpeg_layer != header.layer) 299 if (info->mpeg_layer != header.layer)
297 g_warning("layer varies!!"); 300 g_warning("layer varies!!");
298 if (info->freq != header.samplerate) 301 if (info->freq != header.samplerate)
299 g_warning("samplerate varies!!"); 302 g_warning("samplerate varies!!");
324 if (stream.error != MAD_ERROR_BUFLEN) 327 if (stream.error != MAD_ERROR_BUFLEN)
325 break; 328 break;
326 } 329 }
327 330
328 if (info->vbr && !has_xing) 331 if (info->vbr && !has_xing)
329 info->bitrate = info->bitrate / info->frames; 332 info->bitrate = info->bitrate / bitrate_frames;
330 333
331 mad_frame_finish(&frame); 334 mad_frame_finish(&frame);
332 mad_header_finish(&header); 335 mad_header_finish(&header);
333 mad_stream_finish(&stream); 336 mad_stream_finish(&stream);
334 xing_finish(&info->xing); 337 xing_finish(&info->xing);
345 unsigned char buffer[BUFFER_SIZE]; 348 unsigned char buffer[BUFFER_SIZE];
346 int len; 349 int len;
347 gboolean seek_skip = FALSE; 350 gboolean seek_skip = FALSE;
348 int remainder = 0; 351 int remainder = 0;
349 gint tlen; 352 gint tlen;
353 unsigned int iteration = 0;
350 354
351 /* mad structs */ 355 /* mad structs */
352 struct mad_stream stream; 356 struct mad_stream stream;
353 struct mad_frame frame; 357 struct mad_frame frame;
354 struct mad_synth synth; 358 struct mad_synth synth;
501 mad_stream_errorstr(&stream)); 505 mad_stream_errorstr(&stream));
502 #endif /* DEBUG */ 506 #endif /* DEBUG */
503 continue; 507 continue;
504 } 508 }
505 509
510 info->bitrate = frame.header.bitrate;
511
512 if (info->vbr && (iteration % 40 == 0)) {
513 mad_plugin->set_info(info->title,
514 tlen == 0 ? -1 : tlen,
515 info->bitrate, info->freq, info->channels);
516 }
517 iteration++;
518
506 if (mad_frame_decode(&frame, &stream) == -1) { 519 if (mad_frame_decode(&frame, &stream) == -1) {
507 if (!MAD_RECOVERABLE(stream.error)) 520 if (!MAD_RECOVERABLE(stream.error))
508 break; 521 break;
509 #ifdef DEBUG 522 #ifdef DEBUG
510 g_message("(recovered) error decoding frame %d: %s", 523 g_message("(recovered) error decoding frame %d: %s",