Fix building with video support (including dshow camera) on mingw (#2589)

This commit is contained in:
Nikolai ZHUBR 2020-12-10 11:54:40 +03:00 committed by GitHub
parent 2a0095175f
commit dad6a34680
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 213 additions and 13 deletions

View File

@ -681,6 +681,9 @@ ac_darwin_cflags
ac_pjmedia_video_has_ios_opengl
ac_pjmedia_video_has_vtoolbox
ac_pjmedia_video_has_darwin
ac_dshow_ldflags
ac_dshow_cflags
ac_pjmedia_video_dev_has_dshow
ac_android_cflags
ac_pjmedia_video_has_android
ac_pjmedia_video
@ -6481,10 +6484,12 @@ fi
# Disable video on mingw
# Disable video on mingw by default (but respect --enable-video=yes)
case $target in
*mingw*)
if test ! "$enable_video" = "yes"; then
enable_video="no"
fi
;;
esac
@ -6556,6 +6561,18 @@ $as_echo "Checking if OpenGL ES 2 is available... no" >&6; }
fi
ac_android_cflags="$ac_android_cflags -DPJMEDIA_VIDEO_DEV_HAS_ANDROID=1"
;;
*mingw*)
if test "$enable_video" = "yes"; then
ac_pjmedia_video=windows_os
ac_pjmedia_video_dev_has_dshow=yes
ac_dshow_cflags="-DPJMEDIA_HAS_VIDEO=1 -DPJMEDIA_VIDEO_DEV_HAS_DSHOW=1"
ac_dshow_ldflags=" -lstdc++ -lquartz -lole32 -loleaut32 -lrpcrt4 -lwinmm -luuid -lmingwex -lstrmiids "
LIBS="$LIBS -lstdc++ -lquartz -lole32 -loleaut32 -lrpcrt4 -lwinmm -luuid -lmingwex -lstrmiids "
fi
;;
*darwin*)
ac_pjmedia_video=darwin_os
@ -7064,6 +7081,7 @@ $as_echo "not found" >&6; }
ac_sdl_cflags=`$SDL_CONFIG --cflags`
ac_sdl_cflags="-DPJMEDIA_VIDEO_DEV_HAS_SDL=1 $ac_sdl_cflags"
ac_sdl_ldflags=`$SDL_CONFIG --libs`
ac_sdl_ldflags=${ac_sdl_ldflags//-mwindows/}
LIBS="$LIBS $ac_sdl_ldflags"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Unsupported SDL version" >&5

View File

@ -772,10 +772,12 @@ fi
AC_SUBST(ac_pjmedia_video)
# Disable video on mingw
# Disable video on mingw by default (but respect --enable-video=yes)
case $target in
*mingw*)
if test ! "$enable_video" = "yes"; then
enable_video="no"
fi
;;
esac
@ -828,6 +830,18 @@ else
fi
ac_android_cflags="$ac_android_cflags -DPJMEDIA_VIDEO_DEV_HAS_ANDROID=1"
;;
*mingw*)
if test "$enable_video" = "yes"; then
ac_pjmedia_video=windows_os
AC_SUBST(ac_pjmedia_video_dev_has_dshow)
ac_pjmedia_video_dev_has_dshow=yes
AC_SUBST(ac_dshow_cflags)
ac_dshow_cflags="-DPJMEDIA_HAS_VIDEO=1 -DPJMEDIA_VIDEO_DEV_HAS_DSHOW=1"
AC_SUBST(ac_dshow_ldflags)
ac_dshow_ldflags=" -lstdc++ -lquartz -lole32 -loleaut32 -lrpcrt4 -lwinmm -luuid -lmingwex -lstrmiids "
LIBS="$LIBS -lstdc++ -lquartz -lole32 -loleaut32 -lrpcrt4 -lwinmm -luuid -lmingwex -lstrmiids "
fi
;;
*darwin*)
ac_pjmedia_video=darwin_os
AC_SUBST(ac_pjmedia_video_has_darwin)
@ -1082,6 +1096,7 @@ AC_ARG_ENABLE(sdl,
ac_sdl_cflags=`$SDL_CONFIG --cflags`
ac_sdl_cflags="-DPJMEDIA_VIDEO_DEV_HAS_SDL=1 $ac_sdl_cflags"
ac_sdl_ldflags=`$SDL_CONFIG --libs`
ac_sdl_ldflags=${ac_sdl_ldflags//-mwindows/}
LIBS="$LIBS $ac_sdl_ldflags"
else
AC_MSG_RESULT([Unsupported SDL version])

View File

@ -187,13 +187,22 @@ AC_PJMEDIA_VIDEO_HAS_VTOOLBOX = @ac_pjmedia_video_has_vtoolbox@
AC_PJMEDIA_VIDEO_HAS_IOS_OPENGL = @ac_pjmedia_video_has_ios_opengl@
DARWIN_CFLAGS = @ac_darwin_cflags@
# mingw
AC_PJMEDIA_VIDEO_DEV_HAS_DSHOW = @ac_pjmedia_video_dev_has_dshow@
ifeq (@ac_pjmedia_video_dev_has_dshow@,yes)
DSHOW_CFLAGS = @ac_dshow_cflags@
DSHOW_LDFLAGS = @ac_dshow_ldflags@
APP_THIRD_PARTY_LIB_FILES += $(PJ_DIR)/third_party/lib/libbaseclasses-$(LIB_SUFFIX)
APP_THIRD_PARTY_LIBS += -lbaseclasses-$(TARGET_NAME)
endif
# Android
ANDROID_CFLAGS = @ac_android_cflags@
# PJMEDIA features exclusion
PJ_VIDEO_CFLAGS += $(SDL_CFLAGS) $(FFMPEG_CFLAGS) $(V4L2_CFLAGS) $(QT_CFLAGS) \
PJ_VIDEO_CFLAGS += $(SDL_CFLAGS) $(FFMPEG_CFLAGS) $(V4L2_CFLAGS) $(DSHOW_CFLAGS) $(QT_CFLAGS) \
$(OPENH264_CFLAGS) $(VPX_CFLAGS) $(DARWIN_CFLAGS)
PJ_VIDEO_LDFLAGS += $(SDL_LDFLAGS) $(FFMPEG_LDFLAGS) $(V4L2_LDFLAGS) \
PJ_VIDEO_LDFLAGS += $(SDL_LDFLAGS) $(FFMPEG_LDFLAGS) $(V4L2_LDFLAGS) $(DSHOW_LDFLAGS) \
$(OPENH264_LDFLAGS) $(VPX_LDFLAGS)
# CFLAGS, LDFLAGS, and LIBS to be used by applications

View File

@ -169,6 +169,11 @@ $(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.S | $(OBJDIRS)
$(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
$(subst /,$(HOST_PSEP),$<)
$(OBJDIR)/dshowclasses.o: $(SRCDIR)/dshowclasses.cpp | $(OBJDIRS)
$(CXX) $($(APP)_CXXFLAGS) -I$(SRCDIR)/../../../third_party/BaseClasses -fpermissive \
$(CC_OUT)$(subst /,$(HOST_PSEP),$@) \
$(subst /,$(HOST_PSEP),$<)
$(OBJDIR)/%$(OBJEXT): $(SRCDIR)/%.cpp | $(OBJDIRS)
$(CXX) $($(APP)_CXXFLAGS) \
$(CC_OUT)$(subst /,$(HOST_PSEP),$@) \

View File

@ -18,6 +18,10 @@ FFMPEG_LDFLAGS = @ac_ffmpeg_ldflags@
V4L2_CFLAGS = @ac_v4l2_cflags@
V4L2_LDFLAGS = @ac_v4l2_ldflags@
# Directshow
DSHOW_CFLAGS = @ac_dshow_cflags@
DSHOW_LDFLAGS = @ac_dshow_ldflags@
# QT
AC_PJMEDIA_VIDEO_HAS_QT = @ac_pjmedia_video_has_qt@
# QT_CFLAGS = @ac_qt_cflags@
@ -39,10 +43,10 @@ VPX_LDFLAGS = @ac_vpx_ldflags@
# PJMEDIA features exclusion
export CFLAGS += @ac_no_small_filter@ @ac_no_large_filter@ @ac_no_speex_aec@ \
$(SDL_CFLAGS) $(FFMPEG_CFLAGS) $(V4L2_CFLAGS) $(QT_CFLAGS) \
$(SDL_CFLAGS) $(FFMPEG_CFLAGS) $(V4L2_CFLAGS) $(DSHOW_CFLAGS) $(QT_CFLAGS) \
$(DARWIN_CFLAGS) $(ANDROID_CFLAGS) \
$(OPENH264_CFLAGS) $(VPX_CFLAGS)
export LDFLAGS += $(SDL_LDFLAGS) $(FFMPEG_LDFLAGS) $(V4L2_LDFLAGS) \
export LDFLAGS += $(SDL_LDFLAGS) $(FFMPEG_LDFLAGS) $(V4L2_LDFLAGS) $(DSHOW_LDFLAGS) \
$(OPENH264_LDFLAGS) $(VPX_LDFLAGS)
# Define the desired sound device backend
@ -289,6 +293,14 @@ ifeq ($(AC_PJMEDIA_VIDEO_HAS_IOS_OPENGL),yes)
export PJMEDIA_VIDEODEV_OBJS += ios_opengl_dev.o
endif
#
# Directshow video device
#
ifeq ($(AC_PJMEDIA_VIDEO_DEV_HAS_DSHOW),yes)
export PJMEDIA_VIDEODEV_OBJS += dshow_dev.o dshowclasses.o
export CFLAGS += -I$(THIRD_PARTY)/BaseClasses
endif
#
# Android video device
#

View File

@ -38,6 +38,8 @@
#ifdef _MSC_VER
# pragma warning(pop)
#else
#include <amvideo2.h>
#endif
#pragma comment(lib, "Strmiids.lib")

View File

@ -7,8 +7,8 @@ RULES_MAK := $(PJDIR)/build/rules.mak
###############################################################################
# Gather all flags.
#
export _CFLAGS := $(PJ_CFLAGS) $(CFLAGS)
export _CXXFLAGS:= $(PJ_CXXFLAGS) $(CFLAGS)
export _CFLAGS := $(PJ_CFLAGS) $(CFLAGS) $(PJ_VIDEO_CFLAGS)
export _CXXFLAGS:= $(PJ_CXXFLAGS) $(CFLAGS) $(PJ_VIDEO_CFLAGS)
export _LDFLAGS := $(PJ_LDFLAGS) $(PJ_LDLIBS) $(LDFLAGS)
export _LDXXFLAGS := $(PJ_LDXXFLAGS) $(PJ_LDXXLIBS) $(LDFLAGS)

View File

@ -429,6 +429,7 @@ static void mainProg4(Endpoint &ep)
#endif
extern "C"
int main()
{
int ret = 0;

View File

@ -163,7 +163,7 @@ export PJSUA2_TEST_SRCDIR = ../src/pjsua2-test
export PJSUA2_TEST_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
main.o
export PJSUA2_TEST_CFLAGS += $(_CFLAGS) $(PJ_VIDEO_CFLAGS)
export PJSUA2_TEST_CXXFLAGS = $(_CXXFLAGS) $(PJSUA2_LIB_CFLAGS)
export PJSUA2_TEST_CXXFLAGS = $(_CXXFLAGS) $(PJSUA2_LIB_CFLAGS) $(PJ_VIDEO_CFLAGS)
export PJSUA2_TEST_LDFLAGS += $(PJ_LDXXFLAGS) $(PJ_LDXXLIBS) $(LDFLAGS)
ifeq ($(EXCLUDE_APP),0)
export PJSUA2_TEST_EXE := pjsua2-test-$(TARGET_NAME)$(HOST_EXE)
@ -182,7 +182,7 @@ export TEST_OBJS += dlg_core_test.o dns_test.o msg_err_test.o \
tsx_basic_test.o tsx_bench.o tsx_uac_test.o \
tsx_uas_test.o txdata_test.o uri_test.o \
inv_offer_answer_test.o
export TEST_CFLAGS += $(_CFLAGS)
export TEST_CFLAGS += $(_CFLAGS) $(PJ_VIDEO_CFLAGS)
export TEST_CXXFLAGS += $(_CXXFLAGS)
export TEST_LDFLAGS += $(PJSIP_LDLIB) \
$(PJSIP_UA_LDLIB) \

View File

@ -20,6 +20,7 @@
using namespace pj;
extern "C"
int main(int argc, char *argv[])
{
Endpoint ep;

26
third_party/BaseClasses/amvideo2.h vendored Normal file
View File

@ -0,0 +1,26 @@
/*
Some necessary macros are missing from mingw version. They are here.
See https://github.com/ofTheo/videoInput/blob/master/videoInputSrcAndDemos/libs/DShow/Include/amvideo.h
*/
//------------------------------------------------------------------------------
// File: AMVideo.h
//
// Desc: Video related definitions and interfaces for ActiveMovie.
//
// Copyright (c) 1992 - 2001, Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
#define TRUECOLOR(pbmi) ((TRUECOLORINFO *)(((LPBYTE)&((pbmi)->bmiHeader)) \
+ (pbmi)->bmiHeader.biSize))
#define COLORS(pbmi) ((RGBQUAD *)(((LPBYTE)&((pbmi)->bmiHeader)) \
+ (pbmi)->bmiHeader.biSize))
#define SIZE_MASKS (iMASK_COLORS * sizeof(DWORD))
#define SIZE_PREHEADER (FIELD_OFFSET(VIDEOINFOHEADER,bmiHeader))
#define WIDTHBYTES(bits) ((DWORD)(((bits)+31) & (~31)) / 8)
#define DIBWIDTHBYTES(bi) (DWORD)WIDTHBYTES((DWORD)(bi).biWidth * (DWORD)(bi).biBitCount)
#define _DIBSIZE(bi) (DIBWIDTHBYTES(bi) * (DWORD)(bi).biHeight)
#define DIBSIZE(bi) ((bi).biHeight < 0 ? (-1)*(_DIBSIZE(bi)) : _DIBSIZE(bi))
#define PALETTISED(pbmi) ((pbmi)->bmiHeader.biBitCount <= iPALETTE)

View File

@ -21,7 +21,7 @@
// Enlarged integer divide - 64-bits / 32-bits > 32-bits
//
#ifndef _X86_
#if !defined(_X86_) || !defined(_MSC_VER)
#define LLtoU64(x) (*(unsigned __int64*)(void*)(&(x)))

19
third_party/BaseClasses/sal2.h vendored Normal file
View File

@ -0,0 +1,19 @@
/*
See https://github.com/RobertBeckebans/RBDOOM-3-BFG/blob/master/neo/libs/mingw-hacks/sal.h
*/
/* From PortAudio, which is under MIT license:
* https://www.assembla.com/code/portaudio/subversion/nodes/portaudio/trunk/src/hostapi/wasapi/mingw-include/sal.h
*/
#pragma once
#if __GNUC__ >=3
#pragma GCC system_header
#endif
#define __in
#define __out
#define __deref_in
#define __deref_inout_opt
#define __field_ecount_opt(x)
#define __in_bcount_opt(size)

View File

@ -23,6 +23,11 @@
#else
#define AM_NOVTABLE
#endif
#else
#include <sal.h>
#include <sal2.h>
#define AM_NOVTABLE
#pragma GCC diagnostic ignored "-Wwrite-strings"
#endif // MSC_VER
@ -193,6 +198,13 @@ const LONGLONG MAX_TIME = 0x7FFFFFFFFFFFFFFF; /* Maximum LONGLONG value */
//#include <edevdefs.h> // External device control interface defines
//#include <audevcod.h> // audio filter device error event codes
#ifndef _MSC_VER
#define min(a,b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; })
#include <amvideo2.h>
#endif
#else
#ifdef DEBUG

View File

@ -384,7 +384,7 @@ void * __stdcall memmoveInternal(void * dst, const void * src, size_t count)
{
void * ret = dst;
#ifdef _X86_
#if defined(_X86_) && defined(_MSC_VER)
if (dst <= src || (char *)dst >= ((char *)src + count)) {
/*
@ -432,6 +432,7 @@ memmove_done:
return ret;
}
#ifdef _MSC_VER
HRESULT AMSafeMemMoveOffset(
__in_bcount(dst_size) void * dst,
__in size_t dst_size,
@ -458,6 +459,7 @@ HRESULT AMSafeMemMoveOffset(
memmoveInternal( (BYTE *)dst+cb_dst_offset, (BYTE *)src+cb_src_offset, count);
return S_OK;
}
#endif
#ifdef DEBUG

View File

@ -337,6 +337,7 @@ public:
}
};
#ifdef _MSC_VER
// Ensures that memory is not read past the length source buffer
// and that memory is not written past the length of the dst buffer
// dst - buffer to copy to
@ -358,13 +359,14 @@ HRESULT AMSafeMemMoveOffset(
__in size_t src_size,
__in DWORD cb_src_offset,
__in size_t count);
#endif
extern "C"
void * __stdcall memmoveInternal(void *, const void *, size_t);
inline void * __cdecl memchrInternal(const void *buf, int chr, size_t cnt)
{
#ifdef _X86_
#if defined(_X86_) && defined(_MSC_VER)
void *pRet = NULL;
_asm {

72
third_party/build/baseclasses/Makefile vendored Normal file
View File

@ -0,0 +1,72 @@
include ../../../build.mak
include ../../../build/common.mak
export LIBDIR := ../../lib
RULES_MAK := $(PJDIR)/build/rules.mak
export BASECLASSES_LIB := libbaseclasses-$(TARGET_NAME)$(LIBEXT)
ifeq ($(PJ_SHARED_LIBRARIES),)
else
export BASECLASSES_SONAME := libbaseclasses.$(SHLIB_SUFFIX)
export BASECLASSES_SHLIB := $(BASECLASSES_SONAME).$(PJ_VERSION_MAJOR)
endif
###############################################################################
# Gather all flags.
#
export _CFLAGS := $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \
$(CFLAGS) $(CC_INC)../../BaseClasses \
$(CC_INC)../../../pjmedia/include $(CC_INC)../../../pjlib/include
export _CXXFLAGS:= $(_CFLAGS) $(CC_CXXFLAGS) $(OS_CXXFLAGS) $(M_CXXFLAGS) \
$(HOST_CXXFLAGS) $(CXXFLAGS)
export _LDFLAGS := $(CC_LDFLAGS) $(OS_LDFLAGS) $(M_LDFLAGS) $(HOST_LDFLAGS) \
$(LDFLAGS)
export BASECLASSES_SRCDIR = ../../BaseClasses
export BASECLASSES_OBJS = amfilter.o amvideo.o arithutil.o combase.o ctlutil.o \
mtype.o renbase.o wxdebug.o wxlist.o \
wxutil.o
export BASECLASSES_CFLAGS = $(_CFLAGS)
export BASECLASSES_CXXFLAGS = -fpermissive -D__STRSAFE__NO_INLINE=1 -DPJMEDIA_VIDEO_DEV_HAS_DSHOW=1 $(_CFLAGS)
export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT
###############################################################################
# Main entry
#
# $(TARGET) is defined in os-$(OS_NAME).mak file in current directory.
#
TARGETS := $(BASECLASSES_LIB) $(BASECLASSES_SONAME)
all: $(TARGETS)
doc:
cd .. && doxygen docs/doxygen.cfg
dep: depend
distclean: realclean
.PHONY: all dep depend clean realclean distclean
.PHONY: $(TARGETS)
.PHONY: $(BASECLASSES_LIB) $(BASECLASSES_SONAME)
libbaseclasses: $(BASECLASSES_LIB)
$(BASECLASSES_SONAME): $(BASECLASSES_LIB)
$(BASECLASSES_LIB) $(BASECLASSES_SONAME):
$(MAKE) -f $(RULES_MAK) APP=BASECLASSES app=baseclasses $(subst /,$(HOST_PSEP),$(LIBDIR)/$@)
clean print_lib:
$(MAKE) -f $(RULES_MAK) APP=BASECLASSES app=baseclasses $@
realclean:
$(subst @@,$(subst /,$(HOST_PSEP),.ilbc-$(TARGET_NAME).depend),$(HOST_RMR))
$(MAKE) -f $(RULES_MAK) APP=BASECLASSES app=baseclasses $@
depend:
$(MAKE) -f $(RULES_MAK) APP=BASECLASSES app=baseclasses $@

View File

@ -39,6 +39,10 @@ else
endif
endif
ifneq ($(findstring windows_os,@ac_pjmedia_video@),)
DIRS += baseclasses
endif
ifneq (@ac_external_srtp@,0)
# External SRTP
else