summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mf.c
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-02-03 08:05:11 +0100
committerUoti Urpala <uau@mplayer2.org>2012-03-09 20:48:54 +0200
commita1244111a790bbc4bf91b078ebcad3f415da79da (patch)
treebbbb99a7364b7ee4eaa96a44930f84a88db25090 /libmpdemux/demux_mf.c
parent24be34f1e9e37111a06108c090324426aff6f1db (diff)
downloadmpv-a1244111a790bbc4bf91b078ebcad3f415da79da.tar.bz2
mpv-a1244111a790bbc4bf91b078ebcad3f415da79da.tar.xz
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.
Diffstat (limited to 'libmpdemux/demux_mf.c')
-rw-r--r--libmpdemux/demux_mf.c13
1 files changed, 7 insertions, 6 deletions
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 <sys/stat.h>
#include <unistd.h>
+#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;