[FFmpeg-devel] [PATCH] Made minor changes to get the decklink avdevice code to build using Visual C++

Hendrik Leppkes h.leppkes at gmail.com
Thu Apr 13 10:36:55 EEST 2017


On Thu, Apr 13, 2017 at 5:34 AM, Aaron Levinson <alevinsn at aracnet.com> wrote:
> From aa549cf1c463f4a37bda44b934e17811986f11d9 Mon Sep 17 00:00:00 2001
> From: Aaron Levinson <alevinsn at 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"

As in the other patch before, the toolchain handling section has no
business setting these.

> @@ -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)'

I really don't like having these decklink specific things in the OS
sections. I know its already there in one section, but I would greatly
prefer if this would also be moved into a dedicated decklink section
somewhere, instead of littering the msvc/mingw sections.
In fact, its now set for both mingw and msvc, so setting it centrally
in one place would be even better to avoid duplicating it.

> 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 at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list