[FFmpeg-cvslog] mfenc: Avoid including codecapi.h, fix building in UWP mode with clang

Martin Storsjö git at videolan.org
Wed May 27 00:19:46 EEST 2020


ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Mon May 25 13:26:04 2020 +0300| [6c33a230e46a1434e32acf0004c6ffb983c2b566] | committer: Martin Storsjö

mfenc: Avoid including codecapi.h, fix building in UWP mode with clang

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ö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6c33a230e46a1434e32acf0004c6ffb983c2b566
---

 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);



More information about the ffmpeg-cvslog mailing list