From 9b5dd7b191787049d84da7df291f2329a387af22 Mon Sep 17 00:00:00 2001
From: smorlat <smorlat@3f6dc0c8-ddfe-455d-9043-3cd528dc4637>
Date: Tue, 14 Apr 2009 15:07:35 +0000
Subject: [PATCH] ready for 3.1.1, fix a severe bug in directshow capture
 plugin

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@416 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
---
 linphone/coreapi/private.h                    |  2 +-
 linphone/gtk-glade/linphone.h                 |  2 +-
 linphone/gtk-glade/linphone.iss               |  2 +-
 linphone/gtk-glade/main.c                     | 10 +++++
 .../build/win32native/mediastreamer2.dev      | 20 ++++++---
 .../plugins/msdscap/libmsdscap.dev            |  4 +-
 .../mediastreamer2/plugins/msdscap/mdscap.cc  | 42 +++++++++++--------
 linphone/mediastreamer2/src/videoout.c        |  1 +
 8 files changed, 56 insertions(+), 27 deletions(-)

diff --git a/linphone/coreapi/private.h b/linphone/coreapi/private.h
index 7319e9b5ae..1e641d7f26 100644
--- a/linphone/coreapi/private.h
+++ b/linphone/coreapi/private.h
@@ -33,7 +33,7 @@
 #endif
 
 #ifndef LINPHONE_VERSION
-#define LINPHONE_VERSION "3.0.0"
+#define LINPHONE_VERSION "3.1.1"
 #endif
 
 #ifndef LIBLINPHONE_VERSION 
diff --git a/linphone/gtk-glade/linphone.h b/linphone/gtk-glade/linphone.h
index add5942232..51612007be 100644
--- a/linphone/gtk-glade/linphone.h
+++ b/linphone/gtk-glade/linphone.h
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define PACKAGE_DATA_DIR "./"
 
 #ifndef LINPHONE_VERSION
-#define LINPHONE_VERSION "3.1.0-20090402"
+#define LINPHONE_VERSION "3.1.1"
 #endif
 
 #endif
diff --git a/linphone/gtk-glade/linphone.iss b/linphone/gtk-glade/linphone.iss
index e213aabcc3..641aa6825a 100755
--- a/linphone/gtk-glade/linphone.iss
+++ b/linphone/gtk-glade/linphone.iss
@@ -3,7 +3,7 @@
 
 [Setup]
 AppName=Linphone
-AppVerName=Linphone version 3.1.0
+AppVerName=Linphone version 3.1.1
 AppPublisher=linphone.org
 AppPublisherURL=http://www.linphone.org
 AppSupportURL=http://www.linphone.org
diff --git a/linphone/gtk-glade/main.c b/linphone/gtk-glade/main.c
index 73897050fc..ac19a2d031 100644
--- a/linphone/gtk-glade/main.c
+++ b/linphone/gtk-glade/main.c
@@ -908,6 +908,16 @@ int main(int argc, char *argv[]){
 		g_warning("This instance is going to exit now.");
 		return 0;
 	}
