添加 KSPROPERTY_CAMERACONTROL_ROLL 到MFT KSPROPERTY
接口名字: KSPROPERTY_CAMERACONTROL_ROLL
接口来源:https://learn.microsoft.com/en-us/windows-hardware/drivers/stream/ksproperty-cameracontrol-roll
功能:通知camera旋转角度【 -180,180】内某一角度。
代码:
MFT收到的入口
HRESULT KsProperty( [in] PKSPROPERTY Property, [in] ULONG PropertyLength, [in, out] LPVOID PropertyData, [in] ULONG DataLength, [in, out] ULONG *BytesReturned );
Property->Set 是 PROPSETID_VIDCAP_CAMERACONTROL
Property->Id 是 KSPROPERTY_CAMERACONTROL_ROLL
以上2点就可以确定收到了 这个KsProperty,然后就是针对性内部处理和回复。内部处理不同驱动各有不同,但是回复有共性。
Flag一般有3种:
|
设置旋转角度 |
|
获取当前角度 |
|
获取支持的旋转角度 |
对于SET和GET,需要获取PropertyData指向的数据,转换成对应接口MSDN上规定的类型,比如这个功能需要转成如下:
PKSPROPERTY_CAMERACONTROL_S pCamcontrol = (PKSPROPERTY_CAMERACONTROL_S)PropertyData
set和get都需要 设置/获取 pCamcontrol->Value,这个字段是旋转的大小。set就拿这个值,get要写进去。
BASICSUPPORT就有点复杂:
//step 1 DataLength, 判断后面有几个header,我这里大小是72, 有3个部分,大小分别为40+16+16 PKSPROPERTY_DESCRIPTION pdesc = (PKSPROPERTY_DESCRIPTION)PropertyData; pdesc->AccessFlags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET; pdesc->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG); pdesc->MembersListCount = 1;//表明最后我有1个说明范围的结构 pdesc->PropTypeSet.Set = PROPSETID_VIDCAP_CAMERACONTROL; pdesc->PropTypeSet.Id = KSPROPERTY_CAMERACONTROL_ROLL; pdesc->PropTypeSet.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET; //step 2 这一部分要说明我最后说明范围的结构是什么类型 PKSPROPERTY_MEMBERSHEADER pheader = (PKSPROPERTY_MEMBERSHEADER)(pdesc + 1);
pheader->MembersFlags = KSPROPERTY_MEMBER_STEPPEDRANGES; pheader->MembersCount = 1; pheader->MembersSize = sizeof(KSPROPERTY_STEPPING_LONG);
pheader->Flags = KSPROPERTY_MEMBER_STEPPEDRANGES; //step 3 最后就是我需要返回的范围了 KSPROPERTY_STEPPING_LONG *pval = (KSPROPERTY_STEPPING_LONG *)(pheader + 1); pval->SteppingDelta = 90; //这里我设置范围为{270,0,90,180}所以step是90,也可以按照MSDN的指导设置连续值 pval->Bounds.SignedMinimum = -180;//这只最大最小值 pval->Bounds.SignedMaximum = 180;
最后就可以返回成功了。