*/
}
+static bool PeekASX( demux_t *p_demux )
+{
+ const uint8_t *p_peek;
+ return ( stream_Peek( p_demux->s, &p_peek, 12 ) == 12
+ && !memcmp( p_peek, "<asx version", 12 ) );
+}
+
/*****************************************************************************
* Import_ASX: main import function
*****************************************************************************/
if( demux_IsPathExtension( p_demux, ".asx" ) ||
demux_IsPathExtension( p_demux, ".wax" ) ||
demux_IsPathExtension( p_demux, ".wvx" ) ||
+ (
+ CheckContentType( p_demux->s, "video/x-ms-asf" ) && PeekASX( p_demux )
+ ) ||
demux_IsForced( p_demux, "asx-open" ) )
{
STANDARD_DEMUX_INIT_MSG( "found valid ASX playlist" );
static int Demux( demux_t *p_demux);
static void parseEXTINF( char *psz_string, char **ppsz_artist, char **ppsz_name, int *pi_duration );
static bool ContainsURL( demux_t *p_demux );
-static bool CheckContentType( stream_t * p_stream, const char * psz_ctype );
static char *GuessEncoding (const char *str)
{
return false;
}
-static bool CheckContentType( stream_t * p_stream, const char * psz_ctype )
-{
- char *psz_check = stream_ContentType( p_stream );
- if( !psz_check ) return false;
-
- int i_len = strlen( psz_check );
- if ( i_len == 0 )
- {
- free( psz_check );
- return false;
- }
-
- int i_res = strncasecmp( psz_check, psz_ctype, i_len );
- free( psz_check );
-
- return ( i_res == 0 ) ? true : false;
-}
-
/*****************************************************************************
* Deactivate: frees unused data
*****************************************************************************/
uri:
return vlc_path2uri( psz_mrl, NULL );
}
+
+/**
+ * Checks stream Content-Type against a known one
+ */
+bool CheckContentType( stream_t * p_stream, const char * psz_ctype )
+{
+ char *psz_check = stream_ContentType( p_stream );
+ if( !psz_check ) return false;
+
+ int i_len = strlen( psz_check );
+ if ( i_len == 0 )
+ {
+ free( psz_check );
+ return false;
+ }
+
+ /* check for Content-Type: foo-type; charset=... */
+ const char * psz_sep = index( psz_check, ';' );
+ if ( psz_sep )
+ i_len = __MIN( i_len, psz_sep - psz_check );
+
+ int i_res = strncasecmp( psz_check, psz_ctype, i_len );
+ free( psz_check );
+
+ return ( i_res == 0 ) ? true : false;
+}
extern input_item_t * GetCurrentItem(demux_t *p_demux);
+bool CheckContentType( stream_t * p_stream, const char * psz_ctype );
+
#define STANDARD_DEMUX_INIT_MSG( msg ) do { \
DEMUX_INIT_COMMON(); \
msg_Dbg( p_demux, "%s", msg ); } while(0)