X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=fecdec_filter.c;h=bc0eee92bf6be7806cbf0ac1c3efb77115810c76;hb=810761a3cdf3f75dd8e07a5d903793048c36df1d;hp=39e78163538825e696cceca43e03bf89d8db2c64;hpb=d67fcd1fc34ec2de6bed616e8e96c91a67cbaca7;p=paraslash.git diff --git a/fecdec_filter.c b/fecdec_filter.c index 39e78163..bc0eee92 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; } @@ -396,7 +404,6 @@ static int dispatch_slice(char *buf, size_t len, struct fec_header *h, int ret, k, n; struct private_fecdec_data *pfd = fn->private_data; - PARA_CRIT_LOG("sb: %d, len: %d\n", h->slice_bytes, len); if (h->slice_bytes > len) { /* can not use the thing, try to read more */ fn->min_iqs = h->slice_bytes + FEC_HEADER_SIZE; return 0; @@ -427,6 +434,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) @@ -440,26 +448,6 @@ decode: return 1; } -static ssize_t fecdec(char *buf, size_t len, struct filter_node *fn) -{ - int ret; - struct fec_header h; - - ret = read_fec_header(buf, len, &h); - if (ret <= 0) - return ret; - if (!h.slice_bytes) - return -E_BAD_SLICE_SIZE; - if (h.slice_num > h.slices_per_group) - return -E_BAD_SLICE_NUM; - ret = dispatch_slice(buf + FEC_HEADER_SIZE, len - FEC_HEADER_SIZE, - &h, fn); - //PARA_INFO_LOG("ret: %d, len: %d, slice_bytes: %d\n", ret, len, h.slice_bytes); - if (ret <= 0) - return ret; - return FEC_HEADER_SIZE + h.slice_bytes; -} - static void fecdec_close(struct filter_node *fn) { struct private_fecdec_data *pfd = fn->private_data; @@ -530,7 +518,6 @@ static void fecdec_open(struct filter_node *fn) */ void fecdec_filter_init(struct filter *f) { - f->convert = fecdec; f->close = fecdec_close; f->open = fecdec_open; f->pre_select = generic_filter_pre_select;