diff mbox

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

Message ID fac11045-67bd-d414-5db1-09c8ae9be348@aracnet.com
State Changes Requested
Headers show

Commit Message

Aaron Levinson April 13, 2017, 10:39 a.m. UTC
On 4/13/2017 12:36 AM, Hendrik Leppkes wrote:
> On Thu, Apr 13, 2017 at 5:34 AM, Aaron Levinson <alevinsn@aracnet.com> wrote:
>> 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.

I believe that I've addressed both of these issues with the following new version of the patch.

Thanks,
Aaron

--------------------------------------------------------------------------------------

From 2e87ce15e9fb27b81b11b88a0660581549cfcfaf Mon Sep 17 00:00:00 2001
From: Aaron Levinson <alevinsn@aracnet.com>
Date: Thu, 13 Apr 2017 03:28:40 -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.  Also made
changes to configure per Hendrik Leppkes's review of first version of
patch.

Comments:

-- configure: Added if enabled decklink section and setting
   decklink_indev_extralibs and decklink_outdev_extralibs here for
   both mingw and Windows.  In the case of Windows, the new value,
   -lole32 and -loleaut32 overwrites the default value.  In the case
   of mingw, -lole32 and -loleaut32 is added to the default value.
   Also eliminated the setting of these variables in the mingw section
   earlier in the file.

-- 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                       | 15 +++++++++++++--
 libavdevice/decklink_common.cpp | 10 +++++++++-
 libavdevice/decklink_dec.cpp    | 17 +++++++++++++++--
 libavdevice/decklink_enc.cpp    |  5 ++++-
 4 files changed, 41 insertions(+), 6 deletions(-)

Comments

Hendrik Leppkes April 13, 2017, 10:55 a.m. UTC | #1
On Thu, Apr 13, 2017 at 12:39 PM, Aaron Levinson <alevinsn@aracnet.com> wrote:
> On 4/13/2017 12:36 AM, Hendrik Leppkes wrote:
>> On Thu, Apr 13, 2017 at 5:34 AM, Aaron Levinson <alevinsn@aracnet.com> wrote:
>>> 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.
>
> I believe that I've addressed both of these issues with the following new version of the patch.
>
> Thanks,
> Aaron
>
> --------------------------------------------------------------------------------------
>
> From 2e87ce15e9fb27b81b11b88a0660581549cfcfaf Mon Sep 17 00:00:00 2001
> From: Aaron Levinson <alevinsn@aracnet.com>
> Date: Thu, 13 Apr 2017 03:28:40 -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.  Also made
> changes to configure per Hendrik Leppkes's review of first version of
> patch.
>
> Comments:
>
> -- configure: Added if enabled decklink section and setting
>    decklink_indev_extralibs and decklink_outdev_extralibs here for
>    both mingw and Windows.  In the case of Windows, the new value,
>    -lole32 and -loleaut32 overwrites the default value.  In the case
>    of mingw, -lole32 and -loleaut32 is added to the default value.
>    Also eliminated the setting of these variables in the mingw section
>    earlier in the file.
>
> -- 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                       | 15 +++++++++++++--
>  libavdevice/decklink_common.cpp | 10 +++++++++-
>  libavdevice/decklink_dec.cpp    | 17 +++++++++++++++--
>  libavdevice/decklink_enc.cpp    |  5 ++++-
>  4 files changed, 41 insertions(+), 6 deletions(-)
>
> diff --git a/configure b/configure
> index a383bf2..9a06437 100755
> --- a/configure
> +++ b/configure
> @@ -4843,8 +4843,6 @@ case $target_os in
>          else
>              target_os=mingw32
>          fi
> -        decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
> -        decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
>          LIBTARGET=i386
>          if enabled x86_64; then
>              LIBTARGET="i386:x86-64"
> @@ -5946,6 +5944,19 @@ if ! disabled sdl2; then
>  fi
>  enabled sdl2 && enable sdl && add_cflags $sdl2_cflags && add_extralibs $sdl2_libs
>
> +if enabled decklink; then
> +    case $target_os in
> +        mingw32*|mingw64*)
> +            decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
> +            decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
> +            ;;
> +        win32|win64)
> +            decklink_outdev_extralibs="-lole32 -loleaut32"
> +            decklink_indev_extralibs="-lole32 -loleaut32"
> +            ;;
> +    esac
> +fi
> +

