X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fecdec_filter.c;h=3c0c67bc367d4d766c5b7f8933bdb0349df555f1;hp=25533b2428fc6777ba53eb093abed7d5b30c049d;hb=42bf98c68c9d6b095f92defba959bca148cd9c1a;hpb=5f303cc5a96bfeaa66d2d6e899bf56d1d03ed085 diff --git a/fecdec_filter.c b/fecdec_filter.c index 25533b24..3c0c67bc 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -31,11 +31,6 @@ */ #define NUM_FEC_GROUPS 3 -/** Default size of the output buffer of the fecdec filter. */ -#define FECDEC_DEFAULT_OUTBUF_SIZE (3 * 1024) -/** Maximal size of the output buffer of the fecdec filter. */ -#define FECDEC_MAX_OUTBUF_SIZE (1024 * 1024) - /** Data read from the header of a slice. */ struct fec_header { /** Total number of slices in this group. */ @@ -312,23 +307,11 @@ 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); - if (fn->btrn) { - 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) - return -E_FECDEC_OVERRUN; - PARA_INFO_LOG("increasing fec buf to %zu\n", fn->bufsize); - fn->buf = para_realloc(fn->buf, fn->bufsize); - } - p = fn->buf + fn->loaded; - } + 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; if (u == FEC_GROUP_USABLE_WITH_HEADER) { PARA_INFO_LOG("writing audio file header\n"); written = 0; @@ -338,11 +321,7 @@ 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; - if (fn->btrn) - btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); - else - memcpy(p + written, fg->data[i], n); - fn->loaded += n; + btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); written += n; } p += written; @@ -352,11 +331,7 @@ 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; - if (fn->btrn) - btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); - else - memcpy(p + written, fg->data[i], n); - fn->loaded += n; + btr_copy(fg->data[i], n, pfd->btrp, fn->btrn); written += n; } p += written; @@ -404,7 +379,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; @@ -449,26 +423,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; @@ -476,12 +430,10 @@ static void fecdec_close(struct filter_node *fn) FOR_EACH_FECDEC_GROUP(fg, pfd) clear_group(fg); - free(fn->buf); - fn->buf = NULL; fec_free(pfd->fec); + btr_pool_free(pfd->btrp); free(fn->private_data); fn->private_data = NULL; - fn->conf = NULL; } static void fecdec_post_select(__a_unused struct sched *s, struct task *t) @@ -524,11 +476,8 @@ out: static void fecdec_open(struct filter_node *fn) { struct private_fecdec_data *pfd; - fn->bufsize = FECDEC_DEFAULT_OUTBUF_SIZE; - fn->buf = para_malloc(fn->bufsize); pfd = para_calloc(sizeof(*pfd)); fn->private_data = pfd; - fn->loaded = 0; fn->min_iqs = FEC_HEADER_SIZE; } @@ -539,7 +488,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;