* The VLC-integrated SAP server now sends compliant packets. They can
authorClément Stenac <zorglub@videolan.org>
Mon, 26 May 2003 13:45:52 +0000 (13:45 +0000)
committerClément Stenac <zorglub@videolan.org>
Mon, 26 May 2003 13:45:52 +0000 (13:45 +0000)
  only be viewed with the CVS version of VLC

include/announce.h
modules/stream_out/standard.c
src/stream_output/announce.c

index 6b9d2f2..5c298d5 100644 (file)
@@ -2,7 +2,7 @@
  * announce.h : Session announcement
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
- * $Id: announce.h,v 1.1 2003/05/20 16:20:33 zorglub Exp $
+ * $Id: announce.h,v 1.2 2003/05/26 13:45:51 zorglub Exp $
  *
  * Authors: Christophe Massiot <massiot@via.ecp.fr>
  *          Laurent Aimar <fenrir@via.ecp.fr>
@@ -51,6 +51,7 @@ struct sap_session_t
 {
         char psz_url[256];
         char psz_name[1024];
+        char psz_port[8];
         module_t p_network;
         unsigned int socket;
         unsigned int sendnow;
@@ -62,6 +63,6 @@ struct sap_session_t
 /*****************************************************************************
  * Prototypes
  *****************************************************************************/
-VLC_EXPORT( sap_session_t *,            sout_SAPNew,         ( sout_instance_t *,char * , char * ) );
+VLC_EXPORT( sap_session_t *,            sout_SAPNew,         ( sout_instance_t *,char * , char * , char * ) );
 VLC_EXPORT( void,            sout_SAPSend,        ( sout_instance_t *,sap_session_t * ) );
 VLC_EXPORT( void,            sout_SAPDelete,      ( sap_session_t * ) );
index b249389..6030b33 100644 (file)
@@ -2,7 +2,7 @@
  * standard.c
  *****************************************************************************
  * Copyright (C) 2001, 2002 VideoLAN
- * $Id: standard.c,v 1.2 2003/05/20 16:20:33 zorglub Exp $
+ * $Id: standard.c,v 1.3 2003/05/26 13:45:52 zorglub Exp $
  *
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  *
@@ -77,6 +77,8 @@ static int Open( vlc_object_t *p_this )
 
     char                *psz_sap = NULL;
 
+    char                *psz_port = "1234";
+    
     sap_session_t       *p_sap = NULL;
     
     sout_access_out_t *p_access;
@@ -126,7 +128,7 @@ static int Open( vlc_object_t *p_this )
     if(p_sys->b_sap)
     {        
         msg_Dbg( p_sout , "Creating SAP" );
-        p_sap = sout_SAPNew( p_sout , psz_url , psz_sap );
+        p_sap = sout_SAPNew( p_sout , psz_url , psz_port , psz_sap );
     }   
     
     /* XXX beurk */
index 4dabfed..03474d7 100644 (file)
@@ -3,9 +3,8 @@
  *****************************************************************************
  * Copyright (C) 2002 VideoLAN
  *
- * Authors: Christophe Massiot <massiot@via.ecp.fr>
- *          Laurent Aimar <fenrir@via.ecp.fr>
- *          Eric Petit <titer@videolan.org>
+ * Authors: Clément Stenac <zorglub@via.ecp.fr>
+ *          Damien Lucas <nitrox@via.ecp.fr>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include <announce.h>
 #include <network.h>
 
-#define SAP_ADDR "224.2.127.254"
+#define SAP_ADDR "224.2.127.254" /* Standard port and address for SAP */
 #define SAP_PORT 9875
 
 /*****************************************************************************
  * sout_SAPNew: Creates a SAP Session
  *****************************************************************************/
-sap_session_t * sout_SAPNew ( sout_instance_t *p_sout , char * psz_url_arg , char * psz_name_arg )
+sap_session_t * sout_SAPNew ( sout_instance_t *p_sout , char * psz_url_arg , char *psz_port_arg , char * psz_name_arg )
 {
         sap_session_t           *p_new;
         module_t                *p_network;
@@ -56,6 +55,7 @@ sap_session_t * sout_SAPNew ( sout_instance_t *p_sout , char * psz_url_arg , cha
         
         sprintf ( p_new->psz_url , "%s" , psz_url_arg );
         sprintf ( p_new->psz_name , "%s" , psz_name_arg );
+        sprintf ( p_new->psz_port, "%s" , psz_port_arg ); /* Not implemented in SO */
         
         msg_Dbg (p_sout , "Creating SAP Socket" );
         
@@ -106,32 +106,72 @@ void sout_SAPDelete( sap_session_t * p_this )
  *****************************************************************************/
 void sout_SAPSend( sout_instance_t *p_sout, sap_session_t * p_this )
 { 
-      char sap_msg[2048];
-      char *user="VideoLAN";
-      char *machine="VideoLAN";
-      char *site="VideoLAN";
+      char *sap_head;
+      char sap_msg[1000];
+      char *sap_send;
+      char *payload_type="application/sdp";
       int i_send_result;
+      int i;
+      int i_header_size;
+      int i_msg_size;
+      int i_size;
      
-    if(p_this->sendnow == 24)
-    {      
-      sprintf(sap_msg,"         ***øv=0 \n\
-      o=%s 3247692199 3247895918 IN IP4 %s \n\
-      s=%s\n\
-      u=%s \n\
-      t=3247691400 3250117800 \n\
-      a=type:test   \n\
-      m=audio 1234 udp 14 \n\
-      c=IN IP4 %s/15  \n\
-      xxxxxxxxxxxxxxxxxxxxx \n ",user,machine,p_this->psz_name,site,p_this->psz_url);
-        
-     i_send_result =  sendto( p_this->socket , sap_msg , strlen(sap_msg) , 0 , (struct sockaddr *)&p_this->addr , sizeof(p_this->addr) );
+    if( p_this->sendnow == 1 )
+    {
+         i_header_size = 9 + strlen( payload_type );
+         sap_head = ( char * )malloc( i_header_size * sizeof( char ) );
+                
+          sap_head[0]=0x20; /* Means IPv4, not encrypted, not compressed */
+          sap_head[1]=0x00; /* No authentification */
+          sap_head[2]=0x42; /* Version */
+          sap_head[3]=0x12; /* Version */
+          
+          sap_head[4]=0x01; /* Source IP  FIXME: we should get the real address */
+          sap_head[5]=0x02; /* idem */
+          sap_head[6]=0x03; /* idem */
+          sap_head[7]=0x04; /* idem */
+          
+          strncpy( sap_head+8 , payload_type , 15 );
+          sap_head[ i_header_size-1 ] = '\0'; 
+       
+        /* Do not add spaces at beginning of the lines ! */  
+          sprintf(sap_msg,"v=0\n\
+o=VideoLAN 3247692199 3247895918 IN IP4 VideoLAN\n\
+s=%s\n\
+u=VideoLAN\n\
+t=0 0\n\
+m=audio %s udp 14\n\
+c=IN IP4 %s/15\n\
+a=type:test\n", p_this->psz_name , p_this->psz_port , p_this->psz_url );
+     
+     i_msg_size = strlen( sap_msg );     
+     i_size = i_msg_size + i_header_size;
+     
+     sap_send = ( char* )malloc( i_size*sizeof(char) ); 
+          
+      for(i=0 ; i<i_header_size ; i++)
+      {
+           sap_send[i] = sap_head[i];
+       }
+
+     for( ;  i<i_size; i++)
+     {
+         sap_send[i] = sap_msg[i-i_header_size];
+     }
+    
+    /* What we send is the SAP header and the SDP packet */
      
+     if(i_size<1024) /* We mustn't send packets larger than 1024B */     
+         i_send_result =  sendto( p_this->socket , sap_send , i_size , 0 , (struct sockaddr *)&p_this->addr , sizeof(p_this->addr) );
+    
      if(i_send_result == -1)
      {
-              msg_Warn(p_sout , "SAP Send failed on socket %i. " , p_this->socket );
-             perror("send"); 
+          msg_Warn(p_sout , "SAP Send failed on socket %i. " , p_this->socket );
+          perror("sendto"); 
      }
-     p_this->sendnow=0;
-    }
-     p_this->sendnow++;  
+     p_this->sendnow = 0;
+     if(sap_send) free(sap_send);
+     if(sap_head) free(sap_head);
+   }
+   p_this->sendnow++;  
 }