Whats in the extralibs before this block that you need to clear out in
the msvc case?
Maybe that part should just be set conditionally so we can unify this,
and don't set something we need to strip out again after.

- Hendrik
Aaron Levinson April 13, 2017, 8:09 p.m. UTC | #2
On 4/13/2017 3:55 AM, Hendrik Leppkes wrote:
> On Thu, Apr 13, 2017 at 12:39 PM, Aaron Levinson <alevinsn@aracnet.com> wrote:
>> On 4/13/2017 12:36 AM, Hendrik Leppkes wrote:
>> diff --git a/configure b/configure
>> index a383bf2..9a06437 100755
>> --- a/configure
>> +++ b/configure
>> @@ -4843,8 +4843,6 @@ case $target_os in
>>          else
>>              target_os=mingw32
>>          fi
>> -        decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
>> -        decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
>>          LIBTARGET=i386
>>          if enabled x86_64; then
>>              LIBTARGET="i386:x86-64"
>> @@ -5946,6 +5944,19 @@ if ! disabled sdl2; then
>>  fi
>>  enabled sdl2 && enable sdl && add_cflags $sdl2_cflags && add_extralibs $sdl2_libs
>>
>> +if enabled decklink; then
>> +    case $target_os in
>> +        mingw32*|mingw64*)
>> +            decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
>> +            decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
>> +            ;;
>> +        win32|win64)
>> +            decklink_outdev_extralibs="-lole32 -loleaut32"
>> +            decklink_indev_extralibs="-lole32 -loleaut32"
>> +            ;;
>> +    esac
>> +fi
>> +
>
> Whats in the extralibs before this block that you need to clear out in
> the msvc case?
> Maybe that part should just be set conditionally so we can unify this,
> and don't set something we need to strip out again after.
>
> - Hendrik

decklink_outdev_extralibs and decklink_indev_extralibs are declared as 
follows earlier in configure:

decklink_indev_extralibs="-lstdc++"
decklink_outdev_extralibs="-lstdc++"

This is done in the standard section where 
<library>_<indev|outdev>_<extralibs|deps> can be found.

libstdc++ is needed when building the Decklink source files with gcc/g++ 
because of, at a minimum, the use of STL in one of the .cpp files.

For builds targeting Windows, -lole32 and -loleaut32 are also needed 
because of the use of COM.  So, that explains why -lole32 and -loleaut32 
are added for both mingw and Windows.

Finally, when building with the Microsoft compiler (cl.exe), libstdc++ 
is not needed and actually can't be found.  The C/C++ run-time is 
included by default in some form when building with cl.exe unless the 
-nodefaultlib linker option is used.  So, that explains why it replaces 
the extralibs variables with just -lole32 and -loleaut32 for Windows 
builds.  Note that win32 to specified as the target_os when an msvc 
build is done, and it may be the only case when target_os is set to 
win32 unless the user manually sets it as an option when invoking configure.

-lole32 and -loleaut32 is likely relevant for both cygwin and the Intel 
compiler, but it should be a simple matter to add those later if anyone 
uses those for building.  The elimination of -lstdc++ may also be 
relevant for the Intel compiler but probably only when using the Intel 
compiler on Windows.

Anyway, I don't think an approach that moves -lstdc++ into the above if 
block is any better or worse than the patch in its current form, and the 
patch in its current form results in fewer changes to configure than a 
patch that moves -lstdc++ around.

