#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 ) )
{
asf_StreamSelect( &p_sys->asfh,
var_CreateGetInteger( p_access, "mms-maxbitrate" ),
- var_CreateGetInteger( p_access, "mms-all" ),
+ var_CreateGetBool( p_access, "mms-all" ),
var_CreateGetInteger( p_access, "audio" ),
var_CreateGetInteger( p_access, "video" ) );
*ppsz_location = psz_location;
return VLC_SUCCESS;
}
+ free( psz_location );
/* Read the asf header */
GetHeader( p_access );
asf_StreamSelect( &p_sys->asfh,
var_CreateGetInteger( p_access, "mms-maxbitrate" ),
- var_CreateGetInteger( p_access, "mms-all" ),
+ var_CreateGetBool( p_access, "mms-all" ),
var_CreateGetInteger( p_access, "audio" ),
var_CreateGetInteger( p_access, "video" ) );
return VLC_SUCCESS;
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;