Eric Peng wrote:
I'm using libmad for MP3 streaming decoding. However, my program doesn't decode the last frame.
You've correctly isolated the problem. The solution is to append enough zero bytes to your stream buffer after the last frame to satisfy the MAD_BUFFER_GUARD.
The reason for MAD_BUFFER_GUARD has to do with the way decoding is performed. In Layer III, Huffman decoding may inadvertently read a few bytes beyond the end of the buffer in the case of certain invalid input. This is not detected until after the fact. To prevent this from causing problems, and also to ensure the next frame's main_data_begin pointer is always accessible, MAD requires MAD_BUFFER_GUARD (currently 8) bytes to be present in the buffer past the end of the current frame in order to decode the frame.
Cheers,