#include <vlc_common.h>
#include <vlc_access.h>
-#include "vlc_strings.h"
-#include "vlc_input.h"
+#include <vlc_strings.h>
+#include <vlc_input.h>
#include <vlc_network.h>
-#include "vlc_url.h"
+#include <vlc_url.h>
#include "asf.h"
#include "buffer.h"
static block_t *Block( access_t *p_access );
static ssize_t ReadRedirect( access_t *, uint8_t *, size_t );
-static int Seek( access_t *, int64_t );
+static int Seek( access_t *, uint64_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 int Start( access_t *, uint64_t );
static void Stop( access_t * );
static int GetPacket( access_t *, chunk_t * );
/* Check proxy */
/* TODO reuse instead http-proxy from http access ? */
- psz_proxy = var_CreateGetString( p_access, "mmsh-proxy" );
- if( !*psz_proxy )
+ psz_proxy = var_CreateGetNonEmptyString( p_access, "mmsh-proxy" );
+ if( !psz_proxy )
{
- char *psz_http_proxy = config_GetPsz( p_access, "http-proxy" );
- if( psz_http_proxy && *psz_http_proxy )
+ char *psz_http_proxy = var_InheritString( p_access, "http-proxy" );
+ if( 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 )
+ if( psz_proxy )
{
p_sys->b_proxy = true;
vlc_UrlParse( &p_sys->proxy, psz_proxy, 0 );
+ free( psz_proxy );
}
#ifdef HAVE_GETENV
else
{
- char *psz_proxy = getenv( "http_proxy" );
- if( psz_proxy && *psz_proxy )
+ const char *http_proxy = getenv( "http_proxy" );
+ if( http_proxy )
{
p_sys->b_proxy = true;
- vlc_UrlParse( &p_sys->proxy, psz_proxy, 0 );
+ vlc_UrlParse( &p_sys->proxy, http_proxy, 0 );
}
}
#endif
- free( psz_proxy );
if( p_sys->b_proxy )
{
( *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;
+ goto error;
}
if( p_sys->url.i_port <= 0 )
p_sys->url.i_port = 80;
if( Describe( p_access, &psz_location ) )
- {
- vlc_UrlClean( &p_sys->proxy );
- vlc_UrlClean( &p_sys->url );
- free( p_sys );
- return VLC_EGENERIC;
- }
+ goto error;
+
/* Handle redirection */
if( psz_location && *psz_location )
{
msg_Dbg( p_access, "redirection to %s", psz_location );
- input_thread_t * p_input = vlc_object_find( p_access, VLC_OBJECT_INPUT, FIND_PARENT );
+ input_thread_t * p_input = access_GetParentInput( p_access );
input_item_t * p_new_loc;
if( !p_input )
{
- vlc_UrlClean( &p_sys->proxy );
- vlc_UrlClean( &p_sys->url );
- free( p_sys );
free( psz_location );
- return VLC_EGENERIC;
+ goto error;
}
/** \bug we do not autodelete here */
p_new_loc = input_item_New( p_access, psz_location, psz_location );
- input_item_AddSubItem( input_GetItem( p_input ), p_new_loc );
+ input_item_t *p_item = input_GetItem( p_input );
+ input_item_AddSubItem( p_item, p_new_loc );
+ input_item_AddSubItem2( p_item, p_new_loc );
+
vlc_gc_decref( p_new_loc );
vlc_object_release( p_input );
{
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;
+ goto error;
}
if( !p_sys->b_broadcast )
}
return VLC_SUCCESS;
+
+error:
+ vlc_UrlClean( &p_sys->proxy );
+ vlc_UrlClean( &p_sys->url );
+ free( p_sys );
+ return VLC_EGENERIC;
}
/*****************************************************************************
Stop( p_access );
- free( p_sys->p_header );
+ free( p_sys->p_header );
vlc_UrlClean( &p_sys->proxy );
vlc_UrlClean( &p_sys->url );
/*****************************************************************************
* Seek: try to go at the right place
*****************************************************************************/
-static int Seek( access_t *p_access, int64_t i_pos )
+static int Seek( access_t *p_access, uint64_t i_pos )
{
access_sys_t *p_sys = p_access->p_sys;
chunk_t ck;
- off_t i_offset;
- off_t i_packet;
+ uint64_t i_offset;
+ uint64_t i_packet;
msg_Dbg( p_access, "seeking to %"PRId64, i_pos );
msg_Err( p_access, "describe failed" );
return VLC_EGENERIC;
}
+ free( psz_location );
+
/* */
if( Start( p_access, 0 ) )
{
if( p_sys->i_header <= 0 )
return VLC_EGENERIC;
- asf_HeaderParse ( &p_sys->asfh,
- p_sys->p_header, p_sys->i_header );
+ asf_HeaderParse ( &p_sys->asfh,
+ p_sys->p_header, p_sys->i_header );
msg_Dbg( p_access, "packet count=%"PRId64" packet size=%d",
p_sys->asfh.i_data_packets_count,
p_sys->asfh.i_min_data_packet_size );
- 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" ) );
+ asf_StreamSelect( &p_sys->asfh,
+ var_CreateGetInteger( p_access, "mms-maxbitrate" ),
+ var_CreateGetBool( 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++ )
p_sys->i_packet_used = 0;
p_sys->i_packet_length = 0;
p_sys->p_packet = NULL;
- GenerateGuid ( &p_sys->guid );
+
+ GenerateGuid ( &p_sys->guid );
if( OpenConnection( p_access ) )
return VLC_EGENERIC;
}
/* Receive the http header */
- if( ( psz = net_Gets( VLC_OBJECT(p_access), p_sys->fd, NULL ) ) == NULL )
+ if( ( psz = net_Gets( p_access, p_sys->fd, NULL ) ) == NULL )
{
msg_Err( p_access, "failed to read answer" );
goto error;
*ppsz_location = psz_location;
return VLC_SUCCESS;
}
+ free( psz_location );
/* Read the asf header */
GetHeader( p_access );
*
* TODO : stream bitrates properties(optional)
* and bitrate mutual exclusion(optional) */
- asf_HeaderParse ( &p_sys->asfh,
- p_sys->p_header, p_sys->i_header );
+ asf_HeaderParse ( &p_sys->asfh,
+ p_sys->p_header, p_sys->i_header );
msg_Dbg( p_access, "packet count=%"PRId64" packet size=%d",
p_sys->asfh.i_data_packets_count,
p_sys->asfh.i_min_data_packet_size );
if( p_sys->asfh.i_min_data_packet_size <= 0 )
goto error;
- 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" ) );
+ asf_StreamSelect( &p_sys->asfh,
+ var_CreateGetInteger( p_access, "mms-maxbitrate" ),
+ var_CreateGetBool( p_access, "mms-all" ),
+ var_CreateGetInteger( p_access, "audio" ),
+ var_CreateGetInteger( p_access, "video" ) );
return VLC_SUCCESS;
error:
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 );
+ p_sys->p_header = xrealloc( 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 );
}
/*****************************************************************************
* Start stream
****************************************************************************/
-static int Start( access_t *p_access, int64_t i_pos )
+static int Start( access_t *p_access, uint64_t i_pos )
{
access_sys_t *p_sys = p_access->p_sys;
int i_streams = 0;
return VLC_EGENERIC;
}
- psz = net_Gets( VLC_OBJECT(p_access), p_sys->fd, NULL );
+ psz = net_Gets( p_access, p_sys->fd, NULL );
if( psz == NULL )
{
msg_Err( p_access, "cannot read data 0" );