Merge commit 'meins/master'
authorAndre Noll <maan@systemlinux.org>
Mon, 14 Sep 2009 08:08:57 +0000 (10:08 +0200)
committerAndre Noll <maan@systemlinux.org>
Mon, 14 Sep 2009 08:08:57 +0000 (10:08 +0200)
vss.c

diff --git a/vss.c b/vss.c
index ccdd1f7c96323b0158892beb984e34ab33d4c8b1..babcd24c9a1e55cf95b1dcb6d340e5b5d490cb06 100644 (file)
--- 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,15 @@ 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 */
+       tv_scale(g->first_chunk - fc->first_stream_chunk, chunk_tv, &tmp);
+       tv_add(&fc->stream_start, &tmp, &g->start);
        return 1;
 }
 
@@ -825,7 +834,7 @@ err:
  */
 static void vss_send(struct vss_task *vsst)
 {
-       int i, sent_something = 0;
+       int i, fec_active = 0;
        struct timeval due;
        struct fec_client *fc, *tmp_fc;
 
@@ -839,8 +848,10 @@ static void vss_send(struct vss_task *vsst)
        list_for_each_entry_safe(fc, tmp_fc, &fec_client_list, node) {
                if (fc->error < 0)
                        continue;
-               if (!next_slice_is_due(fc, NULL))
+               if (!next_slice_is_due(fc, NULL)) {
+                       fec_active = 1;
                        continue;
+               }
                if (compute_next_fec_slice(fc, vsst) <= 0)
                        continue;
                PARA_DEBUG_LOG("sending %d:%d (%u bytes)\n", fc->group.num,
@@ -849,10 +860,10 @@ static void vss_send(struct vss_task *vsst)
                        fc->fcp->max_slice_bytes,
                        fc->fcp->private_data);
                fc->current_slice_num++;
-               sent_something = 1;
+               fec_active = 1;
        }
        if (mmd->current_chunk >= mmd->afd.afhi.chunks_total) { /* eof */
-               if (!sent_something)
+               if (!fec_active)
                        mmd->new_vss_status_flags |= VSS_NEXT;
                return;
        }