X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fecdec_filter.c;h=5f37f1a81f9199f6080b6669cd455d706a96af06;hp=30ac818c360873f6aedadd19e55ca7e0f6209550;hb=44c5fe64eebb185ecc7a406c3db26721834dbea4;hpb=35f9051506345255c7ed3c076b7df5f3b7d26039 diff --git a/fecdec_filter.c b/fecdec_filter.c index 30ac818c..5f37f1a8 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -27,10 +27,8 @@ */ #define NUM_FEC_GROUPS 3 -/** Default size of the output buffer of the fecdec filter. */ -#define FECDEC_DEFAULT_OUTBUF_SIZE (16 * 1024) -/** Maximal size of the output buffer of the fecdec filter. */ -#define FECDEC_MAX_OUTBUF_SIZE (1024 * 1024) +/** Size of the output buffer of the fecdec filter. */ +#define FECDEC_OUTBUF_SIZE (1024 * 1024) /* FIXME: This has to depend on the fec params */ /** Data read from the header of a slice. */ struct fec_header { @@ -119,10 +117,15 @@ static int find_group(struct fec_header *h, FOR_EACH_FECDEC_GROUP(fg, pfd) { if (fg->h.group_num != h->group_num) continue; + if (fg->num_received_slices == 0) + goto success; if (fg->h.slices_per_group != h->slices_per_group) - continue; + return -E_BAD_FEC_HEADER; if (fg->h.data_slices_per_group != h->data_slices_per_group) - continue; + return -E_BAD_FEC_HEADER; + if (fg->h.group_bytes != h->group_bytes) + return -E_BAD_FEC_HEADER; +success: *result = fg; return 1; } @@ -163,8 +166,8 @@ static struct fecdec_group *free_oldest_group(struct private_fecdec_data *pfd) } if (!group_complete(oldest) && !group_empty(oldest)) PARA_WARNING_LOG("Clearing incomplete group %d " - "(contains %d slices)\n", fg->h.group_num, - fg->num_received_slices); + "(contains %d slices)\n", oldest->h.group_num, + oldest->num_received_slices); clear_group(oldest); return oldest; } @@ -253,7 +256,7 @@ static enum fec_group_usability group_is_usable(struct fecdec_group *fg, static int decode_group(struct fecdec_group *fg, struct filter_node *fn) { int i, ret, sb = fg->h.slice_bytes; - size_t written = 0, need; + size_t written = 0; struct private_fecdec_data *pfd = fn->private_data; enum fec_group_usability u = group_is_usable(fg, pfd); @@ -276,18 +279,12 @@ 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 (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); - } for (; i < fg->h.data_slices_per_group; i++) { size_t n = sb; if (n + written > fg->h.group_bytes) n = fg->h.group_bytes - written; + if (fn->loaded + n > fn->bufsize) + return -E_FECDEC_OVERRUN; memcpy(fn->buf + fn->loaded, fg->data[i], n); fn->loaded += n; written += n; @@ -394,7 +391,7 @@ static void fecdec_close(struct filter_node *fn) static void fecdec_open(struct filter_node *fn) { - fn->bufsize = FECDEC_DEFAULT_OUTBUF_SIZE; + fn->bufsize = FECDEC_OUTBUF_SIZE; fn->buf = para_malloc(fn->bufsize); fn->private_data = para_calloc(sizeof(struct private_fecdec_data)); fn->loaded = 0;