X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=2068563cf557d9531b84f508cb869d16120e584c;hp=2dab278dfff9c20983e3353e9a86a7147904262a;hb=1d54a5412ef39590022e6dd4448881f267e96d0b;hpb=ead9cdc8160656e868f1d709ad1a764f9dcc3a2f diff --git a/vss.c b/vss.c index 2dab278d..2068563c 100644 --- a/vss.c +++ b/vss.c @@ -12,7 +12,6 @@ */ #include -#include #include #include "para.h" @@ -338,6 +337,26 @@ static int initialize_fec_client(struct fec_client *fc, struct vss_task *vsst) return 1; } +static void vss_get_chunk(int chunk_num, struct vss_task *vsst, + char **buf, size_t *sz) +{ + /* + * Chunk zero is special for header streams: It is the first portion of + * the audio file which consists of the audio file header. It may be + * arbitrary large due to embedded meta data. Audio format handlers may + * replace the header by a stripped one with meta data omitted which is + * of bounded size. We always use the stripped header for streaming + * rather than the unmodified header (chunk zero). + */ + if (chunk_num == 0 && vsst->header_len > 0) { + *buf = vsst->header_buf; /* stripped header */ + *sz = vsst->header_len; + return; + } + afh_get_chunk(chunk_num, &mmd->afd.afhi, vsst->map, (const char **)buf, + sz); +} + static void compute_group_size(struct vss_task *vsst, struct fec_group *g, int max_bytes) { @@ -352,7 +371,7 @@ static void compute_group_size(struct vss_task *vsst, struct fec_group *g, * of exactly one chunk for these audio formats. */ for (i = 0;; i++) { - const char *buf; + char *buf; size_t len; int chunk_num = g->first_chunk + i; @@ -360,7 +379,7 @@ static void compute_group_size(struct vss_task *vsst, struct fec_group *g, break; if (chunk_num >= mmd->afd.afhi.chunks_total) /* eof */ break; - afh_get_chunk(chunk_num, &mmd->afd.afhi, vsst->map, &buf, &len); + vss_get_chunk(chunk_num, vsst, &buf, &len); if (g->bytes + len > max_bytes) break; /* Include this chunk */ @@ -482,7 +501,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) { int ret, i, k, n, data_slices; size_t len; - const char *buf; + char *buf; struct fec_group *g = &fc->group; if (fc->state == FEC_STATE_NONE) { @@ -522,6 +541,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) /* setup header slices */ buf = vsst->header_buf; for (i = 0; i < g->num_header_slices; i++) { + uint32_t payload_size; if (buf + g->slice_bytes <= vsst->header_buf + vsst->header_len) { fc->src_data[i] = (const unsigned char *)buf; buf += g->slice_bytes; @@ -532,8 +552,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) * goes beyond the buffer. This slice will not be fully * used. */ - uint32_t payload_size = vsst->header_buf - + vsst->header_len - buf; + payload_size = vsst->header_buf + vsst->header_len - buf; memcpy(fc->extra_header_buf, buf, payload_size); if (payload_size < g->slice_bytes) memset(fc->extra_header_buf + payload_size, 0, @@ -543,7 +562,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) } /* setup data slices */ - afh_get_chunk(g->first_chunk, &mmd->afd.afhi, vsst->map, &buf, &len); + vss_get_chunk(g->first_chunk, vsst, &buf, &len); for (; i < g->num_header_slices + data_slices; i++) { if (buf + g->slice_bytes > vsst->map + mmd->size) { /* @@ -1062,7 +1081,7 @@ static void vss_send(struct vss_task *vsst) compute_chunk_time(mmd->chunks_sent, &mmd->afd.afhi.chunk_tv, &mmd->stream_start, &due); if (tv_diff(&due, now, NULL) <= 0) { - const char *buf; + char *buf; size_t len; if (!mmd->chunks_sent) { @@ -1075,8 +1094,7 @@ static void vss_send(struct vss_task *vsst) * they might have still some data queued which can be sent in * this case. */ - afh_get_chunk(mmd->current_chunk, &mmd->afd.afhi, vsst->map, - &buf, &len); + vss_get_chunk(mmd->current_chunk, vsst, &buf, &len); for (i = 0; senders[i].name; i++) { if (!senders[i].send) continue; @@ -1167,5 +1185,6 @@ void init_vss_task(int afs_socket) tv_add(&vsst->autoplay_barrier, &vsst->announce_tv, &vsst->data_send_barrier); } + sprintf(vsst->task.status, "vss task"); register_task(&vsst->task); }