Aaron
Hendrik Leppkes April 13, 2017, 8:23 p.m. UTC | #3
On Thu, Apr 13, 2017 at 10:09 PM, Aaron Levinson <alevinsn@aracnet.com> wrote:
> On 4/13/2017 3:55 AM, Hendrik Leppkes wrote:
>>
>> On Thu, Apr 13, 2017 at 12:39 PM, Aaron Levinson <alevinsn@aracnet.com>
>> wrote:
>>>
>>> On 4/13/2017 12:36 AM, Hendrik Leppkes wrote:
>>> diff --git a/configure b/configure
>>> index a383bf2..9a06437 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -4843,8 +4843,6 @@ case $target_os in
>>>          else
>>>              target_os=mingw32
>>>          fi
>>> -        decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32
>>> -loleaut32"
>>> -        decklink_indev_extralibs="$decklink_indev_extralibs -lole32
>>> -loleaut32"
>>>          LIBTARGET=i386
>>>          if enabled x86_64; then
>>>              LIBTARGET="i386:x86-64"
>>> @@ -5946,6 +5944,19 @@ if ! disabled sdl2; then
>>>  fi
>>>  enabled sdl2 && enable sdl && add_cflags $sdl2_cflags && add_extralibs
>>> $sdl2_libs
>>>
>>> +if enabled decklink; then
>>> +    case $target_os in
>>> +        mingw32*|mingw64*)
>>> +            decklink_outdev_extralibs="$decklink_outdev_extralibs
>>> -lole32 -loleaut32"
>>> +            decklink_indev_extralibs="$decklink_indev_extralibs -lole32
>>> -loleaut32"
>>> +            ;;
>>> +        win32|win64)
>>> +            decklink_outdev_extralibs="-lole32 -loleaut32"
>>> +            decklink_indev_extralibs="-lole32 -loleaut32"
>>> +            ;;
>>> +    esac
>>> +fi
>>> +
>>
>>
>> Whats in the extralibs before this block that you need to clear out in
>> the msvc case?
>> Maybe that part should just be set conditionally so we can unify this,
>> and don't set something we need to strip out again after.
>>
>> - Hendrik
>
>
> decklink_outdev_extralibs and decklink_indev_extralibs are declared as
> follows earlier in configure:
>
> decklink_indev_extralibs="-lstdc++"
> decklink_outdev_extralibs="-lstdc++"
>
> This is done in the standard section where
> <library>_<indev|outdev>_<extralibs|deps> can be found.
>
> libstdc++ is needed when building the Decklink source files with gcc/g++
> because of, at a minimum, the use of STL in one of the .cpp files.
>
> For builds targeting Windows, -lole32 and -loleaut32 are also needed because
> of the use of COM.  So, that explains why -lole32 and -loleaut32 are added
> for both mingw and Windows.
>
> Finally, when building with the Microsoft compiler (cl.exe), libstdc++ is
> not needed and actually can't be found.  The C/C++ run-time is included by
> default in some form when building with cl.exe unless the -nodefaultlib
> linker option is used.  So, that explains why it replaces the extralibs
> variables with just -lole32 and -loleaut32 for Windows builds.  Note that
> win32 to specified as the target_os when an msvc build is done, and it may
> be the only case when target_os is set to win32 unless the user manually
> sets it as an option when invoking configure.
>
> -lole32 and -loleaut32 is likely relevant for both cygwin and the Intel
> compiler, but it should be a simple matter to add those later if anyone uses
> those for building.  The elimination of -lstdc++ may also be relevant for
> the Intel compiler but probably only when using the Intel compiler on
> Windows.
>
> Anyway, I don't think an approach that moves -lstdc++ into the above if
> block is any better or worse than the patch in its current form, and the
> patch in its current form results in fewer changes to configure than a patch
> that moves -lstdc++ around.
>

You could add -lstdc++ to the msvc flag filter (ie.
msvc_common_flags), since its never needed, and may be added by more
things in the future, that would solve all of those neatly.

- Hendrik
diff mbox

Patch

diff --git a/configure b/configure
index a383bf2..9a06437 100755
--- a/configure
+++ b/configure
@@ -4843,8 +4843,6 @@  case $target_os in
         else
             target_os=mingw32
         fi
-        decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
-        decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
         LIBTARGET=i386
         if enabled x86_64; then
             LIBTARGET="i386:x86-64"
@@ -5946,6 +5944,19 @@  if ! disabled sdl2; then
 fi
 enabled sdl2 && enable sdl && add_cflags $sdl2_cflags && add_extralibs $sdl2_libs
 
+if enabled decklink; then
+    case $target_os in
+        mingw32*|mingw64*)
+            decklink_outdev_extralibs="$decklink_outdev_extralibs -lole32 -loleaut32"
+            decklink_indev_extralibs="$decklink_indev_extralibs -lole32 -loleaut32"
+            ;;
+        win32|win64)
+            decklink_outdev_extralibs="-lole32 -loleaut32"
+            decklink_indev_extralibs="-lole32 -loleaut32"
+            ;;
+    esac
+fi
+
 disabled securetransport || { check_func SecIdentityCreate "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
     check_lib "Security/SecureTransport.h Security/Security.h" "SSLCreateContext SecItemImport" "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
     enable securetransport; }
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"
 }