2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34 #elif HAVE_MAPVIEWOFFILE
38 typedef struct FileLogContext
{
44 static const AVClass file_log_ctx_class
= {
46 .item_name
= av_default_item_name
,
48 .version
= LIBAVUTIL_VERSION_INT
,
49 .log_level_offset_offset
= offsetof(FileLogContext
, log_offset
),
50 .parent_log_context_offset
= offsetof(FileLogContext
, log_ctx
),
53 int av_file_map(const char *filename
, uint8_t **bufptr
, size_t *size
,
54 int log_offset
, void *log_ctx
)
56 FileLogContext file_log_ctx
= { &file_log_ctx_class
, log_offset
, log_ctx
};
57 int err
, fd
= avpriv_open(filename
, O_RDONLY
);
67 av_strerror(err
, errbuf
, sizeof(errbuf
));
68 av_log(&file_log_ctx
, AV_LOG_ERROR
, "Cannot read file '%s': %s\n", filename
, errbuf
);
72 if (fstat(fd
, &st
) < 0) {
74 av_strerror(err
, errbuf
, sizeof(errbuf
));
75 av_log(&file_log_ctx
, AV_LOG_ERROR
, "Error occurred in fstat(): %s\n", errbuf
);
80 off_size
= st
.st_size
;
81 if (off_size
> SIZE_MAX
) {
82 av_log(&file_log_ctx
, AV_LOG_ERROR
,
83 "File size for file '%s' is too big\n", filename
);
85 return AVERROR(EINVAL
);
95 ptr
= mmap(NULL
, *size
, PROT_READ
|PROT_WRITE
, MAP_PRIVATE
, fd
, 0);
96 if (ptr
== MAP_FAILED
) {
98 av_strerror(err
, errbuf
, sizeof(errbuf
));
99 av_log(&file_log_ctx
, AV_LOG_ERROR
, "Error occurred in mmap(): %s\n", errbuf
);
105 #elif HAVE_MAPVIEWOFFILE
107 HANDLE mh
, fh
= (HANDLE
)_get_osfhandle(fd
);
109 mh
= CreateFileMapping(fh
, NULL
, PAGE_READONLY
, 0, 0, NULL
);
111 av_log(&file_log_ctx
, AV_LOG_ERROR
, "Error occurred in CreateFileMapping()\n");
117 ptr
= MapViewOfFile(mh
, FILE_MAP_READ
, 0, 0, *size
);
120 av_log(&file_log_ctx
, AV_LOG_ERROR
, "Error occurred in MapViewOfFile()\n");
129 *bufptr
= av_malloc(*size
);
131 av_log(&file_log_ctx
, AV_LOG_ERROR
, "Memory allocation error occurred\n");
134 return AVERROR(ENOMEM
);
136 read(fd
, *bufptr
, *size
);
144 void av_file_unmap(uint8_t *bufptr
, size_t size
)
146 if (!size
|| !bufptr
)
149 munmap(bufptr
, size
);
150 #elif HAVE_MAPVIEWOFFILE
151 UnmapViewOfFile(bufptr
);
157 int av_tempfile(const char *prefix
, char **filename
, int log_offset
, void *log_ctx
) {
158 return avpriv_tempfile(prefix
, filename
, log_offset
, log_ctx
);