X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Frtsp%2Frtsp.c;h=67fbf409b7ce4d70df9922c86ee31808cfed6d8a;hb=6ee1e193fd896ab9a4729fde14f009d9ce629815;hp=419018bfc400e8bb531646a7a64507e72f3537b4;hpb=c284892b9bf06acca13bcb0cd1502c509296f287;p=vlc diff --git a/modules/access/rtsp/rtsp.c b/modules/access/rtsp/rtsp.c index 419018bfc4..67fbf409b7 100644 --- a/modules/access/rtsp/rtsp.c +++ b/modules/access/rtsp/rtsp.c @@ -4,7 +4,7 @@ ***************************************************************************** * 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 * Adapted from xine which itself adapted it from joschkas real tools. @@ -21,10 +21,8 @@ * * 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 -#include #include @@ -89,7 +87,7 @@ static char *rtsp_get( rtsp_client_t *rtsp ) 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 ); @@ -103,10 +101,10 @@ static char *rtsp_get( rtsp_client_t *rtsp ) /* * 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; @@ -114,7 +112,7 @@ static int rtsp_put( rtsp_client_t *rtsp, const char *psz_string ) 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; @@ -128,7 +126,7 @@ static int rtsp_get_status_code( rtsp_client_t *rtsp, const char *psz_string ) { 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 ); @@ -142,7 +140,7 @@ static int rtsp_get_status_code( rtsp_client_t *rtsp, const char *psz_string ) 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; @@ -202,7 +200,7 @@ static void rtsp_schedule_standard( rtsp_client_t *rtsp ) /* * get the answers, if server responses with something != 200, return NULL */ - + static int rtsp_get_answers( rtsp_client_t *rtsp ) { char *answer = NULL; @@ -210,7 +208,7 @@ static int rtsp_get_answers( rtsp_client_t *rtsp ) 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 ); @@ -222,7 +220,7 @@ static int rtsp_get_answers( rtsp_client_t *rtsp ) answer = rtsp_get( rtsp ); if( !answer ) return 0; - + if( !strncasecmp( answer, "Cseq:", 5 ) ) { sscanf( answer, "%*s %u", &answer_seq ); @@ -239,8 +237,7 @@ static int rtsp_get_answers( rtsp_client_t *rtsp ) 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 ); + rtsp->p_private->server = buf; } if( !strncasecmp( answer, "Session:", 8 ) ) { @@ -250,15 +247,15 @@ static int rtsp_get_answers( rtsp_client_t *rtsp ) { 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 ); @@ -283,7 +280,7 @@ static int rtsp_get_answers( rtsp_client_t *rtsp ) 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 ); @@ -394,13 +391,13 @@ int rtsp_request_tearoff( rtsp_client_t *rtsp, const char *what ) * 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' && @@ -418,13 +415,13 @@ int rtsp_read_data( rtsp_client_t *rtsp, char *buffer, unsigned int size ) 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 */ @@ -433,15 +430,16 @@ int rtsp_read_data( rtsp_client_t *rtsp, char *buffer, unsigned int size ) 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 ); @@ -458,7 +456,7 @@ int rtsp_connect( rtsp_client_t *rtsp, const char *psz_mrl, 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) ); @@ -493,7 +491,7 @@ int rtsp_connect( rtsp_client_t *rtsp, const char *psz_mrl, 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; @@ -514,13 +512,14 @@ int rtsp_connect( rtsp_client_t *rtsp, const char *psz_mrl, 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; } @@ -545,7 +544,7 @@ int rtsp_connect( rtsp_client_t *rtsp, const char *psz_mrl, } /* - * closes an rtsp connection + * closes an rtsp connection */ void rtsp_close( rtsp_client_t *rtsp ) @@ -561,6 +560,7 @@ void rtsp_close( rtsp_client_t *rtsp ) 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 ); + if( rtsp->p_private->server ) free( rtsp->p_private->server ); rtsp_free_answers( rtsp ); rtsp_unschedule_all( rtsp ); free( rtsp->p_private ); @@ -630,7 +630,7 @@ void rtsp_schedule_field( rtsp_client_t *rtsp, const char *string ) } /* - * 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 )