[FFmpeg-devel] [PATCH] fix MSVC compilation errors

Mateusz mateuszb at poczta.onet.pl
Tue Dec 5 01:31:34 EET 2017


After some tests:
1) #undef far
after #include <windows.h> is wrong -- in oleauto.h is declaration
WINOLEAUTAPI VarUI1FromI8(LONG64 i64In, _Out_ BYTE FAR* pbOut);
and 'FAR' is defined as 'far' which is define as empty.

2) #undef near
after #include <windows.h> works in ffmpeg but is danger -- see 1)

3) after
git revert 3701d499f8734ec5f3e7359de7311b15d92070b0
git revert 590136e78da3d091ea99ab5432543d47a559a461
and patch
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
-    MXFPackage packages[2] = {};
+    MXFPackage packages[2] = {{NULL}};
VS 2017 can compile ffmpeg and fate stops at audiomatch-nero-16000-mono-he-m4a
(without reverting 590136e hangs at api-flac-test.exe)

4) if for any reasons commits 3701d49 and 590136e shouldn't be reverted,
we can apply this patch and
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index baf09119fe..b34a3803b8 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1943,7 +1943,7 @@ int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))

 int ff_lock_avcodec(AVCodecContext *log_ctx, const AVCodec *codec)
 {
-    _Bool exp = 0;
+    atomic_bool exp = 0;
     if (codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE || !codec->init)
         return 0;

@@ -1969,7 +1969,7 @@ int ff_lock_avcodec(AVCodecContext *log_ctx, const AVCodec *codec)

 int ff_unlock_avcodec(const AVCodec *codec)
 {
-    _Bool exp = 1;
+    atomic_bool exp = 1;
     if (codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE || !codec->init)
         return 0;


Mateusz



W dniu 04.12.2017 o 20:27, Mateusz pisze:
> W dniu 04.12.2017 o 15:02, Derek Buitenhuis pisze:
>> On 12/4/2017 8:03 AM, Mateusz wrote:
>>> After commit 3701d49 'error_resilience: remove avpriv_atomic usage'
>>> we have included windows.h in much more files and we should
>>> avoid conflicts with defines/function declarations.
>>>
>>> Signed-off-by: Mateusz Brzostek <mateuszb at poczta.onet.pl>
>>> ---
>>>  libavcodec/jpegls.h  | 4 ++++
>>>  libavcodec/mss2.c    | 6 +++---
>>>  libavformat/mxfenc.c | 2 +-
>>>  3 files changed, 8 insertions(+), 4 deletions(-)
>>
>> Sprinkling these weird ifdefs and renames around is pretty ugly. Is there
>> some sort of canonical list on MSDN or something we can use globally-ish?
>>
>> - Derek
> 
> There is a list of "Predefined Macros" in MSVC -- IMO there are OK
> https://msdn.microsoft.com/en-us/library/b0084kay(v=vs.140).aspx
> 
> More danger are macros from windows.h -- there is a list of macros
> to exclude some parts (from MSDN and windows.h):
> Define WIN32_LEAN_AND_MEAN to exclude APIs such as
> Cryptography, DDE, RPC, Shell, and Windows Sockets.
> 
> /*  If defined, the following flags inhibit definition
>  *     of the indicated items.
>  *
>  *  NOGDICAPMASKS     - CC_*, LC_*, PC_*, CP_*, TC_*, RC_
>  *  NOVIRTUALKEYCODES - VK_*
>  *  NOWINMESSAGES     - WM_*, EM_*, LB_*, CB_*
>  *  NOWINSTYLES       - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_*
>  *  NOSYSMETRICS      - SM_*
>  *  NOMENUS           - MF_*
>  *  NOICONS           - IDI_*
>  *  NOKEYSTATES       - MK_*
>  *  NOSYSCOMMANDS     - SC_*
>  *  NORASTEROPS       - Binary and Tertiary raster ops
>  *  NOSHOWWINDOW      - SW_*
>  *  OEMRESOURCE       - OEM Resource values
>  *  NOATOM            - Atom Manager routines
>  *  NOCLIPBOARD       - Clipboard routines
>  *  NOCOLOR           - Screen colors
>  *  NOCTLMGR          - Control and Dialog routines
>  *  NODRAWTEXT        - DrawText() and DT_*
>  *  NOGDI             - All GDI defines and routines
>  *  NOKERNEL          - All KERNEL defines and routines
>  *  NOUSER            - All USER defines and routines
>  *  NONLS             - All NLS defines and routines
>  *  NOMB              - MB_* and MessageBox()
>  *  NOMEMMGR          - GMEM_*, LMEM_*, GHND, LHND, associated routines
>  *  NOMETAFILE        - typedef METAFILEPICT
>  *  NOMINMAX          - Macros min(a,b) and max(a,b)
>  *  NOMSG             - typedef MSG and associated routines
>  *  NOOPENFILE        - OpenFile(), OemToAnsi, AnsiToOem, and OF_*
>  *  NOSCROLL          - SB_* and scrolling routines
>  *  NOSERVICE         - All Service Controller routines, SERVICE_ equates, etc.
>  *  NOSOUND           - Sound driver routines
>  *  NOTEXTMETRIC      - typedef TEXTMETRIC and associated routines
>  *  NOWH              - SetWindowsHook and WH_*
>  *  NOWINOFFSETS      - GWL_*, GCL_*, associated routines
>  *  NOCOMM            - COMM driver routines
>  *  NOKANJI           - Kanji support stuff.
>  *  NOHELP            - Help engine interface.
>  *  NOPROFILER        - Profiler interface.
>  *  NODEFERWINDOWPOS  - DeferWindowPos routines
>  *  NOMCX             - Modem Configuration Extensions
>  */
> 
> The most danger are small caps macros defined as empty in minwindef.h:
> far
> near
> pascal
> cdecl
> 
> I think it is possible to make in ffmpeg's *.h files which include windows.h
> something like this:
> #define WIN32_LEAN_AND_MEAN
> #define NOMINMAX
> #define NOGDI
> #include <windows.h>
> #undef far
> #undef near
> #undef pascal
> #undef cdecl
> 
> I will make some test and write back.
> 
> Mateusz



More information about the ffmpeg-devel mailing list