+#ifdef WIN32
+	/*workaround for windows: sometimes LANG is defined to an integer value, not understood by gtk */
+	if ((lang=getenv("LANG"))!=NULL){
+		if (atoi(lang)!=0){
+			char tmp[128];
+			snprintf(tmp,sizeof(tmp),"LANG=",lang);
+			_putenv(tmp);
+		}
+	}
+#endif
 	
 	if ((lang=linphone_gtk_get_lang(config_file))!=NULL && lang[0]!='\0'){
 #ifdef WIN32
diff --git a/linphone/mediastreamer2/build/win32native/mediastreamer2.dev b/linphone/mediastreamer2/build/win32native/mediastreamer2.dev
index fa95fe0f57..dacd487847 100755
--- a/linphone/mediastreamer2/build/win32native/mediastreamer2.dev
+++ b/linphone/mediastreamer2/build/win32native/mediastreamer2.dev
@@ -619,15 +619,25 @@ Compile=0
 Link=0
 Priority=1000
 OverrideBuildCmd=0
-BuildCmd=	$(CPP) -c winvideods.c -o "Default Profile/winvideods.o" $(CXXFLAGS)
+BuildCmd=$(CPP) -c winvideods.c -o "Default Profile/winvideods.o" $(CXXFLAGS)
+
+[Unit58]
+FileName=..\..\src\void.c
+CompileCpp=0
+Folder=mediastreamer2
+Compile=1
+Link=1
+Priority=1000
+OverrideBuildCmd=0
+BuildCmd=	$(CC) -c void.c -o "Default Profile/void.o" $(CFLAGS)
 
 [Unit57]
-FileName=..\..\src\mingw-dshow.h
-CompileCpp=1
-Folder=
+FileName=..\..\src\void.c
+CompileCpp=0
+Folder=mediastreamer2
 Compile=1
 Link=1
 Priority=1000
 OverrideBuildCmd=0
-BuildCmd=
+BuildCmd=	$(CC) -c void.c -o "Default Profile/void.o" $(CFLAGS)
 
diff --git a/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev b/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev
index a54e05e670..4c6c28cf3e 100755
--- a/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev
+++ b/linphone/mediastreamer2/plugins/msdscap/libmsdscap.dev
@@ -77,8 +77,8 @@ Includes=../../include;../../../oRTP/include
 Libs=../../build/win32native/;../../../oRTP/build/win32native
 ResourceIncludes=
 MakeIncludes=
-Compiler=-DBUILDING_DLL=1_@@_-DORTP_INET6_@@_
-CppCompiler=-DBUILDING_DLL=1_@@_
+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
diff --git a/linphone/mediastreamer2/plugins/msdscap/mdscap.cc b/linphone/mediastreamer2/plugins/msdscap/mdscap.cc
index 99ec9a520c..acbcf22f4e 100755
--- a/linphone/mediastreamer2/plugins/msdscap/mdscap.cc
+++ b/linphone/mediastreamer2/plugins/msdscap/mdscap.cc
@@ -502,6 +502,7 @@ public:
 		_frame_count=0;
 		_pixfmt=MS_YUV420P;
 		_ready=false;
+		m_refCount=1;
 	}
 	virtual ~DSCapture(){
 		if (_ready) stopAndClean();
@@ -552,6 +553,7 @@ private:
 	float _start_time;
 	int _frame_count;
 	MSPixFmt _pixfmt;
+	ComPtr< IGraphBuilder > _graphBuilder;
 	ComPtr< IBaseFilter > _source;
 	ComPtr< IBaseFilter > _nullRenderer;
 	ComPtr< IBaseFilter > _grabberBase;
@@ -746,10 +748,8 @@ int DSCapture::createDshowGraph(){
     createDevEnum.reset();
     enumMoniker->Reset();
 
-    int index = 0;
     ULONG fetched = 0;
-	ComPtr< IGraphBuilder > graphBuilder;
-	graphBuilder.coCreateInstance( CLSID_FilterGraph, IID_IGraphBuilder,
+	_graphBuilder.coCreateInstance( CLSID_FilterGraph, IID_IGraphBuilder,
                                    "Could not create graph builder "
                                    "interface" );
     ComPtr< IMoniker > moniker;
@@ -767,7 +767,7 @@ int DSCapture::createDshowGraph(){
 	}
 	moniker.reset();
     enumMoniker.reset();
-    if (graphBuilder->AddFilter( _source.get(), L"Source" )!=S_OK){
+    if (_graphBuilder->AddFilter( _source.get(), L"Source" )!=S_OK){
     	ms_error("Error adding camera source to filter graph" );
     	return -1;
 	}
@@ -798,7 +798,7 @@ int DSCapture::createDshowGraph(){
     	ms_error("Error creating sample grabber" );
     	return -1;
 	}
-    if (graphBuilder->AddFilter( _grabberBase.get(), L"Grabber" )!=S_OK){
+    if (_graphBuilder->AddFilter( _grabberBase.get(), L"Grabber" )!=S_OK){
 		ms_error("Error adding sample grabber to filter graph");
 		return -1;
 	}
@@ -836,32 +836,33 @@ int DSCapture::createDshowGraph(){
 		ms_error("Error creating Null Renderer" );
 		return -1;
 	}
-	if (graphBuilder->AddFilter( _nullRenderer.get(), L"Sink" )!=S_OK){
+	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){
+	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){
+    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,
+    if (_graphBuilder->QueryInterface( IID_IMediaControl,
                                                 (void **)&_mediaControl )!=S_OK){
         ms_error("Error requesting media control interface" );
 		return -1;
 	}
-    if (graphBuilder->QueryInterface( IID_IMediaEvent,
+    if (_graphBuilder->QueryInterface( IID_IMediaEvent,
                                         (void **)&_mediaEvent )!=S_OK){
     	ms_error("Error requesting event interface" );
     	return -1;
 	}
 	_ready=true;
+	return 0;
 }
 
 int DSCapture::startDshowGraph(){
@@ -874,20 +875,31 @@ int DSCapture::startDshowGraph(){
 		return -1;
 	}
 	ms_message("Graph started");
+	return 0;
 }
 
 void DSCapture::stopAndClean(){
 	if (_mediaControl.get()!=NULL){
-		_mediaControl->Stop();
-    	long evCode = 0;
-    	_mediaEvent->WaitForCompletion( INFINITE, &evCode );
+		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;
 }
 
@@ -918,7 +930,6 @@ static void dscap_process(MSFilter * obj){
 	DSCapture *s=(DSCapture*)obj->data;
 	mblk_t *m;
 	uint32_t timestamp;
-	int cur_frame;
 
 	if (s->isTimeToSend(obj->ticker->time)){
 		mblk_t *om=NULL;
@@ -1002,8 +1013,6 @@ static MSWebCamDesc ms_dshow_cam_desc={
 };
 
 static void ms_dshow_detect(MSWebCamManager *obj){
-	int i;
-	MSWebCam *cam;
 	ComPtr<IPropertyBag> pBag;
 	
 	CoInitialize(NULL);
@@ -1020,7 +1029,6 @@ static void ms_dshow_detect(MSWebCamManager *obj){
     createDevEnum.reset();
     enumMoniker->Reset();
     
-    int index = 0;
     ULONG fetched = 0;
     ComPtr< IMoniker > moniker;
     for ( int i=0;enumMoniker->Next( 1, &moniker, &fetched )==S_OK;++i ) {
diff --git a/linphone/mediastreamer2/src/videoout.c b/linphone/mediastreamer2/src/videoout.c
index be5e2a5482..974aa10abc 100644
--- a/linphone/mediastreamer2/src/videoout.c
+++ b/linphone/mediastreamer2/src/videoout.c
@@ -752,6 +752,7 @@ static void video_out_process(MSFilter *f){
 				qvga_size.width=MS_VIDEO_SIZE_QVGA_W;
 				qvga_size.height=MS_VIDEO_SIZE_QVGA_H;
 				obj->prevsize=newsize;
+				ms_message("received size is %ix%i",newsize.width,newsize.height);
 				/*don't resize less than QVGA, it is too small*/
 				if (ms_video_size_greater_than(qvga_size,newsize)){
 					newsize.width=MS_VIDEO_SIZE_QVGA_W;
-- 
GitLab