diff options
author | Daniel Verkamp <daniel@drv.nu> | 2011-01-05 05:16:33 +0000 |
---|---|---|
committer | Daniel Verkamp <daniel@drv.nu> | 2011-01-05 05:16:33 +0000 |
commit | 73f6d31e6c87150bab6a5cea36eb794c3e26535b (patch) | |
tree | f4fb2cc45d289acbbe74b2499895e8641bccbec3 /libavutil/file.c | |
parent | db61329607c858f95cd7e4c165897dcd39f82977 (diff) | |
download | ffmpeg-73f6d31e6c87150bab6a5cea36eb794c3e26535b.tar.gz |
Win32 support for av_file_map()
Originally committed as revision 26221 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavutil/file.c')
-rw-r--r-- | libavutil/file.c | 26 |
1 files changed, 26 insertions, 0 deletions
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 <unistd.h> #if HAVE_MMAP #include <sys/mman.h> +#elif HAVE_MAPVIEWOFFILE +#include <io.h> +#include <windows.h> #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 |