/*
- * Copyright (C) 2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2006-2007 Andre Noll <maan@systemlinux.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
/** the output buffer size */
#define AAC_OUTBUF_SIZE (32 * 1024)
+/** give up decoding after that many errors */
+#define MAX_ERRORS 20
+
/**
* data specific to the aacdec filter
*
* \sa filter, filter_node
*/
struct private_aacdec_data {
+ /** the return value of aac_open */
NeAACDecHandle handle;
+ /** info about the currently decoded frame */
NeAACDecFrameInfo frame_info;
-
+ /** whether this instance of the aac decoder is already initialized */
int initialized;
+ /**
+ * return value of aac_find_esds(). Used to call the right aacdec
+ * init function
+ */
int decoder_length;
+ /** number of times the decoder returned an error */
+ unsigned error_count;
+ /** number of bytes already consumed from the imput stream */
size_t consumed_total;
+ /** return value of aac_find_entry_point */
size_t entry;
};
p = inbuf + consumed;
outbuffer = NeAACDecDecode(padd->handle, &padd->frame_info, p,
len - consumed);
- ret = -E_AAC_DECODE;
if (padd->frame_info.error) {
+ ret = -E_AAC_DECODE;
+ if (padd->error_count++ > MAX_ERRORS)
+ goto out;
PARA_ERROR_LOG("frame_error: %d, consumed: %zu + %zd + %lu\n",
padd->frame_info.error, padd->consumed_total,
consumed, padd->frame_info.bytesconsumed);
consumed++; /* catch 21 */
goto success;
}
+ padd->error_count = 0;
consumed += padd->frame_info.bytesconsumed;
ret = consumed;
if (!padd->frame_info.samples)
/**
* the init function of the aacdec filter
*
+ * \param f pointer to the filter struct to initialize
+ *
* \sa filter::init
*/
void aacdec_init(struct filter *f)