Add btr pool support to the fecdec filter.
[paraslash.git] / fecdec_filter.c
index 39e78163538825e696cceca43e03bf89d8db2c64..25533b2428fc6777ba53eb093abed7d5b30c049d 100644 (file)
@@ -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)