]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/periodic_header_optional'
authorAndre Noll <maan@systemlinux.org>
Sat, 22 Jan 2011 15:57:02 +0000 (16:57 +0100)
committerAndre Noll <maan@systemlinux.org>
Sat, 22 Jan 2011 15:57:02 +0000 (16:57 +0100)
command.c
dccp_send.c
http_send.c
send.h
server.c
udp_send.c
vss.c

index e95318c4f1661c50caf7664542d20e5babddbcac..57e851f938c700044be20b62226dc07fae63c07e 100644 (file)
--- a/command.c
+++ b/command.c
@@ -13,6 +13,7 @@
 #include <dirent.h>
 #include <openssl/rc4.h>
 #include <osl.h>
+#include <stdbool.h>
 
 #include "para.h"
 #include "error.h"
index 425527fc423e90dfc0396d7680d25d00733379ea..304a42e749a647d5d6a568ae0e9850d183907979 100644 (file)
@@ -145,6 +145,7 @@ static void dccp_post_select(fd_set *rfds, __a_unused fd_set *wfds)
        dfc->fcp.slices_per_group       = conf.dccp_slices_per_group_arg;
        dfc->fcp.init_fec               = dccp_init_fec;
        dfc->fcp.send_fec               = dccp_send_fec;
+       dfc->fcp.need_periodic_header   = false;
        dfc->fc = vss_add_fec_client(sc, &dfc->fcp);
 }
 
index 4ad857662f6ef5d9029129c6714b8c0c20ecdca4..086b600f0d043f928e6c2c0f71afa65104045f00 100644 (file)
@@ -10,6 +10,7 @@
 #include <sys/types.h>
 #include <dirent.h>
 #include <osl.h>
+#include <stdbool.h>
 
 #include "para.h"
 #include "error.h"
diff --git a/send.h b/send.h
index e13909321f193b8326bcfda87e1adecedd2ff5ae..836babd50845088be08a2061fe39cc6ffd7760cb 100644 (file)
--- a/send.h
+++ b/send.h
@@ -131,6 +131,8 @@ struct fec_client_parms {
        uint8_t slices_per_group;
        /** Number of slices minus number of redundant slices. */
        uint8_t data_slices_per_group;
+       /** Whether the header must be sent periodically. */
+       bool need_periodic_header;
        /**
         * Transport-layer initialisation for FEC support.
         *
index dfac4c588910bfbbf3ae1469d26992849b811647..efff208b1bd704a1e5bf64aee32491b514b5b14e 100644 (file)
--- a/server.c
+++ b/server.c
@@ -68,6 +68,7 @@
 #include <openssl/rc4.h>
 #include <regex.h>
 #include <osl.h>
+#include <stdbool.h>
 
 #include "para.h"
 #include "error.h"
index 003757ef8a94b2af8c7218d31fdaca6489ed765b..4fb10b444be321c51e7d33da2442fd6b8a469138 100644 (file)
@@ -14,6 +14,7 @@
 #include <netinet/udp.h>
 #include <net/if.h>
 #include <osl.h>
+#include <stdbool.h>
 
 #include "server.cmdline.h"
 #include "para.h"
@@ -317,6 +318,7 @@ static int udp_com_add(struct sender_command_data *scd)
        ut->fcp.data_slices_per_group = scd->data_slices_per_group;
        ut->fcp.init_fec              = udp_init_fec;
        ut->fcp.send_fec              = udp_send_fec;
+       ut->fcp.need_periodic_header  = true;
 
        sc->private_data = ut;
        sc->fd = -1;
diff --git a/vss.c b/vss.c
index 38e829356e2adf1f866ceaaaa84fbdbe603193ea..916a71d518762f63675c65c195f87b6fdce089e1 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -227,12 +227,29 @@ static bool need_audio_header(struct fec_client *fc, struct vss_task *vsst)
                return false;
        if (vsst->header_len == 0)
                return false;
-       if (fc->group.num && tv_diff(&fc->next_header_time, now, NULL) > 0)
-               return false;
+       if (fc->group.num > 0) {
+               if (!fc->fcp->need_periodic_header)
+                       return false;
+               if (tv_diff(&fc->next_header_time, now, NULL) > 0)
+                       return false;
+       }
        tv_add(now, &vsst->header_interval, &fc->next_header_time);
        return true;
 }
 
+static bool need_data_slices(struct fec_client *fc, struct vss_task *vsst)
+{
+       if (fc->group.num > 0)
+               return true;
+       if (!vsst->header_buf)
+               return true;
+       if (vsst->header_len == 0)
+               return true;
+       if (fc->fcp->need_periodic_header)
+               return true;
+       return false;
+}
+
 static int num_slices(long unsigned bytes, int max_payload, int rs)
 {
        int ret;
@@ -246,11 +263,15 @@ static int num_slices(long unsigned bytes, int max_payload, int rs)
 }
 
 /* set group start and group duration */
-static void set_group_timing(struct fec_client *fc, struct fec_group *g)
+static void set_group_timing(struct fec_client *fc, struct vss_task *vsst)
 {
+       struct fec_group *g = &fc->group;
        struct timeval *chunk_tv = vss_chunk_time();
 
-       tv_scale(g->num_chunks, chunk_tv, &g->duration);
+       if (!need_data_slices(fc, vsst))
+               ms2tv(200, &g->duration);
+       else
+               tv_scale(g->num_chunks, chunk_tv, &g->duration);
        tv_divide(fc->fcp->slices_per_group + fc->num_extra_slices,
                &g->duration, &g->slice_duration);
        PARA_DEBUG_LOG("durations (group/chunk/slice): %lu/%lu/%lu\n",
@@ -288,7 +309,10 @@ static int initialize_fec_client(struct fec_client *fc, struct vss_task *vsst)
        if (ret < 0)
                return ret;
        ds = ret;
-       k = hs + ds;
+       if (fc->fcp->need_periodic_header)
+               k = hs + ds;
+       else
+               k = PARA_MAX(hs, ds);
        if (k < fc->fcp->data_slices_per_group)
                k = fc->fcp->data_slices_per_group;
        fc->num_extra_slices = k - fc->fcp->data_slices_per_group;
@@ -407,6 +431,13 @@ static int compute_slice_size(struct fec_client *fc, struct vss_task *vsst)
                        g->slice_bytes = 1;
                return 1;
        }
+       if (!need_data_slices(fc, vsst)) {
+               g->bytes = 0;
+               g->num_chunks = 0;
+               g->slice_bytes = DIV_ROUND_UP(vsst->header_len, k);
+               g->num_header_slices = k;
+               return 1;
+       }
        h = vsst->header_len;
        max_group_bytes = (k - num_slices(h, max_slice_bytes, n - k))
                * max_slice_bytes;
@@ -467,7 +498,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
                 */
                tmp = g->start;
                tv_add(&tmp, &g->duration, &g->start);
-               set_group_timing(fc, g);
+               set_group_timing(fc, vsst);
                g->first_chunk += g->num_chunks;
                g->num++;
        }
@@ -483,7 +514,7 @@ static int setup_next_fec_group(struct fec_client *fc, struct vss_task *vsst)
        assert(g->num_header_slices + data_slices <= k);
        fc->current_slice_num = 0;
        if (g->num == 0)
-               set_group_timing(fc, g);
+               set_group_timing(fc, vsst);
 
        /* setup header slices */
        buf = vsst->header_buf;