summaryrefslogtreecommitdiff
path: root/avstream/avscamera/sys/filter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'avstream/avscamera/sys/filter.cpp')
-rw-r--r--avstream/avscamera/sys/filter.cpp183
1 files changed, 160 insertions, 23 deletions
diff --git a/avstream/avscamera/sys/filter.cpp b/avstream/avscamera/sys/filter.cpp
index 2680f503..dfb6ce1f 100644
--- a/avstream/avscamera/sys/filter.cpp
+++ b/avstream/avscamera/sys/filter.cpp
@@ -64,6 +64,7 @@ Return Value:
m_pCaptureDevice(NULL),
m_pPerFrameSettings(nullptr),
m_pinArray(nullptr),
+ m_pMinimumRequestedFrames(nullptr),
m_PhotoModeNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE ),
m_PhotoMaxFrameRateNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE) ,
m_FocusNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE ),
@@ -141,10 +142,12 @@ Return Value:
IFFAILED_EXIT( m_Sensor->AddFilter(m_pKSFilter) );
IFNULL_EXIT(m_pinArray = new (PagedPool, 'sniP') CCapturePin *[m_Sensor->GetPinCount()]);
+ IFNULL_EXIT(m_pMinimumRequestedFrames = new (PagedPool, 'sniP') ULONG[m_Sensor->GetPinCount()]);
for( ULONG i=0; i<m_Sensor->GetPinCount(); i++ )
{
m_pinArray[i] = nullptr;
+ m_pMinimumRequestedFrames[i] = IMAGE_CAPTURE_PIN_MINIMUM_FRAMES;
}
done:
@@ -209,6 +212,7 @@ CCaptureFilter::~CCaptureFilter()
// may need to have some things reset.
m_Sensor->Reset();
+ delete [] m_pMinimumRequestedFrames;
delete [] m_pinArray;
DBG_LEAVE("(%S)", Name);
@@ -352,6 +356,11 @@ Return Value:
// Take out a weak reference to the pin object.
m_pinArray[Id] = pPin;
+ if (m_pinArray[Id] != nullptr)
+ {
+ m_pinArray[Id]->SetDesiredFrames(m_pMinimumRequestedFrames[Id]);
+ (void)m_pinArray[Id]->UpdateAllocatorFraming();
+ }
}
CCapturePin *
@@ -391,7 +400,8 @@ Return Value:
NTSTATUS
CCaptureFilter::
UpdateAllocatorFraming(
- _In_ ULONG PinId
+ _In_ ULONG PinId,
+ _In_ ULONG DesiredFrames
)
/*++
@@ -412,15 +422,20 @@ Return Value:
{
PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
+ NTSTATUS Status = STATUS_SUCCESS;
// Acquire the lock and update the Pin's allocator framing.
LockFilter Lock(m_pKSFilter);
if( m_pinArray[PinId] )
{
+ m_pinArray[PinId]->SetDesiredFrames(DesiredFrames);
Status = m_pinArray[PinId]->UpdateAllocatorFraming();
}
+ else
+ {
+ m_pMinimumRequestedFrames[PinId] = DesiredFrames;
+ }
DBG_LEAVE("()=0x%08X",Status);
return Status;
@@ -636,6 +651,7 @@ SetPhotoMode(
PAGED_CODE();
NTSTATUS Status = STATUS_INVALID_PARAMETER;
+ ULONG TotalFrames = IMAGE_CAPTURE_PIN_MINIMUM_FRAMES;
DBG_ENTER( "()" );
@@ -645,10 +661,6 @@ SetPhotoMode(
{
CExtendedPhotoMode Caps(*pMode);
Status = m_Sensor->GetPhotoMode( &Caps );
- CCapturePin *pPin = getPin(pMode->PinId);
-
- // Should always be valid.
- NT_ASSERT(pPin);
if( NT_SUCCESS(Status) )
{
@@ -686,7 +698,7 @@ SetPhotoMode(
// Assume the normal photo sequence case.
// For normal photo sequence, we provide history frames +1 or at least a minimum of 3 frames.
- ULONG TotalFrames = pMode->RequestedHistoryFrames() + 1;
+ TotalFrames = pMode->RequestedHistoryFrames() + 1;
// Modify TotalFrames for the VPS case.
// For VPS, we need LoopCount * FrameCount; but limit by the minimum(3) and maximum (20) frames.
@@ -708,14 +720,12 @@ SetPhotoMode(
DBG_TRACE( "Advertising Framing requirement: %d", TotalFrames );
- pPin->SetDesiredFrames(TotalFrames);
Status = STATUS_SUCCESS;
break;
}
case KSCAMERA_EXTENDEDPROP_PHOTOMODE_NORMAL:
{
// Set it back to the minimum number of frames.
- pPin->SetDesiredFrames(IMAGE_CAPTURE_PIN_MINIMUM_FRAMES);
Status = STATUS_SUCCESS;
break;
}
@@ -724,7 +734,7 @@ SetPhotoMode(
// Update allocator framing.
if( NT_SUCCESS( Status ) )
{
- Status = UpdateAllocatorFraming( pMode->PinId );
+ Status = UpdateAllocatorFraming( pMode->PinId, TotalFrames );
}
// Update the sensor object...
@@ -1118,13 +1128,13 @@ GetTorchMode(
NTSTATUS Status = STATUS_INVALID_PARAMETER;
- if( pTorchMode->isValid() &&
- pTorchMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
+ if (pTorchMode->isValid() &&
+ pTorchMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE)
{
- Status = m_Sensor->GetTorchMode( pTorchMode );
+ Status = m_Sensor->GetTorchMode(pTorchMode);
}
DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pTorchMode->PinId, pTorchMode->Flags, pTorchMode->Capability, Status );
+ pTorchMode->PinId, pTorchMode->Flags, pTorchMode->Capability, Status);
return Status;
}
@@ -1139,34 +1149,101 @@ SetTorchMode(
NTSTATUS Status = STATUS_INVALID_PARAMETER;
- if( !(pTorchMode->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pTorchMode->isValid() &&
- pTorchMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pTorchMode->m_Value.Value.ul <= 100 )
+ if (!(pTorchMode->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
+ pTorchMode->isValid() &&
+ pTorchMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
+ pTorchMode->m_Value.Value.ul <= 100)
{
CExtendedProperty Caps(*pTorchMode);
Status = m_Sensor->GetTorchMode(&Caps);
- if( NT_SUCCESS(Status) )
+ if (NT_SUCCESS(Status))
{
// Assume an invalid parameter.
Status = STATUS_INVALID_PARAMETER;
- if( pTorchMode->Flags == (pTorchMode->Flags & Caps.Capability) )
+ if (pTorchMode->Flags == (pTorchMode->Flags & Caps.Capability))
{
- switch( pTorchMode->Flags )
+ switch (pTorchMode->Flags)
{
case KSCAMERA_EXTENDEDPROP_VIDEOTORCH_OFF:
case KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON:
case KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON_ADJUSTABLEPOWER:
- Status = m_Sensor->SetTorchMode( pTorchMode );
+ Status = m_Sensor->SetTorchMode(pTorchMode);
break;
}
}
}
}
DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pTorchMode->PinId, pTorchMode->Flags, pTorchMode->Capability, Status );
+ pTorchMode->PinId, pTorchMode->Flags, pTorchMode->Capability, Status);
+ return Status;
+}
+
+// Get KSPROPERTY_CAMERACONTROL_EXTENDED_IRTORCHMODE
+NTSTATUS
+CCaptureFilter::
+GetIRTorch(
+ _Inout_ CExtendedVidProcSetting *pTorch
+)
+{
+ PAGED_CODE();
+
+ NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ if (pTorch->isValid() &&
+ pTorch->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE)
+ {
+ Status = m_Sensor->GetIRTorch(pTorch);
+ }
+ DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
+ pTorch->PinId, pTorch->Flags, pTorch->Capability, Status);
+ return Status;
+}
+
+// Set KSPROPERTY_CAMERACONTROL_EXTENDED_IRTORCHMODE
+NTSTATUS
+CCaptureFilter::
+SetIRTorch(
+ _In_ CExtendedVidProcSetting *pTorch
+)
+{
+ PAGED_CODE();
+
+ NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ if (!(pTorch->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
+ pTorch->isValid() &&
+ pTorch->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE)
+ {
+ CExtendedVidProcSetting Caps(*pTorch);
+ Status = m_Sensor->GetIRTorch(&Caps);
+
+ if (NT_SUCCESS(Status))
+ {
+ Status = Caps.BoundsCheck(pTorch->GetULONG());
+
+ if (NT_SUCCESS(Status))
+ {
+ // Assume an invalid parameter.
+ Status = STATUS_INVALID_PARAMETER;
+
+ if (pTorch->Flags == (pTorch->Flags & Caps.Capability))
+ {
+ switch (pTorch->Flags)
+ {
+ case KSCAMERA_EXTENDEDPROP_IRTORCHMODE_OFF:
+ case KSCAMERA_EXTENDEDPROP_IRTORCHMODE_ALWAYS_ON:
+ case KSCAMERA_EXTENDEDPROP_IRTORCHMODE_ALTERNATING_FRAME_ILLUMINATION:
+ Status = m_Sensor->SetIRTorch(pTorch);
+ break;
+ }
+ }
+ }
+ }
+ }
+ DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
+ pTorch->PinId, pTorch->Flags, pTorch->Capability, Status);
return Status;
}
@@ -3494,6 +3571,66 @@ SetOpticalImageStabilization(
return Status;
}
+// Get KSPROPERTY_CAMERACONTROL_EXTENDED_RELATIVEPANEL.
+NTSTATUS
+CCaptureFilter::
+GetRelativePanel(
+ _Inout_ CExtendedProperty *pRelativePanel
+)
+{
+ PAGED_CODE();
+ NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ if (pRelativePanel->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
+ pRelativePanel->isValid())
+ {
+ //Get the current state
+ Status = m_Sensor->GetRelativePanel(pRelativePanel);
+ }
+
+ DBG_TRACE("pRelativePanel = %p, PinId = %u, Flags = %llu, Version = %u",
+ pRelativePanel, pRelativePanel->PinId, pRelativePanel->Flags, pRelativePanel->Version);
+
+ return Status;
+}
+
+// Set KSPROPERTY_CAMERACONTROL_EXTENDED_RELATIVEPANEL.
+NTSTATUS
+CCaptureFilter::
+SetRelativePanel(
+ _In_ CExtendedProperty *pRelativePanel
+)
+{
+ PAGED_CODE();
+
+ NTSTATUS Status = STATUS_INVALID_PARAMETER;
+
+ // Call must be Filter and flags must be supported and version must be 1
+ if (pRelativePanel->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
+ pRelativePanel->isValid() &&
+ (KSCAMERA_EXTENDEDPROP_RELATIVEPANELOPTIMIZATION_ON == pRelativePanel->Flags ||
+ KSCAMERA_EXTENDEDPROP_RELATIVEPANELOPTIMIZATION_OFF == pRelativePanel->Flags))
+ {
+ CExtendedProperty Caps(*pRelativePanel);
+ Status = m_Sensor->GetRelativePanel(&Caps);
+
+ if (NT_SUCCESS(Status))
+ {
+ // Assume an invalid parameter.
+ Status = STATUS_INVALID_PARAMETER;
+
+ if (pRelativePanel->Flags == (pRelativePanel->Flags & Caps.Capability))
+ {
+ Status = m_Sensor->SetRelativePanel(pRelativePanel);
+ }
+ }
+ }
+ DBG_TRACE("pOIS = %p, PinId = %u, Flags = %llu, Version = %u",
+ pRelativePanel, pRelativePanel->PinId, pRelativePanel->Flags, pRelativePanel->Version);
+
+ return Status;
+}
+
// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO.
NTSTATUS
CCaptureFilter::