Mercurial > audlegacy-plugins
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", |
