Don't zero out spec coeffs before doing the final IMDCT.

Addresses bug 7140347.

When flushing the decoder, you need to make sure to zero out any
lingering spectral coefficients as well as zero out the overlap buffer
state after decoding the final access unit.  Zeroing out the spec
coefficients *before* you decode the last block, however, seems like a
mistake.  If the final block contains any useful information for the
stream, then you end up outputting the overlap portion of the second
to last decoded block combined with zeros.  Because of the shape of
the second to last block's windows, this results in what appears to be
a fade out, but actually is a zero'ed out final block.

Signed-off-by: John Grossman <johngro@google.com>
Change-Id: I0fab9ee1a5899811d5519a91dc05631e9bf4963c
This commit is contained in:
John Grossman 2012-09-12 14:08:09 -07:00
parent 381d69840a
commit 34ce250e90
1 changed files with 1 additions and 4 deletions

View File

@ -1646,10 +1646,6 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
self->sbrEnabled self->sbrEnabled
); );
if ( flags&AACDEC_FLUSH ) {
FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame);
}
switch (pAacDecoderChannelInfo->renderMode) switch (pAacDecoderChannelInfo->renderMode)
{ {
case AACDEC_RENDER_IMDCT: case AACDEC_RENDER_IMDCT:
@ -1677,6 +1673,7 @@ LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame(
break; break;
} }
if ( flags&AACDEC_FLUSH ) { if ( flags&AACDEC_FLUSH ) {
FDKmemclear(pAacDecoderChannelInfo->pSpectralCoefficient, sizeof(FIXP_DBL)*self->streamInfo.aacSamplesPerFrame);
FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL)); FDKmemclear(self->pAacDecoderStaticChannelInfo[c]->pOverlapBuffer, OverlapBufferSize*sizeof(FIXP_DBL));
} }
} }