From 73f6d31e6c87150bab6a5cea36eb794c3e26535b Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Wed, 5 Jan 2011 05:16:33 +0000 Subject: [PATCH] Win32 support for av_file_map() Originally committed as revision 26221 to svn://svn.ffmpeg.org/ffmpeg/trunk --- configure | 2 ++ libavutil/file.c | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/configure b/configure index f778f359de..a30a2c92dd 100755 --- a/configure +++ b/configure @@ -1040,6 +1040,7 @@ HAVE_LIST=" machine_ioctl_bt848_h machine_ioctl_meteor_h malloc_h + MapViewOfFile memalign mkstemp mmap @@ -2687,6 +2688,7 @@ check_func_headers io.h setmode check_func_headers lzo/lzo1x.h lzo1x_999_compress check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi check_func_headers windows.h GetProcessTimes +check_func_headers windows.h MapViewOfFile check_func_headers windows.h VirtualAlloc check_header conio.h diff --git a/libavutil/file.c b/libavutil/file.c index 1ccb692f92..c79f68aab3 100644 --- a/libavutil/file.c +++ b/libavutil/file.c @@ -22,6 +22,9 @@ #include #if HAVE_MMAP #include +#elif HAVE_MAPVIEWOFFILE +#include +#include #endif typedef struct { @@ -81,6 +84,27 @@ int av_file_map(const char *filename, uint8_t **bufptr, size_t *size, return err; } *bufptr = ptr; +#elif HAVE_MAPVIEWOFFILE + { + HANDLE mh, fh = (HANDLE)_get_osfhandle(fd); + + mh = CreateFileMapping(fh, NULL, PAGE_READONLY, 0, 0, NULL); + if (!mh) { + av_log(&file_log_ctx, AV_LOG_ERROR, "Error occurred in CreateFileMapping()\n"); + close(fd); + return -1; + } + + ptr = MapViewOfFile(mh, FILE_MAP_READ, 0, 0, *size); + CloseHandle(mh); + if (!ptr) { + av_log(&file_log_ctx, AV_LOG_ERROR, "Error occurred in MapViewOfFile()\n"); + close(fd); + return -1; + } + + *bufptr = ptr; + } #else *bufptr = av_malloc(*size); if (!*bufptr) { @@ -99,6 +123,8 @@ void av_file_unmap(uint8_t *bufptr, size_t size) { #if HAVE_MMAP munmap(bufptr, size); +#elif HAVE_MAPVIEWOFFILE + UnmapViewOfFile(bufptr); #else av_free(bufptr); #endif