From ee9d3921f2435e3ade7f4aa7acb3f0e8322580b0 Mon Sep 17 00:00:00 2001 From: smorlat Date: Mon, 17 Aug 2009 10:40:11 +0000 Subject: [PATCH] remove msdscap (integrated in mediastreamer2 directly) add make setup to msx264 fix various build issues. git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@574 3f6dc0c8-ddfe-455d-9043-3cd528dc4637 --- linphone/Makefile.am | 11 +- linphone/coreapi/plugins/buddylookup/INSTALL | 110 +- .../coreapi/plugins/buddylookup/Makefile.am | 2 +- .../coreapi/plugins/buddylookup/configure.ac | 10 + linphone/gtk-glade/gtkrc | 5 +- linphone/linphone-deps.filelist | 2 +- .../mediastreamer2/plugins/msdscap/comptr.hh | 73 -- .../mediastreamer2/plugins/msdscap/ds3.cc | 702 ----------- .../mediastreamer2/plugins/msdscap/error.cc | 23 - .../mediastreamer2/plugins/msdscap/error.hh | 133 --- .../plugins/msdscap/libmsdscap.dev | 125 -- .../mediastreamer2/plugins/msdscap/mdscap.cc | 1054 ----------------- .../mediastreamer2/plugins/msx264/INSTALL | 17 +- .../mediastreamer2/plugins/msx264/Makefile.am | 25 + .../plugins/msx264/configure.ac | 4 + .../msx264/{msx264.iss => msx264.iss.in} | 69 +- linphone/mediastreamer2/src/mscommon.c | 7 +- 17 files changed, 193 insertions(+), 2179 deletions(-) delete mode 100644 linphone/mediastreamer2/plugins/msdscap/comptr.hh delete mode 100644 linphone/mediastreamer2/plugins/msdscap/ds3.cc delete mode 100644 linphone/mediastreamer2/plugins/msdscap/error.cc delete mode 100644 linphone/mediastreamer2/plugins/msdscap/error.hh delete mode 100755 linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev delete mode 100755 linphone/mediastreamer2/plugins/msdscap/mdscap.cc rename linphone/mediastreamer2/plugins/msx264/{msx264.iss => msx264.iss.in} (80%) mode change 100755 => 100644 diff --git a/linphone/Makefile.am b/linphone/Makefile.am index f33f3d07f..93d03f6f2 100644 --- a/linphone/Makefile.am +++ b/linphone/Makefile.am @@ -23,9 +23,12 @@ ZIPFILE=$(shell cd $(top_builddir) && pwd)/$(PACKAGE)-win32-$(VERSION).zip ZIP_EXCLUDED=include lib \ share/sounds/linphone/rings/synth.wav \ share/sounds/linphone/rings/tapping.wav \ - share/sounds/linphone/rings/orig.wav + share/sounds/linphone/rings/orig.wav \ + share/sounds/linphone/rings/sweet.wav \ + share/sounds/linphone/rings/rock.wav -GTK_PREFIX=/usr/local + +GTK_PREFIX=/usr GTK_FILELIST=gtk+-2.16.2.filelist GTK_FILELIST_PATH=$(shell cd $(top_srcdir) && pwd)/$(GTK_FILELIST) LINPHONEDEPS_FILELIST=linphone-deps.filelist @@ -78,7 +81,9 @@ other-cherrypick: else \ cp $$file $(INSTALLDIR_WITH_PREFIX)/$$file ;\ fi \ - done + done + cp /mingw/bin/libgcc_s*.dll $(INSTALLDIR_WITH_PREFIX)/bin/. + gtk-cherrypick: cd $(GTK_PREFIX) && \ diff --git a/linphone/coreapi/plugins/buddylookup/INSTALL b/linphone/coreapi/plugins/buddylookup/INSTALL index 5458714e1..2550dab75 100755 --- a/linphone/coreapi/plugins/buddylookup/INSTALL +++ b/linphone/coreapi/plugins/buddylookup/INSTALL @@ -2,15 +2,15 @@ Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006 Free Software Foundation, Inc. +2006, 2007, 2008, 2009 Free Software Foundation, Inc. -This file is free documentation; the Free Software Foundation gives + This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== -Briefly, the shell commands `./configure; make; make install' should + Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. @@ -67,12 +67,15 @@ The simplest way to compile this package is: all sorts of other programs in order to regenerate files that came with the distribution. + 6. Often, you can also type `make uninstall' to remove the installed + files again. + Compilers and Options ===================== -Some systems require unusual options for compilation or linking that the -`configure' script does not know about. Run `./configure --help' for -details on some of the pertinent environment variables. + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here @@ -85,7 +88,7 @@ is an example: Compiling For Multiple Architectures ==================================== -You can compile the package for more than one kind of computer at the + You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run @@ -97,10 +100,24 @@ architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + Installation Names ================== -By default, `make install' installs the package's commands under + By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. @@ -123,7 +140,7 @@ option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= -Some packages pay attention to `--enable-FEATURE' options to + Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The @@ -135,14 +152,46 @@ find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + Specifying the System Type ========================== -There may be some features `configure' cannot figure out automatically, -but needs to determine by the type of machine the package will run on. -Usually, assuming the package is built to be run on the _same_ -architectures, `configure' can figure that out, but if it prints a -message saying it cannot guess the machine type, give it the + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: @@ -150,7 +199,8 @@ type, such as `sun4', or a canonical name which has the form: where SYSTEM can have one of these forms: - OS KERNEL-OS + OS + KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't @@ -168,9 +218,9 @@ eventually be run) with `--host=TYPE'. Sharing Defaults ================ -If you want to set default values for `configure' scripts to share, you -can create a site shell script called `config.site' that gives default -values for variables like `CC', `cache_file', and `prefix'. + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. @@ -179,7 +229,7 @@ A warning: not all `configure' scripts look for a site script. Defining Variables ================== -Variables not defined in a site shell script can be set in the + Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set @@ -198,11 +248,19 @@ an Autoconf bug. Until the bug is fixed you can use this workaround: `configure' Invocation ====================== -`configure' recognizes the following options to control how it operates. + `configure' recognizes the following options to control how it +operates. `--help' `-h' - Print a summary of the options to `configure', and exit. + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. `--version' `-V' @@ -229,6 +287,16 @@ an Autoconf bug. Until the bug is fixed you can use this workaround: Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. +`--prefix=DIR' + Use DIR as the installation prefix. *Note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. diff --git a/linphone/coreapi/plugins/buddylookup/Makefile.am b/linphone/coreapi/plugins/buddylookup/Makefile.am index 281d0c4cc..9d1a0e814 100644 --- a/linphone/coreapi/plugins/buddylookup/Makefile.am +++ b/linphone/coreapi/plugins/buddylookup/Makefile.am @@ -18,4 +18,4 @@ zip: clean-local: rm -rf $(PACKAGE)-install - rm $(PACKAGE)-win32-$(VERSION).zip + rm -f $(PACKAGE)-win32-$(VERSION).zip diff --git a/linphone/coreapi/plugins/buddylookup/configure.ac b/linphone/coreapi/plugins/buddylookup/configure.ac index 3ddda90f8..5e61343da 100644 --- a/linphone/coreapi/plugins/buddylookup/configure.ac +++ b/linphone/coreapi/plugins/buddylookup/configure.ac @@ -31,6 +31,16 @@ AC_DISABLE_STATIC AC_PROG_LIBTOOL + +AC_CONFIG_COMMANDS([libtool-hacking],[ + if test "$mingw_found" = "yes" ; then + echo "Hacking libtool to work with mingw..." + sed -e 's/\*\" \$a_deplib \"\*/\*/' < ./libtool > libtool.tmp + cp -f ./libtool.tmp ./libtool + rm -f ./libtool.tmp + fi +],[mingw_found=$mingw_found]) + # Checks for libraries. PKG_CHECK_MODULES(LIBSOUP, libsoup-2.4 >= 2.4.0) diff --git a/linphone/gtk-glade/gtkrc b/linphone/gtk-glade/gtkrc index 12f3baee4..73d21744f 100644 --- a/linphone/gtk-glade/gtkrc +++ b/linphone/gtk-glade/gtkrc @@ -1,3 +1,4 @@ -#include "c:/Program Files/Linphone/share/themes/Cillop/gtk-2.0/gtkrc" -include "share/themes/XLiquid_GTK-1.0.3/gtk-2.0/gtkrc" +#include "share/themes/XLiquid_GTK-1.0.3/gtk-2.0/gtkrc" #include "share/themes/Aero-ion3.1/gtk-2.0/gtkrc" +include "share/themes/Outcrop/gtk-2.0/gtkrc" + diff --git a/linphone/linphone-deps.filelist b/linphone/linphone-deps.filelist index 40d31692f..703504f3f 100755 --- a/linphone/linphone-deps.filelist +++ b/linphone/linphone-deps.filelist @@ -5,7 +5,7 @@ ./bin/libogg-0.dll ./bin/libsoup-2.4-1.dll ./bin/libtheora-0.dll -./bin/libxml2.dll +./bin/libxml2-2.dll ./bin/osip2.dll ./bin/osipparser2.dll ./bin/swscale-0.dll diff --git a/linphone/mediastreamer2/plugins/msdscap/comptr.hh b/linphone/mediastreamer2/plugins/msdscap/comptr.hh deleted file mode 100644 index 6bfa0109e..000000000 --- a/linphone/mediastreamer2/plugins/msdscap/comptr.hh +++ /dev/null @@ -1,73 +0,0 @@ -/* HornetsEye - Computer Vision with Ruby - Copyright (C) 2006, 2007 Jan Wedekind - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ -#ifndef HORNETSEYE_COMPTR_HH -#define HORNETSEYE_COMPTR_HH - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef WIN32 -#include -#include -#include "error.hh" - -namespace Hornetseye { - - template< class I > - class ComPtr - { - public: - ComPtr(void): m_i(NULL) {} - ComPtr( const ComPtr< I > &ptr ): m_i(ptr.get()) { - if ( m_i != NULL ) m_i->AddRef(); - } - ~ComPtr(void) { reset(); } - ComPtr< I > &operator=( const ComPtr< I > &other ) { - reset(); - m_i = other.get(); - if ( m_i != NULL ) m_i->AddRef(); - return *this; - }; - I **operator&(void) { - reset(); - return &m_i; - } - void coCreateInstance( REFCLSID clsid, REFIID iid, const char *errorText ) - throw (Error) { - reset(); - COERRORMACRO( CoCreateInstance( clsid, NULL, CLSCTX_INPROC, iid, - (void **)&m_i ), Error, , errorText ); - } - I *get(void) const { return m_i; } - I &operator*(void) { - assert( m_i != NULL ); - return *m_i; - } - I *operator->(void) { - assert( m_i != NULL ); - return m_i; - } - void reset(void) { if ( m_i != NULL ) { m_i->Release(); m_i = NULL; } } - protected: - I *m_i; - }; - -}; - -#endif - -#endif diff --git a/linphone/mediastreamer2/plugins/msdscap/ds3.cc b/linphone/mediastreamer2/plugins/msdscap/ds3.cc deleted file mode 100644 index 2d8dacfd8..000000000 --- a/linphone/mediastreamer2/plugins/msdscap/ds3.cc +++ /dev/null @@ -1,702 +0,0 @@ -// This is a DirectShow interface. But maybe you'll find that it's easier to -// access the camera directly ;) - -// http://www.codeguru.com/cpp/g-m/multimedia/video/article.php/c9551/ -// http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-April/027965.html -// http://msdn2.microsoft.com/en-us/library/ms787594.aspx -// http://msdn2.microsoft.com/en-us/library/ms787867.aspx -// NullRenderer wih reference clock set to NULL -// http://www.videolan.org/ -// http://git.videolan.org/gitweb.cgi?p=vlc.git;f=modules/access/dshow;hb=0.8.6 - -// #include -// #include -// #include -// #include -// #include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "comptr.hh" -#include "error.hh" - -#define FILTER_NAME L"HornetsEye Capture Filter" -#define PIN_NAME L"Capture" - -using namespace Hornetseye; - -DEFINE_GUID( CLSID_VideoInputDeviceCategory, 0x860BB310, 0x5D01, - 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86); -DEFINE_GUID( CLSID_SystemDeviceEnum, 0x62BE5D10, 0x60EB, 0x11d0, - 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); -DEFINE_GUID( CLSID_FilterGraph, 0xe436ebb3, 0x524f, 0x11ce, - 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); -DEFINE_GUID( CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, - 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37 ); -DEFINE_GUID( CLSID_NullRenderer,0xc1f400a4, 0x3f08, 0x11d3, - 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37 ); -DEFINE_GUID( CLSID_VfwCapture, 0x1b544c22, 0xfd0b, 0x11ce, - 0x8c, 0x63, 0x0, 0xaa, 0x00, 0x44, 0xb5, 0x1e); -DEFINE_GUID( IID_IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); -DEFINE_GUID( IID_IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, - 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86 ); -DEFINE_GUID( IID_IEnumFilters, 0x56a86893, 0xad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IEnumPins, 0x56a86892, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMediaSample, 0x56a8689a, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMediaFilter, 0x56a86899, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IPin, 0x56a86891, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, - 0x92, 0xad, 0x02, 0x66, 0xb5, 0xd7, 0xc7, 0x8f ); -DEFINE_GUID( IID_ISampleGrabberCB, 0x0579154a, 0x2b53, 0x4994, - 0xb0, 0xd0, 0xe7, 0x73, 0x14, 0x8e, 0xff, 0x85 ); -DEFINE_GUID( IID_IMediaEvent, 0x56a868b6, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMemInputPin, 0x56a8689d, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IAMStreamConfig, 0xc6e13340, 0x30ac, 0x11d0, - 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 ); -DEFINE_GUID( IID_IVideoProcAmp, 0x4050560e, 0x42a7, 0x413a, - 0x85, 0xc2, 0x09, 0x26, 0x9a, 0x2d, 0x0f, 0x44 ); -DEFINE_GUID( MEDIATYPE_Video, 0x73646976, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); -DEFINE_GUID( MEDIASUBTYPE_YV12, 0x32315659, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_IYUV, 0x56555949, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_YUYV, 0x56595559, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_YUY2, 0x32595559, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_UYVY, 0x59565955, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_RGB24, 0xe436eb7d, 0x524f, 0x11ce, - 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); - -using namespace std; - -typedef LONGLONG REFERENCE_TIME; - -typedef struct tagVIDEOINFOHEADER { - RECT rcSource; - RECT rcTarget; - DWORD dwBitRate; - DWORD dwBitErrorRate; - REFERENCE_TIME AvgTimePerFrame; - BITMAPINFOHEADER bmiHeader; -} VIDEOINFOHEADER; - -typedef struct _AMMediaType { - GUID majortype; - GUID subtype; - BOOL bFixedSizeSamples; - BOOL bTemporalCompression; - ULONG lSampleSize; - GUID formattype; - IUnknown *pUnk; - ULONG cbFormat; - BYTE *pbFormat; -} AM_MEDIA_TYPE; - -DECLARE_ENUMERATOR_(IEnumMediaTypes,AM_MEDIA_TYPE*); - -typedef struct _VIDEO_STREAM_CONFIG_CAPS -{ - GUID guid; - ULONG VideoStandard; - SIZE InputSize; - SIZE MinCroppingSize; - SIZE MaxCroppingSize; - int CropGranularityX; - int CropGranularityY; - int CropAlignX; - int CropAlignY; - SIZE MinOutputSize; - SIZE MaxOutputSize; - int OutputGranularityX; - int OutputGranularityY; - int StretchTapsX; - int StretchTapsY; - int ShrinkTapsX; - int ShrinkTapsY; - LONGLONG MinFrameInterval; - LONGLONG MaxFrameInterval; - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; -} VIDEO_STREAM_CONFIG_CAPS; - -typedef LONGLONG REFERENCE_TIME; - -typedef interface IBaseFilter IBaseFilter; -typedef interface IReferenceClock IReferenceClock; -typedef interface IFilterGraph IFilterGraph; - -typedef enum _FilterState { - State_Stopped, - State_Paused, - State_Running -} FILTER_STATE; - -#define MAX_FILTER_NAME 128 -typedef struct _FilterInfo { - WCHAR achName[MAX_FILTER_NAME]; - IFilterGraph *pGraph; -} FILTER_INFO; - -typedef enum _PinDirection { - PINDIR_INPUT, - PINDIR_OUTPUT -} PIN_DIRECTION; - -#define MAX_PIN_NAME 128 -typedef struct _PinInfo { - IBaseFilter *pFilter; - PIN_DIRECTION dir; - WCHAR achName[MAX_PIN_NAME]; -} PIN_INFO; - -#define INTERFACE IPin -DECLARE_INTERFACE_(IPin,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Connect)(THIS_ IPin*,const AM_MEDIA_TYPE*) PURE; - STDMETHOD(ReceiveConnection)(THIS_ IPin*,const AM_MEDIA_TYPE*) PURE; - STDMETHOD(Disconnect)(THIS) PURE; - STDMETHOD(ConnectedTo)(THIS_ IPin**) PURE; - STDMETHOD(ConnectionMediaType)(THIS_ AM_MEDIA_TYPE*) PURE; - STDMETHOD(QueryPinInfo)(THIS_ PIN_INFO*) PURE; - STDMETHOD(QueryDirection)(THIS_ PIN_DIRECTION*) PURE; -}; -#undef INTERFACE - -DECLARE_ENUMERATOR_(IEnumPins,IPin*); - -typedef struct _AllocatorProperties { - long cBuffers; - long cbBuffer; - long cbAlign; - long cbPrefix; -} ALLOCATOR_PROPERTIES; - -typedef LONG_PTR OAEVENT; - -#define INTERFACE IMediaEvent -DECLARE_INTERFACE_(IMediaEvent,IDispatch) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(GetEventHandle)(THIS_ OAEVENT*) PURE; - STDMETHOD(GetEvent)(THIS_ long*,LONG_PTR,LONG_PTR,long) PURE; - STDMETHOD(WaitForCompletion)(THIS_ long,long*) PURE; - STDMETHOD(CancelDefaultHandling)(THIS_ long) PURE; - STDMETHOD(RestoreDefaultHandling)(THIS_ long) PURE; - STDMETHOD(FreeEventParams)(THIS_ long,LONG_PTR,LONG_PTR) PURE; -}; -#undef INTERFACE - -typedef long OAFilterState; - -#define INTERFACE IMediaControl -DECLARE_INTERFACE_(IMediaControl,IDispatch) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Run)(THIS) PURE; - STDMETHOD(Pause)(THIS) PURE; - STDMETHOD(Stop)(THIS) PURE; - STDMETHOD(GetState)(THIS_ LONG,OAFilterState*) PURE; - STDMETHOD(RenderFile)(THIS_ BSTR) PURE; - STDMETHOD(AddSourceFilter)(THIS_ BSTR,IDispatch**) PURE; - STDMETHOD(get_FilterCollection)(THIS_ IDispatch**) PURE; - STDMETHOD(get_RegFilterCollection)(THIS_ IDispatch**) PURE; - STDMETHOD(StopWhenReady)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IVideoProcAmp -DECLARE_INTERFACE_(IVideoProcAmp,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IAMStreamConfig -DECLARE_INTERFACE_(IAMStreamConfig,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SetFormat)(THIS_ AM_MEDIA_TYPE*) PURE; - STDMETHOD(GetFormat)(THIS_ AM_MEDIA_TYPE**) PURE; - STDMETHOD(GetNumberOfCapabilities)(THIS_ int*,int*) PURE; - STDMETHOD(GetStreamCaps)(THIS_ int,AM_MEDIA_TYPE**,BYTE*) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMediaFilter -DECLARE_INTERFACE_(IMediaFilter,IPersist) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Stop)(THIS) PURE; - STDMETHOD(Pause)(THIS) PURE; - STDMETHOD(Run)(THIS_ REFERENCE_TIME) PURE; - STDMETHOD(GetState)(THIS_ DWORD,FILTER_STATE*) PURE; - STDMETHOD(SetSyncSource)(THIS_ IReferenceClock*) PURE; - STDMETHOD(GetSyncSource)(THIS_ IReferenceClock**) PURE; -}; -#undef INTERFACE - -#define INTERFACE IBaseFilter -DECLARE_INTERFACE_(IBaseFilter,IMediaFilter) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(EnumPins)(THIS_ IEnumPins**) PURE; - STDMETHOD(FindPin)(THIS_ LPCWSTR,IPin**) PURE; - STDMETHOD(QueryFilterInfo)(THIS_ FILTER_INFO*) PURE; - STDMETHOD(JoinFilterGraph)(THIS_ IFilterGraph*,LPCWSTR) PURE; - STDMETHOD(QueryVendorInfo)(THIS_ LPWSTR*) PURE; -}; -#undef INTERFACE - -DECLARE_ENUMERATOR_(IEnumFilters,IBaseFilter*); - -// #define INTERFACE IEnumFilters -// DECLARE_INTERFACE_(IEnumFilters,IUnknown) -// { -// STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; -// STDMETHOD_(ULONG,AddRef)(THIS) PURE; -// STDMETHOD_(ULONG,Release)(THIS) PURE; -// STDMETHOD(Next)(THIS_ ULONG,IBaseFilter**,ULONG*) PURE; -// STDMETHOD(Skip)(THIS_ ULONG) PURE; -// STDMETHOD(Reset)(THIS) PURE; -// STDMETHOD(Clone)(THIS_ IEnumFilters**) PURE; -// }; -// #undef INTERFACE - -#define INTERFACE IFilterGraph -DECLARE_INTERFACE_(IFilterGraph,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(AddFilter)(THIS_ IBaseFilter*,LPCWSTR) PURE; - STDMETHOD(RemoveFilter)(THIS_ IBaseFilter*) PURE; - STDMETHOD(EnumFilters)(THIS_ IEnumFilters**) PURE; - STDMETHOD(FindFilterByName)(THIS_ LPCWSTR,IBaseFilter**) PURE; - STDMETHOD(ConnectDirect)(THIS_ IPin*,IPin*,const AM_MEDIA_TYPE*) PURE; - STDMETHOD(Reconnect)(THIS_ IPin*) PURE; - STDMETHOD(Disconnect)(THIS_ IPin*) PURE; - STDMETHOD(SetDefaultSyncSource)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IGraphBuilder -DECLARE_INTERFACE_(IGraphBuilder,IFilterGraph) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Connect)(THIS_ IPin*,IPin*) PURE; - STDMETHOD(Render)(THIS_ IPin*) PURE; - STDMETHOD(RenderFile)(THIS_ LPCWSTR,LPCWSTR) PURE; - STDMETHOD(AddSourceFilter)(THIS_ LPCWSTR,LPCWSTR,IBaseFilter**) PURE; - STDMETHOD(SetLogFile)(THIS_ DWORD_PTR) PURE; - STDMETHOD(Abort)(THIS) PURE; - STDMETHOD(ShouldOperationContinue)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE ICreateDevEnum -DECLARE_INTERFACE_(ICreateDevEnum,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(CreateClassEnumerator)(THIS_ REFIID,IEnumMoniker**,DWORD) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMediaSample -DECLARE_INTERFACE_(IMediaSample,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMemAllocator -DECLARE_INTERFACE_(IMemAllocator,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SetProperties)(THIS_ ALLOCATOR_PROPERTIES*,ALLOCATOR_PROPERTIES*) PURE; - STDMETHOD(GetProperties)(THIS_ ALLOCATOR_PROPERTIES*) PURE; - STDMETHOD(Commit)(THIS) PURE; - STDMETHOD(Decommit)(THIS) PURE; - STDMETHOD(GetBuffer)(THIS_ IMediaSample **,REFERENCE_TIME*,REFERENCE_TIME*,DWORD) PURE; - STDMETHOD(ReleaseBuffer)(THIS_ IMediaSample*) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMemInputPin -DECLARE_INTERFACE_(IMemInputPin,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(GetAllocator)(THIS_ IMemAllocator**) PURE; - STDMETHOD(NotifyAllocator)(THIS_ IMemAllocator*,BOOL) PURE; - STDMETHOD(GetAllocatorRequirements)(THIS_ ALLOCATOR_PROPERTIES*) PURE; - STDMETHOD(Receive)(THIS_ IMediaSample*) PURE; - STDMETHOD(ReceiveMultiple)(THIS_ IMediaSample**,LONG,LONG*) PURE; - STDMETHOD(ReceiveCanBlock)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE ISampleGrabberCB -DECLARE_INTERFACE_(ISampleGrabberCB,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SampleCB)(THIS_ double,IMediaSample*) PURE; - STDMETHOD(BufferCB)(THIS_ double,BYTE*,long) PURE; -}; -#undef INTERFACE - -#define INTERFACE ISampleGrabber -DECLARE_INTERFACE_(ISampleGrabber,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SetOneShot)(THIS_ BOOL) PURE; - STDMETHOD(SetMediaType)(THIS_ const AM_MEDIA_TYPE*) PURE; - STDMETHOD(GetConnectedMediaType)(THIS_ AM_MEDIA_TYPE*) PURE; - STDMETHOD(SetBufferSamples)(THIS_ BOOL) PURE; - STDMETHOD(GetCurrentBuffer)(THIS_ long*,long*) PURE; - STDMETHOD(GetCurrentSample)(THIS_ IMediaSample**) PURE; - STDMETHOD(SetCallBack)(THIS_ ISampleGrabberCB *,long) PURE; -}; -#undef INTERFACE - -ComPtr< IPin > getPin( IBaseFilter *filter, PIN_DIRECTION direction, int num ) -{ - ComPtr< IPin > retVal; - ComPtr< IEnumPins > enumPins; - COERRORMACRO( filter->EnumPins( &enumPins ), Error, , - "Error getting pin enumerator" ); - ULONG found; - ComPtr< IPin > pin; - while ( enumPins->Next( 1, &pin, &found ) == S_OK ) { - PIN_DIRECTION pinDirection = (PIN_DIRECTION)( -1 ); - pin->QueryDirection( &pinDirection ); - if ( pinDirection == direction ) { - if ( num == 0 ) { - retVal = pin; - break; - }; - num--; - }; - }; - return retVal; -} - -class Callback: public ISampleGrabberCB -{ -public: - Callback(void); - virtual ~Callback(void); - STDMETHODIMP QueryInterface( REFIID riid, void **ppv ); - STDMETHODIMP_(ULONG) AddRef(void); - STDMETHODIMP_(ULONG) Release(void); - STDMETHODIMP SampleCB(double,IMediaSample*); - STDMETHODIMP BufferCB(double,BYTE*,long); -protected: - long m_refCount; -}; - -Callback::Callback(void): m_refCount(1) -{ -#ifndef NDEBUG - cerr << "Callback::Callback" << endl; -#endif -} - -Callback::~Callback(void) -{ -#ifndef NDEBUG - cerr << "Callback::~Callback" << endl; -#endif -} - -STDMETHODIMP Callback::QueryInterface(REFIID riid, void **ppv) -{ -#ifndef NDEBUG - cerr << "Callback::QueryInterface" << endl; -#endif - HRESULT retval; - if ( ppv == NULL ) return E_POINTER; - /* - if ( riid == IID_IUnknown ) { - *ppv = static_cast< IUnknown * >( this ); - AddRef(); - retval = S_OK; - } else if ( riid == IID_ISampleGrabberCB ) { - *ppv = static_cast< ISampleGrabberCB * >( this ); - AddRef(); - retval = S_OK; - } else */ { -#ifndef NDEBUG - cerr << setbase( 16 ) << setfill('0') - << "DEFINE_GUID( ..., 0x" << setw(8) << (int)riid.Data1 << ", 0x" - << setw(4) << (int)riid.Data2 << "," << endl - << " 0x" - << setw(4) << (int)riid.Data3 << ", 0x" << setw(2) - << (int)riid.Data4[0] << ", 0x" - << (int)riid.Data4[1] << ", 0x" - << (int)riid.Data4[2] << ", 0x" - << (int)riid.Data4[3] << ", 0x" - << (int)riid.Data4[4] << ", 0x" - << (int)riid.Data4[5] << ", 0x" - << (int)riid.Data4[6] << ", 0x" - << (int)riid.Data4[7] << " ) ?" << endl - << setfill( ' ' ) << setw( 0 ) << setbase( 10 ); -#endif - retval = E_NOINTERFACE; - }; - return retval; -}; - -STDMETHODIMP_(ULONG) Callback::AddRef(void) -{ -#ifndef NDEBUG - cerr << "Callback::AddRef" << endl; -#endif - m_refCount++; - return m_refCount; -} - -STDMETHODIMP_(ULONG) Callback::Release(void) -{ -#ifndef NDEBUG - cerr << "Callback::Release" << endl; -#endif - if ( !InterlockedDecrement( &m_refCount ) ) delete this; - return m_refCount; -} - -STDMETHODIMP Callback::SampleCB( double, IMediaSample * ) -{ -#ifndef NDEBUG - cerr << "Callback::SampleCB" << endl; -#endif - return S_OK; -} - -STDMETHODIMP Callback::BufferCB( double, BYTE *, long ) -{ -#ifndef NDEBUG - cerr << "Callback::BufferCB" << endl; -#endif - return E_NOTIMPL; -} - -using namespace std; - -int main(void) -{ - int retVal = 0; - bool initialized = false; - Callback *callback = NULL; - try { - COERRORMACRO( CoInitialize(NULL), Error, , "CoInitialize failed" ); - initialized = true; - ComPtr< IGraphBuilder > graphBuilder; - graphBuilder.coCreateInstance( CLSID_FilterGraph, IID_IGraphBuilder, - "Could not create graph builder " - "interface" ); - cerr << "graphBuilder is " << graphBuilder.get() << endl; - ComPtr< ICreateDevEnum > createDevEnum; - createDevEnum.coCreateInstance( CLSID_SystemDeviceEnum, - IID_ICreateDevEnum, "Could not create " - "device enumerator" ); - ComPtr< IEnumMoniker > enumMoniker; - COERRORMACRO( createDevEnum->CreateClassEnumerator - ( CLSID_VideoInputDeviceCategory, &enumMoniker, 0 ), Error, , - "Error requesting moniker enumerator" ); - createDevEnum.reset(); - COERRORMACRO( enumMoniker->Reset(), Error, , - "Error resetting moniker enumerator" ); - int index = 0; - ComPtr< IMoniker > moniker; - for ( int i=0; i<=index; i++ ) { - ULONG fetched = 0; - COERRORMACRO( enumMoniker->Next( 1, &moniker, &fetched ), Error, , - "Error fetching next moniker" ); - }; - enumMoniker.reset(); - ComPtr< IBaseFilter > source; - COERRORMACRO( moniker->BindToObject( 0, 0, IID_IBaseFilter, - (void **)&source ), Error, , - "Error binding moniker to base filter" ); - moniker.reset(); - COERRORMACRO( graphBuilder->AddFilter( source.get(), L"Source" ), - Error, , "Error adding camera source to filter graph" ); - ComPtr< IPin > sourceOut = getPin( source.get(), PINDIR_OUTPUT, 0 ); - ERRORMACRO( sourceOut.get() != NULL, Error, , - "Error getting output pin of camera source" ); - ComPtr< IAMStreamConfig > streamConfig; - COERRORMACRO( sourceOut-> - QueryInterface( IID_IAMStreamConfig, - (void **)&streamConfig ), - Error, , "Error requesting stream configuration API" ); - int count, size; - COERRORMACRO( streamConfig->GetNumberOfCapabilities( &count, &size ), - Error, , "Error getting number of capabilities" ); - bool ok = false; - for ( int i=0; iGetStreamCaps( i, &mediaType, - (BYTE *)&videoConfig ), - Error, , "Error getting stream capabilities" ); - if ( mediaType->majortype == MEDIATYPE_Video && - mediaType->cbFormat != 0 ) { - VIDEOINFOHEADER *infoHeader = (VIDEOINFOHEADER*)mediaType->pbFormat; - // TODO: choose format here !!! - cerr << "Setting format " << infoHeader->bmiHeader.biWidth - << "x" << infoHeader->bmiHeader.biHeight << endl; - streamConfig->SetFormat( mediaType ); - ok = true; - }; - if ( mediaType->cbFormat != 0 ) - CoTaskMemFree( (PVOID)mediaType->pbFormat ); - if ( mediaType->pUnk != NULL ) mediaType->pUnk->Release(); - CoTaskMemFree( (PVOID)mediaType ); - if ( ok ) - break; - }; - streamConfig.reset(); - ERRORMACRO( ok, Error, , "Could not find any video format" ); - - ComPtr< IBaseFilter > grabberBase; - COERRORMACRO( CoCreateInstance( CLSID_SampleGrabber, NULL, - CLSCTX_INPROC, IID_IBaseFilter, - (void **)&grabberBase ), - Error, , "Error creating sample grabber" ); - COERRORMACRO( graphBuilder->AddFilter( grabberBase.get(), L"Grabber" ), - Error, , "Error adding sample grabber to filter graph" ); - ComPtr< ISampleGrabber > sampleGrabber; - COERRORMACRO( grabberBase->QueryInterface( IID_ISampleGrabber, - (void **)&sampleGrabber ), - Error, , "Error requesting sample grabber interface" ); - COERRORMACRO( sampleGrabber->SetOneShot( FALSE ), Error, , - "Error disabling one-shot mode" ); - COERRORMACRO( sampleGrabber->SetBufferSamples( TRUE ), Error, , - "Error enabling buffer sampling" ); - callback = new Callback; - COERRORMACRO( sampleGrabber->SetCallBack( callback, 0 ), Error, , - "Error setting callback interface for grabbing" ); - ComPtr< IPin > grabberIn = getPin( grabberBase.get(), PINDIR_INPUT, 0 ); - ERRORMACRO( grabberIn.get() != NULL, Error, , - "Error getting input of sample grabber" ); - ComPtr< IPin > grabberOut = getPin( grabberBase.get(), PINDIR_OUTPUT, 0 ); - ERRORMACRO( grabberOut.get() != NULL, Error, , - "Error getting output of sample grabber" ); - - ComPtr< IBaseFilter > nullRenderer; - COERRORMACRO( CoCreateInstance( CLSID_NullRenderer, NULL, - CLSCTX_INPROC, IID_IBaseFilter, - (void **)&nullRenderer ), - Error, , "Error creating Null Renderer" ); - COERRORMACRO( graphBuilder->AddFilter( nullRenderer.get(), L"Sink" ), - Error, , "Error adding null renderer to filter graph" ); - ComPtr< IPin > nullIn = getPin( nullRenderer.get(), PINDIR_INPUT, 0 ); - - cerr << endl << "Attempting to connect" << endl; - COERRORMACRO( graphBuilder->Connect( sourceOut.get(), grabberIn.get() ), - Error, , "Error connecting source to sample grabber" ); - COERRORMACRO( graphBuilder->Connect( grabberOut.get(), nullIn.get() ), - Error, , "Error connecting sample grabber to sink" ); - - cerr << "Success!!!!!!!!!!!!!!!!!!!!!" << endl; - - ComPtr< IMediaControl > mediaControl; - COERRORMACRO( graphBuilder->QueryInterface( IID_IMediaControl, - (void **)&mediaControl ), - Error, , "Error requesting media control interface" ); - COERRORMACRO( mediaControl->Run(), Error, , "Error running graph" ); - - ComPtr< IMediaEvent > mediaEvent; - COERRORMACRO( graphBuilder->QueryInterface( IID_IMediaEvent, - (void **)&mediaEvent ), - Error, , "Error requesting event interface" ); - - cin.get(); - - mediaControl->Stop(); - - long evCode = 0; - mediaEvent->WaitForCompletion( INFINITE, &evCode ); - - // sourceOut.reset(); - // sinkIn.reset(); - // source.reset(); - } catch ( Error &e ) { - cerr << e.what() << endl; - retVal = 1; - }; - if ( callback != NULL ) callback->Release(); - if ( initialized ) CoUninitialize(); - return retVal; -} - -static void ms_dshow_detect(MSWebCamManager *obj); - -static MSWebCamDesc ms_dshow_cam_desc={ - "Directshow capture", - &ms_dshow_detect, - NULL, - &ms_dshow_create_reader, - NULL -}; - -static void ms_dshow_detect(MSWebCamManager *obj){ - int i; - MSWebCam *cam; -} - -extern "C" void libmsdscap_init(void){ - ms_web_cam_desc_register(&ms_dshow_cam_desc); -} diff --git a/linphone/mediastreamer2/plugins/msdscap/error.cc b/linphone/mediastreamer2/plugins/msdscap/error.cc deleted file mode 100644 index 1365a4eca..000000000 --- a/linphone/mediastreamer2/plugins/msdscap/error.cc +++ /dev/null @@ -1,23 +0,0 @@ -/* HornetsEye - Computer Vision with Ruby - Copyright (C) 2006, 2007 Jan Wedekind - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ -#include "error.hh" - -using namespace std; - -namespace Hornetseye { - string Error::temp; -}; - diff --git a/linphone/mediastreamer2/plugins/msdscap/error.hh b/linphone/mediastreamer2/plugins/msdscap/error.hh deleted file mode 100644 index 453c6e748..000000000 --- a/linphone/mediastreamer2/plugins/msdscap/error.hh +++ /dev/null @@ -1,133 +0,0 @@ -/* HornetsEye - Computer Vision with Ruby - Copyright (C) 2006, 2007 Jan Wedekind - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ -#ifndef HORNETSEYE_ERROR_HH -#define HORNETSEYE_ERROR_HH - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#ifdef WIN32 -#include -#include -#include -#include -#endif - -namespace Hornetseye { - - /** Exception class deriving from std::exception. - This class provides a syntax similar to output-streams for convenience. - For compability with other libraries it is inheriting the class - \c std::exception. - - Here is an example how to use an instance of this class in C++: - \include exceptiontest/exceptiontest.cc - - Exception-handling also can be done using the macro \c ERRORMACRO: - \include exceptiontest/macrotest.cc - - Mind that the macro uses a variable with the name \c _e. Make sure, that - you don't use this variable-name in any of the macro-arguments! - - Ruby already comes with exception classes: - \include exceptiontest/exceptiontest.rb - - @date Mon Aug 23 14:37:05 UTC 2004 */ - class Error: public std::exception - { - public: - /// Constructor. - Error(void) {} - /// Copy constructor. - Error( Error &e ): std::exception( e ) - { m_message << e.m_message.str(); } - /// Destructor. - virtual ~Error(void) throw() {} - /// - template< typename T > - std::ostream &operator<<( const T &t ) - { m_message << t; return m_message; } - /** Interface for manipulators. - Manipulators such as \c std::endl and \c std::hex use these - functions in constructs like "Error e; e << std::endl". - For more information, see the iomanip header. */ - std::ostream &operator<<( std::ostream& (*__pf)( std::ostream&) ) - { (*__pf)( m_message ); return m_message; } - /// Returns error message (not thread safe). - virtual const char* what(void) const throw() { - temp = m_message.str(); - return temp.c_str(); - return NULL; - } - protected: - /// Memory-stream containing the error message. - std::ostringstream m_message; - /** Temporary to do null-termination. - The method \c what() requires a null-terminated string. */ - static std::string temp; - }; - -}; - -#define ERRORMACRO( condition, class, params, message ) \ - if ( !( condition ) ) { \ - class _e params; \ - _e << message; \ - throw _e; \ - }; - -#ifdef WIN32 -#define COERRORMACRO( condition, class, params, message ) \ - { \ - HRESULT _hr = condition; \ - if ( FAILED( _hr ) ) { \ - class _e params; \ - _e << message; \ - TCHAR *_msg; \ - if ( FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | \ - FORMAT_MESSAGE_FROM_SYSTEM, 0, _hr, 0, \ - (LPTSTR)&_msg, 0, NULL ) != 0 ) { \ - _e << ": " << _msg; \ - LocalFree( _msg ); \ - }; \ - throw _e; \ - }; \ - }; - -#define W32ERRORMACRO( condition, class, params, message ) \ - { \ - if ( !( condition ) ) { \ - class _e params; \ - _e << message; \ - TCHAR *_msg; \ - DWORD _errCode = GetLastError(); \ - if ( FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | \ - FORMAT_MESSAGE_FROM_SYSTEM, 0, _errCode, 0, \ - (LPTSTR)&_msg, 0, NULL ) != 0 ) { \ - _e << ": " << _msg; \ - LocalFree( _msg ); \ - }; \ - throw _e; \ - }; \ - }; - -#endif - -#endif diff --git a/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev b/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev deleted file mode 100755 index 4c6c28cf3..000000000 --- a/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev +++ /dev/null @@ -1,125 +0,0 @@ -[Project] -FileName=libmsdscap.dev -Name=libmsdscap -UnitCount=4 -PchHead=-1 -PchSource=-1 -Ver=3 -IsCpp=1 -ProfilesCount=2 -ProfileIndex=0 -Folders= - -[Unit1] -FileName=error.hh -CompileCpp=1 -Folder=libmsdscap -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit2] -FileName=comptr.hh -CompileCpp=1 -Folder=libmsdscap -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit3] -FileName=mdscap.cc -CompileCpp=1 -Folder=libmsdscap -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[Unit4] -FileName=error.cc -CompileCpp=1 -Folder=libmsdscap -Compile=1 -Link=1 -Priority=1000 -OverrideBuildCmd=0 -BuildCmd= - -[VersionInfo] -Major=0 -Minor=1 -Release=1 -Build=1 -LanguageID=1033 -CharsetID=1252 -CompanyName= -FileVersion= -FileDescription= -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion= -AutoIncBuildNrOnRebuild=0 -AutoIncBuildNrOnCompile=0 - -[Profile1] -ProfileName=MingW 3.4.2 -Type=3 -ObjFiles= -Includes=../../include;../../../oRTP/include -Libs=../../build/win32native/;../../../oRTP/build/win32native -ResourceIncludes= -MakeIncludes= -Compiler=_@@_ -CppCompiler=-DBUILDING_DLL=1_@@_-DORTP_INET6_@@_-ggdb -02_@@_-Wall_@@_ -Linker=--no-export-all-symbols_@@_--add-stdcall-alias_@@_-lole32_@@_-loleaut32_@@_-lwinmm_@@_-luuid_@@_-lmediastreamer2_@@_-lortp_@@_ -PreprocDefines= -CompilerSettings=0000000001001000000000 -Icon= -ExeOutput= -ObjectOutput=Output\MingW -OverrideOutput=0 -OverrideOutputName=libmsdscap.dll -HostApplication= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=0 -compilerType=0 - -[Profile2] -ProfileName=Visual C++ 2005 -Type=3 -ObjFiles= -Includes= -Libs= -ResourceIncludes= -MakeIncludes= -Compiler=/DBUILDING_DLL=1 -CppCompiler=/DBUILDING_DLL=1 -Linker= -PreprocDefines= -CompilerSettings=000000000000010000000000000000000000 -Icon= -ExeOutput=Output\Visual C++ 2005 -ObjectOutput=Objects\Visual C++ 2005 -OverrideOutput=0 -OverrideOutputName= -HostApplication= -CommandLine= -UseCustomMakefile=0 -CustomMakefile= -IncludeVersionInfo=0 -SupportXPThemes=0 -CompilerSet=1 -compilerType=1 - diff --git a/linphone/mediastreamer2/plugins/msdscap/mdscap.cc b/linphone/mediastreamer2/plugins/msdscap/mdscap.cc deleted file mode 100755 index acbcf22f4..000000000 --- a/linphone/mediastreamer2/plugins/msdscap/mdscap.cc +++ /dev/null @@ -1,1054 +0,0 @@ -/* msdscap - mediastreamer2 plugin for video capture using directshow - Copyright (C) 2009 Simon Morlat - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ -/* -This plugin has been written by Simon Morlat based on the work made by -Jan Wedekind, posted on mingw tracker here: -http://sourceforge.net/tracker/index.php?func=detail&aid=1819367&group_id=2435&atid=302435 -He wrote all the declarations missing to get directshow capture working -with mingw, and provided a demo code that worked great with minimal code. -*/ - -// This is a DirectShow interface. But maybe you'll find that it's easier to -// access the camera directly ;) - -// http://www.codeguru.com/cpp/g-m/multimedia/video/article.php/c9551/ -// http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/2007-April/027965.html -// http://msdn2.microsoft.com/en-us/library/ms787594.aspx -// http://msdn2.microsoft.com/en-us/library/ms787867.aspx -// NullRenderer wih reference clock set to NULL -// http://www.videolan.org/ -// http://git.videolan.org/gitweb.cgi?p=vlc.git;f=modules/access/dshow;hb=0.8.6 - -// #include -// #include -// #include -// #include -// #include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "comptr.hh" -#include "error.hh" - -#include -#include -#include -#include - -#define FILTER_NAME L"Mediasatreamer2 plugin for video capture" -#define PIN_NAME L"Capture" - -using namespace Hornetseye; - -DEFINE_GUID( CLSID_VideoInputDeviceCategory, 0x860BB310, 0x5D01, - 0x11d0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86); -DEFINE_GUID( CLSID_SystemDeviceEnum, 0x62BE5D10, 0x60EB, 0x11d0, - 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); -DEFINE_GUID( CLSID_FilterGraph, 0xe436ebb3, 0x524f, 0x11ce, - 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); -DEFINE_GUID( CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, - 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37 ); -DEFINE_GUID( CLSID_NullRenderer,0xc1f400a4, 0x3f08, 0x11d3, - 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37 ); -DEFINE_GUID( CLSID_VfwCapture, 0x1b544c22, 0xfd0b, 0x11ce, - 0x8c, 0x63, 0x0, 0xaa, 0x00, 0x44, 0xb5, 0x1e); -DEFINE_GUID( IID_IGraphBuilder, 0x56a868a9, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); -DEFINE_GUID( IID_IBaseFilter, 0x56a86895, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_ICreateDevEnum, 0x29840822, 0x5b84, 0x11d0, - 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86 ); -DEFINE_GUID( IID_IEnumFilters, 0x56a86893, 0xad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IEnumPins, 0x56a86892, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMediaSample, 0x56a8689a, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMediaFilter, 0x56a86899, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IPin, 0x56a86891, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_ISampleGrabber, 0x6b652fff, 0x11fe, 0x4fce, - 0x92, 0xad, 0x02, 0x66, 0xb5, 0xd7, 0xc7, 0x8f ); -DEFINE_GUID( IID_ISampleGrabberCB, 0x0579154a, 0x2b53, 0x4994, - 0xb0, 0xd0, 0xe7, 0x73, 0x14, 0x8e, 0xff, 0x85 ); -DEFINE_GUID( IID_IMediaEvent, 0x56a868b6, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMediaControl, 0x56a868b1, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IMemInputPin, 0x56a8689d, 0x0ad4, 0x11ce, - 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); -DEFINE_GUID( IID_IAMStreamConfig, 0xc6e13340, 0x30ac, 0x11d0, - 0xa1, 0x8c, 0x00, 0xa0, 0xc9, 0x11, 0x89, 0x56 ); -DEFINE_GUID( IID_IVideoProcAmp, 0x4050560e, 0x42a7, 0x413a, - 0x85, 0xc2, 0x09, 0x26, 0x9a, 0x2d, 0x0f, 0x44 ); -DEFINE_GUID( MEDIATYPE_Video, 0x73646976, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); -DEFINE_GUID( MEDIASUBTYPE_YV12, 0x32315659, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_IYUV, 0x56555949, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_YUYV, 0x56595559, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_YUY2, 0x32595559, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_UYVY, 0x59565955, 0x0000, 0x0010, - 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); -DEFINE_GUID( MEDIASUBTYPE_RGB24, 0xe436eb7d, 0x524f, 0x11ce, - 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 ); - -using namespace std; - -typedef LONGLONG REFERENCE_TIME; - -typedef struct tagVIDEOINFOHEADER { - RECT rcSource; - RECT rcTarget; - DWORD dwBitRate; - DWORD dwBitErrorRate; - REFERENCE_TIME AvgTimePerFrame; - BITMAPINFOHEADER bmiHeader; -} VIDEOINFOHEADER; - -typedef struct _AMMediaType { - GUID majortype; - GUID subtype; - BOOL bFixedSizeSamples; - BOOL bTemporalCompression; - ULONG lSampleSize; - GUID formattype; - IUnknown *pUnk; - ULONG cbFormat; - BYTE *pbFormat; -} AM_MEDIA_TYPE; - -DECLARE_ENUMERATOR_(IEnumMediaTypes,AM_MEDIA_TYPE*); - -typedef struct _VIDEO_STREAM_CONFIG_CAPS -{ - GUID guid; - ULONG VideoStandard; - SIZE InputSize; - SIZE MinCroppingSize; - SIZE MaxCroppingSize; - int CropGranularityX; - int CropGranularityY; - int CropAlignX; - int CropAlignY; - SIZE MinOutputSize; - SIZE MaxOutputSize; - int OutputGranularityX; - int OutputGranularityY; - int StretchTapsX; - int StretchTapsY; - int ShrinkTapsX; - int ShrinkTapsY; - LONGLONG MinFrameInterval; - LONGLONG MaxFrameInterval; - LONG MinBitsPerSecond; - LONG MaxBitsPerSecond; -} VIDEO_STREAM_CONFIG_CAPS; - -typedef LONGLONG REFERENCE_TIME; - -typedef interface IBaseFilter IBaseFilter; -typedef interface IReferenceClock IReferenceClock; -typedef interface IFilterGraph IFilterGraph; - -typedef enum _FilterState { - State_Stopped, - State_Paused, - State_Running -} FILTER_STATE; - -#define MAX_FILTER_NAME 128 -typedef struct _FilterInfo { - WCHAR achName[MAX_FILTER_NAME]; - IFilterGraph *pGraph; -} FILTER_INFO; - -typedef enum _PinDirection { - PINDIR_INPUT, - PINDIR_OUTPUT -} PIN_DIRECTION; - -#define MAX_PIN_NAME 128 -typedef struct _PinInfo { - IBaseFilter *pFilter; - PIN_DIRECTION dir; - WCHAR achName[MAX_PIN_NAME]; -} PIN_INFO; - -#define INTERFACE IPin -DECLARE_INTERFACE_(IPin,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Connect)(THIS_ IPin*,const AM_MEDIA_TYPE*) PURE; - STDMETHOD(ReceiveConnection)(THIS_ IPin*,const AM_MEDIA_TYPE*) PURE; - STDMETHOD(Disconnect)(THIS) PURE; - STDMETHOD(ConnectedTo)(THIS_ IPin**) PURE; - STDMETHOD(ConnectionMediaType)(THIS_ AM_MEDIA_TYPE*) PURE; - STDMETHOD(QueryPinInfo)(THIS_ PIN_INFO*) PURE; - STDMETHOD(QueryDirection)(THIS_ PIN_DIRECTION*) PURE; -}; -#undef INTERFACE - -DECLARE_ENUMERATOR_(IEnumPins,IPin*); - -typedef struct _AllocatorProperties { - long cBuffers; - long cbBuffer; - long cbAlign; - long cbPrefix; -} ALLOCATOR_PROPERTIES; - -typedef LONG_PTR OAEVENT; - -#define INTERFACE IMediaEvent -DECLARE_INTERFACE_(IMediaEvent,IDispatch) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(GetEventHandle)(THIS_ OAEVENT*) PURE; - STDMETHOD(GetEvent)(THIS_ long*,LONG_PTR,LONG_PTR,long) PURE; - STDMETHOD(WaitForCompletion)(THIS_ long,long*) PURE; - STDMETHOD(CancelDefaultHandling)(THIS_ long) PURE; - STDMETHOD(RestoreDefaultHandling)(THIS_ long) PURE; - STDMETHOD(FreeEventParams)(THIS_ long,LONG_PTR,LONG_PTR) PURE; -}; -#undef INTERFACE - -typedef long OAFilterState; - -#define INTERFACE IMediaControl -DECLARE_INTERFACE_(IMediaControl,IDispatch) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Run)(THIS) PURE; - STDMETHOD(Pause)(THIS) PURE; - STDMETHOD(Stop)(THIS) PURE; - STDMETHOD(GetState)(THIS_ LONG,OAFilterState*) PURE; - STDMETHOD(RenderFile)(THIS_ BSTR) PURE; - STDMETHOD(AddSourceFilter)(THIS_ BSTR,IDispatch**) PURE; - STDMETHOD(get_FilterCollection)(THIS_ IDispatch**) PURE; - STDMETHOD(get_RegFilterCollection)(THIS_ IDispatch**) PURE; - STDMETHOD(StopWhenReady)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IVideoProcAmp -DECLARE_INTERFACE_(IVideoProcAmp,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IAMStreamConfig -DECLARE_INTERFACE_(IAMStreamConfig,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SetFormat)(THIS_ AM_MEDIA_TYPE*) PURE; - STDMETHOD(GetFormat)(THIS_ AM_MEDIA_TYPE**) PURE; - STDMETHOD(GetNumberOfCapabilities)(THIS_ int*,int*) PURE; - STDMETHOD(GetStreamCaps)(THIS_ int,AM_MEDIA_TYPE**,BYTE*) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMediaFilter -DECLARE_INTERFACE_(IMediaFilter,IPersist) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Stop)(THIS) PURE; - STDMETHOD(Pause)(THIS) PURE; - STDMETHOD(Run)(THIS_ REFERENCE_TIME) PURE; - STDMETHOD(GetState)(THIS_ DWORD,FILTER_STATE*) PURE; - STDMETHOD(SetSyncSource)(THIS_ IReferenceClock*) PURE; - STDMETHOD(GetSyncSource)(THIS_ IReferenceClock**) PURE; -}; -#undef INTERFACE - -#define INTERFACE IBaseFilter -DECLARE_INTERFACE_(IBaseFilter,IMediaFilter) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(EnumPins)(THIS_ IEnumPins**) PURE; - STDMETHOD(FindPin)(THIS_ LPCWSTR,IPin**) PURE; - STDMETHOD(QueryFilterInfo)(THIS_ FILTER_INFO*) PURE; - STDMETHOD(JoinFilterGraph)(THIS_ IFilterGraph*,LPCWSTR) PURE; - STDMETHOD(QueryVendorInfo)(THIS_ LPWSTR*) PURE; -}; -#undef INTERFACE - -DECLARE_ENUMERATOR_(IEnumFilters,IBaseFilter*); - -// #define INTERFACE IEnumFilters -// DECLARE_INTERFACE_(IEnumFilters,IUnknown) -// { -// STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; -// STDMETHOD_(ULONG,AddRef)(THIS) PURE; -// STDMETHOD_(ULONG,Release)(THIS) PURE; -// STDMETHOD(Next)(THIS_ ULONG,IBaseFilter**,ULONG*) PURE; -// STDMETHOD(Skip)(THIS_ ULONG) PURE; -// STDMETHOD(Reset)(THIS) PURE; -// STDMETHOD(Clone)(THIS_ IEnumFilters**) PURE; -// }; -// #undef INTERFACE - -#define INTERFACE IFilterGraph -DECLARE_INTERFACE_(IFilterGraph,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(AddFilter)(THIS_ IBaseFilter*,LPCWSTR) PURE; - STDMETHOD(RemoveFilter)(THIS_ IBaseFilter*) PURE; - STDMETHOD(EnumFilters)(THIS_ IEnumFilters**) PURE; - STDMETHOD(FindFilterByName)(THIS_ LPCWSTR,IBaseFilter**) PURE; - STDMETHOD(ConnectDirect)(THIS_ IPin*,IPin*,const AM_MEDIA_TYPE*) PURE; - STDMETHOD(Reconnect)(THIS_ IPin*) PURE; - STDMETHOD(Disconnect)(THIS_ IPin*) PURE; - STDMETHOD(SetDefaultSyncSource)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE IGraphBuilder -DECLARE_INTERFACE_(IGraphBuilder,IFilterGraph) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(Connect)(THIS_ IPin*,IPin*) PURE; - STDMETHOD(Render)(THIS_ IPin*) PURE; - STDMETHOD(RenderFile)(THIS_ LPCWSTR,LPCWSTR) PURE; - STDMETHOD(AddSourceFilter)(THIS_ LPCWSTR,LPCWSTR,IBaseFilter**) PURE; - STDMETHOD(SetLogFile)(THIS_ DWORD_PTR) PURE; - STDMETHOD(Abort)(THIS) PURE; - STDMETHOD(ShouldOperationContinue)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE ICreateDevEnum -DECLARE_INTERFACE_(ICreateDevEnum,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(CreateClassEnumerator)(THIS_ REFIID,IEnumMoniker**,DWORD) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMediaSample -DECLARE_INTERFACE_(IMediaSample,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(GetPointer)(THIS_ BYTE **) PURE; - STDMETHOD_(long, GetSize)(THIS) PURE; -}; -/* -#define INTERFACE IMediaSample -DECLARE_INTERFACE_(IMediaSample, IUnknown) -{ - STDMETHOD(GetPointer)(THIS_ BYTE **) PURE; - STDMETHOD_(long, GetSize)(THIS) PURE; - STDMETHOD(GetTime)(THIS_ REFERENCE_TIME *, REFERENCE_TIME *) PURE; - STDMETHOD(SetTime)(THIS_ REFERENCE_TIME *, REFERENCE_TIME *) PURE; - STDMETHOD(IsSyncPoint)(THIS) PURE; - STDMETHOD(SetSyncPoint)(THIS_ BOOL) PURE; - STDMETHOD(IsPreroll)(THIS) PURE; - STDMETHOD(SetPreroll)(THIS_ BOOL) PURE; - STDMETHOD_(long, GetActualDataLength)(THIS) PURE; - STDMETHOD(SetActualDataLength)(THIS_ long) PURE; - STDMETHOD(GetMediaType)(THIS_ AM_MEDIA_TYPE **) PURE; - STDMETHOD(SetMediaType)(THIS_ AM_MEDIA_TYPE *) PURE; - STDMETHOD(IsDiscontinuity)(THIS) PURE; - STDMETHOD(SetDiscontinuity)(THIS_ BOOL) PURE; - STDMETHOD(GetMediaTime)(THIS_ LONGLONG *, LONGLONG *) PURE; - STDMETHOD(SetMediaTime)(THIS_ LONGLONG *, LONGLONG *) PURE; -}; -*/ - - -#undef INTERFACE - -#define INTERFACE IMemAllocator -DECLARE_INTERFACE_(IMemAllocator,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SetProperties)(THIS_ ALLOCATOR_PROPERTIES*,ALLOCATOR_PROPERTIES*) PURE; - STDMETHOD(GetProperties)(THIS_ ALLOCATOR_PROPERTIES*) PURE; - STDMETHOD(Commit)(THIS) PURE; - STDMETHOD(Decommit)(THIS) PURE; - STDMETHOD(GetBuffer)(THIS_ IMediaSample **,REFERENCE_TIME*,REFERENCE_TIME*,DWORD) PURE; - STDMETHOD(ReleaseBuffer)(THIS_ IMediaSample*) PURE; -}; -#undef INTERFACE - -#define INTERFACE IMemInputPin -DECLARE_INTERFACE_(IMemInputPin,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(GetAllocator)(THIS_ IMemAllocator**) PURE; - STDMETHOD(NotifyAllocator)(THIS_ IMemAllocator*,BOOL) PURE; - STDMETHOD(GetAllocatorRequirements)(THIS_ ALLOCATOR_PROPERTIES*) PURE; - STDMETHOD(Receive)(THIS_ IMediaSample*) PURE; - STDMETHOD(ReceiveMultiple)(THIS_ IMediaSample**,LONG,LONG*) PURE; - STDMETHOD(ReceiveCanBlock)(THIS) PURE; -}; -#undef INTERFACE - -#define INTERFACE ISampleGrabberCB -DECLARE_INTERFACE_(ISampleGrabberCB,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SampleCB)(THIS_ double,IMediaSample*) PURE; - STDMETHOD(BufferCB)(THIS_ double,BYTE*,long) PURE; -}; -#undef INTERFACE - -#define INTERFACE ISampleGrabber -DECLARE_INTERFACE_(ISampleGrabber,IUnknown) -{ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - STDMETHOD(SetOneShot)(THIS_ BOOL) PURE; - STDMETHOD(SetMediaType)(THIS_ const AM_MEDIA_TYPE*) PURE; - STDMETHOD(GetConnectedMediaType)(THIS_ AM_MEDIA_TYPE*) PURE; - STDMETHOD(SetBufferSamples)(THIS_ BOOL) PURE; - STDMETHOD(GetCurrentBuffer)(THIS_ long*,long*) PURE; - STDMETHOD(GetCurrentSample)(THIS_ IMediaSample**) PURE; - STDMETHOD(SetCallBack)(THIS_ ISampleGrabberCB *,long) PURE; -}; -#undef INTERFACE - -ComPtr< IPin > getPin( IBaseFilter *filter, PIN_DIRECTION direction, int num ) -{ - ComPtr< IPin > retVal; - ComPtr< IEnumPins > enumPins; - if (filter->EnumPins( &enumPins )!=S_OK){ - ms_error("Error getting pin enumerator" ); - return retVal; - } - ULONG found; - ComPtr< IPin > pin; - while ( enumPins->Next( 1, &pin, &found ) == S_OK ) { - PIN_DIRECTION pinDirection = (PIN_DIRECTION)( -1 ); - pin->QueryDirection( &pinDirection ); - if ( pinDirection == direction ) { - if ( num == 0 ) { - retVal = pin; - break; - }; - num--; - }; - }; - return retVal; -} - - - -class DSCapture : public ISampleGrabberCB{ -public: - DSCapture(){ - qinit(&_rq); - ms_mutex_init(&_mutex,NULL); - _vsize=MS_VIDEO_SIZE_CIF; - _fps=15; - _start_time=0; - _frame_count=0; - _pixfmt=MS_YUV420P; - _ready=false; - m_refCount=1; - } - virtual ~DSCapture(){ - if (_ready) stopAndClean(); - flushq(&_rq,0); - ms_mutex_destroy(&_mutex); - } - STDMETHODIMP QueryInterface( REFIID riid, void **ppv ); - STDMETHODIMP_(ULONG) AddRef(void); - STDMETHODIMP_(ULONG) Release(void); - STDMETHODIMP SampleCB(double,IMediaSample*); - STDMETHODIMP BufferCB(double,BYTE*,long); - int startDshowGraph(); - void stopAndClean(); - mblk_t *readFrame(){ - mblk_t *ret=NULL; - ms_mutex_lock(&_mutex); - ret=getq(&_rq); - ms_mutex_unlock(&_mutex); - return ret; - } - bool isTimeToSend(uint64_t ticker_time); - MSVideoSize getVSize()const{ - return _vsize; - } - void setVSize(MSVideoSize vsize){ - _vsize=vsize; - } - void setFps(float fps){ - _fps=fps; - } - MSPixFmt getPixFmt(){ - if (!_ready) createDshowGraph(); /* so that _pixfmt is updated*/ - return _pixfmt; - } - void setDeviceIndex(int index){ - _devid=index; - } -protected: - long m_refCount; -private: - int createDshowGraph(); - int selectBestFormat(ComPtr streamConfig, int count); - int _devid; - MSVideoSize _vsize; - queue_t _rq; - ms_mutex_t _mutex; - float _fps; - float _start_time; - int _frame_count; - MSPixFmt _pixfmt; - ComPtr< IGraphBuilder > _graphBuilder; - ComPtr< IBaseFilter > _source; - ComPtr< IBaseFilter > _nullRenderer; - ComPtr< IBaseFilter > _grabberBase; - ComPtr< IMediaControl > _mediaControl; - ComPtr< IMediaEvent > _mediaEvent; - bool _ready; -}; - - -STDMETHODIMP DSCapture::QueryInterface(REFIID riid, void **ppv) -{ - HRESULT retval; - if ( ppv == NULL ) return E_POINTER; - /* - if ( riid == IID_IUnknown ) { - *ppv = static_cast< IUnknown * >( this ); - AddRef(); - retval = S_OK; - } else if ( riid == IID_ISampleGrabberCB ) { - *ppv = static_cast< ISampleGrabberCB * >( this ); - AddRef(); - retval = S_OK; - } else */ { -#ifndef NDEBUG - cerr << setbase( 16 ) << setfill('0') - << "DEFINE_GUID( ..., 0x" << setw(8) << (int)riid.Data1 << ", 0x" - << setw(4) << (int)riid.Data2 << "," << endl - << " 0x" - << setw(4) << (int)riid.Data3 << ", 0x" << setw(2) - << (int)riid.Data4[0] << ", 0x" - << (int)riid.Data4[1] << ", 0x" - << (int)riid.Data4[2] << ", 0x" - << (int)riid.Data4[3] << ", 0x" - << (int)riid.Data4[4] << ", 0x" - << (int)riid.Data4[5] << ", 0x" - << (int)riid.Data4[6] << ", 0x" - << (int)riid.Data4[7] << " ) ?" << endl - << setfill( ' ' ) << setw( 0 ) << setbase( 10 ); -#endif - retval = E_NOINTERFACE; - }; - return retval; -}; - -STDMETHODIMP_(ULONG) DSCapture::AddRef(){ - m_refCount++; - return m_refCount; -} - -STDMETHODIMP_(ULONG) DSCapture::Release() -{ - ms_message("DSCapture::Release"); - if ( !InterlockedDecrement( &m_refCount ) ) { - int refcnt=m_refCount; - delete this; - return refcnt; - } - return m_refCount; -} - -static void dummy(void*p){ -} - -STDMETHODIMP DSCapture::SampleCB( double par1 , IMediaSample * sample) -{ - uint8_t *p; - unsigned int size; - if (sample->GetPointer(&p)!=S_OK){ - ms_error("error in GetPointer()"); - return S_OK; - } - size=sample->GetSize(); - //ms_message( "DSCapture::SampleCB pointer=%p, size=%i",p,size); - mblk_t *m=esballoc(p,size,0,dummy); - m->b_wptr+=size; - ms_mutex_lock(&_mutex); - putq(&_rq,m); - ms_mutex_unlock(&_mutex); - return S_OK; -} - - - -STDMETHODIMP DSCapture::BufferCB( double, BYTE *b, long len) -{ - ms_message("DSCapture::BufferCB"); - return S_OK; -} - -static void dscap_init(MSFilter *f){ - DSCapture *s=new DSCapture(); - f->data=s; -} - - - -static void dscap_uninit(MSFilter *f){ - DSCapture *s=(DSCapture*)f->data; - s->Release(); -} - -static char * fourcc_to_char(char *str, uint32_t fcc){ - memcpy(str,&fcc,4); - str[4]='\0'; - return str; -} - -static int find_best_format(ComPtr streamConfig, int count, MSVideoSize *requested_size, MSPixFmt requested_fmt ){ - int i; - MSVideoSize best_found=(MSVideoSize){32768,32768}; - int best_index=-1; - char fccstr[5]; - char selected_fcc[5]; - for (i=0; iGetStreamCaps( i, &mediaType, - (BYTE *)&videoConfig ), - Error, , "Error getting stream capabilities" ); - if ( mediaType->majortype == MEDIATYPE_Video && - mediaType->cbFormat != 0 ) { - VIDEOINFOHEADER *infoHeader = (VIDEOINFOHEADER*)mediaType->pbFormat; - ms_message("Seeing format %ix%i %s",infoHeader->bmiHeader.biWidth,infoHeader->bmiHeader.biHeight, - fourcc_to_char(fccstr,infoHeader->bmiHeader.biCompression)); - if (ms_fourcc_to_pix_fmt(infoHeader->bmiHeader.biCompression)==requested_fmt){ - MSVideoSize cur; - cur.width=infoHeader->bmiHeader.biWidth; - cur.height=infoHeader->bmiHeader.biHeight; - if (ms_video_size_greater_than(cur,*requested_size)){ - if (ms_video_size_greater_than(best_found,cur)){ - best_found=cur; - best_index=i; - fourcc_to_char(selected_fcc,infoHeader->bmiHeader.biCompression); - } - } - } - }; - if ( mediaType->cbFormat != 0 ) - CoTaskMemFree( (PVOID)mediaType->pbFormat ); - if ( mediaType->pUnk != NULL ) mediaType->pUnk->Release(); - CoTaskMemFree( (PVOID)mediaType ); - } - if (best_index!=-1) { - *requested_size=best_found; - ms_message("Best camera format is %s %ix%i",selected_fcc,best_found.width,best_found.height); - } - return best_index; -} - -int DSCapture::selectBestFormat(ComPtr streamConfig, int count){ - int index; - _pixfmt=MS_YUV420P; - index=find_best_format(streamConfig, count, &_vsize, _pixfmt); - if (index!=-1) goto success; - _pixfmt=MS_YUY2; - index=find_best_format(streamConfig, count, &_vsize,_pixfmt); - if (index!=-1) goto success; - _pixfmt=MS_YUYV; - index=find_best_format(streamConfig, count, &_vsize, _pixfmt); - if (index!=-1) goto success; - _pixfmt=MS_RGB24; - index=find_best_format(streamConfig, count, &_vsize, _pixfmt); - if (index!=-1) { - _pixfmt=MS_RGB24_REV; - goto success; - } - ms_error("This camera does not support any of our pixel formats."); - return -1; - - success: - VIDEO_STREAM_CONFIG_CAPS videoConfig; - AM_MEDIA_TYPE *mediaType; - COERRORMACRO( streamConfig->GetStreamCaps( index, &mediaType, - (BYTE *)&videoConfig ), - Error, , "Error getting stream capabilities" ); - streamConfig->SetFormat( mediaType ); - return 0; -} - -int DSCapture::createDshowGraph(){ - ComPtr< ICreateDevEnum > createDevEnum; - - CoInitialize(NULL); - createDevEnum.coCreateInstance( CLSID_SystemDeviceEnum, - IID_ICreateDevEnum, "Could not create " - "device enumerator" ); - ComPtr< IEnumMoniker > enumMoniker; - if (createDevEnum->CreateClassEnumerator( CLSID_VideoInputDeviceCategory, &enumMoniker, 0 )!=S_OK){ - ms_error("Fail to create class enumerator."); - return -1; - } - createDevEnum.reset(); - enumMoniker->Reset(); - - ULONG fetched = 0; - _graphBuilder.coCreateInstance( CLSID_FilterGraph, IID_IGraphBuilder, - "Could not create graph builder " - "interface" ); - ComPtr< IMoniker > moniker; - for ( int i=0;enumMoniker->Next( 1, &moniker, &fetched )==S_OK;++i ) { - if (i==_devid){ - if (moniker->BindToObject( 0, 0, IID_IBaseFilter, (void **)&_source )!=S_OK){ - ms_error("Error binding moniker to base filter" ); - return -1; - } - } - } - if (_source.get()==0){ - ms_error("Could not interface with webcam devid=%i",_devid); - return -1; - } - moniker.reset(); - enumMoniker.reset(); - if (_graphBuilder->AddFilter( _source.get(), L"Source" )!=S_OK){ - ms_error("Error adding camera source to filter graph" ); - return -1; - } - ComPtr< IPin > sourceOut = getPin( _source.get(), PINDIR_OUTPUT, 0 ); - if (sourceOut.get()==NULL){ - ms_error("Error getting output pin of camera source" ); - return -1; - } - ComPtr< IAMStreamConfig > streamConfig; - if (sourceOut->QueryInterface( IID_IAMStreamConfig, - (void **)&streamConfig )!=S_OK){ - ms_error("Error requesting stream configuration API" ); - return -1; - } - int count, size; - if (streamConfig->GetNumberOfCapabilities( &count, &size )!=S_OK){ - ms_error("Error getting number of capabilities" ); - return -1; - } - if (selectBestFormat(streamConfig,count)!=0){ - return -1; - } - streamConfig.reset(); - - if (CoCreateInstance( CLSID_SampleGrabber, NULL, - CLSCTX_INPROC, IID_IBaseFilter, - (void **)&_grabberBase )!=S_OK){ - ms_error("Error creating sample grabber" ); - return -1; - } - if (_graphBuilder->AddFilter( _grabberBase.get(), L"Grabber" )!=S_OK){ - ms_error("Error adding sample grabber to filter graph"); - return -1; - } - ComPtr< ISampleGrabber > sampleGrabber; - if (_grabberBase->QueryInterface( IID_ISampleGrabber, - (void **)&sampleGrabber )!=S_OK){ - ms_error("Error requesting sample grabber interface"); - return -1; - } - if (sampleGrabber->SetOneShot( FALSE )!=S_OK){ - ms_error("Error disabling one-shot mode" ); - return -1; - } - if (sampleGrabber->SetBufferSamples( TRUE )!=S_OK){ - ms_error("Error enabling buffer sampling" ); - return -1; - } - if (sampleGrabber->SetCallBack(this, 0 )!=S_OK){ - ms_error("Error setting callback interface for grabbing" ); - return -1; - } - ComPtr< IPin > grabberIn = getPin( _grabberBase.get(), PINDIR_INPUT, 0 ); - if (grabberIn.get() == NULL){ - ms_error("Error getting input of sample grabber"); - return -1; - } - ComPtr< IPin > grabberOut = getPin( _grabberBase.get(), PINDIR_OUTPUT, 0 ); - if (grabberOut.get()==NULL){ - ms_error("Error getting output of sample grabber" ); - return -1; - } - if (CoCreateInstance( CLSID_NullRenderer, NULL, - CLSCTX_INPROC, IID_IBaseFilter, - (void **)&_nullRenderer )!=S_OK){ - ms_error("Error creating Null Renderer" ); - return -1; - } - if (_graphBuilder->AddFilter( _nullRenderer.get(), L"Sink" )!=S_OK){ - ms_error("Error adding null renderer to filter graph" ); - return -1; - } - ComPtr< IPin > nullIn = getPin( _nullRenderer.get(), PINDIR_INPUT, 0 ); - if (_graphBuilder->Connect( sourceOut.get(), grabberIn.get() )!=S_OK){ - ms_error("Error connecting source to sample grabber" ); - return -1; - } - if (_graphBuilder->Connect( grabberOut.get(), nullIn.get() )!=S_OK){ - ms_error("Error connecting sample grabber to sink" ); - return -1; - } - ms_message("Directshow graph is now ready to run."); - - if (_graphBuilder->QueryInterface( IID_IMediaControl, - (void **)&_mediaControl )!=S_OK){ - ms_error("Error requesting media control interface" ); - return -1; - } - if (_graphBuilder->QueryInterface( IID_IMediaEvent, - (void **)&_mediaEvent )!=S_OK){ - ms_error("Error requesting event interface" ); - return -1; - } - _ready=true; - return 0; -} - -int DSCapture::startDshowGraph(){ - if (!_ready) { - if (createDshowGraph()!=0) return -1; - } - HRESULT r=_mediaControl->Run(); - if (r!=S_OK && r!=S_FALSE){ - ms_error("Error starting graph (%i)",r); - return -1; - } - ms_message("Graph started"); - return 0; -} - -void DSCapture::stopAndClean(){ - if (_mediaControl.get()!=NULL){ - HRESULT r; - r=_mediaControl->Stop(); - if (r!=S_OK){ - ms_error("msdscap: Could not stop graph !"); - fflush(NULL); - } - _graphBuilder->RemoveFilter(_source.get()); - _graphBuilder->RemoveFilter(_grabberBase.get()); - _graphBuilder->RemoveFilter(_nullRenderer.get()); - } - _source.reset(); - _grabberBase.reset(); - _nullRenderer.reset(); - _mediaControl.reset(); - _mediaEvent.reset(); - _graphBuilder.reset(); - CoUninitialize(); - ms_mutex_lock(&_mutex); - flushq(&_rq,0); - ms_mutex_unlock(&_mutex); - _ready=false; -} - -bool DSCapture::isTimeToSend(uint64_t ticker_time){ - if (_frame_count==-1){ - _start_time=(float)ticker_time; - _frame_count=0; - } - int cur_frame=(int)(((float)ticker_time-_start_time)*_fps/1000.0); - if (cur_frame>_frame_count){ - _frame_count++; - return true; - } - return false; -} - -static void dscap_preprocess(MSFilter * obj){ - DSCapture *s=(DSCapture*)obj->data; - s->startDshowGraph(); -} - -static void dscap_postprocess(MSFilter * obj){ - DSCapture *s=(DSCapture*)obj->data; - s->stopAndClean(); -} - -static void dscap_process(MSFilter * obj){ - DSCapture *s=(DSCapture*)obj->data; - mblk_t *m; - uint32_t timestamp; - - if (s->isTimeToSend(obj->ticker->time)){ - mblk_t *om=NULL; - /*keep the most recent frame if several frames have been captured */ - while((m=s->readFrame())!=NULL){ - if (om!=NULL) freemsg(om); - om=m; - } - if (om!=NULL){ - timestamp=(uint32_t)(obj->ticker->time*90);/* rtp uses a 90000 Hz clockrate for video*/ - mblk_set_timestamp_info(om,timestamp); - ms_queue_put(obj->outputs[0],om); - } - } -} - -static int dscap_set_fps(MSFilter *f, void *arg){ - DSCapture *s=(DSCapture*)f->data; - s->setFps(*(float*)arg); - return 0; -} - -static int dscap_get_pix_fmt(MSFilter *f,void *arg){ - DSCapture *s=(DSCapture*)f->data; - *((MSPixFmt*)arg)=s->getPixFmt(); - return 0; -} - -static int dscap_set_vsize(MSFilter *f, void *arg){ - DSCapture *s=(DSCapture*)f->data; - s->setVSize(*((MSVideoSize*)arg)); - return 0; -} - -static int dscap_get_vsize(MSFilter *f, void *arg){ - DSCapture *s=(DSCapture*)f->data; - MSVideoSize *vs=(MSVideoSize*)arg; - *vs=s->getVSize(); - return 0; -} - -static MSFilterMethod methods[]={ - { MS_FILTER_SET_FPS , dscap_set_fps }, - { MS_FILTER_GET_PIX_FMT , dscap_get_pix_fmt }, - { MS_FILTER_SET_VIDEO_SIZE, dscap_set_vsize }, - { MS_FILTER_GET_VIDEO_SIZE, dscap_get_vsize }, - { 0 , NULL } -}; - -MSFilterDesc ms_dscap_desc={ - MS_FILTER_PLUGIN_ID, - "MSDsCap", - N_("A webcam grabber based on directshow."), - MS_FILTER_OTHER, - NULL, - 0, - 1, - dscap_init, - dscap_preprocess, - dscap_process, - dscap_postprocess, - dscap_uninit, - methods -}; - - -static void ms_dshow_detect(MSWebCamManager *obj); -static MSFilter * ms_dshow_create_reader(MSWebCam *obj){ - MSFilter *f=ms_filter_new_from_desc(&ms_dscap_desc); - DSCapture *s=(DSCapture*)f->data; - s->setDeviceIndex((int)obj->data); - return f; -} - -static MSWebCamDesc ms_dshow_cam_desc={ - "Directshow capture", - &ms_dshow_detect, - NULL, - &ms_dshow_create_reader, - NULL -}; - -static void ms_dshow_detect(MSWebCamManager *obj){ - ComPtr pBag; - - CoInitialize(NULL); - - ComPtr< ICreateDevEnum > createDevEnum; - createDevEnum.coCreateInstance( CLSID_SystemDeviceEnum, - IID_ICreateDevEnum, "Could not create " - "device enumerator" ); - ComPtr< IEnumMoniker > enumMoniker; - if (createDevEnum->CreateClassEnumerator( CLSID_VideoInputDeviceCategory, &enumMoniker, 0 )!=S_OK){ - ms_error("Fail to create class enumerator."); - return; - } - createDevEnum.reset(); - enumMoniker->Reset(); - - ULONG fetched = 0; - ComPtr< IMoniker > moniker; - for ( int i=0;enumMoniker->Next( 1, &moniker, &fetched )==S_OK;++i ) { - VARIANT var; - if (moniker->BindToStorage( 0, 0, IID_IPropertyBag, (void**) &pBag )!=S_OK) - continue; - VariantInit(&var); - if (pBag->Read( L"FriendlyName", &var, NULL )!=S_OK) - continue; - char szName[256]; - WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,szName,256,0,0); - MSWebCam *cam=ms_web_cam_new(&ms_dshow_cam_desc); - cam->name=ms_strdup(szName); - cam->data=(void*)i; - ms_web_cam_manager_prepend_cam(obj,cam); - VariantClear(&var); - } - enumMoniker.reset(); -} - -extern "C" void libmsdscap_init(void){ - ms_web_cam_manager_register_desc(ms_web_cam_manager_get(),&ms_dshow_cam_desc); -} diff --git a/linphone/mediastreamer2/plugins/msx264/INSTALL b/linphone/mediastreamer2/plugins/msx264/INSTALL index 8b82ade08..2550dab75 100644 --- a/linphone/mediastreamer2/plugins/msx264/INSTALL +++ b/linphone/mediastreamer2/plugins/msx264/INSTALL @@ -2,7 +2,7 @@ Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008 Free Software Foundation, Inc. +2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. @@ -159,7 +159,7 @@ Particular systems CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: - ./configure CC="cc -Ae" + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. @@ -174,6 +174,16 @@ and if that doesn't work, try ./configure CC="cc -nodtk" + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + Specifying the System Type ========================== @@ -189,7 +199,8 @@ type, such as `sun4', or a canonical name which has the form: where SYSTEM can have one of these forms: - OS KERNEL-OS + OS + KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't diff --git a/linphone/mediastreamer2/plugins/msx264/Makefile.am b/linphone/mediastreamer2/plugins/msx264/Makefile.am index ce781594e..3ec7f9edc 100644 --- a/linphone/mediastreamer2/plugins/msx264/Makefile.am +++ b/linphone/mediastreamer2/plugins/msx264/Makefile.am @@ -5,19 +5,44 @@ SUBDIRS=src INSTALLDIR=$(shell cd $(top_builddir) && pwd)/$(PACKAGE)-install +INSTALLDIR_WITH_PREFIX=$(INSTALLDIR)/$(prefix) ZIPFILE=$(shell cd $(top_builddir) && pwd)/$(PACKAGE)-win32-$(VERSION).zip ZIP_EXCLUDED=include +ISS_SCRIPT=msx264.iss +ISS_SCRIPT_PATH=$(shell cd $(top_srcdir) && pwd)/$(ISS_SCRIPT) +#path to Inno Setup 5 compiler +ISCC=/c/Program\ Files/Inno\ Setup\ 5/ISCC.exe +PACKAGE_WIN32_FILELIST=$(PACKAGE)-win32.filelist +setup.exe: zip + cd $(INSTALLDIR_WITH_PREFIX) && \ + rm -f $(PACKAGE_WIN32_FILELIST) && \ + for file in `find` ; do \ + if ! test -d $$file ; then \ + echo "Source: $$file; Destdir: {app}\\`dirname $$file`; Flags: ignoreversion" \ + >> $(PACKAGE_WIN32_FILELIST) ;\ + fi \ + done + cp $(ISS_SCRIPT) $(INSTALLDIR_WITH_PREFIX)/. + cd $(INSTALLDIR_WITH_PREFIX) && \ + $(ISCC) $(ISS_SCRIPT) + mv $(INSTALLDIR_WITH_PREFIX)/Output/setup.exe $(PACKAGE)-$(VERSION)-setup.exe + rm -rf $(INSTALLDIR_WITH_PREFIX)/Output + rm -f $(INSTALLDIR_WITH_PREFIX)/$(PACKAGE_WIN32_FILELIST) + rm -f $(INSTALLDIR_WITH_PREFIX)/$(ISS_SCRIPT) zip: rm -f $(ZIPFILE) rm -rf $(INSTALLDIR) mkdir -p $(INSTALLDIR) make install DESTDIR=$(INSTALLDIR) + cp -f $(top_srcdir)/README $(INSTALLDIR_WITH_PREFIX)/. + cp -f $(top_srcdir)/COPYING $(INSTALLDIR_WITH_PREFIX)/. cd $(INSTALLDIR)/$(prefix) && rm -rf $(ZIP_EXCLUDED) && \ zip -r $(ZIPFILE) * clean-local: -rm -rf $(PACKAGE)-install -rm -f $(PACKAGE)-win32-$(VERSION).zip + diff --git a/linphone/mediastreamer2/plugins/msx264/configure.ac b/linphone/mediastreamer2/plugins/msx264/configure.ac index 641c1efe9..2c35be84a 100644 --- a/linphone/mediastreamer2/plugins/msx264/configure.ac +++ b/linphone/mediastreamer2/plugins/msx264/configure.ac @@ -29,12 +29,15 @@ esac AM_CONDITIONAL(BUILD_WIN32, test x$mingw_found = xyes) +AC_CONFIG_COMMANDS([libtool-hacking],[ if test "$mingw_found" = "yes" ; then AC_MSG_NOTICE([Hacking libtool to work with mingw...]) sed -e 's/\*\" \$a_deplib \"\*/\*/' < ./libtool > libtool.tmp cp -f ./libtool.tmp ./libtool rm -f ./libtool.tmp fi +],[mingw_found=$mingw_found]) + CFLAGS="$CFLAGS -Wall" @@ -157,4 +160,5 @@ AC_SUBST(RELEASE) AC_OUTPUT( Makefile src/Makefile +msx264.iss ) diff --git a/linphone/mediastreamer2/plugins/msx264/msx264.iss b/linphone/mediastreamer2/plugins/msx264/msx264.iss.in old mode 100755 new mode 100644 similarity index 80% rename from linphone/mediastreamer2/plugins/msx264/msx264.iss rename to linphone/mediastreamer2/plugins/msx264/msx264.iss.in index 9918f00b4..94f282b8e --- a/linphone/mediastreamer2/plugins/msx264/msx264.iss +++ b/linphone/mediastreamer2/plugins/msx264/msx264.iss.in @@ -1,35 +1,34 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -[Setup] -AppName=msx264 -AppVerName=msx264 version 1.1.7., an H.264 plugin for linphone. -AppPublisher=linphone.org -AppPublisherURL=http://www.linphone.org -AppSupportURL=http://www.linphone.org -AppUpdatesURL=http://www.linphone.org -DefaultDirName={pf}\Linphone -DefaultGroupName=Linphone -LicenseFile=COPYING -InfoBeforeFile=README -OutputBaseFilename=setup -Compression=lzma -SolidCompression=yes - -[Languages] -Name: "english"; MessagesFile: "compiler:Default.isl" - -[Tasks] -;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked - -[Files] -Source: "libmsx264.dll"; DestDir: "{app}\plugins"; Flags: ignoreversion -; NOTE: Don't use "Flags: ignoreversion" on any shared system files - -[Icons] -;Name: "{group}\Linphone"; Filename: "{app}\linphone-wx.exe" ; WorkingDir: "{app}" -;Name: "{userdesktop}\Linphone"; Filename: "{app}\linphone-wx.exe"; WorkingDir: "{app}" ; Tasks: desktopicon - -[Run] -;Filename: "{app}\linphone-wx.exe"; Description: "{cm:LaunchProgram,Linphone}"; WorkingDir: "{app}" ; Flags: nowait postinstall skipifsilent - +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +[Setup] +AppName=msx264 +AppVerName=msx264 version @VERSION@ , an H.264 plugin for linphone. +AppPublisher=linphone.org +AppPublisherURL=http://www.linphone.org +AppSupportURL=http://www.linphone.org +AppUpdatesURL=http://www.linphone.org +DefaultDirName={pf}\Linphone +DefaultGroupName=Linphone +LicenseFile=COPYING +InfoBeforeFile=README +OutputBaseFilename=setup +Compression=lzma +SolidCompression=yes + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +#include "msx264-win32.filelist" + +[Icons] +;Name: "{group}\Linphone"; Filename: "{app}\linphone-wx.exe" ; WorkingDir: "{app}" +;Name: "{userdesktop}\Linphone"; Filename: "{app}\linphone-wx.exe"; WorkingDir: "{app}" ; Tasks: desktopicon + +[Run] +;Filename: "{app}\linphone-wx.exe"; Description: "{cm:LaunchProgram,Linphone}"; WorkingDir: "{app}" ; Flags: nowait postinstall skipifsilent + diff --git a/linphone/mediastreamer2/src/mscommon.c b/linphone/mediastreamer2/src/mscommon.c index e85861205..a086791c4 100644 --- a/linphone/mediastreamer2/src/mscommon.c +++ b/linphone/mediastreamer2/src/mscommon.c @@ -264,7 +264,8 @@ int ms_load_plugins(const char *dir){ char szDirPath[1024]; char szPluginFile[1024]; BOOL fFinished = FALSE; - + const char *tmp=getenv("DEBUG"); + BOOL debug=(tmp!=NULL && atoi(tmp)==1); snprintf(szDirPath, sizeof(szDirPath), "%s", dir); // Start searching for .dll files in the current directory. @@ -283,7 +284,7 @@ int ms_load_plugins(const char *dir){ /* load library */ HINSTANCE os_handle; UINT em; - em = SetErrorMode (SEM_FAILCRITICALERRORS); + if (!debug) em = SetErrorMode (SEM_FAILCRITICALERRORS); snprintf(szPluginFile, sizeof(szPluginFile), "%s\\%s", szDirPath, FileData.cFileName); os_handle = LoadLibraryEx (szPluginFile, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); @@ -292,7 +293,7 @@ int ms_load_plugins(const char *dir){ ms_warning("Fail to load plugin %s: error %i",szPluginFile,GetLastError()); os_handle = LoadLibraryEx (szPluginFile, NULL, 0); } - SetErrorMode (em); + if (!debug) SetErrorMode (em); if (os_handle==NULL) ms_warning("Fail to load plugin %s", szPluginFile); else{