X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=aacdec_filter.c;h=017e439b38b3b346925399e41b9b6100c77e2685;hp=d85f33746d76c0a10e64303b15658c53fc8b4eda;hb=929a67dd8f243686fb5928d175b00937446ffda5;hpb=198d80de3be06f39f316f516fba655392d7b885a diff --git a/aacdec_filter.c b/aacdec_filter.c index d85f3374..017e439b 100644 --- a/aacdec_filter.c +++ b/aacdec_filter.c @@ -38,17 +38,10 @@ struct private_aacdec_data { 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 - */ - unsigned long 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; /** The number of channels of the current stream. */ unsigned int channels; /** Current sample rate in Hz. */ @@ -72,105 +65,6 @@ static NeAACDecHandle aac_open(void) return h; } -static unsigned long aac_read_decoder_length(char *buf, int *description_len) -{ - uint8_t b; - uint8_t numBytes = 0; - unsigned long length = 0; - - do { - b = buf[numBytes]; - numBytes++; - length = (length << 7) | (b & 0x7F); - } while - ((b & 0x80) && numBytes < 4); - *description_len = numBytes; - return length; -} - -/* - * Search for the position and the length of the decoder configuration. - * - * \param buf Buffer to seach. - * \param buflen Length of \a buf. - * \param skip Upon succesful return, this contains the offset in \a buf where - * the decoder config starts. - * \param decoder_length Result pointer that is filled in with the length of - * the decoder configuration on success. - * - * \return Standard. - */ -static int aac_find_esds(char *buf, size_t buflen, size_t *skip, - unsigned long *decoder_length) -{ - size_t i; - - for (i = 0; i + 4 < buflen; i++) { - char *p = buf + i; - int description_len; - - if (p[0] != 'e' || p[1] != 's' || p[2] != 'd' || p[3] != 's') - continue; - i += 8; - p = buf + i; - PARA_INFO_LOG("found esds@%zu, next: %x\n", i, *p); - if (*p == 3) - i += 8; - else - i += 6; - p = buf + i; - PARA_INFO_LOG("next: %x\n", *p); - if (*p != 4) - continue; - i += 18; - p = buf + i; - PARA_INFO_LOG("next: %x\n", *p); - if (*p != 5) - continue; - i++; - p = buf + i; - *decoder_length = aac_read_decoder_length(p, &description_len); - PARA_INFO_LOG("decoder length: %lu\n", *decoder_length); - i += description_len; - *skip = i; - return 1; - } - return -E_ESDS; -} - -/* - * Search for the first entry in the stco table. - * - * \param buf Buffer to seach. - * \param buflen Length of \a buf. - * \param skip Upon succesful return, this contains the number - * of bytes to skip from the input buffer. - * - * \return The position of the first entry in the table on success, - * -E_STCO on errors. - */ -static ssize_t aac_find_entry_point(char *buf, size_t buflen, size_t *skip) -{ - ssize_t ret; - size_t i; - - for (i = 0; i + 20 < buflen; i++) { - char *p = buf + i; - - if (p[0] != 's' || p[1] != 't' || p[2] != 'c' || p[3] != 'o') - continue; - PARA_INFO_LOG("found stco@%zu\n", i); - i += 12; - ret = read_u32_be(buf + i); /* first offset */ - i += 4; - PARA_INFO_LOG("entry point: %zd\n", ret); - *skip = i; - return ret; - } - PARA_WARNING_LOG("stco not found, buflen: %zu\n", buflen); - return -E_STCO; -} - static int aacdec_execute(struct btr_node *btrn, const char *cmd, char **result) { struct filter_node *fn = btr_context(btrn); @@ -205,7 +99,7 @@ static int aacdec_post_select(__a_unused struct sched *s, void *context) int i, ret; char *p, *inbuf, *outbuffer; char *btr_buf; - size_t len, skip, consumed, loaded; + size_t len, consumed, loaded; next_buffer: ret = btr_node_status(btrn, fn->min_iqs, BTR_NT_INTERNAL); @@ -220,53 +114,20 @@ next_buffer: if (!padd->initialized) { unsigned long rate = 0; unsigned char channels = 0; - ret = aac_find_esds(inbuf, len, &skip, &padd->decoder_length); + ret = NeAACDecInit(padd->handle, (unsigned char *)inbuf, + len, &rate, &channels); + PARA_INFO_LOG("decoder init: %d\n", ret); if (ret < 0) { - PARA_INFO_LOG("%s\n", para_strerror(-ret)); - ret = NeAACDecInit(padd->handle, (unsigned char *)inbuf, - len, &rate, &channels); - PARA_INFO_LOG("decoder init: %d\n", ret); - if (ret < 0) { - ret = -E_AACDEC_INIT; - goto out; - } - consumed = ret; - } else { - PARA_INFO_LOG("decoder len: %lu\n", - padd->decoder_length); - consumed += skip; - p = inbuf + consumed; ret = -E_AACDEC_INIT; - if (NeAACDecInit2(padd->handle, (unsigned char *)p, - padd->decoder_length, &rate, - &channels) != 0) - goto out; + goto out; } + consumed = ret; padd->sample_rate = rate; padd->channels = channels; PARA_INFO_LOG("rate: %u, channels: %u\n", padd->sample_rate, padd->channels); padd->initialized = 1; } - if (padd->decoder_length > 0) { - consumed = 0; - if (!padd->entry) { - ret = aac_find_entry_point(inbuf + consumed, - len - consumed, &skip); - if (ret < 0) { - ret = len; - goto out; - } - consumed += skip; - padd->entry = ret; - PARA_INFO_LOG("entry: %zu\n", padd->entry); - } - ret = len; - if (padd->consumed_total + len < padd->entry) - goto out; - if (padd->consumed_total < padd->entry) - consumed = padd->entry - padd->consumed_total; - } if (consumed >= len) goto success; p = inbuf + consumed;