a few aac/mp4 minor fixes

don't set audioFormat till decode first frame

git-svn-id: https://svn.musicpd.org/mpd/trunk@359 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
Warren Dukes 2004-03-22 05:08:14 +00:00
parent 097c8720ef
commit 80e0fec683
2 changed files with 33 additions and 17 deletions

View File

@ -301,14 +301,10 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
return -1; return -1;
} }
af->sampleRate = sampleRate;
af->channels = channels;
af->bits = 16; af->bits = 16;
cb->totalTime = totalTime; cb->totalTime = totalTime;
dc->state = DECODE_STATE_DECODE;
dc->start = 0;
time = 0.0; time = 0.0;
advanceAacBuffer(&b,bread); advanceAacBuffer(&b,bread);
@ -322,7 +318,6 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer, sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer,
b.bytesIntoBuffer); b.bytesIntoBuffer);
advanceAacBuffer(&b,frameInfo.bytesconsumed);
if(frameInfo.error > 0) { if(frameInfo.error > 0) {
ERROR("error decoding AAC file: %s\n",dc->file); ERROR("error decoding AAC file: %s\n",dc->file);
@ -332,6 +327,15 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
break; break;
} }
if(dc->start) {
af->channels = frameInfo.channels;
af->sampleRate = frameInfo.samplerate;
dc->state = DECODE_STATE_DECODE;
dc->start = 0;
}
advanceAacBuffer(&b,frameInfo.bytesconsumed);
sampleCount = (unsigned long)(frameInfo.samples); sampleCount = (unsigned long)(frameInfo.samples);
if(sampleCount>0) { if(sampleCount>0) {
@ -383,6 +387,12 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
if(b.bytesIntoBuffer==0) eof = 1; if(b.bytesIntoBuffer==0) eof = 1;
} while (!eof); } while (!eof);
faacDecClose(decoder);
fclose(b.infile);
if(b.buffer) free(b.buffer);
if(dc->start) return -1;
if(!dc->stop && !dc->seek && chunkLen>0) { if(!dc->stop && !dc->seek && chunkLen>0) {
cb->chunkSize[cb->end] = chunkLen; cb->chunkSize[cb->end] = chunkLen;
++cb->end; ++cb->end;
@ -394,10 +404,6 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
chunkLen = 0; chunkLen = 0;
} }
faacDecClose(decoder);
fclose(b.infile);
if(b.buffer) free(b.buffer);
if(dc->seek) dc->seek = 0; if(dc->seek) dc->seek = 0;
if(dc->stop) { if(dc->stop) {

View File

@ -174,8 +174,6 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
numSamples = mp4ff_num_samples(mp4fh,track); numSamples = mp4ff_num_samples(mp4fh,track);
dc->state = DECODE_STATE_DECODE;
dc->start = 0;
time = 0.0; time = 0.0;
seekTable = malloc(sizeof(float)*numSamples); seekTable = malloc(sizeof(float)*numSamples);
@ -224,6 +222,16 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer, sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer,
mp4BufferSize); mp4BufferSize);
if(dc->start) {
channels = frameInfo.channels;
scale = frameInfo.samplerate;
af->channels = frameInfo.channels;
af->sampleRate = frameInfo.samplerate;
dc->state = DECODE_STATE_DECODE;
dc->start = 0;
}
if(mp4Buffer) free(mp4Buffer); if(mp4Buffer) free(mp4Buffer);
if(frameInfo.error > 0) { if(frameInfo.error > 0) {
ERROR("error decoding MP4 file: %s\n",dc->file); ERROR("error decoding MP4 file: %s\n",dc->file);
@ -287,6 +295,14 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
} }
} }
free(seekTable);
faacDecClose(decoder);
mp4ff_close(mp4fh);
fclose(fh);
free(mp4cb);
if(dc->start) return -1;
if(!dc->stop && !dc->seek && chunkLen>0) { if(!dc->stop && !dc->seek && chunkLen>0) {
cb->chunkSize[cb->end] = chunkLen; cb->chunkSize[cb->end] = chunkLen;
++cb->end; ++cb->end;
@ -298,12 +314,6 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
chunkLen = 0; chunkLen = 0;
} }
free(seekTable);
faacDecClose(decoder);
mp4ff_close(mp4fh);
fclose(fh);
free(mp4cb);
if(dc->seek) dc->seek = 0; if(dc->seek) dc->seek = 0;
if(dc->stop) { if(dc->stop) {