X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=aacdec.c;h=315f338ced283c063d9012e20040fb0b3f0b82a1;hb=d2f8a4ab39aa44d565ef04e2d4792b1dea49ab0e;hp=c41a5ac887e4ff6408e257d1423a74436cf5c491;hpb=019f1ffdacd228f6a1e701ef6795c1a65ff02785;p=paraslash.git diff --git a/aacdec.c b/aacdec.c index c41a5ac8..315f338c 100644 --- a/aacdec.c +++ b/aacdec.c @@ -46,84 +46,34 @@ struct private_mp4dec_data { int initialized; int decoder_length; - unsigned char *inbuf; - int inbuf_len; int consumed; long unsigned consumed_total; - unsigned noffsets; - unsigned *offset; - unsigned offset0; - int offset_pos; + long unsigned entry; }; -static int read_int32(struct private_mp4dec_data *padd, unsigned *result) -{ - uint8_t *d = (uint8_t*)(padd->inbuf + padd->consumed); - if (padd->consumed + 4 > padd->inbuf_len) - return -1; - padd->consumed += 4; - *result = (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3]; - return 1; -} - -static int fill_offset_table(struct private_mp4dec_data *padd) -{ - int i, ret; - - for (i = padd->offset_pos; i < padd->noffsets; i++) { - ret = read_int32(padd, &padd->offset[i]); - if (ret < 0) - return -1; - PARA_DEBUG_LOG("offset #%d: %d\n", i, padd->offset[i]); - padd->offset_pos++; - } - return 1; -} - -static int find_stco(struct private_mp4dec_data *padd) -{ - int ret; - - for (; padd->consumed < padd->inbuf_len; padd->consumed++) { - unsigned char *p = padd->inbuf + padd->consumed; - - if (p[0] != 's' || p[1] != 't' || p[2] != 'c' || p[3] != 'o') - continue; - PARA_INFO_LOG("found stco: %d\n", padd->consumed); - padd->consumed += 8; - ret = read_int32(padd, &padd->noffsets); - padd->offset = para_malloc(padd->noffsets * sizeof(int)); - PARA_INFO_LOG("num entries: %d\n", padd->noffsets); - return 1; - } - return -E_STCO; -} - -static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn) +static ssize_t mp4dec(char *input_buffer, size_t len, struct filter_node *fn) { struct private_mp4dec_data *padd = fn->private_data; struct filter_chain_info *fci = fn->fci; unsigned long rate = 0; unsigned char channels = 0; - int i, ret, nbytes, skip; + int i, ret, skip; unsigned char *p, *outbuffer; + unsigned char *inbuf = (unsigned char*)input_buffer; if (fn->loaded > fn->bufsize * 4 / 5) return 0; if (len < 1000 && !*fci->eof) return 0; padd->consumed = 0; - padd->inbuf = (unsigned char*)inbuffer; - padd->inbuf_len = len; if (!padd->initialized) { - padd->decoder_length = aac_find_esds(padd->inbuf, padd->inbuf_len, - &skip); + padd->decoder_length = aac_find_esds(inbuf, len, &skip); PARA_INFO_LOG("decoder len: %d\n", padd->decoder_length); if (padd->decoder_length < 0) { - ret = NeAACDecInit(padd->decoder, padd->inbuf, - padd->inbuf_len, &rate, &channels); + ret = NeAACDecInit(padd->decoder, inbuf, + len, &rate, &channels); PARA_INFO_LOG("decoder init: %d\n", ret); if (ret < 0) { ret = -E_AACDEC_INIT; @@ -132,7 +82,7 @@ static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn) padd->consumed = ret; } else { padd->consumed += skip; - p = padd->inbuf + padd->consumed; + p = inbuf + padd->consumed; ret = -E_AACDEC_INIT; if (NeAACDecInit2(padd->decoder, p, padd->decoder_length, &rate, @@ -147,37 +97,29 @@ static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn) } if (padd->decoder_length > 0) { padd->consumed = 0; - if (!padd->offset_pos) { - ret = aac_find_stco(padd->inbuf + padd->consumed, - padd->inbuf_len - padd->consumed, &skip); + if (!padd->entry) { + ret = aac_find_stco(inbuf + padd->consumed, + len - padd->consumed, &skip); if (ret < 0) { ret = len; goto out; } - padd->noffsets = ret; - padd->offset = para_malloc(padd->noffsets * sizeof(int)); padd->consumed += skip; + padd->entry = aac_read_int32(inbuf + padd->consumed); + PARA_INFO_LOG("entry: %lu\n", padd->entry); } - if (padd->offset_pos < padd->noffsets) { - fill_offset_table(padd); - ret = padd->consumed; - goto out; - } -// PARA_INFO_LOG("consumed total: %lu, first_chunk: %d\n", -// padd->consumed_total, padd->offset[0]); ret = len; - if (padd->consumed_total + len < padd->offset[0]) + if (padd->consumed_total + len < padd->entry) goto out; - if (padd->consumed_total < padd->offset[0]) - padd->consumed = padd->offset[0] - padd->consumed_total; + if (padd->consumed_total < padd->entry) + padd->consumed = padd->entry - padd->consumed_total; } - for (; padd->consumed < padd->inbuf_len; padd->consumed++) - if ((padd->inbuf[padd->consumed] & 0xfe) == 0x20) + for (; padd->consumed < len; padd->consumed++) + if ((inbuf[padd->consumed] & 0xfe) == 0x20) break; - if (padd->consumed >= padd->inbuf_len) + if (padd->consumed >= len) goto success; - p = padd->inbuf + padd->consumed; -// PARA_NOTICE_LOG("p[0]: %lx\n", (long unsigned) *p); + p = inbuf + padd->consumed; outbuffer = NeAACDecDecode(padd->decoder, &padd->frame_info, p, len - padd->consumed); ret = -E_AAC_DECODE; @@ -194,7 +136,6 @@ static ssize_t mp4dec(char *inbuffer, size_t len, struct filter_node *fn) ret = padd->consumed; if (!padd->frame_info.samples) goto out; - nbytes = padd->frame_info.samples; for (i = 0; i < padd->frame_info.samples; i++) { short *s = (short *)outbuffer; fn->buf[fn->loaded++] = s[i] & 0xff;