summaryrefslogtreecommitdiff
path: root/avstream/avscamera/sys/filter.cpp
diff options
context:
space:
mode:
authorsaredd <[email protected]>2018-01-19 17:19:00 -0800
committerWei Mao <[email protected]>2018-01-19 17:19:00 -0800
commit6e7c8cb437135e55917c34cfebe1be944bbf6d3f (patch)
treef7570fe170194facd45e4f9f887ff56dc683a31c /avstream/avscamera/sys/filter.cpp
parentdd7e6f697ed67e94dc45cd33078b1dbcb643f439 (diff)
Updating Camera WDK Samples to RS3 version (#193)
Diffstat (limited to 'avstream/avscamera/sys/filter.cpp')
-rw-r--r--avstream/avscamera/sys/filter.cpp239
1 files changed, 237 insertions, 2 deletions
diff --git a/avstream/avscamera/sys/filter.cpp b/avstream/avscamera/sys/filter.cpp
index cb28775e..2680f503 100644
--- a/avstream/avscamera/sys/filter.cpp
+++ b/avstream/avscamera/sys/filter.cpp
@@ -3029,8 +3029,7 @@ SetVFR(
pVFR->isValid() &&
pVFR->Capability == 0 &&
(KSCAMERA_EXTENDEDPROP_VFR_OFF == pVFR->Flags ||
- KSCAMERA_EXTENDEDPROP_VFR_ON == pVFR->Flags ||
- KSCAMERA_EXTENDEDPROP_VIDEOHDR_AUTO == pVFR->Flags ) )
+ KSCAMERA_EXTENDEDPROP_VFR_ON == pVFR->Flags) )
{
//Set the current VFR state
Status = m_Sensor->SetVFR( pVFR );
@@ -3370,6 +3369,69 @@ SetVideoStabilization(
return Status;
}
+// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOTEMPORALDENOISING.
+NTSTATUS
+CCaptureFilter::
+GetVideoTemporalDenoising(
+ _Inout_ CExtendedProperty *pVideoTemporalDenoising
+)
+{
+ PAGED_CODE();
+ NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ // Call must come for filter scope only
+ if (pVideoTemporalDenoising->isValid() &&
+ pVideoTemporalDenoising->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE)
+ {
+ //Get the current state
+ Status = m_Sensor->GetVideoTemporalDenoising(pVideoTemporalDenoising);
+ }
+
+ DBG_TRACE("pVideoTemporalDenoising = %p, PinId = %u, Flags = %llu, Version = %u",
+ pVideoTemporalDenoising, pVideoTemporalDenoising->PinId, pVideoTemporalDenoising->Flags, pVideoTemporalDenoising->Version);
+
+ return Status;
+}
+
+// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOTEMPORALDENOISING.
+NTSTATUS
+CCaptureFilter::
+SetVideoTemporalDenoising(
+ _In_ CExtendedProperty *pVideoTemporalDenoising
+)
+{
+ PAGED_CODE();
+
+ NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ // Call must come for filter scope only and flags must be supported and mutually exclusive
+ if (pVideoTemporalDenoising->isValid() &&
+ pVideoTemporalDenoising->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
+ !(pVideoTemporalDenoising->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
+ (KSCAMERA_EXTENDEDPROP_VIDEOTEMPORALDENOISING_AUTO == pVideoTemporalDenoising->Flags ||
+ KSCAMERA_EXTENDEDPROP_VIDEOTEMPORALDENOISING_OFF == pVideoTemporalDenoising->Flags ||
+ KSCAMERA_EXTENDEDPROP_VIDEOTEMPORALDENOISING_ON == pVideoTemporalDenoising->Flags))
+ {
+ CExtendedProperty Caps(*pVideoTemporalDenoising);
+ Status = m_Sensor->GetVideoTemporalDenoising(&Caps);
+
+ if (NT_SUCCESS(Status))
+ {
+ // Assume an invalid parameter.
+ Status = STATUS_INVALID_PARAMETER;
+
+ if (pVideoTemporalDenoising->Flags == (pVideoTemporalDenoising->Flags & Caps.Capability))
+ {
+ Status = m_Sensor->SetVideoTemporalDenoising(pVideoTemporalDenoising);
+ }
+ }
+ }
+ DBG_TRACE("pVideoTemporalDenoising = %p, PinId = %u, Flags = %llu, Version = %u",
+ pVideoTemporalDenoising, pVideoTemporalDenoising->PinId, pVideoTemporalDenoising->Flags, pVideoTemporalDenoising->Version);
+
+ return Status;
+}
+
// Get KSPROPERTY_CAMERACONTROL_EXTENDED_OIS.
NTSTATUS
CCaptureFilter::
@@ -4078,3 +4140,176 @@ GetVideoControlCaps(
return Status;
}
+NTSTATUS
+CCaptureFilter::GetExtrinsic(
+ _In_opt_ KS_CAMERA_EXTRINSICS *Data,
+ _In_ ULONG PinId,
+ _Inout_ ULONG *Length)
+{
+ PAGED_CODE();
+
+ if( PinId < m_pKSFilter->Descriptor->PinDescriptorsCount )
+ {
+ CCameraExtrinsics_2Transforms Extrinsics( PinId ); // Parameters are just identification for now.
+ if( Data )
+ {
+ RtlCopyMemory(Data, &Extrinsics, sizeof(Extrinsics));
+ }
+
+ *Length = sizeof(Extrinsics);
+ return STATUS_SUCCESS;
+ }
+ return STATUS_INVALID_PARAMETER;
+}
+
+NTSTATUS
+CCaptureFilter::GetIntrinsic(
+ _In_opt_ KS_CAMERA_INTRINSICS *Data,
+ _In_ ULONG PinId,
+ _Inout_ ULONG *Length)
+{
+ PAGED_CODE();
+
+ if( PinId < m_pKSFilter->Descriptor->PinDescriptorsCount )
+ {
+ CCameraIntrinsics_2Models Intrinsics;
+ if( Data )
+ {
+ RtlCopyMemory(Data, &Intrinsics, sizeof(Intrinsics));
+ }
+
+ *Length = sizeof(Intrinsics);
+ return STATUS_SUCCESS;
+ }
+ return STATUS_INVALID_PARAMETER;
+}
+
+// Get KSPROPERTY_CAMERA_ATTRIBUTES_EXTRINSICS
+NTSTATUS
+CCaptureFilter::GetExtrinsics(
+ _In_ PIRP pIrp,
+ _In_ PKSP_PIN pProperty,
+ _Inout_ PVOID pData
+)
+{
+ PAGED_CODE();
+
+ NT_ASSERT(pIrp);
+ NT_ASSERT(pProperty);
+
+ CCaptureFilter *pFilter = reinterpret_cast <CCaptureFilter *>(KsGetFilterFromIrp(pIrp)->Context);
+ PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
+ ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
+ ULONG RequiredLength = 0;
+
+ NTSTATUS Status =
+ pFilter->GetExtrinsic( nullptr, pProperty->PinId, &RequiredLength );
+
+ // Note: We may want to determine capabilities at runtime in the future.
+
+ // We only handle GETs
+ if( NT_SUCCESS(Status) )
+ {
+ RequiredLength += sizeof(KSCAMERA_ATTRIBUTES_HEADER);
+
+ if (ulOutputBufferLength == 0)
+ {
+ pIrp->IoStatus.Information = RequiredLength;
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else if (ulOutputBufferLength < RequiredLength)
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ }
+ else if (pData && ulOutputBufferLength >= RequiredLength)
+ {
+ PKSCAMERA_ATTRIBUTES_HEADER pHdr = (PKSCAMERA_ATTRIBUTES_HEADER) pData;
+ PKS_CAMERA_EXTRINSICS pExtrinsic = (PKS_CAMERA_EXTRINSICS) (pHdr + 1);
+ ULONG Size=0;
+
+ Status =
+ pFilter->GetExtrinsic(
+ pExtrinsic,
+ pProperty->PinId,
+ &Size );
+
+ if( NT_SUCCESS(Status) )
+ {
+ pHdr->Size = RequiredLength;
+ pHdr->PinId = pProperty->PinId;
+ pIrp->IoStatus.Information = RequiredLength;
+ }
+ }
+ else
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ }
+ return Status;
+}
+
+// Get KSPROPERTY_CAMERA_ATTRIBUTES_INTRINSICS
+NTSTATUS
+CCaptureFilter::GetIntrinsics(
+ _In_ PIRP pIrp,
+ _In_ PKSP_PIN pProperty,
+ _Inout_ PVOID pData
+)
+{
+ PAGED_CODE();
+
+ NT_ASSERT(pIrp);
+ NT_ASSERT(pProperty);
+
+ CCaptureFilter *pFilter = reinterpret_cast <CCaptureFilter *>(KsGetFilterFromIrp(pIrp)->Context);
+ PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
+ ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
+ ULONG RequiredLength = 0;
+
+ NTSTATUS Status =
+ pFilter->GetIntrinsic( nullptr, pProperty->PinId, &RequiredLength );
+
+ // Note: We may want to determine capabilities at runtime in the future.
+
+ // We only handle GETs
+ if( NT_SUCCESS(Status) )
+ {
+ RequiredLength += sizeof(KSCAMERA_ATTRIBUTES_HEADER);
+
+ if (ulOutputBufferLength == 0)
+ {
+ pIrp->IoStatus.Information = RequiredLength;
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else if (ulOutputBufferLength < RequiredLength)
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ }
+ else if (pData && ulOutputBufferLength >= RequiredLength)
+ {
+ PKSCAMERA_ATTRIBUTES_HEADER pHdr = (PKSCAMERA_ATTRIBUTES_HEADER) pData;
+ PKS_CAMERA_INTRINSICS pIntrinsic = (PKS_CAMERA_INTRINSICS) (pHdr + 1);
+ ULONG Size=0;
+
+ Status =
+ pFilter->GetIntrinsic(
+ pIntrinsic,
+ pProperty->PinId,
+ &Size );
+
+ if( NT_SUCCESS(Status) )
+ {
+ pHdr->Size = RequiredLength;
+ pHdr->PinId = pProperty->PinId;
+ pIrp->IoStatus.Information = RequiredLength;
+ }
+ }
+ else
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ }
+ return Status;
+}
+
+