喵的,今天同事反应,开发的虚拟驱动PTZ功能Zoom放大缩小时,可以开始,但是停止的时候错误。
在应用层DirectShow应用层的代码如下:
void CCamera::SetZoom(int value, int delay)
{
HRESULT hr = 0;
long flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | CameraControl_Flags_Manual;
hr = m_pCamControl->Set(KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE, value, flags);
printf("hr=%x\n", hr);
Sleep(delay);
flags = KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE | CameraControl_Flags_Manual;
hr = m_pCamControl->Set(KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE, 0, flags);
printf("hr=%x\n", hr);
}
发现,你一次调用如用参数1或0xff的时候,hr=S_OK,而当停止的时候,即发0的时候,竟然报错了。hr= 0x80070057 (E_INVALIDARG)
最后在驱动层查代码,发现发向相机终端描述符使用CT_ZOOM_RELATIVE_CONTROL选择子时的GET_MIN参数设置错误了。
竟然将bSpeed 的最小值 写成了1。导致参数错误。
else if (Urb->UrbControlVendorClassRequest.Request == GET_MIN)
{
((UINT8*)buffer)[0] = 0; // bZoom
((UINT8*)buffer)[1] = 0; // bDigitalZoom
((UINT8*)buffer)[2] = 0; // bSpeed
}
DirectShow相关协议见:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/stream/ksproperty-cameracontrol-zoom-relative
https://docs.microsoft.com/en-us/previous-versions/ms893691(v=msdn.10)
https://docs.microsoft.com/en-us/previous-versions/ms893692(v=msdn.10)