From 6c33a230e46a1434e32acf0004c6ffb983c2b566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Mon, 25 May 2020 13:26:04 +0300 Subject: [PATCH] mfenc: Avoid including codecapi.h, fix building in UWP mode with clang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Including codecapi.h and uuids.h in UWP mode doesn't define all defines properly, ending up with constructs that MSVC silently tolerates, but that clang errors out on, like this: DEFINE_GUIDEX(CODECAPI_AVEncCommonFormatConstraint); Just avoid including codecapi.h completely and hardcode the last few enum values we use from there. We already use local versions of most enums from there, due to older mingw-w64 headers being incomplete. Signed-off-by: Martin Storsjö --- libavcodec/mf_utils.h | 15 +++++++++++---- libavcodec/mfenc.c | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/libavcodec/mf_utils.h b/libavcodec/mf_utils.h index 4373e62ed2..d514723c3b 100644 --- a/libavcodec/mf_utils.h +++ b/libavcodec/mf_utils.h @@ -28,15 +28,12 @@ // of including it though, through strmif.h via dshow.h. And on mingw, the // mf*.h headers below indirectly include strmif.h.) #include -// Clang in MSVC mode fails on codecapi.h if we haven't included uuids.h -// before, while it seems to work fine with MSVC itself. -#include #else #include -#endif // Older versions of mingw-w64 need codecapi.h explicitly included, while newer // ones include it implicitly from dshow.h (via uuids.h). #include +#endif #include #include #include @@ -134,6 +131,16 @@ enum { ff_METransformMarker, }; +// These do exist in all supported headers, but are manually defined here +// to avoid having to include codecapi.h, as there's problems including that +// header when targeting UWP (where including it with MSVC seems to work, +// but fails when built with clang in MSVC mode). +enum ff_eAVEncH264VProfile { + ff_eAVEncH264VProfile_Base = 66, + ff_eAVEncH264VProfile_Main = 77, + ff_eAVEncH264VProfile_High = 100, +}; + char *ff_hr_str_buf(char *buf, size_t size, HRESULT hr); #define ff_hr_str(hr) ff_hr_str_buf((char[80]){0}, 80, hr) diff --git a/libavcodec/mfenc.c b/libavcodec/mfenc.c index 3432d48f30..ee3c164e69 100644 --- a/libavcodec/mfenc.c +++ b/libavcodec/mfenc.c @@ -651,13 +651,13 @@ static int mf_encv_output_adjust(AVCodecContext *avctx, IMFMediaType *type) // (MS HEVC supports eAVEncH265VProfile_Main_420_8 only.) if (avctx->codec_id == AV_CODEC_ID_H264) { - UINT32 profile = eAVEncH264VProfile_Base; + UINT32 profile = ff_eAVEncH264VProfile_Base; switch (avctx->profile) { case FF_PROFILE_H264_MAIN: - profile = eAVEncH264VProfile_Main; + profile = ff_eAVEncH264VProfile_Main; break; case FF_PROFILE_H264_HIGH: - profile = eAVEncH264VProfile_High; + profile = ff_eAVEncH264VProfile_High; break; } IMFAttributes_SetUINT32(type, &MF_MT_MPEG2_PROFILE, profile);