X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=fecdec_filter.c;h=d7427c2b251b7878aca48c06bc25e9ddfeef10b3;hp=ca9dcd739e23c6fe7e89d4ff67cec41686906318;hb=1aeb12d89d5334c70be373fa1ef7a547a8fd6ba4;hpb=fcb24360b1b14c9fe0e510282cf85f4e112eaf23 diff --git a/fecdec_filter.c b/fecdec_filter.c index ca9dcd73..d7427c2b 100644 --- a/fecdec_filter.c +++ b/fecdec_filter.c @@ -104,7 +104,7 @@ struct private_fecdec_data { /** Iterate over all fecdec groups. */ #define FOR_EACH_FECDEC_GROUP(g, d) for (g = (d)->groups; \ - (g) - (d)->groups < NUM_FEC_GROUPS; (g)++) + (g) < (d)->groups + NUM_FEC_GROUPS; (g)++) static int group_complete(struct fecdec_group *fg) { @@ -248,13 +248,13 @@ static int add_slice(char *buf, struct fecdec_group *fg) slice_num = fg->h.slice_num; if (fg->num_slices == 0) { fg->num_slices = fg->h.slices_per_group; - fg->idx = malloc(fg->num_slices * sizeof(int)); - fg->data = malloc(fg->num_slices * sizeof(unsigned char *)); + fg->idx = para_malloc(fg->num_slices * sizeof(int)); + fg->data = para_malloc(fg->num_slices * sizeof(unsigned char *)); memset(fg->data, 0, fg->num_slices * sizeof(unsigned char *)); } r = fg->num_received_slices; fg->idx[r] = slice_num; - fg->data[r] = malloc(fg->h.slice_bytes); + fg->data[r] = para_malloc(fg->h.slice_bytes); memcpy(fg->data[r], buf, fg->h.slice_bytes); fg->num_received_slices++; return 1; @@ -264,6 +264,7 @@ enum fec_group_usability { FEC_GROUP_UNUSABLE, FEC_GROUP_USABLE, FEC_GROUP_USABLE_SKIP_HEADER, + FEC_GROUP_USABLE_WITH_HEADER }; static enum fec_group_usability group_is_usable(struct fecdec_group *fg, @@ -281,14 +282,14 @@ static enum fec_group_usability group_is_usable(struct fecdec_group *fg, if (fg->h.bos) return FEC_GROUP_USABLE; if (fg->h.audio_header_size) - return FEC_GROUP_USABLE; + return FEC_GROUP_USABLE_WITH_HEADER; return FEC_GROUP_UNUSABLE; } 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, need; struct private_fecdec_data *pfd = fn->private_data; enum fec_group_usability u = group_is_usable(fg, pfd); @@ -319,6 +320,21 @@ static int decode_group(struct fecdec_group *fg, struct filter_node *fn) PARA_INFO_LOG("increasing fec buf to %zu\n", fn->bufsize); fn->buf = para_realloc(fn->buf, fn->bufsize); } + if (u == FEC_GROUP_USABLE_WITH_HEADER) { + PARA_INFO_LOG("writing audio file header\n"); + written = 0; + for (i = 0; i < fg->h.data_slices_per_group; i++) { + size_t n = sb; + if (written >= fg->h.audio_header_size) + break; + if (sb + written > fg->h.audio_header_size) + n = fg->h.audio_header_size - written; + memcpy(fn->buf + fn->loaded, fg->data[i], n); + fn->loaded += n; + written += n; + } + } + written = 0; for (; i < fg->h.data_slices_per_group; i++) { size_t n = sb; if (n + written > fg->h.group_bytes)