X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=6db42bdec7356b15a9f971fee16023b947efa13b;hp=babcd24c9a1e55cf95b1dcb6d340e5b5d490cb06;hb=d7f96d2c7c718e3f7d4834fb25b6939a355a0e19;hpb=c0876c7471af8dc8c677e8c98e58d2715b21929e diff --git a/vss.c b/vss.c index babcd24c..6db42bde 100644 --- a/vss.c +++ b/vss.c @@ -254,38 +254,39 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) uint32_t max_data_size; assert(chunk_tv); - k = fc->fcp->data_slices_per_group + fc->num_extra_slices; if (fc->first_stream_chunk < 0) { - uint32_t largest = afh_get_largest_chunk_size(&mmd->afd.afhi) - + vsst->header_len; - uint8_t needed, want; + uint8_t hs, ds; /* needed header/data slices */ + uint8_t rs = fc->fcp->slices_per_group + - fc->fcp->data_slices_per_group; /* redundant slices */ + int n; - ret = num_slices(largest, fc, &needed); + ret = num_slices(vsst->header_len, fc, &hs); + if (ret < 0) + return ret; + ret = num_slices(afh_get_largest_chunk_size(&mmd->afd.afhi), + fc, &ds); + if (ret < 0) + return ret; + k = (int)hs + ds; + if (k > 255) + return -E_BAD_CT; + if (k < fc->fcp->data_slices_per_group) + k = fc->fcp->data_slices_per_group; + n = k + rs; + fc->num_extra_slices = k - fc->fcp->data_slices_per_group; + PARA_NOTICE_LOG("fec parms %d:%d:%d (%d extra slices)\n", + slice_bytes, k, n, fc->num_extra_slices); + fec_free(fc->parms); + fc->src_data = para_realloc(fc->src_data, k * sizeof(char *)); + ret = fec_new(k, n, &fc->parms); if (ret < 0) return ret; - if (needed > fc->fcp->data_slices_per_group) - PARA_WARNING_LOG("fec parms insufficient for this audio file\n"); - want = PARA_MAX(needed, fc->fcp->data_slices_per_group); - if (want != k) { - fec_free(fc->parms); - fc->src_data = para_realloc(fc->src_data, want * sizeof(char *)); - ret = fec_new(want, want + fc->fcp->slices_per_group - - fc->fcp->data_slices_per_group, &fc->parms); - if (ret < 0) - return ret; - k = want; - fc->num_extra_slices = 0; - if (k > fc->fcp->data_slices_per_group) { - fc->num_extra_slices = k - fc->fcp->data_slices_per_group; - PARA_NOTICE_LOG("using %d extra slices\n", - fc->num_extra_slices); - } - } fc->stream_start = *now; fc->first_stream_chunk = mmd->current_chunk; g->first_chunk = mmd->current_chunk; g->num = 0; } else { + k = fc->fcp->data_slices_per_group + fc->num_extra_slices; /* use duration of the previous group for the timing of this group */ set_slice_duration(fc, g); g->first_chunk += g->num_chunks; @@ -354,7 +355,12 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) g->num_header_slices, data_slices ); /* set group start */ - tv_scale(g->first_chunk - fc->first_stream_chunk, chunk_tv, &tmp); + if (g->num != 0 && vsst->header_len != 0 && fc->first_stream_chunk == 0) + /* chunk #0 is the audio file header */ + tv_scale(g->first_chunk - 1, chunk_tv, &tmp); + else + tv_scale(g->first_chunk - fc->first_stream_chunk, + chunk_tv, &tmp); tv_add(&fc->stream_start, &tmp, &g->start); return 1; }