#define MAD_TO_SHORT(f) (f) >= MAD_F_ONE? SHRT_MAX :\
(f) <= -MAD_F_ONE? -SHRT_MAX : (signed short) ((f) >> (MAD_F_FRACBITS - 15))
-/** State of the decoding process. */
-enum mp3dec_flags {
- /** Bad main_data_begin pointer encounterd. */
- MP3DEC_FLAG_BAD_DATA = 1,
- /** Some output has already been produced. */
- MP3DEC_FLAG_DECODE_STARTED = 2,
- MP3DEC_FLAG_NEED_MORE = 4,
-};
-
/** Data specific to the mp3dec filter. */
struct private_mp3dec_data {
/** Information on the current mp3 stream. */
struct mad_frame frame;
/** Contains the PCM output. */
struct mad_synth synth;
- /** See \ref mp3dec_flags. */
- unsigned flags;
- /** Defer decoding until this time. */
- struct timeval stream_start_barrier;
- /** Wait until this many input bytes are available. */
- size_t input_len_barrier;
/** The number of channels of the current stream. */
unsigned int channels;
/** Current sample rate in Hz. */
unsigned int sample_rate;
};
-static int need_bad_data_delay(struct private_mp3dec_data *pmd,
- size_t bytes_available)
-{
- if (!(pmd->flags & MP3DEC_FLAG_BAD_DATA))
- return 0;
- if (pmd->flags & MP3DEC_FLAG_DECODE_STARTED)
- return 0;
- if (bytes_available >= pmd->input_len_barrier)
- return 0;
- if (tv_diff(now, &pmd->stream_start_barrier, NULL) > 0)
- return 0;
- return 1;
-}
-
-/*
- * Returns negative on serious errors, zero if the error should be ignored and
- * positive on bad data pointer errors at stream start.
- */
-static int handle_decode_error(struct private_mp3dec_data *pmd, size_t len)
+/* Returns negative on serious errors. */
+static int handle_decode_error(struct private_mp3dec_data *pmd)
{
- const struct timeval delay = {0, 60 * 1000};
if (!MAD_RECOVERABLE(pmd->stream.error)
&& pmd->stream.error != MAD_ERROR_BUFLEN) {
PARA_ERROR_LOG("%s\n", mad_stream_errorstr(&pmd->stream));
return -E_MAD_FRAME_DECODE;
}
PARA_DEBUG_LOG("%s\n", mad_stream_errorstr(&pmd->stream));
- if (pmd->stream.error != MAD_ERROR_BADDATAPTR)
- return 0;
- if (pmd->flags & MP3DEC_FLAG_DECODE_STARTED)
- return 0;
- /*
- * Bad data pointer at stream start. Defer decoding until the amount of
- * data we are about to skip is available again, but wait at most 60ms.
- */
- pmd->flags |= MP3DEC_FLAG_BAD_DATA;
- pmd->input_len_barrier = len;
- tv_add(now, &delay, &pmd->stream_start_barrier);
- return 1;
+ return 0;
}
static size_t used_mad_buffer_bytes(struct mad_stream *s, size_t max)
ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL);
if (ret < 0)
goto err;
- if (need_bad_data_delay(pmd, iqs))
- return;
if (ret == 0)
return;
btr_merge(btrn, fn->min_iqs);
if (ret != 0) {
PARA_INFO_LOG("frame decode: %s\n", mad_stream_errorstr(&pmd->stream));
used = used_mad_buffer_bytes(&pmd->stream, len);
- ret = handle_decode_error(pmd, used);
+ ret = handle_decode_error(pmd);
btr_consume(btrn, used);
if (ret < 0)
goto err;
return;
}
mad_synth_frame(&pmd->synth, &pmd->frame);
- pmd->flags |= MP3DEC_FLAG_DECODE_STARTED;
outbuffer = para_malloc(pmd->synth.pcm.length * 2 * pmd->channels);
loaded = 0;
for (i = 0; i < pmd->synth.pcm.length; i++) {