X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fecdec_filter.c;h=25533b2428fc6777ba53eb093abed7d5b30c049d;hp=39e78163538825e696cceca43e03bf89d8db2c64;hb=5f303cc5a96bfeaa66d2d6e899bf56d1d03ed085;hpb=d67fcd1fc34ec2de6bed616e8e96c91a67cbaca7 diff --git a/fecdec_filter.c b/fecdec_filter.c index 39e78163..25533b24 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -86,6 +86,7 @@ struct private_fecdec_data { int have_header; /** Points to the first received group. */ struct fecdec_group *first_complete_group; + struct btr_pool *btrp; }; /** Iterate over all fecdec groups. */ @@ -311,11 +312,14 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) PARA_DEBUG_LOG("writing group %d (%d/%d decoded data bytes)\n", fg->h.group_num, fg->h.group_bytes, fg->h.data_slices_per_group * sb); - need = fn->loaded + (fg->h.data_slices_per_group - i) * sb; if (fn->btrn) { - buf = para_malloc(need); + need = (fg->h.data_slices_per_group - i) * sb; + if (need > btr_pool_unused(pfd->btrp)) + return -E_FECDEC_OVERRUN; + btr_pool_get_buffer(pfd->btrp, &buf); p = buf; } else { + need = fn->loaded + (fg->h.data_slices_per_group - i) * sb; if (need > fn->bufsize) { fn->bufsize = PARA_MAX(fn->bufsize * 2, need); if (fn->bufsize > FECDEC_MAX_OUTBUF_SIZE) @@ -334,7 +338,10 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) break; if (sb + written > fg->h.audio_header_size) n = fg->h.audio_header_size - written; - memcpy(p + written, fg->data[i], n); + if (fn->btrn) + btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); + else + memcpy(p + written, fg->data[i], n); fn->loaded += n; written += n; } @@ -345,13 +352,14 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) size_t n = sb; if (n + written > fg->h.group_bytes) n = fg->h.group_bytes - written; - memcpy(p + written, fg->data[i], n); + if (fn->btrn) + btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); + else + memcpy(p + written, fg->data[i], n); fn->loaded += n; written += n; } p += written; - if (fn->btrn) - btr_add_output(buf, p - buf, fn->btrn); return 0; } @@ -427,6 +435,7 @@ static int dispatch_slice(char *buf, size_t len, struct fec_header *h, ret = fec_new(k, n, &pfd->fec); if (ret < 0) return ret; + pfd->btrp = btr_pool_new("fecdec", 20 * k * h->slice_bytes); /* decode and clear the first group */ ret = decode_group(pfd->first_complete_group, fn); if (ret < 0)