Skip to content

Commit 3fb9244

Browse files
committed
fftools: Stop using av_fopen_utf8
Provide a header based inline reimplementation of it. Using av_fopen_utf8 doesn't work outside of the libraries when built with MSVC as shared libraries (in the default configuration, where each DLL gets a separate statically linked CRT). Signed-off-by: Martin Storsjö <[email protected]>
1 parent 1f9b5fa commit 3fb9244

File tree

2 files changed

+73
-1
lines changed

2 files changed

+73
-1
lines changed

fftools/ffmpeg_opt.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#endif
2929

3030
#include "ffmpeg.h"
31+
#include "fopen_utf8.h"
3132
#include "cmdutils.h"
3233
#include "opt_common.h"
3334

@@ -1882,7 +1883,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
18821883
video_enc->stats_in = logbuffer;
18831884
}
18841885
if (video_enc->flags & AV_CODEC_FLAG_PASS1) {
1885-
f = av_fopen_utf8(logfilename, "wb");
1886+
f = fopen_utf8(logfilename, "wb");
18861887
if (!f) {
18871888
av_log(NULL, AV_LOG_FATAL,
18881889
"Cannot write log file '%s' for pass-1 encoding: %s\n",

fftools/fopen_utf8.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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+
#ifndef FFTOOLS_FOPEN_UTF8_H
20+
#define FFTOOLS_FOPEN_UTF8_H
21+
22+
#include <stdio.h>
23+
24+
/* The fopen_utf8 function here is essentially equivalent to av_fopen_utf8,
25+
* except that it doesn't set O_CLOEXEC, and that it isn't exported
26+
* from a different library. (On Windows, each DLL might use a different
27+
* CRT, and FILE* handles can't be shared across them.) */
28+
29+
#ifdef _WIN32
30+
#include "libavutil/wchar_filename.h"
31+
32+
static inline FILE *fopen_utf8(const char *path_utf8, const char *mode)
33+
{
34+
wchar_t *path_w, *mode_w;
35+
FILE *f;
36+
37+
/* convert UTF-8 to wide chars */
38+
if (utf8towchar(path_utf8, &path_w)) /* This sets errno on error. */
39+
return NULL;
40+
if (!path_w)
41+
goto fallback;
42+
43+
if (utf8towchar(mode, &mode_w))
44+
return NULL;
45+
if (!mode_w) {
46+
/* If failing to interpret the mode string as utf8, it is an invalid
47+
* parameter. */
48+
av_freep(&path_w);
49+
errno = EINVAL;
50+
return NULL;
51+
}
52+
53+
f = _wfopen(path_w, mode_w);
54+
av_freep(&path_w);
55+
av_freep(&mode_w);
56+
57+
return f;
58+
fallback:
59+
/* path may be in CP_ACP */
60+
return fopen(path_utf8, mode);
61+
}
62+
63+
#else
64+
65+
static inline FILE *fopen_utf8(const char *path, const char *mode)
66+
{
67+
return fopen(path, mode);
68+
}
69+
#endif
70+
71+
#endif /* FFTOOLS_FOPEN_UTF8_H */

0 commit comments

Comments
 (0)