int have_header;
/** Points to the first received group. */
struct fecdec_group *first_complete_group;
+ struct btr_pool *btrp;
};
/** Iterate over all fecdec groups. */
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)
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;
}
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;
}
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)