From aa549cf1c463f4a37bda44b934e17811986f11d9 Mon Sep 17 00:00:00 2001 From: Aaron Levinson <alevi...@aracnet.com> Date: Wed, 12 Apr 2017 20:21:41 -0700 Subject: [PATCH] Made minor changes to get the decklink avdevice code to build using Visual C++
Purpose: Made minor changes to get the decklink avdevice code to build using Visual C++. Notes: Used Visual Studio 2015 (with update 3) for this. Comments: -- configure: For MSVC (Microsoft Visual C++) builds, now reinitializing decklink_indev_extralibs and decklink_outdev_extralibs to empty and then later, following the similar procedure used for mingw by adding -lole32 and -loleaut32. This is necessary in order for it to link properly when building with Visual C++. -- libavdevice/decklink_common.cpp: Switched the order of the include of libavformat/internal.h to workaround build issues with Visual C++. See comment in file for more details. -- libavdevice/decklink_dec.cpp: a) Rearranged the include of libavformat/internal.h (for reasons as described above). b) Made slight alteration to an argument for call to av_rescale_q() to workaround a compiler error with Visual C++. This appears to only be an issue when building C++ files with Visual C++. See comments in code for more details. -- libavdevice/decklink_enc.cpp: Rearranged the include of libavformat/internal.h (for reasons as described above). --- configure | 4 ++++ libavdevice/decklink_common.cpp | 10 +++++++++- libavdevice/decklink_dec.cpp | 17 +++++++++++++++-- libavdevice/decklink_enc.cpp | 5 ++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/configure b/configure index adb0060..5b76a33 100755 --- a/configure +++ b/configure @@ -3646,6 +3646,8 @@ case "$toolchain" in ld_default="$source_path/compat/windows/mslink" nm_default="dumpbin -symbols" ar_default="lib" + decklink_indev_extralibs="" + decklink_outdev_extralibs="" case "$arch" in arm*) as_default="armasm" @@ -4902,6 +4904,8 @@ case $target_os in fi enabled x86_32 && check_ldflags -LARGEADDRESSAWARE shlibdir_default="$bindir_default" + decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32" + decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32" SLIBPREF="" SLIBSUF=".dll" SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)' diff --git a/libavdevice/decklink_common.cpp b/libavdevice/decklink_common.cpp index f01fba9..523217c 100644 --- a/libavdevice/decklink_common.cpp +++ b/libavdevice/decklink_common.cpp @@ -19,6 +19,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +// Moved inclusion of internal.h here in order to get it to build successfully +// when using Visual C++ to build--otherwise, compilation errors result +// due to winsock.h (which is included indirectly by DeckLinkAPI.h and +// DeckLinkAPI_i.c) conflicting with winsock2.h, which is included by +// internal.h. If winsock2.h is included first, then the conflict is resolved. +extern "C" { +#include "libavformat/internal.h" +} + #include <DeckLinkAPI.h> #ifdef _WIN32 #include <DeckLinkAPI_i.c> @@ -28,7 +37,6 @@ extern "C" { #include "libavformat/avformat.h" -#include "libavformat/internal.h" #include "libavutil/imgutils.h" #include "libavutil/intreadwrite.h" #include "libavutil/bswap.h" diff --git a/libavdevice/decklink_dec.cpp b/libavdevice/decklink_dec.cpp index 67eaf97..a663029 100644 --- a/libavdevice/decklink_dec.cpp +++ b/libavdevice/decklink_dec.cpp @@ -19,12 +19,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +extern "C" { +#include "libavformat/internal.h" +} + #include <DeckLinkAPI.h> extern "C" { #include "config.h" #include "libavformat/avformat.h" -#include "libavformat/internal.h" #include "libavutil/avutil.h" #include "libavutil/common.h" #include "libavutil/imgutils.h" @@ -262,8 +265,18 @@ static int64_t get_pkt_pts(IDeckLinkVideoInputFrame *videoFrame, res = videoFrame->GetHardwareReferenceTimestamp(time_base.den, &bmd_pts, &bmd_duration); break; case PTS_SRC_WALLCLOCK: - pts = av_rescale_q(wallclock, AV_TIME_BASE_Q, time_base); + { + // doing the following rather than using AV_TIME_BASE_Q because + // AV_TIME_BASE_Q doesn't work when building with Visual C++ + // for C++ files (works for C files). When building C++ files, + // it results in compiler error C4576. At least, this is the case + // with Visual C++ 2015. + AVRational timebase; + timebase.num = 1; + timebase.den = AV_TIME_BASE; + pts = av_rescale_q(wallclock, timebase, time_base); break; + } } if (res == S_OK) pts = bmd_pts / time_base.num; diff --git a/libavdevice/decklink_enc.cpp b/libavdevice/decklink_enc.cpp index 5105967..3bd6357 100644 --- a/libavdevice/decklink_enc.cpp +++ b/libavdevice/decklink_enc.cpp @@ -22,11 +22,14 @@ #include <atomic> using std::atomic; +extern "C" { +#include "libavformat/internal.h" +} + #include <DeckLinkAPI.h> extern "C" { #include "libavformat/avformat.h" -#include "libavformat/internal.h" #include "libavutil/imgutils.h" } -- 2.10.1.windows.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel