X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Faccess%2Fmms%2Fmmsh.c;h=cc22555931ff76a3f9b6a0538a2f50784e5f11bd;hb=850c37b46867f04052709bdfce91c3f04ddc27d2;hp=6786972d0dc2af6d863c36bc5edf218c4cb212f8;hpb=ed0b72e3714ad87cb4e10b9a7239e19b9ef0724e;p=vlc diff --git a/modules/access/mms/mmsh.c b/modules/access/mms/mmsh.c index 6786972d0d..cc22555931 100644 --- a/modules/access/mms/mmsh.c +++ b/modules/access/mms/mmsh.c @@ -24,14 +24,17 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include +#include #include "vlc_playlist.h" +#include "vlc_strings.h" -#include "network.h" +#include #include "vlc_url.h" #include "asf.h" #include "buffer.h" @@ -40,7 +43,6 @@ #include "mmsh.h" /* TODO: - * - http_proxy * - authentication */ @@ -50,15 +52,23 @@ int E_(MMSHOpen) ( access_t * ); void E_(MMSHClose) ( access_t * ); -static int Read( access_t *, uint8_t *, int ); -static int ReadRedirect( access_t *, uint8_t *, int ); +static ssize_t Read( access_t *, uint8_t *, size_t ); +static ssize_t ReadRedirect( access_t *, uint8_t *, size_t ); static int Seek( access_t *, int64_t ); static int Control( access_t *, int, va_list ); static int Describe( access_t *, char **ppsz_location ); static int Start( access_t *, int64_t ); static void Stop( access_t * ); + static int GetPacket( access_t *, chunk_t * ); +static void GetHeader( access_t *p_access ); + +static int Restart( access_t * ); +static int Reset( access_t * ); + +//#define MMSH_USER_AGENT "NSPlayer/4.1.0.3856" +#define MMSH_USER_AGENT "NSPlayer/7.10.0.3059" /**************************************************************************** * Open: connect to ftp server and ask for file @@ -67,6 +77,7 @@ int E_(MMSHOpen)( access_t *p_access ) { access_sys_t *p_sys; char *psz_location = NULL; + char *psz_proxy; /* init p_sys */ @@ -81,17 +92,80 @@ int E_(MMSHOpen)( access_t *p_access ) p_access->info.b_eof = VLC_FALSE; p_access->info.i_title = 0; p_access->info.i_seekpoint = 0; + p_access->p_sys = p_sys = malloc( sizeof( access_sys_t ) ); + if( !p_sys ) + return VLC_ENOMEM; + memset( p_sys, 0, sizeof( access_sys_t ) ); p_sys->i_proto= MMS_PROTO_HTTP; p_sys->fd = -1; p_sys->i_start= 0; + /* Handle proxy */ + p_sys->b_proxy = VLC_FALSE; + memset( &p_sys->proxy, 0, sizeof(p_sys->proxy) ); + + /* Check proxy */ + /* TODO reuse instead http-proxy from http access ? */ + psz_proxy = var_CreateGetString( p_access, "mmsh-proxy" ); + if( !*psz_proxy ) + { + char *psz_http_proxy = config_GetPsz( p_access, "http-proxy" ); + if( psz_http_proxy && *psz_http_proxy ) + { + free( psz_proxy ); + psz_proxy = psz_http_proxy; + var_SetString( p_access, "mmsh-proxy", psz_proxy ); + } + else + { + free( psz_http_proxy ); + } + } + + if( *psz_proxy ) + { + p_sys->b_proxy = VLC_TRUE; + vlc_UrlParse( &p_sys->proxy, psz_proxy, 0 ); + } +#ifdef HAVE_GETENV + else + { + char *psz_proxy = getenv( "http_proxy" ); + if( psz_proxy && *psz_proxy ) + { + p_sys->b_proxy = VLC_TRUE; + vlc_UrlParse( &p_sys->proxy, psz_proxy, 0 ); + } + } +#endif + free( psz_proxy ); + + if( p_sys->b_proxy ) + { + if( ( p_sys->proxy.psz_host == NULL ) || + ( *p_sys->proxy.psz_host == '\0' ) ) + { + msg_Warn( p_access, "invalid proxy host" ); + vlc_UrlClean( &p_sys->proxy ); + free( p_sys ); + return VLC_EGENERIC; + } + + if( p_sys->proxy.i_port <= 0 ) + p_sys->proxy.i_port = 80; + msg_Dbg( p_access, "Using http proxy %s:%d", + p_sys->proxy.psz_host, p_sys->proxy.i_port ); + } + /* open a tcp connection */ vlc_UrlParse( &p_sys->url, p_access->psz_path, 0 ); - if( p_sys->url.psz_host == NULL || *p_sys->url.psz_host == '\0' ) + if( ( p_sys->url.psz_host == NULL ) || + ( *p_sys->url.psz_host == '\0' ) ) { msg_Err( p_access, "invalid host" ); + vlc_UrlClean( &p_sys->proxy ); vlc_UrlClean( &p_sys->url ); free( p_sys ); return VLC_EGENERIC; @@ -101,6 +175,7 @@ int E_(MMSHOpen)( access_t *p_access ) if( Describe( p_access, &psz_location ) ) { + vlc_UrlClean( &p_sys->proxy ); vlc_UrlClean( &p_sys->url ); free( p_sys ); return VLC_EGENERIC; @@ -108,19 +183,13 @@ int E_(MMSHOpen)( access_t *p_access ) /* Handle redirection */ if( psz_location && *psz_location ) { - playlist_t * p_playlist = vlc_object_find( p_access, VLC_OBJECT_PLAYLIST, FIND_PARENT ); - + playlist_t * p_playlist = pl_Yield( p_access ); msg_Dbg( p_access, "redirection to %s", psz_location ); - if( !p_playlist ) - { - msg_Err( p_access, "redirection failed: can't find playlist" ); - free( psz_location ); - return VLC_EGENERIC; - } /** \bug we do not autodelete here */ - playlist_PlaylistAdd( p_playlist, psz_location, psz_location, - PLAYLIST_INSERT | PLAYLIST_GO, PLAYLIST_END ); + playlist_Add( p_playlist, psz_location, psz_location, + PLAYLIST_INSERT | PLAYLIST_GO, PLAYLIST_END, VLC_TRUE, + VLC_FALSE ); vlc_object_release( p_playlist ); free( psz_location ); @@ -134,6 +203,7 @@ int E_(MMSHOpen)( access_t *p_access ) { msg_Err( p_access, "cannot start stream" ); free( p_sys->p_header ); + vlc_UrlClean( &p_sys->proxy ); vlc_UrlClean( &p_sys->url ); free( p_sys ); return VLC_EGENERIC; @@ -155,6 +225,11 @@ void E_( MMSHClose )( access_t *p_access ) access_sys_t *p_sys = p_access->p_sys; Stop( p_access ); + + free( p_sys->p_header ); + + vlc_UrlClean( &p_sys->proxy ); + vlc_UrlClean( &p_sys->url ); free( p_sys ); } @@ -185,11 +260,6 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_CAN_CONTROL_PACE: pb_bool = (vlc_bool_t*)va_arg( args, vlc_bool_t* ); - -#if 0 /* Disable for now until we have a clock synchro algo - * which works with something else than MPEG over UDP */ - *pb_bool = VLC_FALSE; -#endif *pb_bool = VLC_TRUE; break; @@ -208,7 +278,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) i_int = (int)va_arg( args, int ); pb_bool = (vlc_bool_t *)va_arg( args, vlc_bool_t * ); - if( i_int < 0 || i_int > 127 ) + if( (i_int < 0) || (i_int > 127) ) return VLC_EGENERIC; *pb_bool = p_sys->asfh.stream[i_int].i_selected ? VLC_TRUE : VLC_FALSE; break; @@ -219,6 +289,7 @@ static int Control( access_t *p_access, int i_query, va_list args ) case ACCESS_SET_TITLE: case ACCESS_SET_SEEKPOINT: case ACCESS_SET_PRIVATE_ID_STATE: + case ACCESS_GET_CONTENT_TYPE: return VLC_EGENERIC; default: @@ -249,6 +320,7 @@ static int Seek( access_t *p_access, int64_t i_pos ) while( !p_access->b_die ) { + msg_Warn( p_access, "GetPacket 1" ); if( GetPacket( p_access, &ck ) ) break; @@ -269,7 +341,7 @@ static int Seek( access_t *p_access, int64_t i_pos ) /***************************************************************************** * Read: *****************************************************************************/ -static int ReadRedirect( access_t *p_access, uint8_t *p, int i_len ) +static ssize_t ReadRedirect( access_t *p_access, uint8_t *p, size_t i_len ) { return 0; } @@ -277,7 +349,7 @@ static int ReadRedirect( access_t *p_access, uint8_t *p, int i_len ) /***************************************************************************** * Read: *****************************************************************************/ -static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) +static ssize_t Read( access_t *p_access, uint8_t *p_buffer, size_t i_len ) { access_sys_t *p_sys = p_access->p_sys; size_t i_copy; @@ -288,10 +360,11 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) while( i_data < (size_t) i_len ) { - if( p_access->info.i_pos < p_sys->i_start + p_sys->i_header ) + if( p_access->info.i_pos < (p_sys->i_start + p_sys->i_header) ) { int i_offset = p_access->info.i_pos - p_sys->i_start; - i_copy = __MIN( p_sys->i_header - i_offset, (int)((size_t)i_len - i_data) ); + i_copy = __MIN( p_sys->i_header - i_offset, + (int)((size_t)i_len - i_data) ); memcpy( &p_buffer[i_data], &p_sys->p_header[i_offset], i_copy ); i_data += i_copy; @@ -301,7 +374,6 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) { i_copy = __MIN( p_sys->i_packet_length - p_sys->i_packet_used, i_len - i_data ); - memcpy( &p_buffer[i_data], &p_sys->p_packet[p_sys->i_packet_used], i_copy ); @@ -315,7 +387,6 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) { i_copy = __MIN( p_sys->asfh.i_min_data_packet_size - p_sys->i_packet_used, i_len - i_data ); - memset( &p_buffer[i_data], 0, i_copy ); i_data += i_copy; @@ -325,33 +396,18 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) else { chunk_t ck; + msg_Warn( p_access, "GetPacket 2" ); if( GetPacket( p_access, &ck ) ) { - if( (ck.i_type == 0x4524) && (ck.i_sequence != 0) && - (p_sys->b_broadcast) ) + int i_ret = -1; + if( p_sys->b_broadcast ) { - char *psz_location = NULL; - - p_sys->i_start = p_access->info.i_pos; - - msg_Dbg( p_access, "stoping the stream" ); - Stop( p_access ); - - msg_Dbg( p_access, "describe the stream" ); - if( Describe( p_access, &psz_location ) ) - { - msg_Err( p_access, "describe failed" ); - p_access->info.b_eof = VLC_TRUE; - return 0; - } - if( Start( p_access, 0 ) ) - { - msg_Err( p_access, "Start failed" ); - p_access->info.b_eof = VLC_TRUE; - return 0; - } + if( (ck.i_type == 0x4524) && (ck.i_sequence != 0) ) + i_ret = Restart( p_access ); + else if( ck.i_type == 0x4324 ) + i_ret = Reset( p_access ); } - else + if( i_ret ) { p_access->info.b_eof = VLC_TRUE; return 0; @@ -368,6 +424,139 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) return( i_data ); } +/* */ +static int Restart( access_t *p_access ) +{ + access_sys_t *p_sys = p_access->p_sys; + char *psz_location = NULL; + + msg_Dbg( p_access, "Restart the stream" ); + p_sys->i_start = p_access->info.i_pos; + + /* */ + msg_Dbg( p_access, "stoping the stream" ); + Stop( p_access ); + + /* */ + msg_Dbg( p_access, "describe the stream" ); + if( Describe( p_access, &psz_location ) ) + { + msg_Err( p_access, "describe failed" ); + return VLC_EGENERIC; + } + /* */ + if( Start( p_access, 0 ) ) + { + msg_Err( p_access, "Start failed" ); + return VLC_EGENERIC; + } + return VLC_SUCCESS; +} +static int Reset( access_t *p_access ) +{ + access_sys_t *p_sys = p_access->p_sys; + asf_header_t old_asfh = p_sys->asfh; + int i; + + msg_Dbg( p_access, "Reset the stream" ); + p_sys->i_start = p_access->info.i_pos; + + /* */ + p_sys->i_packet_sequence = 0; + p_sys->i_packet_used = 0; + p_sys->i_packet_length = 0; + p_sys->p_packet = NULL; + + /* Get the next header FIXME memory loss ? */ + GetHeader( p_access ); + if( p_sys->i_header <= 0 ) + return VLC_EGENERIC; + + E_( asf_HeaderParse )( &p_sys->asfh, + p_sys->p_header, p_sys->i_header ); + msg_Dbg( p_access, "packet count="I64Fd" packet size=%d", + p_sys->asfh.i_data_packets_count, + p_sys->asfh.i_min_data_packet_size ); + + E_( asf_StreamSelect)( &p_sys->asfh, + var_CreateGetInteger( p_access, "mms-maxbitrate" ), + var_CreateGetInteger( p_access, "mms-all" ), + var_CreateGetInteger( p_access, "audio" ), + var_CreateGetInteger( p_access, "video" ) ); + + /* Check we have comptible asfh */ + for( i = 1; i < 128; i++ ) + { + asf_stream_t *p_old = &old_asfh.stream[i]; + asf_stream_t *p_new = &p_sys->asfh.stream[i]; + + if( p_old->i_cat != p_new->i_cat || p_old->i_selected != p_new->i_selected ) + break; + } + if( i < 128 ) + { + msg_Warn( p_access, "incompatible asf header, restart" ); + return Restart( p_access ); + } + + /* */ + p_sys->i_packet_used = 0; + p_sys->i_packet_length = 0; + return VLC_SUCCESS; +} + +static int OpenConnection( access_t *p_access ) +{ + access_sys_t *p_sys = p_access->p_sys; + vlc_url_t srv = p_sys->b_proxy ? p_sys->proxy : p_sys->url; + + if( ( p_sys->fd = net_ConnectTCP( p_access, + srv.psz_host, srv.i_port ) ) < 0 ) + { + msg_Err( p_access, "cannot connect to %s:%d", + srv.psz_host, srv.i_port ); + return VLC_EGENERIC; + } + + if( p_sys->b_proxy ) + { + net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, + "GET http://%s:%d%s HTTP/1.0\r\n", + p_sys->url.psz_host, p_sys->url.i_port, + ( (p_sys->url.psz_path == NULL) || + (*p_sys->url.psz_path == '\0') ) ? + "/" : p_sys->url.psz_path ); + + /* Proxy Authentication */ + if( p_sys->proxy.psz_username && *p_sys->proxy.psz_username ) + { + char *buf; + char *b64; + + asprintf( &buf, "%s:%s", p_sys->proxy.psz_username, + p_sys->proxy.psz_password ? p_sys->proxy.psz_password : "" ); + + b64 = vlc_b64_encode( buf ); + free( buf ); + + net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, + "Proxy-Authorization: Basic %s\r\n", b64 ); + free( b64 ); + } + } + else + { + net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, + "GET %s HTTP/1.0\r\n" + "Host: %s:%d\r\n", + ( (p_sys->url.psz_path == NULL) || + (*p_sys->url.psz_path == '\0') ) ? + "/" : p_sys->url.psz_path, + p_sys->url.psz_host, p_sys->url.i_port ); + } + return VLC_SUCCESS; +} + /***************************************************************************** * Describe: *****************************************************************************/ @@ -387,25 +576,15 @@ static int Describe( access_t *p_access, char **ppsz_location ) p_sys->p_packet = NULL; E_( GenerateGuid )( &p_sys->guid ); - if( ( p_sys->fd = net_ConnectTCP( p_access, p_sys->url.psz_host, - p_sys->url.i_port ) ) < 0 ) - { - msg_Err( p_access, "cannot connect to %s:%d", p_sys->url.psz_host, - p_sys->url.i_port ); - goto error; - } + if( OpenConnection( p_access ) ) + return VLC_EGENERIC; - /* send first request */ net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, - "GET %s HTTP/1.0\r\n" "Accept: */*\r\n" - "User-Agent: NSPlayer/4.1.0.3856\r\n" - "Host: %s:%d\r\n" + "User-Agent: "MMSH_USER_AGENT"\r\n" "Pragma: no-cache,rate=1.000000,stream-time=0,stream-offset=0:0,request-context=%d,max-duration=0\r\n" "Pragma: xClientGUID={"GUID_FMT"}\r\n" "Connection: Close\r\n", - ( p_sys->url.psz_path == NULL || *p_sys->url.psz_path == '\0' ) ? "/" : p_sys->url.psz_path, - p_sys->url.psz_host, p_sys->url.i_port, p_sys->i_request_context++, GUID_PRINT( p_sys->guid ) ); @@ -421,6 +600,7 @@ static int Describe( access_t *p_access, char **ppsz_location ) msg_Err( p_access, "failed to read answer" ); goto error; } + if( strncmp( psz, "HTTP/1.", 7 ) ) { msg_Err( p_access, "invalid HTTP reply '%s'", psz ); @@ -496,8 +676,8 @@ static int Describe( access_t *p_access, char **ppsz_location ) } /* Handle the redirection */ - if( ( i_code == 301 || i_code == 302 || - i_code == 303 || i_code == 307 ) && + if( ( (i_code == 301) || (i_code == 302) || + (i_code == 303) || (i_code == 307) ) && psz_location && *psz_location ) { msg_Dbg( p_access, "redirection to %s", psz_location ); @@ -508,33 +688,15 @@ static int Describe( access_t *p_access, char **ppsz_location ) } /* Read the asf header */ - p_sys->i_header = 0; - p_sys->p_header = NULL; - for( ;; ) - { - chunk_t ck; - if( GetPacket( p_access, &ck ) || - (ck.i_type != 0x4824) ) - { - break; - } - - if( ck.i_data > 0 ) - { - p_sys->i_header += ck.i_data; - p_sys->p_header = realloc( p_sys->p_header, p_sys->i_header ); - memcpy( &p_sys->p_header[p_sys->i_header - ck.i_data], - ck.p_data, ck.i_data ); - } - } - msg_Dbg( p_access, "complete header size=%d", p_sys->i_header ); + GetHeader( p_access ); if( p_sys->i_header <= 0 ) { msg_Err( p_access, "header size == 0" ); goto error; } /* close this connection */ - net_Close( p_sys->fd ); p_sys->fd = -1; + net_Close( p_sys->fd ); + p_sys->fd = -1; /* *** parse header and get stream and their id *** */ /* get all streams properties, @@ -563,46 +725,65 @@ error: return VLC_EGENERIC; } +static void GetHeader( access_t *p_access ) +{ + access_sys_t *p_sys = p_access->p_sys; + + /* Read the asf header */ + p_sys->i_header = 0; + free( p_sys->p_header ); + p_sys->p_header = NULL; + for( ;; ) + { + chunk_t ck; + if( GetPacket( p_access, &ck ) || ck.i_type != 0x4824 ) + break; + + if( ck.i_data > 0 ) + { + p_sys->i_header += ck.i_data; + p_sys->p_header = realloc( p_sys->p_header, p_sys->i_header ); + memcpy( &p_sys->p_header[p_sys->i_header - ck.i_data], + ck.p_data, ck.i_data ); + } + } + msg_Dbg( p_access, "complete header size=%d", p_sys->i_header ); +} + + /***************************************************************************** - * - *****************************************************************************/ -static int Start( access_t *p_access, off_t i_pos ) + * Start stream + ****************************************************************************/ +static int Start( access_t *p_access, int64_t i_pos ) { access_sys_t *p_sys = p_access->p_sys; int i_streams = 0; + int i_streams_selected = 0; int i; - char *psz; + char *psz = NULL; msg_Dbg( p_access, "starting stream" ); - if( ( p_sys->fd = net_ConnectTCP( p_access, p_sys->url.psz_host, - p_sys->url.i_port ) ) < 0 ) - { - /* should not occur */ - msg_Err( p_access, "cannot connect to the server" ); - return VLC_EGENERIC; - } - for( i = 1; i < 128; i++ ) { + if( p_sys->asfh.stream[i].i_cat == ASF_STREAM_UNKNOWN ) + continue; + i_streams++; if( p_sys->asfh.stream[i].i_selected ) - { - i_streams++; - } + i_streams_selected++; } - - if( i_streams <= 0 ) + if( i_streams_selected <= 0 ) { msg_Err( p_access, "no stream selected" ); return VLC_EGENERIC; } + + if( OpenConnection( p_access ) ) + return VLC_EGENERIC; + net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, - "GET %s HTTP/1.0\r\n" "Accept: */*\r\n" - "User-Agent: NSPlayer/4.1.0.3856\r\n" - "Host: %s:%d\r\n", - ( p_sys->url.psz_path == NULL || *p_sys->url.psz_path == '\0' ) ? "/" : p_sys->url.psz_path, - p_sys->url.psz_host, p_sys->url.i_port ); + "User-Agent: "MMSH_USER_AGENT"\r\n" ); if( p_sys->b_broadcast ) { net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, @@ -634,7 +815,6 @@ static int Start( access_t *p_access, off_t i_pos ) { i_select = 0; } - net_Printf( VLC_OBJECT(p_access), p_sys->fd, NULL, "ffff:%d:%d ", i, i_select ); } @@ -649,11 +829,13 @@ static int Start( access_t *p_access, off_t i_pos ) return VLC_EGENERIC; } - if( ( psz = net_Gets( VLC_OBJECT(p_access), p_sys->fd, NULL ) ) == NULL ) + psz = net_Gets( VLC_OBJECT(p_access), p_sys->fd, NULL ); + if( psz == NULL ) { - msg_Err( p_access, "cannot read data" ); + msg_Err( p_access, "cannot read data 0" ); return VLC_EGENERIC; } + if( atoi( &psz[9] ) >= 400 ) { msg_Err( p_access, "error: %s", psz ); @@ -669,7 +851,7 @@ static int Start( access_t *p_access, off_t i_pos ) char *psz = net_Gets( p_access, p_sys->fd, NULL ); if( psz == NULL ) { - msg_Err( p_access, "cannot read data" ); + msg_Err( p_access, "cannot read data 1" ); return VLC_EGENERIC; } if( *psz == '\0' ) @@ -688,7 +870,7 @@ static int Start( access_t *p_access, off_t i_pos ) } /***************************************************************************** - * + * closing stream *****************************************************************************/ static void Stop( access_t *p_access ) { @@ -703,7 +885,7 @@ static void Stop( access_t *p_access ) } /***************************************************************************** - * + * get packet *****************************************************************************/ static int GetPacket( access_t * p_access, chunk_t *p_ck ) { @@ -721,9 +903,10 @@ static int GetPacket( access_t * p_access, chunk_t *p_ck ) */ if( net_Read( p_access, p_sys->fd, NULL, p_sys->buffer, 4, VLC_TRUE ) < 4 ) { - msg_Err( p_access, "cannot read data" ); + msg_Err( p_access, "cannot read data 2" ); return VLC_EGENERIC; } + p_ck->i_type = GetWLE( p_sys->buffer); p_ck->i_size = GetWLE( p_sys->buffer + 2); @@ -733,7 +916,7 @@ static int GetPacket( access_t * p_access, chunk_t *p_ck ) if( net_Read( p_access, p_sys->fd, NULL, p_sys->buffer + 4, restsize, VLC_TRUE ) < restsize ) { - msg_Err( p_access, "cannot read data" ); + msg_Err( p_access, "cannot read data 3" ); return VLC_EGENERIC; } p_ck->i_sequence = GetDWLE( p_sys->buffer + 4); @@ -760,14 +943,17 @@ static int GetPacket( access_t * p_access, chunk_t *p_ck ) } else { - msg_Warn( p_access, "next stream follow but not supported" ); + msg_Warn( p_access, "next stream following" ); return VLC_EGENERIC; } } - /* 0x4324 is CHUNK_TYPE_RESET. We can safely ignore it: a new stream will - * follow with a sequence of 0 */ - else if( (p_ck->i_type != 0x4824) && (p_ck->i_type != 0x4424) && - (p_ck->i_type != 0x4324) ) + else if( p_ck->i_type == 0x4324 ) + { + /* 0x4324 is CHUNK_TYPE_RESET: a new stream will follow with a sequence of 0 */ + msg_Warn( p_access, "next stream following (reset) seq=%d", p_ck->i_sequence ); + return VLC_EGENERIC; + } + else if( (p_ck->i_type != 0x4824) && (p_ck->i_type != 0x4424) ) { msg_Err( p_access, "invalid chunk FATAL (0x%x)", p_ck->i_type ); return VLC_EGENERIC; @@ -777,15 +963,17 @@ static int GetPacket( access_t * p_access, chunk_t *p_ck ) (net_Read( p_access, p_sys->fd, NULL, &p_sys->buffer[12], p_ck->i_data, VLC_TRUE ) < p_ck->i_data) ) { - msg_Err( p_access, "cannot read data" ); + msg_Err( p_access, "cannot read data 4" ); return VLC_EGENERIC; } +#if 0 if( (p_sys->i_packet_sequence != 0) && (p_ck->i_sequence != p_sys->i_packet_sequence) ) { msg_Warn( p_access, "packet lost ? (%d != %d)", p_ck->i_sequence, p_sys->i_packet_sequence ); } +#endif p_sys->i_packet_sequence = p_ck->i_sequence + 1; p_sys->i_packet_used = 0;