]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blobdiff - libavformat/frsh.c
Reworked assignment of FRSH contract parameters
[frescor/ffmpeg.git] / libavformat / frsh.c
index 5044ca26fa77df7ae5a2b4a94683017be11956c4..d4fae188a2fcc5fa2a390b7c4b75832d99c61cee 100644 (file)
@@ -36,8 +36,6 @@
 #include <frsh.h>
 #include <frsh_core_types.h>
 
-long int avformat_frsh_budget, avformat_frsh_period;
-
 typedef struct {
     int frsh_fd;
     int ttl;
@@ -49,32 +47,17 @@ typedef struct {
     int dest_addr_len;
        
        frsh_send_endpoint_t sepoint;
-       frsh_send_endpoint_t repoint;
+       frsh_receive_endpoint_t repoint;
        frsh_vres_id_t vres;
        frsh_send_endpoint_protocol_info_t send_pinfo;
        frsh_contract_t contract;
        frsh_contract_label_t label;
-       frsh_rel_time_t budget, period;
+       frsh_rel_time_t budget, period, deadline;
 } FRSHContext;
 
 #define FRSH_TX_BUF_SIZE 32768
 #define FRSH_MAX_PKT_SIZE 65536
 
-static int frsh_set_multicast_ttl(int sockfd, int mcastTTL, struct sockaddr *addr) 
-{
-    return 0;
-}
-
-static int frsh_join_multicast_group(int sockfd, struct sockaddr *addr) 
-{
-    return 0;
-}
-
-static int frsh_leave_multicast_group(int sockfd, struct sockaddr *addr) 
-{
-    return 0;
-}
-
 static int frsh_set_url(struct sockaddr_in *addr, const char *hostname, int port)
 {
     /* set the destination address */
@@ -92,20 +75,20 @@ static int is_multicast_address(struct sockaddr_in *addr)
 }
 
 static int 
-frsh_socket_create(FRSHContext *s, struct sockaddr_in *addr, int *addr_len)
+frsh_output_socket_create(FRSHContext *s)
 {
        static long int netcont_num = 0;
        int ret,frsh_fd;
        char netcont_name[20];
+       struct sockaddr_in addr;
+       int addr_len;
 
-    addr->sin_family = AF_INET;
-    addr->sin_addr.s_addr = htonl (INADDR_ANY);
-    addr->sin_port = htons(s->local_port);
-    *addr_len = sizeof(struct sockaddr_in);
+    addr.sin_family = AF_INET;
+    addr.sin_addr.s_addr = htonl (INADDR_ANY);
+    addr.sin_port = htons(s->local_port);
+    addr_len = sizeof(addr);
 
        /* set params for contract */
-       frsh_network_bytes_to_budget(FRSH_NETPF_FWP, avformat_frsh_budget, &s->budget);
-       s->period = fosa_msec_to_rel_time(avformat_frsh_period);
        s->send_pinfo.body = NULL;              
        
        frsh_fd = frsh_send_endpoint_create(FRSH_NETPF_FWP, 
@@ -129,13 +112,18 @@ frsh_socket_create(FRSHContext *s, struct sockaddr_in *addr, int *addr_len)
                                             FRSH_CT_REGULAR);
        //if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_basic_params");
        if (ret) return -1;
-       snprintf(netcont_name, sizeof(netcont_name), "ffmpeg%02d", ++netcont_num);
+       snprintf(netcont_name, sizeof(netcont_name), "ffmpeg%02ld", ++netcont_num);
        ret = frsh_contract_set_resource_and_label(&s->contract,FRSH_RT_NETWORK,
                                                   FRSH_NETPF_FWP,
                                                   s->label[0] ? s->label : netcont_name);
        //if (ret) PERROR_AND_EXIT(ret, "frsh_contract_set_resource_and_label");
        if (ret) return -1;
 
+       if (frsh_rel_time_to_nsec(s->deadline) > 0) {
+               ret = frsh_contract_set_timing_reqs(&s->contract, false, &s->deadline);
+               if (ret) return -1;
+       }
+
        ret = frsh_contract_negotiate(&s->contract, &s->vres);
        //if (ret) PERROR_AND_EXIT(ret, "frsh_contract_negotiate");
        if (ret) return -1;
@@ -150,6 +138,18 @@ frsh_socket_create(FRSHContext *s, struct sockaddr_in *addr, int *addr_len)
        return frsh_fd;
 }
 
+static int 
+frsh_input_socket_create(FRSHContext *s)
+{
+       frsh_receive_endpoint_protocol_info_t pi = { NULL, 0 };
+       frsh_endpoint_queueing_info_t qi = { .queue_size=0, .queue_policy=FRSH_QRP_OLDEST };
+       
+       return frsh_receive_endpoint_create(FRSH_NETPF_FWP, s->local_port, qi, pi,
+                                           &s->repoint);
+}
+               
+
+
 static int frsh_port(struct sockaddr_in *addr, int len)
 {
     return ntohs(addr->sin_port);
@@ -261,6 +261,15 @@ static int frsh_open(URLContext *h, const char *uri, int flags)
                          "contract_label", p)) {
                s->label[0]=0;
         }
+        if (find_info_tag(buf, sizeof(buf), "budget", p)) {
+               frsh_network_bytes_to_budget(FRSH_NETPF_FWP, strtol(buf, NULL, 10), &s->budget);
+        }
+        if (find_info_tag(buf, sizeof(buf), "period", p)) {
+               s->period=frsh_msec_to_rel_time(strtol(buf, NULL, 10));
+        }
+        if (find_info_tag(buf, sizeof(buf), "deadline", p)) {
+               s->deadline=frsh_msec_to_rel_time(strtol(buf, NULL, 10));
+        }
     }
 
     /* fill the dest addr */
@@ -275,7 +284,10 @@ static int frsh_open(URLContext *h, const char *uri, int flags)
         frsh_set_remote_url(h, uri);
     }
 
-    frsh_fd = frsh_socket_create(s, &my_addr, &len);
+    if (is_output)
+           frsh_fd = frsh_output_socket_create(s);
+    else
+           frsh_fd = frsh_input_socket_create(s);
     if (frsh_fd < 0)
         goto fail;
 #if 0
@@ -334,7 +346,7 @@ static int frsh_write(URLContext *h, uint8_t *buf, int size)
     FRSHContext *s = h->priv_data;
     int ret;
        
-       ret = frsh_send_async(s->sepoint, buf, size);
+       ret = frsh_send_sync(s->sepoint, buf, size);
        return ret;
 }
 
@@ -345,6 +357,7 @@ static int frsh_close(URLContext *h)
        
        frsh_send_endpoint_unbind(s->sepoint);
        ret = frsh_contract_cancel(s->vres);
+       frsh_contract_destroy(s->contract);
        return ret;
 }