X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;ds=sidebyside;f=vss.c;h=941f22fd69ccf40ba16ee7f2291656ea341dec49;hb=5ec0e807014e7e88d6e5e281fd51a391ad697ce1;hp=14cff6960eb2ef1dcfbff1f03dee7da4e3cb6a18;hpb=96dd1284a1b7d565560979fdc7ec647aeceb6b52;p=paraslash.git diff --git a/vss.c b/vss.c index 14cff696..941f22fd 100644 --- a/vss.c +++ b/vss.c @@ -169,8 +169,6 @@ struct fec_client { int num_extra_slices; /** Contains the FEC-encoded data. */ unsigned char *enc_buf; - /** Pointer obtained from sender when the client is added. */ - void *private_data; }; /** @@ -231,19 +229,17 @@ static int need_audio_header(struct fec_client *fc, struct vss_task *vsst) return 1; } -static int num_slices(long unsigned bytes, struct fec_client *fc, uint8_t *result) +static int num_slices(long unsigned bytes, struct fec_client *fc, int rs) { - unsigned long m = fc->fcp->max_slice_bytes - FEC_HEADER_SIZE; - unsigned rv, redundant_slices = fc->fcp->slices_per_group - - fc->fcp->data_slices_per_group; + int m = fc->fcp->max_slice_bytes - FEC_HEADER_SIZE; + int ret; - if (!m) - return -E_BAD_CT; - rv = (bytes + m - 1) / m; - if (rv + redundant_slices > 255) + assert(m > 0); + assert(rs > 0); + ret = (bytes + m - 1) / m; + if (ret + rs > 255) return -E_BAD_CT; - *result = rv; - return 1; + return ret; } /* set group start and group duration */ @@ -261,26 +257,27 @@ static void set_group_timing(struct fec_client *fc, struct fec_group *g) static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) { int ret, i, k, data_slices; + int hs, ds, rs; /* header/data/redundant slices */ size_t len; const char *buf, *start_buf; struct fec_group *g = &fc->group; unsigned slice_bytes = fc->fcp->max_slice_bytes - FEC_HEADER_SIZE; uint32_t max_data_size; + rs = fc->fcp->slices_per_group - fc->fcp->data_slices_per_group; if (fc->first_stream_chunk < 0) { - 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(vsst->header_len, fc, &hs); + ret = num_slices(vsst->header_len, fc, rs); if (ret < 0) return ret; + hs = ret; ret = num_slices(afh_get_largest_chunk_size(&mmd->afd.afhi), - fc, &ds); + fc, rs); if (ret < 0) return ret; - k = (int)hs + ds; + ds = ret; + k = hs + ds; if (k > 255) return -E_BAD_CT; if (k < fc->fcp->data_slices_per_group) @@ -315,9 +312,10 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst) g->num++; } if (need_audio_header(fc, vsst)) { - ret = num_slices(vsst->header_len, fc, &g->num_header_slices); + ret = num_slices(vsst->header_len, fc, rs); if (ret < 0) return ret; + g->num_header_slices = ret; } else g->num_header_slices = 0; afh_get_chunk(g->first_chunk, &mmd->afd.afhi, vsst->map, &start_buf, @@ -638,18 +636,6 @@ static void vss_eof(struct vss_task *vsst) mmd->events++; } -/** - * Get the list of all supported audio formats. - * - * \return Aa space separated list of all supported audio formats - * It is not allocated at runtime, i.e. there is no need to free - * the returned string in the caller. - */ -const char *supported_audio_formats(void) -{ - return SUPPORTED_AUDIO_FORMATS; -} - static int need_to_request_new_audio_file(struct vss_task *vsst) { struct timeval diff; @@ -692,7 +678,7 @@ static void set_mmd_offset(void) static void vss_pre_select(struct sched *s, struct task *t) { int i; - struct timeval *tv, diff; + struct timeval *tv; struct vss_task *vsst = container_of(t, struct vss_task, task); if (!vsst->map || vss_next() || vss_paused() || vss_repos()) { @@ -733,8 +719,8 @@ static void vss_pre_select(struct sched *s, struct task *t) senders[i].pre_select(&s->max_fileno, &s->rfds, &s->wfds); } tv = vss_compute_timeout(vsst); - if (tv && tv_diff(tv, &s->timeout, &diff) < 0) - s->timeout = *tv; + if (tv) + sched_request_timeout(tv, s); } static int recv_afs_msg(int afs_socket, int *fd, uint32_t *code, uint32_t *data) @@ -956,8 +942,12 @@ static void vss_post_select(struct sched *s, struct task *t) int num = mmd->sender_cmd_data.cmd_num, sender_num = mmd->sender_cmd_data.sender_num; - if (senders[sender_num].client_cmds[num]) - senders[sender_num].client_cmds[num](&mmd->sender_cmd_data); + if (senders[sender_num].client_cmds[num]) { + ret = senders[sender_num].client_cmds[num] + (&mmd->sender_cmd_data); + if (ret < 0) + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + } mmd->sender_cmd_data.cmd_num = -1; } if (vsst->afsss != AFS_SOCKET_CHECK_FOR_WRITE)