diff options
| author | saredd <[email protected]> | 2018-01-19 17:19:00 -0800 |
|---|---|---|
| committer | Wei Mao <[email protected]> | 2018-01-19 17:19:00 -0800 |
| commit | 6e7c8cb437135e55917c34cfebe1be944bbf6d3f (patch) | |
| tree | f7570fe170194facd45e4f9f887ff56dc683a31c /avstream/avscamera/sys/filter.cpp | |
| parent | dd7e6f697ed67e94dc45cd33078b1dbcb643f439 (diff) | |
Updating Camera WDK Samples to RS3 version (#193)
Diffstat (limited to 'avstream/avscamera/sys/filter.cpp')
| -rw-r--r-- | avstream/avscamera/sys/filter.cpp | 239 |
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; +} + + |
