diff --git a/aconfigure b/aconfigure index 0fa15238c..9dd490fa2 100755 --- a/aconfigure +++ b/aconfigure @@ -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 diff --git a/aconfigure.ac b/aconfigure.ac index d24f1431e..a72215b36 100644 --- a/aconfigure.ac +++ b/aconfigure.ac @@ -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]) diff --git a/build.mak.in b/build.mak.in index 1a18a8513..28e31386e 100644 --- a/build.mak.in +++ b/build.mak.in @@ -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 diff --git a/build/rules.mak b/build/rules.mak index 912199c41..f2ef26b4a 100644 --- a/build/rules.mak +++ b/build/rules.mak @@ -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),$@) \ diff --git a/pjmedia/build/os-auto.mak.in b/pjmedia/build/os-auto.mak.in index 4c8b4d3fb..fc2f8432b 100644 --- a/pjmedia/build/os-auto.mak.in +++ b/pjmedia/build/os-auto.mak.in @@ -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 # diff --git a/pjmedia/src/pjmedia-videodev/dshow_dev.c b/pjmedia/src/pjmedia-videodev/dshow_dev.c index b28ef718d..c963014da 100644 --- a/pjmedia/src/pjmedia-videodev/dshow_dev.c +++ b/pjmedia/src/pjmedia-videodev/dshow_dev.c @@ -38,6 +38,8 @@ #ifdef _MSC_VER # pragma warning(pop) +#else +#include #endif #pragma comment(lib, "Strmiids.lib") diff --git a/pjsip-apps/build/Samples.mak b/pjsip-apps/build/Samples.mak index 3857a33d0..35da66007 100644 --- a/pjsip-apps/build/Samples.mak +++ b/pjsip-apps/build/Samples.mak @@ -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) diff --git a/pjsip-apps/src/samples/pjsua2_demo.cpp b/pjsip-apps/src/samples/pjsua2_demo.cpp index f7784e9a4..05082db00 100644 --- a/pjsip-apps/src/samples/pjsua2_demo.cpp +++ b/pjsip-apps/src/samples/pjsua2_demo.cpp @@ -429,6 +429,7 @@ static void mainProg4(Endpoint &ep) #endif +extern "C" int main() { int ret = 0; diff --git a/pjsip/build/Makefile b/pjsip/build/Makefile index c92ccc372..a434bfa45 100644 --- a/pjsip/build/Makefile +++ b/pjsip/build/Makefile @@ -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) \ diff --git a/pjsip/src/pjsua2-test/main.cpp b/pjsip/src/pjsua2-test/main.cpp index acd4de11d..46581a3c8 100644 --- a/pjsip/src/pjsua2-test/main.cpp +++ b/pjsip/src/pjsua2-test/main.cpp @@ -20,6 +20,7 @@ using namespace pj; +extern "C" int main(int argc, char *argv[]) { Endpoint ep; diff --git a/third_party/BaseClasses/amvideo2.h b/third_party/BaseClasses/amvideo2.h new file mode 100644 index 000000000..6fda7f5a9 --- /dev/null +++ b/third_party/BaseClasses/amvideo2.h @@ -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) diff --git a/third_party/BaseClasses/arithutil.cpp b/third_party/BaseClasses/arithutil.cpp index 9600e5f3f..121094fc9 100644 --- a/third_party/BaseClasses/arithutil.cpp +++ b/third_party/BaseClasses/arithutil.cpp @@ -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))) diff --git a/third_party/BaseClasses/sal2.h b/third_party/BaseClasses/sal2.h new file mode 100644 index 000000000..e59f760b7 --- /dev/null +++ b/third_party/BaseClasses/sal2.h @@ -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) + diff --git a/third_party/BaseClasses/streams.h b/third_party/BaseClasses/streams.h index 63f33dfe0..c8dcdb007 100644 --- a/third_party/BaseClasses/streams.h +++ b/third_party/BaseClasses/streams.h @@ -23,6 +23,11 @@ #else #define AM_NOVTABLE #endif +#else + #include + #include + #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 // External device control interface defines //#include // 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 + +#endif + #else #ifdef DEBUG diff --git a/third_party/BaseClasses/wxutil.cpp b/third_party/BaseClasses/wxutil.cpp index 59474ed06..235d9fc0d 100644 --- a/third_party/BaseClasses/wxutil.cpp +++ b/third_party/BaseClasses/wxutil.cpp @@ -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 diff --git a/third_party/BaseClasses/wxutil.h b/third_party/BaseClasses/wxutil.h index 305974a5f..9a35b6c19 100644 --- a/third_party/BaseClasses/wxutil.h +++ b/third_party/BaseClasses/wxutil.h @@ -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 { diff --git a/third_party/build/baseclasses/Makefile b/third_party/build/baseclasses/Makefile new file mode 100644 index 000000000..f0b817cc9 --- /dev/null +++ b/third_party/build/baseclasses/Makefile @@ -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 $@ + + diff --git a/third_party/build/os-auto.mak.in b/third_party/build/os-auto.mak.in index 22defec2c..b2f4ffb7a 100644 --- a/third_party/build/os-auto.mak.in +++ b/third_party/build/os-auto.mak.in @@ -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