summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
2b245d8)
This makes num_slices() take ints rather than uint8_t arguments which
avoids nasty integer overflows and allows to drop the result parameter
since the result is now contained in the return value.
Moreover, num_slices() now takes the number of redundant slices as
an additional argument, so that this value has to be comuted only
once in the caller.
-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)
- *result = rv;
- return 1;
}
/* set group start and group duration */
}
/* set group start and group duration */
static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
{
int ret, i, k, data_slices;
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;
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) {
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 */
- ret = num_slices(vsst->header_len, fc, &hs);
+ ret = num_slices(vsst->header_len, fc, rs);
ret = num_slices(afh_get_largest_chunk_size(&mmd->afd.afhi),
ret = num_slices(afh_get_largest_chunk_size(&mmd->afd.afhi),
+ ds = ret;
+ k = hs + ds;
if (k > 255)
return -E_BAD_CT;
if (k < fc->fcp->data_slices_per_group)
if (k > 255)
return -E_BAD_CT;
if (k < fc->fcp->data_slices_per_group)
g->num++;
}
if (need_audio_header(fc, 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);
+ g->num_header_slices = ret;
} else
g->num_header_slices = 0;
afh_get_chunk(g->first_chunk, &mmd->afd.afhi, vsst->map, &start_buf,
} else
g->num_header_slices = 0;
afh_get_chunk(g->first_chunk, &mmd->afd.afhi, vsst->map, &start_buf,