X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=aae601d14153d6973a8a86f8f8a93e69cd6c8bbd;hp=400df846c453756bfe5e8e938fe9d7b1c81e1df3;hb=f21270523b4500797f7976906998128f5ff5da72;hpb=745667ae4887ebe0e25a4b9085556ac6ed56b246 diff --git a/vss.c b/vss.c index 400df846..aae601d1 100644 --- a/vss.c +++ b/vss.c @@ -232,6 +232,17 @@ static int num_slices(long unsigned bytes, struct fec_client *fc, uint8_t *resul return 1; } +static void set_slice_duration(struct fec_client *fc, struct fec_group *g) +{ + struct timeval group_duration, *chunk_tv = vss_chunk_time(); + + tv_scale(g->num_chunks, chunk_tv, &group_duration); + tv_divide(fc->fcp->slices_per_group + fc->num_extra_slices, + &group_duration, &g->slice_duration); + PARA_DEBUG_LOG("durations (group/chunk/slice): %lu/%lu/%lu\n", + tv2ms(&group_duration), tv2ms(chunk_tv), tv2ms(&g->slice_duration)); +} + static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) { int ret, i, k, data_slices; @@ -275,6 +286,8 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) g->first_chunk = mmd->current_chunk; g->num = 0; } else { + /* use duration of the previous group for the timing of this group */ + set_slice_duration(fc, g); g->first_chunk += g->num_chunks; g->num++; } @@ -301,6 +314,8 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) g->num_chunks = i - g->first_chunk; assert(g->num_chunks); fc->current_slice_num = 0; + if (g->num == 0) + set_slice_duration(fc, g); /* setup header slices */ buf = vsst->header_buf; @@ -332,21 +347,20 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) for (; i < k; i++) fc->src_data[i] = (const unsigned char *)buf; } - - /* setup group timing */ - tv_scale(g->first_chunk - fc->first_stream_chunk, chunk_tv, &tmp); - tv_add(&fc->stream_start, &tmp, &g->start); - tv_scale(g->num_chunks, chunk_tv, &tmp); /* group duration */ - tv_divide(fc->fcp->slices_per_group + fc->num_extra_slices, - &tmp, &g->slice_duration); - - PARA_DEBUG_LOG("FEC group %d: %d chunks (%d - %d), %d header slices, %d data slices\n", + PARA_DEBUG_LOG("FEC group %d: %d chunks (%d - %d), " + "%d header slices, %d data slices\n", g->num, g->num_chunks, g->first_chunk, g->first_chunk + g->num_chunks - 1, g->num_header_slices, data_slices ); - PARA_DEBUG_LOG("durations (group/chunk/slice): %lu/%lu/%lu\n", - tv2ms(&tmp), tv2ms(chunk_tv), tv2ms(&g->slice_duration)); + /* set group start */ + 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; }