diff options
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 |