From 2d355a2a37a84eadc9ee80c238851f99d425065d Mon Sep 17 00:00:00 2001
From: aymeric <aymeric@3f6dc0c8-ddfe-455d-9043-3cd528dc4637>
Date: Mon, 21 Sep 2009 08:19:26 +0000
Subject: [PATCH] Avoid detection of camera with no video format supported.

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@667 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
---
 linphone/mediastreamer2/src/winvideods.c | 66 +++++++++++++++++-------
 1 file changed, 48 insertions(+), 18 deletions(-)

diff --git a/linphone/mediastreamer2/src/winvideods.c b/linphone/mediastreamer2/src/winvideods.c
index 1f6ba18e4d..54071e77a3 100644
--- a/linphone/mediastreamer2/src/winvideods.c
+++ b/linphone/mediastreamer2/src/winvideods.c
@@ -165,7 +165,7 @@ HRESULT GetPinCategory(IPin *pPin, GUID *pPinCategory)
 	return hr;
 }
 
-int try_format(V4wState *s, int format, GUID *pPinCategory)
+int try_format(IBaseFilter *m_pDeviceFilter, int format, GUID *pPinCategory)
 {
 	HRESULT hr=S_OK;
 	IEnumPins *pEnum=0;
@@ -177,7 +177,7 @@ int try_format(V4wState *s, int format, GUID *pPinCategory)
 	DWORD biBitCount;
 
 	// Verify input
-	if (!s->m_pDeviceFilter)
+	if (!m_pDeviceFilter)
 		return -1;
 
 	if (format == MS_YUV420P)
@@ -214,7 +214,7 @@ int try_format(V4wState *s, int format, GUID *pPinCategory)
 		biBitCount = 16;
 
 	// Get pin enumerator
-	hr = s->m_pDeviceFilter->EnumPins(&pEnum);
+	hr = m_pDeviceFilter->EnumPins(&pEnum);
 	if(FAILED(hr)) 
 		return -1;
 
@@ -506,17 +506,17 @@ static int v4w_configure_videodevice(V4wState *s)
 
 	GUID pPinCategory;
 
-	if (try_format(s, s->pix_fmt, &pPinCategory)==0)
+	if (try_format(s->m_pDeviceFilter, s->pix_fmt, &pPinCategory)==0)
 		s->pix_fmt = s->pix_fmt;
-	else if (try_format(s,MS_YUV420P, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_YUV420P, &pPinCategory)==0)
 		s->pix_fmt = MS_YUV420P;
-	else if (try_format(s,MS_YUY2, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_YUY2, &pPinCategory)==0)
 		s->pix_fmt = MS_YUY2;
-	else if (try_format(s,MS_YUYV, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_YUYV, &pPinCategory)==0)
 		s->pix_fmt = MS_YUYV;
-	else if (try_format(s,MS_UYVY, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_UYVY, &pPinCategory)==0)
 		s->pix_fmt = MS_UYVY;
-	else if (try_format(s,MS_RGB24, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_RGB24, &pPinCategory)==0)
 		s->pix_fmt = MS_RGB24;
 	else
 	{
@@ -681,17 +681,17 @@ static int v4w_open_videodevice(V4wState *s)
 
 	GUID pPinCategory;
 
-	if (try_format(s, s->pix_fmt, &pPinCategory)==0)
+	if (try_format(s->m_pDeviceFilter, s->pix_fmt, &pPinCategory)==0)
 		s->pix_fmt = s->pix_fmt;
-	else if (try_format(s,MS_YUV420P, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_YUV420P, &pPinCategory)==0)
 		s->pix_fmt = MS_YUV420P;
-	else if (try_format(s,MS_YUY2, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_YUY2, &pPinCategory)==0)
 		s->pix_fmt = MS_YUY2;
-	else if (try_format(s,MS_YUYV, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_YUYV, &pPinCategory)==0)
 		s->pix_fmt = MS_YUYV;
-	else if (try_format(s,MS_UYVY, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_UYVY, &pPinCategory)==0)
 		s->pix_fmt = MS_UYVY;
-	else if (try_format(s,MS_RGB24, &pPinCategory)==0)
+	else if (try_format(s->m_pDeviceFilter,MS_RGB24, &pPinCategory)==0)
 		s->pix_fmt = MS_RGB24;
 	else
 	{
@@ -1407,9 +1407,39 @@ static void vfw_detect(MSWebCamManager *obj){
 		WideCharToMultiByte(CP_UTF8,0,var.bstrVal,-1,szName,256,0,0);
 		VariantClear(&var); 
 
-		MSWebCam *cam=ms_web_cam_new(&ms_directx_cam_desc);
-		cam->name=ms_strdup(szName);
-		ms_web_cam_manager_add_cam(obj,cam);
+		IBaseFilter *m_pDeviceFilter;
+		hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_pDeviceFilter );
+		if(SUCCEEDED(hr))
+		{
+			GUID pPinCategory;
+			int fmt_supported = 0;
+
+			//basic testing for the device.
+			if (try_format(m_pDeviceFilter,MS_YUV420P, &pPinCategory)==0)
+				fmt_supported = 1;
+			else if (try_format(m_pDeviceFilter,MS_YUY2, &pPinCategory)==0)
+				fmt_supported = 1;
+			else if (try_format(m_pDeviceFilter,MS_YUYV, &pPinCategory)==0)
+				fmt_supported = 1;
+			else if (try_format(m_pDeviceFilter,MS_UYVY, &pPinCategory)==0)
+				fmt_supported = 1;
+			else if (try_format(m_pDeviceFilter,MS_RGB24, &pPinCategory)==0)
+				fmt_supported = 1;
+			else
+			{
+				ms_warning("Unsupported video pixel format/refuse camera (%s).", szName);
+			}
+
+			if (fmt_supported==1)
+			{
+				MSWebCam *cam=ms_web_cam_new(&ms_directx_cam_desc);
+				cam->name=ms_strdup(szName);
+				ms_web_cam_manager_add_cam(obj,cam);
+			}
+			m_pDeviceFilter->Release();
+			m_pDeviceFilter=NULL;
+		}
+
 
 		pMoniker->Release();
 		pBag->Release();
-- 
GitLab