[vlc-commits] Do not require a recognized . extension for module tracker files when a robust enough marker is present.
Laurent Aimar
git at videolan.org
Mon Oct 24 21:27:23 CEST 2011
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Mon Oct 24 21:22:32 2011 +0200| [5c13f219d0fc100b4a1c547ac6d8d29f30a95eaa] | committer: Laurent Aimar
Do not require a recognized .extension for module tracker files when a robust enough marker is present.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5c13f219d0fc100b4a1c547ac6d8d29f30a95eaa
---
modules/demux/mod.c | 61 ++++++++++++++++++++++++++------------------------
1 files changed, 32 insertions(+), 29 deletions(-)
diff --git a/modules/demux/mod.c b/modules/demux/mod.c
index a62c331..a625191 100644
--- a/modules/demux/mod.c
+++ b/modules/demux/mod.c
@@ -126,14 +126,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args );
static int Validate( demux_t *p_demux, const char *psz_ext );
-static const char *ppsz_mod_ext[] =
-{
- "mod", "s3m", "xm", "it", "669", "amf", "ams", "dbm", "dmf", "dsm",
- "far", "mdl", "med", "mtm", "okt", "ptm", "stm", "ult", "umx", "mt2",
- "psm", "abc", NULL
-};
-
-
/* We load the complete file in memory, put a higher bound
* of 500 Mo (which is really big anyway) */
#define MOD_MAX_FILE_SIZE (500*1000*1000)
@@ -150,28 +142,16 @@ static int Open( vlc_object_t *p_this )
/* We accept file based on extension match */
if( !p_demux->b_force )
{
- if( !p_demux->psz_file )
- return VLC_EGENERIC;
- const char *psz_ext = strrchr( p_demux->psz_file, '.' );
- int i;
+ const char *psz_ext = p_demux->psz_file ? strrchr( p_demux->psz_file, '.' )
+ : NULL;
+ if( psz_ext )
+ psz_ext++;
- if( !psz_ext )
- return VLC_EGENERIC;
-
- psz_ext++; /* skip . */
- for( i = 0; ppsz_mod_ext[i] != NULL; i++ )
- {
- if( !strcasecmp( psz_ext, ppsz_mod_ext[i] ) )
- break;
- }
- if( ppsz_mod_ext[i] == NULL )
- return VLC_EGENERIC;
- if( Validate( p_demux, ppsz_mod_ext[i] ) )
+ if( Validate( p_demux, psz_ext ) )
{
- msg_Warn( p_demux, "MOD validation failed (ext=%s)", ppsz_mod_ext[i]);
+ msg_Warn( p_demux, "MOD validation failed (ext=%s)", psz_ext ? psz_ext : "");
return VLC_EGENERIC;
}
- msg_Dbg( p_demux, "running MOD demuxer (ext=%s)", ppsz_mod_ext[i] );
}
const int64_t i_size = stream_Size( p_demux->s );
@@ -503,6 +483,10 @@ static int Validate( demux_t *p_demux, const char *psz_ext )
{ 1080, "OKTA" },
{ 1080, "16CN" },
{ 1080, "32CN" },
+ { 1080, "FLT4" },
+ { 1080, "FLT8" },
+ { 1080, "6CHN" },
+ { 1080, "8CHN" },
{ 1080, "FLT" },
{ 1080, "TDZ" },
{ 1081, "CHN" },
@@ -510,6 +494,22 @@ static int Validate( demux_t *p_demux, const char *psz_ext )
{ -1, NULL }
};
+ static const char *ppsz_mod_ext[] =
+ {
+ "mod", "s3m", "xm", "it", "669", "amf", "ams", "dbm", "dmf", "dsm",
+ "far", "mdl", "med", "mtm", "okt", "ptm", "stm", "ult", "umx", "mt2",
+ "psm", "abc", NULL
+ };
+ bool has_valid_extension = false;
+ if( psz_ext )
+ {
+ for( int i = 0; ppsz_mod_ext[i] != NULL; i++ )
+ {
+ has_valid_extension |= !strcasecmp( psz_ext, ppsz_mod_ext[i] );
+ if( has_valid_extension )
+ break;
+ }
+ }
const uint8_t *p_peek;
const int i_peek = stream_Peek( p_demux->s, &p_peek, 2048 );
@@ -526,7 +526,10 @@ static int Validate( demux_t *p_demux, const char *psz_ext )
continue;
if( !memcmp( &p_peek[i_offset], psz_marker, i_size ) )
- return VLC_SUCCESS;
+ {
+ if( i_size >= 4 || has_valid_extension )
+ return VLC_SUCCESS;
+ }
}
/* The only two format left untested are ABC and MOD(old version)
@@ -534,7 +537,7 @@ static int Validate( demux_t *p_demux, const char *psz_ext )
/* Check for ABC
* TODO i_peek = 2048 is too big for such files */
- if( !strcasecmp( psz_ext, "abc" ) )
+ if( psz_ext && !strcasecmp( psz_ext, "abc" ) )
{
bool b_k = false;
bool b_tx = false;
@@ -550,7 +553,7 @@ static int Validate( demux_t *p_demux, const char *psz_ext )
}
/* Check for MOD */
- if( !strcasecmp( psz_ext, "mod" ) && i_peek >= 20 + 15 * 30 )
+ if( psz_ext && !strcasecmp( psz_ext, "mod" ) && i_peek >= 20 + 15 * 30 )
{
/* Check that the name is correctly null padded */
const uint8_t *p = memchr( p_peek, '\0', 20 );
More information about the vlc-commits
mailing list