2017-03-16 Fred Gleason <fredg@paravelsystems.com>

* Fixed a bug in 'lib/rdaudioconvert.cpp' that caused conversions
	from MPEG Layer 3 VBR data to be truncated when no end point
	was specified.
	* Fixed a bug in 'web/rdxport/import.cpp' that caused the
	end marker to be positioned incorrectly when importing MPEG
	Layer 3 VBR files.
This commit is contained in:
Fred Gleason
2017-03-16 16:11:41 -04:00
parent 301fbf42aa
commit 5b5800d27f
3 changed files with 25 additions and 10 deletions

View File

@@ -558,7 +558,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile,
unsigned char buffer[STAGE1BUFSIZE];
float sf_buffer[1152*2];
sf_count_t start=0;
sf_count_t end=wave->getSampleLength();
int64_t end=-1;
sf_count_t frames=0;
//
@@ -607,13 +607,13 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile,
int thiserr=mad_frame_decode(&mad_frame,&mad_stream);
if(thiserr!=0) {
if(!MAD_RECOVERABLE(mad_stream.error))
if(!MAD_RECOVERABLE(mad_stream.error)) {
break;
else
}
else {
continue;
}
}
//printf("decoding...\n");
mad_synth_frame(&mad_synth,&mad_frame);
for(int i=0;i<mad_synth.pcm.length;i++) {
for(int j=0;j<mad_synth.pcm.channels;j++) {
@@ -622,7 +622,7 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile,
}
}
if(frames>=start) {
if((frames+mad_synth.pcm.length)<end) { // Write entire buffer
if((end<0)||((frames+mad_synth.pcm.length)<end)) { // Write full buffer
UpdatePeak(sf_buffer,mad_synth.pcm.length*wave->getChannels());
sf_writef_float(sf_dst,sf_buffer,mad_synth.pcm.length);
}
@@ -659,9 +659,9 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage1Mpeg(const QString &dstfile,
// Prevent buffer overflow on malformed files.
// The amount checked for should match the maximum amount that may be read
// by the next top-of-loop wave->readWave call.
if(left_over + fsize + 1 > STAGE1BUFSIZE)
if(left_over + fsize + 1 > STAGE1BUFSIZE) {
return RDAudioConvert::ErrorFormatError;
}
memmove(buffer,mad_stream.next_frame,left_over);
}