[FFmpeg-devel] [PATCH 2/2] mfenc: Avoid including codecapi.h, fix building in UWP mode with clang

Martin Storsjö martin at martin.st
Mon May 25 13:33:58 EEST 2020


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.
---
 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 <icodecapi.h>
-// 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 <uuids.h>
 #else
 #include <dshow.h>
-#endif
 // Older versions of mingw-w64 need codecapi.h explicitly included, while newer
 // ones include it implicitly from dshow.h (via uuids.h).
 #include <codecapi.h>
+#endif
 #include <mfapi.h>
 #include <mferror.h>
 #include <mfobjects.h>
@@ -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);
-- 
2.17.1



More information about the ffmpeg-devel mailing list