vss: Cleanup num_slices().
authorAndre Noll <maan@systemlinux.org>
Sat, 7 Aug 2010 14:45:41 +0000 (16:45 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 31 Oct 2010 11:06:56 +0000 (12:06 +0100)
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.

vss.c

diff --git a/vss.c b/vss.c
index b470658..941f22f 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -229,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 */
@@ -259,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)
@@ -313,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,