[mad-dev] errors and MAD_RECOVERABLE()

Rob Leslie rob@mars.org
Tue, 14 May 2002 16:56:51 -0700


On Tuesday, May 14, 2002, at 03:23  AM, Thomas Rathbone wrote:
> Using the high level API. In the error callback if 
> MAD_RECOVERABLE(stream->error) returns true how do I deal with the error?
>   Do I just report the error and return MAD_FLOW_CONTINUE? Will madlib 
> recover the error itself or do I have to fix the error before resuming?

When using the high-level API, the error callback is called when a 
decoding error occurs ONLY if MAD_RECOVERABLE(stream->error) is true. You 
need not perform any specific action; usually the only thing you may want 
to do is report the error. The value you return determines what the 
decoder does next:

MAD_FLOW_STOP: The decoder ends its decoding loop and returns normally.

MAD_FLOW_BREAK: The decoder ends its decoding loop and returns abnormally.

MAD_FLOW_IGNORE: As long as the frame's header was successfully decoded, 
the decoder ignores the error and proceeds with the filter callback and 
synthesis. In this case you should arrange to have the desired subband 
samples for synthesis in the frame structure, for example, by leaving the 
previous frame's samples, or by muting the samples by calling 
mad_frame_mute().

MAD_FLOW_CONTINUE: The decoder proceeds to the next frame, skipping the 
frame which caused the error.

If you don't specify an error callback (by passing a null pointer), the 
default action is as follows: If the error is MAD_ERROR_BADCRC, then 
either leave the previous frame's subband samples in the frame, or mute 
the frame if the previous frame had the same error, and then ignore the 
error (proceeding with the filter callback and synthesis). In the case of 
any other error, skip the frame and proceed with the next frame.

The errors which are not recoverable include:

   MAD_ERROR_BUFLEN  - stream buffer needs refilling
   MAD_ERROR_BUFPTR  - invalid buffer pointer
   MAD_ERROR_NOMEM   - required memory could not be allocated

In these cases the high-level decoder will either call your input callback 
to refill the stream buffer, or terminate with an error.

--
Rob Leslie
rob@mars.org