| 帮同学宣传一下http://shop57644665.taobao.com/ |
所有内容是根据http://blog.csdn.net/moonsunearth/archive/2007/09/25/1800790.aspx整理得来的。
首先Windows mobile自带的camera程序是不支持双camera的,如果要加入双camera一个方法是在原来的程序中插入一个菜单来实现调用(经验证菜单的加入是可以实现的),另一个比较推荐的做法是使用directshow自己写一个camera程序。
切换的关键部分是通过directshow控制camera,然后驱动对切换消息进行响应,切换sensor。
Directshow对camera控制的接口如下:
LRESULT hr;
CComPtr<IAMCameraControl> pCameraControl;
long lCurrentVal,lCurrentFlags;
long CameraControl_Switch=CameraControl_Flash+0xff;
if(sensor>=SENSOR_MAX)
return FALSE;
CHK(m_pVideoCapFilter->QueryInterface(&pCameraControl));
CHK(pCameraControl->Get(CameraControl_Switch, &lCurrentVal, &lCurrentFlags));
if(lCurrentVal == sensor)
…{
//return TRUE;
}
CHK(pCameraControl->Set(CameraControl_Switch, sensor, CameraControl_Flags_Manual));
IAMCameraControl::Set函数会调用CAM_IOControl,Ioctl=IOCTL_CS_PROPERTY这个是让驱动进行响应的关键。
在CAM_IOControl函数中对应的IOCTL_CS_PROPERTY中的部分是
else if ( TRUE == IsEqualGUID( pCsProp->Set, PROPSETID_VIDCAP_CAMERACONTROL ) )
{
dwErr = pCamDevice->AdapterHandleCamControlRequests( pInBuf,InBufLen, pOutBuf, OutBufLen, pdwBytesTransferred );
}
对于我们代码的添加一个是在这里添加一个自己的customer函数,另一个方法是继续向上层走,然后在上层添加自己的函数。不过因为这里是mdd层,所以最好不要修改,放到pdd层。
整个的流程的修改基本上就是这么多了。
在驱动层需要实现不同camera sensor的切换,然后上层通过directshow的IAMStreamConfig实现。
CComPtr<IAMStreamConfig> pStremConfig;
CHK(m_pCapGraphBuilder->FindInterface(&PIN_CATEGORY_CAPTURE, 0, m_pVideoCapFilter, IID_IAMStreamConfig, (void **)&pStremConfig))
CHK(pStremConfig->GetNumberOfCapabilities(&iCount, &iSize));
if (iSize == sizeof(VIDEO_STREAM_CONFIG_CAPS))
…{
for (int iFormat = 0; iFormat < iCount; iFormat++)
…{
VIDEO_STREAM_CONFIG_CAPS scc;
AM_MEDIA_TYPE *pmtConfig;
CHK(pStremConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE*)&scc));
if (SUCCEEDED(hr))
…{
if(scc.MinOutputSize.cx == pSize->cx && scc.MinOutputSize.cy == pSize->cy)
…{
CHK(pStremConfig->SetFormat(pmtConfig));
DeleteMediaType(pmtConfig);
break;
}
DeleteMediaType(pmtConfig);
}
}
}
















