From a1244111a790bbc4bf91b078ebcad3f415da79da Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 3 Feb 2012 08:05:11 +0100 Subject: windows support: unicode filenames Windows uses a legacy codepage for char* / runtime functions accepting char *. Using UTF-8 as the codepage with setlocale() is explicitly forbidden. Work this around by overriding the MSVCRT functions with wrapper macros, that assume UTF-8 and use "proper" API calls like _wopen etc. to deal with unicode filenames. All code that uses standard functions that take or return filenames must now include osdep/io.h. stat() can't be overridden, because MinGW-w64 itself defines "stat" as a macro. Change code to use use mp_stat() instead. This is not perfectly clean, but still somewhat sane, and much better than littering the rest of the mplayer code with MinGW specific hacks. It's also a bit fragile, but that's actually little different from the previous situation. Also, MinGW is unlikely to ever include a nice way of dealing with this. --- libmpdemux/demux_mf.c | 13 +++++++------ libmpdemux/mf.c | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 15 deletions(-) (limited to 'libmpdemux') diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c index f47a11eed6..193b17bc18 100644 --- a/libmpdemux/demux_mf.c +++ b/libmpdemux/demux_mf.c @@ -23,6 +23,8 @@ #include #include +#include "osdep/io.h" + #include "talloc.h" #include "config.h" #include "mp_msg.h" @@ -49,20 +51,19 @@ static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_del // 1 = successfully read a packet static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){ mf_t * mf; - struct stat fs; FILE * f; mf=(mf_t*)demuxer->priv; if ( mf->curr_frame >= mf->nr_of_files ) return 0; - stat( mf->names[mf->curr_frame],&fs ); -// printf( "[demux_mf] frame: %d (%s,%d)\n",mf->curr_frame,mf->names[mf->curr_frame],fs.st_size ); - if ( !( f=fopen( mf->names[mf->curr_frame],"rb" ) ) ) return 0; { sh_video_t * sh_video = demuxer->video->sh; - demux_packet_t * dp = new_demux_packet( fs.st_size ); - if ( !fread( dp->buffer,fs.st_size,1,f ) ) return 0; + fseek(f, 0, SEEK_END); + long file_size = ftell(f); + fseek(f, 0, SEEK_SET); + demux_packet_t * dp = new_demux_packet( file_size ); + if ( !fread( dp->buffer,file_size,1,f ) ) return 0; dp->pts=mf->curr_frame / sh_video->fps; dp->pos=mf->curr_frame; dp->flags=0; diff --git a/libmpdemux/mf.c b/libmpdemux/mf.c index 6b22c6147d..d232944593 100644 --- a/libmpdemux/mf.c +++ b/libmpdemux/mf.c @@ -25,7 +25,8 @@ #include #include #include -#include + +#include "osdep/io.h" #include "config.h" @@ -38,6 +39,7 @@ #include "mp_msg.h" #include "stream/stream.h" +#include "path.h" #include "mf.h" @@ -49,7 +51,6 @@ char * mf_type = NULL; //"jpg"; mf_t* open_mf(char * filename){ #if defined(HAVE_GLOB) || defined(__MINGW32__) glob_t gg; - struct stat fs; int i; char * fname; mf_t * mf; @@ -63,13 +64,13 @@ mf_t* open_mf(char * filename){ FILE *lst_f=fopen(filename + 1,"r"); if ( lst_f ) { - fname=malloc(PATH_MAX); - while ( fgets( fname,PATH_MAX,lst_f ) ) + fname=malloc(MP_PATH_MAX); + while ( fgets( fname,MP_PATH_MAX,lst_f ) ) { /* remove spaces from end of fname */ char *t=fname + strlen( fname ) - 1; while ( t > fname && isspace( *t ) ) *(t--)=0; - if ( stat( fname,&fs ) ) + if ( !mp_path_exists( fname ) ) { mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname ); } @@ -94,7 +95,7 @@ mf_t* open_mf(char * filename){ while ( ( fname=strsep( &filename,"," ) ) ) { - if ( stat( fname,&fs ) ) + if ( !mp_path_exists( fname ) ) { mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname ); } @@ -130,8 +131,8 @@ mf_t* open_mf(char * filename){ for( i=0;i < gg.gl_pathc;i++ ) { - stat( gg.gl_pathv[i],&fs ); - if( S_ISDIR( fs.st_mode ) ) continue; + if (mp_path_isdir(gg.gl_pathv[i])) + continue; mf->names[i]=strdup( gg.gl_pathv[i] ); // mp_msg( MSGT_STREAM,MSGL_DBG2,"[mf] added file %d.: %s\n",i,mf->names[i] ); } @@ -144,7 +145,7 @@ mf_t* open_mf(char * filename){ while ( error_count < 5 ) { sprintf( fname,filename,count++ ); - if ( stat( fname,&fs ) ) + if ( !mp_path_exists( fname ) ) { error_count++; mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname ); -- cgit v1.2.3