* 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>
{
char psz_url[256];
char psz_name[1024];
+ char psz_port[8];
module_t p_network;
unsigned int socket;
unsigned int sendnow;
/*****************************************************************************
* 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 * ) );
*****************************************************************************
* 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;
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" );
*****************************************************************************/
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++;
}