*****************************************************************************
* Copyright (C) 2002-2004 the xine project
* Copyright (C) 2005 VideoLAN
- * $Id: file.c 10310 2005-03-11 22:36:40Z anil $
+ * $Id$
*
* Authors: Gildas Bazin <gbazin@videolan.org>
* Adapted from xine which itself adapted it from joschkas real tools.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
-#include <stdio.h>
-#include <stdlib.h>
-#include <vlc/vlc.h>
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
#include "rtsp.h"
char *psz_buffer = malloc( BUF_SIZE );
char *psz_string = NULL;
- if( rtsp->pf_read_line( rtsp->p_userdata, psz_buffer, BUF_SIZE ) >= 0 )
+ if( rtsp->pf_read_line( rtsp->p_userdata, (uint8_t*)psz_buffer, (unsigned int)BUF_SIZE ) >= 0 )
{
//printf( "<< '%s'\n", psz_buffer );
psz_string = strdup( psz_buffer );
/*
* rtsp_put puts a line on stream
*/
-
+
static int rtsp_put( rtsp_client_t *rtsp, const char *psz_string )
{
- int i_buffer = strlen( psz_string );
+ unsigned int i_buffer = strlen( psz_string );
char *psz_buffer = malloc( i_buffer + 3 );
int i_ret;
psz_buffer[i_buffer] = '\r'; psz_buffer[i_buffer+1] = '\n';
psz_buffer[i_buffer+2] = 0;
- i_ret = rtsp->pf_write( rtsp->p_userdata, psz_buffer, i_buffer + 2 );
+ i_ret = rtsp->pf_write( rtsp->p_userdata, (uint8_t*)psz_buffer, i_buffer + 2 );
free( psz_buffer );
return i_ret;
{
char psz_buffer[4];
int i_code = 0;
-
+
if( !strncmp( psz_string, "RTSP/1.0", sizeof("RTSP/1.0") - 1 ) )
{
memcpy( psz_buffer, psz_string + sizeof("RTSP/1.0"), 3 );
if( i_code != 200 )
{
- fprintf( stderr, "librtsp: server responds: '%s'\n", psz_string );
+ //fprintf( stderr, "librtsp: server responds: '%s'\n", psz_string );
}
return i_code;
/*
* get the answers, if server responses with something != 200, return NULL
*/
-
+
static int rtsp_get_answers( rtsp_client_t *rtsp )
{
char *answer = NULL;
char **answer_ptr = rtsp->p_private->answers;
int code;
int ans_count = 0;
-
+
answer = rtsp_get( rtsp );
if( !answer ) return 0;
code = rtsp_get_status_code( rtsp, answer );
answer = rtsp_get( rtsp );
if( !answer ) return 0;
-
+
if( !strncasecmp( answer, "Cseq:", 5 ) )
{
sscanf( answer, "%*s %u", &answer_seq );
{
char *buf = malloc( strlen(answer) );
sscanf( answer, "%*s %s", buf );
- if( rtsp->p_private->server ) free( rtsp->p_private->server );
- rtsp->p_private->server = strdup( buf );
- free( buf );
+ free( rtsp->p_private->server );
+ rtsp->p_private->server = buf;
}
if( !strncasecmp( answer, "Session:", 8 ) )
{
{
if( strcmp( buf, rtsp->p_private->session ) )
{
- fprintf( stderr,
- "rtsp: warning: setting NEW session: %s\n", buf );
+ //fprintf( stderr,
+ // "rtsp: warning: setting NEW session: %s\n", buf );
free( rtsp->p_private->session );
rtsp->p_private->session = strdup( buf );
}
}
else
{
- fprintf( stderr, "setting session id to: %s\n", buf );
+ //fprintf( stderr, "setting session id to: %s\n", buf );
rtsp->p_private->session = strdup( buf );
}
free( buf );
int rtsp_send_ok( rtsp_client_t *rtsp )
{
char cseq[16];
-
+
rtsp_put( rtsp, "RTSP/1.0 200 OK" );
sprintf( cseq, "CSeq: %u", rtsp->p_private->cseq );
rtsp_put( rtsp, cseq );
* read opaque data from stream
*/
-int rtsp_read_data( rtsp_client_t *rtsp, char *buffer, unsigned int size )
+int rtsp_read_data( rtsp_client_t *rtsp, uint8_t *buffer, unsigned int size )
{
int i, seq;
if( size >= 4 )
{
- i= rtsp->pf_read( rtsp->p_userdata, buffer, 4 );
+ i = rtsp->pf_read( rtsp->p_userdata, (uint8_t*)buffer, (unsigned int) 4 );
if( i < 4 ) return i;
if( buffer[0]=='S' && buffer[1]=='E' && buffer[2]=='T' &&
if( !strncasecmp( rest, "Cseq:", 5 ) )
sscanf( rest, "%*s %u", &seq );
- } while( strlen(rest) != 0 );
-
+ } while( *rest );
free( rest );
+
if( seq < 0 )
{
- fprintf(stderr, "warning: cseq not recognized!\n");
- seq=1;
+ //fprintf(stderr, "warning: cseq not recognized!\n");
+ seq = 1;
}
/* lets make the server happy */
sprintf( rest,"CSeq: %u", seq );
rtsp_put( rtsp, rest );
rtsp_put( rtsp, "" );
- rtsp->pf_read( rtsp->p_userdata, buffer, size );
+ free( rest );
+ i = rtsp->pf_read( rtsp->p_userdata, (unsigned char*)buffer, size );
}
else
{
- i = rtsp->pf_read( rtsp->p_userdata, buffer + 4, size - 4 );
+ i = rtsp->pf_read( rtsp->p_userdata, (unsigned char*)buffer + 4, size - 4 );
i += 4;
}
}
- else i= rtsp->pf_read( rtsp->p_userdata, buffer, size );
+ else i = rtsp->pf_read( rtsp->p_userdata, (unsigned char*)buffer, size );
//fprintf( stderr, "<< %d of %d bytes\n", i, size );
rtsp_t *s;
char *mrl_ptr;
char *slash, *colon;
- int hostend, pathbegin, i;
+ unsigned int hostend, pathbegin, i;
if( !psz_mrl ) return -1;
s = malloc( sizeof(rtsp_t) );
colon = strchr( mrl_ptr, ':' );
if( !slash ) slash = mrl_ptr + strlen(mrl_ptr) + 1;
- if( !colon ) colon = slash;
+ if( !colon ) colon = slash;
if( colon > slash ) colon = slash;
pathbegin = slash - mrl_ptr;
if( s->port < 0 || s->port > 65535 ) s->port = 554;
}
- fprintf( stderr, "got mrl: %s %i %s\n", s->host, s->port, s->path );
+ free( mrl_ptr );
+ //fprintf( stderr, "got mrl: %s %i %s\n", s->host, s->port, s->path );
s->s = rtsp->pf_connect( rtsp->p_userdata, s->host, s->port );
if( s->s < 0 )
{
- fprintf(stderr, "rtsp: failed to connect to '%s'\n", s->host);
+ //fprintf(stderr, "rtsp: failed to connect to '%s'\n", s->host);
rtsp_close( rtsp );
return -1;
}
}
/*
- * closes an rtsp connection
+ * closes an rtsp connection
*/
void rtsp_close( rtsp_client_t *rtsp )
rtsp->pf_disconnect( rtsp->p_userdata );
}
- if( rtsp->p_private->path ) free( rtsp->p_private->path );
- if( rtsp->p_private->host ) free( rtsp->p_private->host );
- if( rtsp->p_private->mrl ) free( rtsp->p_private->mrl );
- if( rtsp->p_private->session ) free( rtsp->p_private->session );
- if( rtsp->p_private->user_agent ) free( rtsp->p_private->user_agent );
+ free( rtsp->p_private->path );
+ free( rtsp->p_private->host );
+ free( rtsp->p_private->mrl );
+ free( rtsp->p_private->session );
+ free( rtsp->p_private->user_agent );
+ free( rtsp->p_private->server );
rtsp_free_answers( rtsp );
rtsp_unschedule_all( rtsp );
free( rtsp->p_private );
void rtsp_set_session( rtsp_client_t *rtsp, const char *id )
{
- if( rtsp->p_private->session ) free( rtsp->p_private->session );
+ free( rtsp->p_private->session );
rtsp->p_private->session = strdup(id);
}
}
/*
- * removes the first scheduled field which prefix matches string.
+ * removes the first scheduled field which prefix matches string.
*/
void rtsp_unschedule_field( rtsp_client_t *rtsp, const char *string )
{
if( !strncmp(*ptr, string, strlen(string)) ) break;
}
- if( *ptr ) free( *ptr );
+ free( *ptr );
ptr++;
do
{