FFmpegKit iOS / macOS / tvOS API 5.1
fftools_fopen_utf8.h
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
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.
8 *
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.
13 *
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
17 */
18
19/*
20 * This file is the modified version of fopen_utf8.h file living in ffmpeg source code under the fftools folder. We
21 * manually update it each time we depend on a new ffmpeg version. Below you can see the list of changes applied
22 * by us to develop the ffmpeg-kit library.
23 *
24 * ffmpeg-kit changes by Taner Sener
25 */
26
27#ifndef FFTOOLS_FOPEN_UTF8_H
28#define FFTOOLS_FOPEN_UTF8_H
29
30#include <stdio.h>
31
32/* The fopen_utf8 function here is essentially equivalent to avpriv_fopen_utf8,
33 * except that it doesn't set O_CLOEXEC, and that it isn't exported
34 * from a different library. (On Windows, each DLL might use a different
35 * CRT, and FILE* handles can't be shared across them.) */
36
37#ifdef _WIN32
38#include "libavutil/wchar_filename.h"
39
40static inline FILE *fopen_utf8(const char *path_utf8, const char *mode)
41{
42 wchar_t *path_w, *mode_w;
43 FILE *f;
44
45 /* convert UTF-8 to wide chars */
46 if (get_extended_win32_path(path_utf8, &path_w)) /* This sets errno on error. */
47 return NULL;
48 if (!path_w)
49 goto fallback;
50
51 if (utf8towchar(mode, &mode_w))
52 return NULL;
53 if (!mode_w) {
54 /* If failing to interpret the mode string as utf8, it is an invalid
55 * parameter. */
56 av_freep(&path_w);
57 errno = EINVAL;
58 return NULL;
59 }
60
61 f = _wfopen(path_w, mode_w);
62 av_freep(&path_w);
63 av_freep(&mode_w);
64
65 return f;
66fallback:
67 /* path may be in CP_ACP */
68 return fopen(path_utf8, mode);
69}
70
71#else
72
73static inline FILE *fopen_utf8(const char *path, const char *mode)
74{
75 return fopen(path, mode);
76}
77#endif
78
79#endif /* FFTOOLS_FOPEN_UTF8_H */
static FILE * fopen_utf8(const char *path, const char *mode)