添加 KSPROPERTY_CAMERACONTROL_ROLL 到MFT KSPROPERTY()

接口名字: KSPROPERTY_CAMERACONTROL_ROLL

接口来源:https://learn.microsoft.com/en-us/windows-hardware/drivers/stream/ksproperty-cameracontrol-roll

功能:通知camera旋转角度【 -180,180】内某一角度。

功能:通知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_CAMERACONTROLProperty->Id 是 KSPROPERTY_CAMERACONTROL_ROLL以上2点就可以确定收到了 这个KsProperty,然后就是针对性内部处理和回复。内部处理不同驱动各有不同,但是回复有共性。Flag一般有3种:
KSPROPERTY_TYPE_SET
设置旋转角度
KSPROPERTY_TYPE_GET
获取当前角度
KSPROPERTY_TYPE_BASICSUPPORT
获取支持的旋转角度
KSPROPERTY_TYPE_SET
KSPROPERTY_TYPE_GET
KSPROPERTY_TYPE_BASICSUPPORT

对于SET和GET,需要获取PropertyData指向的数据,转换成对应接口MSDN上规定的类型,比如这个功能需要转成如下:

PropertyData指向的数据,转换成对应接口MSDN上规定的类型,比如这个功能需要转成如下:

PKSPROPERTY_CAMERACONTROL_S pCamcontrol = (PKSPROPERTY_CAMERACONTROL_S)PropertyData

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;

最后就可以返回成功了。

------------------------

接口名字: KSPROPERTY_CAMERACONTROL_ROLL

接口来源:https://learn.microsoft.com/en-us/windows-hardware/drivers/stream/ksproperty-cameracontrol-roll

功能:通知camera旋转角度【 -180,180】内某一角度。

功能:通知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_CAMERACONTROLProperty->Id 是 KSPROPERTY_CAMERACONTROL_ROLL以上2点就可以确定收到了 这个KsProperty,然后就是针对性内部处理和回复。内部处理不同驱动各有不同,但是回复有共性。Flag一般有3种:
KSPROPERTY_TYPE_SET
设置旋转角度
KSPROPERTY_TYPE_GET
获取当前角度
KSPROPERTY_TYPE_BASICSUPPORT
获取支持的旋转角度
KSPROPERTY_TYPE_SET
KSPROPERTY_TYPE_GET
KSPROPERTY_TYPE_BASICSUPPORT

对于SET和GET,需要获取PropertyData指向的数据,转换成对应接口MSDN上规定的类型,比如这个功能需要转成如下:

PropertyData指向的数据,转换成对应接口MSDN上规定的类型,比如这个功能需要转成如下:

PKSPROPERTY_CAMERACONTROL_S pCamcontrol = (PKSPROPERTY_CAMERACONTROL_S)PropertyData

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;

最后就可以返回成功了。