summaryrefslogtreecommitdiff
path: root/AVStream/avscamera/sys/Roi.h
diff options
context:
space:
mode:
Diffstat (limited to 'AVStream/avscamera/sys/Roi.h')
-rw-r--r--AVStream/avscamera/sys/Roi.h279
1 files changed, 279 insertions, 0 deletions
diff --git a/AVStream/avscamera/sys/Roi.h b/AVStream/avscamera/sys/Roi.h
new file mode 100644
index 00000000..5149bf24
--- /dev/null
+++ b/AVStream/avscamera/sys/Roi.h
@@ -0,0 +1,279 @@
+/**************************************************************************
+
+ A/V Stream Camera Sample
+
+ Copyright (c) 2013, Microsoft Corporation.
+
+ File:
+
+ Roi.h
+
+ Abstract:
+
+ This file contains the definition of CRoiConfig, CRoiProperty and
+ related classes used in the filter to implement ROI handling.
+
+ History:
+
+ created 6/27/2013
+
+**************************************************************************/
+
+const ULONG MAX_ROI = 4;
+
+class CRoiIspControl ;
+
+class CRoiConfigCaps : public KSCAMERA_EXTENDEDPROP_ROI_CONFIGCAPS
+{
+public:
+ CRoiConfigCaps(
+ _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Id,
+ _In_ ULONG MaxROI,
+ _In_ ULONGLONG Caps=0
+ )
+ {
+ ControlId = Id;
+ MaxNumberOfROIs = MaxROI;
+ Capability = Caps;
+ }
+
+ static const ULONGLONG FOCUS_CAPS =
+ KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
+ KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
+ KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
+ KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MACRO |
+ KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_NORMAL |
+ KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
+
+ static const ULONGLONG EXPOSURE_CAPS =
+ KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
+ KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
+
+ static const ULONGLONG WHITEBALANCE_CAPS =
+ KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
+ KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
+};
+
+class CRoiConfigCapsHdr : public KSCAMERA_EXTENDEDPROP_ROI_CONFIGCAPSHEADER
+{
+ CRoiConfigCaps FocusCaps;
+ CRoiConfigCaps ExposureCaps;
+ CRoiConfigCaps WhiteBalanceCaps;
+
+public:
+ CRoiConfigCapsHdr()
+ : FocusCaps(
+ KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE,
+ MAX_ROI,
+ CRoiConfigCaps::FOCUS_CAPS)
+ , ExposureCaps(
+ KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE,
+ MAX_ROI,
+ CRoiConfigCaps::EXPOSURE_CAPS )
+ , WhiteBalanceCaps(
+ KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE,
+ MAX_ROI,
+ CRoiConfigCaps::WHITEBALANCE_CAPS )
+ {
+ ConfigCapCount = 3;
+ Reserved = 0;
+ Size = sizeof(*this);
+ }
+};
+
+class CRoiConfig : public KSCAMERA_EXTENDEDPROP_HEADER
+{
+ CRoiConfigCapsHdr CapsHdr;
+public:
+ CRoiConfig()
+ {
+ Version = 1;
+ PinId = KSCAMERA_EXTENDEDPROP_FILTERSCOPE;
+ Size = sizeof(*this);
+ Result = 0;
+ Capability = 0;
+ Flags = 0;
+ }
+ CRoiConfig( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
+ : KSCAMERA_EXTENDEDPROP_HEADER(hdr)
+ {
+ Size = sizeof(*this);
+ }
+
+ bool isValid()
+ {
+ return (Version == KSCAMERA_EXTENDEDPROP_VERSION) &&
+ (Size >= sizeof(*this)) ;
+ }
+};
+
+//
+// A wrapper for the KSCAMERA_EXTENDEDPROP_ROI payload
+//
+// The payload extends beyond the end of this class definition. However the
+// payload is variable in length, so this class definition contains member
+// functions that can be used to access and append items to the payload.
+//
+class CRoiProperty : public KSCAMERA_EXTENDEDPROP_HEADER
+{
+ KSCAMERA_EXTENDEDPROP_ROI_ISPCONTROLHEADER m_Hdr;
+
+public:
+ // Default ctor - used to init the buffer when returning ROI info.
+ CRoiProperty()
+ {
+ Version = KSCAMERA_EXTENDEDPROP_VERSION;
+ PinId = KSCAMERA_EXTENDEDPROP_FILTERSCOPE;
+ Size = sizeof(*this);
+ Result = 0;
+ Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_CAPS_CANCELLABLE;
+ Flags = 0;
+
+ m_Hdr.ControlCount = 0;
+ m_Hdr.Size = sizeof(m_Hdr);
+ m_Hdr.Reserved = 0;
+ }
+
+ // Validate the CRoiProperty
+ bool
+ isValid();
+
+ // Get Size attribute.
+ ULONG
+ GetSize()
+ {
+ return Size;
+ }
+
+ // Get number of controls. (1-3)
+ ULONG
+ GetControlCount()
+ {
+ return m_Hdr.ControlCount;
+ }
+
+ // Find a given control after the property header.
+ PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL
+ Find(
+ _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Property
+ );
+
+ //
+ // Add a control to the end of this header.
+ //
+ // Note: This function does not reallocate memory. Be careful to ensure
+ // there is space available.
+ //
+ PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL
+ Add(
+ _In_ PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pCtrl
+ );
+
+ void
+ Log();
+};
+
+// Note: No initializer classes are provided for the following DDI
+// structure definitions since there is no practical difference in their
+// definitions. However the CRoiIspControl::GetSize() method is aware
+// of them and will report the correct size of the structure if there were
+// any difference in size.
+//
+// - KSCAMERA_EXTENDEDPROP_ROI_WHITEBALANCE
+// - KSCAMERA_EXTENDEDPROP_ROI_EXPOSURE
+// - KSCAMERA_EXTENDEDPROP_ROI_FOCUS
+//
+class CRoiIspControl : public KSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL
+{
+public:
+ BOOL
+ Init(
+ _In_ CRoiProperty *pRoiProperty,
+ _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Property
+ );
+
+ CRoiIspControl(
+ _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Property=
+ KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE
+ );
+
+ void
+ Log();
+
+ ULONG
+ GetSize();
+};
+
+// Simple classes used by the driver to hold the maximum allowed number of ROIs.
+class CWhiteBalanceRoiIspControl : public CRoiIspControl
+{
+private:
+ KSCAMERA_EXTENDEDPROP_ROI_WHITEBALANCE ROI[MAX_ROI];
+
+public:
+ CWhiteBalanceRoiIspControl(
+ _In_ CRoiProperty *pRoiProperty
+ )
+ {
+ Init( pRoiProperty, KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE );
+ }
+
+ CWhiteBalanceRoiIspControl()
+ : CRoiIspControl( KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE )
+ {}
+
+ ULONGLONG
+ GetFlags()
+ {
+ return ( ROICount>0 ) ? ROI[0].ROIInfo.Flags : 0;
+ }
+};
+
+class CExposureRoiIspControl : public CRoiIspControl
+{
+private:
+ KSCAMERA_EXTENDEDPROP_ROI_EXPOSURE ROI[MAX_ROI];
+
+public:
+ CExposureRoiIspControl(
+ _In_ CRoiProperty *pRoiProperty
+ )
+ {
+ Init( pRoiProperty, KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE );
+ }
+
+ CExposureRoiIspControl()
+ : CRoiIspControl( KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE )
+ {}
+
+ ULONGLONG
+ GetFlags()
+ {
+ return ( ROICount>0 ) ? ROI[0].ROIInfo.Flags : 0;
+ }
+};
+
+class CFocusRoiIspControl : public CRoiIspControl
+{
+private:
+ KSCAMERA_EXTENDEDPROP_ROI_FOCUS ROI[MAX_ROI];
+
+public:
+ CFocusRoiIspControl(
+ _In_ CRoiProperty *pRoiProperty
+ )
+ {
+ Init( pRoiProperty, KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE );
+ }
+
+ CFocusRoiIspControl()
+ : CRoiIspControl( KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE )
+ {}
+
+ ULONGLONG
+ GetFlags()
+ {
+ return ( ROICount>0 ) ? ROI[0].ROIInfo.Flags : 0;
+ }
+};
+