diff options
| author | J M Rossy <[email protected]> | 2015-07-29 15:40:09 -0700 |
|---|---|---|
| committer | J M Rossy <[email protected]> | 2015-07-29 16:34:40 -0700 |
| commit | 5d61a4a79a1e96dc5d9af1e5e712c84507307544 (patch) | |
| tree | 49ed270893578cd18758b74ffcca16dc7ab948d6 /avscamera/sys/SensorSimulation.h | |
| parent | 5d41613e26e147d2300c786bb2b34cb4b4067a25 (diff) | |
Samples update for public Windows 10 release
Fix #2 Enabling WPP Recorder in Sensors Samples causes errors
Fix #4 Add back fixed KMDOD sample
Add new BarcodeScanner sample in pos folder
Add new MagneticStripeReader sample in pos folder
Add new SynpaticsTouch sample in input folder
Add new Power Engine Plugin sample in pofx folder
Add new DeviceMft sample in avstream folder
Add new AvsCamera sample in root
Add new SimBatt sample in root
Add other pre-existing samples not yet released for Win10
Diffstat (limited to 'avscamera/sys/SensorSimulation.h')
| -rw-r--r-- | avscamera/sys/SensorSimulation.h | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/avscamera/sys/SensorSimulation.h b/avscamera/sys/SensorSimulation.h new file mode 100644 index 00000000..ecf043e3 --- /dev/null +++ b/avscamera/sys/SensorSimulation.h @@ -0,0 +1,280 @@ +/************************************************************************** + + A/V Stream Camera Sample + + Copyright (c) 2014, Microsoft Corporation. + + File: + + SensorSimulation.h + + Abstract: + + Simulation class declaration. Derived from the base CSensor object. + + This class simulates a theoretical model camera. The camera supports + every modern camera control available and produces a simulation of its + behavior. In most cases this simulation is very very basic because we + have no actual hardware to work with and there producing a visible + effect in the simulation would be difficult or expensive to do. + + History: + + created 5/8/2014 + +**************************************************************************/ + +#pragma once +class CSensorSimulation : + public CSensor +{ +protected: + const + KSFILTER_DESCRIPTOR *m_Descriptors; + + LARGE_INTEGER m_StartTime; + + // State for the various controls. + RECT m_FocusRect; + BOOL m_AutoFocusLock; + BOOL m_AutoExposureLock; + BOOL m_AutoWhitebalanceLock; + ULONG m_Flash; + ULONG m_VideoStabMode; + CExtendedProperty *m_WarmStartEnabled; + CExtendedPhotoMode m_PhotoMode; + ULONG m_RequestedHistoryFrames; + CExtendedProperty m_MaxFrameRate; + ULONGLONG m_FaceDetectionFlags; + ULONG m_FaceDetectionMax; + ULONG m_FaceDetectionCurrentMax; + ULONGLONG m_SceneMode; + CExtendedProperty m_TorchMode; + CExtendedProperty m_OptimizationHint; + CExtendedMetadata *m_MetadataInfo; + PKSCAMERA_PERFRAMESETTING_HEADER m_pPerFrameSettings; + ULONG m_PFSSize; + KSCAMERA_EXTENDEDPROP_FOCUSSTATE m_FocusState; + ULONGLONG m_VFR; + ULONGLONG m_VideoHDR; + ULONGLONG m_VideoStabilization; + ULONGLONG m_Histogram; + ULONGLONG m_OpticalImageStabilization; + ULONGLONG m_AdvancedPhoto; + + CWhiteBalanceRoiIspControl m_RoiWhiteBalance; + CExposureRoiIspControl m_RoiExposureMode; + CFocusRoiIspControl m_RoiFocusMode; + + VIDCAP_PROPERTY m_Pan; + VIDCAP_PROPERTY m_Roll; + VIDCAP_PROPERTY m_Tilt; + + // Zoom parameters + FOCAL_LENGTH_PROPERTY m_FocalLength; // A description of the zoom limits. + VIDCAP_PROPERTY m_Zoom; // Absolute zoom position / mode. + VIDCAP_PROPERTY m_ZoomRelative; // Relative zoom position / mode. + + // Cached Q16-adjusted bounds. I do not use the zoom value stored below. + // + // I am using the same m_Zoom value here to keep both the extended and legacy + // controls tied together. It is not necessary to implement both in a real driver. + // However the legacy control was implemented first in this simulation and leaving both + // in place might have some value. But supporting both adds the question of whether they + // should both present a consistent view of zoom or if they should just save and report + // the values set for their own respective properties. + // + // I have chosen to support a consistent view of the zoom factor between the extended and + // legacy controls. Given that the legacy control was implemented first, I have chosen + // to keep that storage and rescale the value set by the extended zoom to match the + // legacy settings. + // + // But to make the two controls more consistent, I have changed the reported Ocular Focal + // Length to 2^16, which matches the implied denominator in Q16 format - the format used + // by this extended property. So as long as lOcularFocalLength is 0x10000, the following + // function should not change the reported value at all. This should simplify any + // debugging or tracing. + + CExtendedVidProcSetting m_ExtendedZoom; // Must update zoom value on the fly. + + VIDCAP_PROPERTY m_PowerLineFreq; // Power Line Frequency setting. + VIDCAP_PROPERTY m_BacklightCompensation; + VIDCAP_PROPERTY m_Brightness; + VIDCAP_PROPERTY m_Contrast; + VIDCAP_PROPERTY m_Hue; + + ULONG m_IsoResult; + ULONG m_EvCompResult; + ULONG m_WhiteBalanceResult; + ULONG m_ExposureResult; + ULONG m_SceneModeResult; + ULONG m_FaceDetectionResult; + ULONG m_FocusResult; + + ULONGLONG m_LastFocusMode; + ULONG m_LastFocusSetting; + + CRefPtr<CNotifier> m_FocusNotifier; // A reference to the CNotifier for any Focus in flight. + KPassiveTimer *m_FocusTimer; // A timer object used to simulate a focus event. + CRefPtr<CNotifier> m_FocusRectNotifier; + KPassiveTimer *m_FocusRectTimer; + + static const ULONG METADATA_MAX=4096; + +protected: + // + // Deal with scene mode changes. + // + NTSTATUS + UpdateSettings( + _In_ ULONGLONG ullSceneMode + ); + + // + // Put us back to the defaults specified in the DDI. + // + virtual + NTSTATUS + ProgramDefaults(); + +public: + // + // This simulation is based solely on the Descriptors. Yours might + // need additional information. + // + CSensorSimulation( + _In_ CCaptureDevice *Device, + _In_ const KSFILTER_DESCRIPTOR *Descriptors + ); + + virtual ~CSensorSimulation(); + + // + // Parse descriptors to determine what pin simulations are required. + // Do memory allocations, etc. + // + virtual + NTSTATUS + Initialize(); + + virtual + NTSTATUS + GetFocusState( + _Out_ KSCAMERA_EXTENDEDPROP_FOCUSSTATE *FocusState + ); + + // Lets you know if Variable Photo Sequence is active. + // Note: This doesn't tell you if the pin is running. + virtual + BOOLEAN + IsVPSActive() + { + return + KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE_SUB_VARIABLE==m_PhotoMode.SubMode() && + m_pIspSettings ; + } + + // Callback to handle focus convergence. + static + void + FocusConvergence( + _In_opt_ PVOID Context + ); + + // Callback to handle focus convergence. + static + void + FocusRectConvergence( + _In_opt_ PVOID Context + ); + + // Declare the property controls handled by this sensor. + DECLARE_PROPERTY( KSPROPERTY_VIDEOCONTROL_MODE_S, VideoControlMode ); + + DECLARE_PROPERTY_ASYNC( KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S, FocusRect ); + + DECLARE_PROPERTY( KSPROPERTY_CAMERACONTROL_FLASH_S, Flash ); + DECLARE_PROPERTY_GET( KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_S, PinDependence ); + DECLARE_PROPERTY( CExtendedProperty, TriggerTime ); + DECLARE_PROPERTY( CExtendedProperty, TorchMode ); + + DECLARE_PROPERTY( CExtendedProperty, ExtendedFlash ); + + DECLARE_PROPERTY_ASYNC( CExtendedVidProcSetting, Focus ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedProperty, Iso ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedVidProcSetting, IsoAdvanced ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedEvCompensation, EvCompensation ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedVidProcSetting, WhiteBalance ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedVidProcSetting, Exposure ); + DECLARE_PROPERTY( CExtendedProperty, PhotoConfirmation ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedProperty, SceneMode ); + DECLARE_PROPERTY( CExtendedProperty, FocusPriority ); + DECLARE_PROPERTY( CExtendedProperty, VideoHDR ); + DECLARE_PROPERTY( CExtendedProperty, VFR ); + DECLARE_PROPERTY( CExtendedVidProcSetting, Zoom ); + DECLARE_PROPERTY( CExtendedProperty, VideoStabilization ); + DECLARE_PROPERTY( CExtendedProperty, Histogram ); + DECLARE_PROPERTY( CExtendedMetadata, Metadata ); + DECLARE_PROPERTY( CExtendedProperty, OpticalImageStabilization ); + DECLARE_PROPERTY( CExtendedProperty, OptimizationHint ); + DECLARE_PROPERTY( CExtendedProperty, AdvancedPhoto ); + DECLARE_PROPERTY( CExtendedVidProcSetting, FaceDetection ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedPhotoMode, PhotoMode ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedProperty, PhotoMaxFrameRate ); + DECLARE_PROPERTY_ASYNC_NOCANCEL( CExtendedProperty, WarmStart ); + DECLARE_PROPERTY( CExtendedMaxVideoFpsForPhotoRes, MaxVideoFpsForPhotoRes ); + DECLARE_PROPERTY_GET( CExtendedFieldOfView, FieldOfView ); + DECLARE_PROPERTY_GET( CExtendedCameraAngleOffset, CameraAngleOffset ); + + DECLARE_PROPERTY_VARSIZE_ASYNC_NOCANCEL( CRoiProperty, Roi ); + + DECLARE_PROPERTY( KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S, VideoStabMode ); + + // Update the zoom factor over time. + void + SmoothZoom(); + + // Apply a zoom factor. + virtual + void + UpdateZoom(void); + + // Declare legacy controls that are needed. + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, Exposure); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, Focus); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, Zoom); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, ZoomRelative); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, Pan); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, Roll); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_S, Tilt); + DECLARE_PROPERTY(KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S, FocalLength); + + DECLARE_PROPERTY(KSPROPERTY_VIDEOPROCAMP_S, BacklightCompensation); + DECLARE_PROPERTY(KSPROPERTY_VIDEOPROCAMP_S, Brightness); + DECLARE_PROPERTY(KSPROPERTY_VIDEOPROCAMP_S, Contrast); + DECLARE_PROPERTY(KSPROPERTY_VIDEOPROCAMP_S, Hue); + DECLARE_PROPERTY(KSPROPERTY_VIDEOPROCAMP_S, WhiteBalance); + DECLARE_PROPERTY(KSPROPERTY_VIDEOPROCAMP_S, PowerlineFreq); + + DECLARE_PROPERTY_GET( CRoiConfig, RoiConfigCaps ); + + // Special-case Per-Frame settings since it requires a variable length structure. + _Success_(return == 0) + virtual + NTSTATUS + GetPfsCaps( + _Inout_opt_ KSCAMERA_PERFRAMESETTING_CAP_HEADER *Caps, + _Inout_ ULONG *Size + ); +}; + +// Constants... +const LONG WHITEBALANCE_MIN = 0; +const LONG WHITEBALANCE_MAX = 15000; +const LONG WHITEBALANCE_STEP= 1; +const LONG WHITEBALANCE_DEF = 5000; + +const LONG EXPOSURE_BILOG_MIN = -10; +const LONG EXPOSURE_BILOG_MAX = 9; +const LONG EXPOSURE_BILOG_STEP = 1; +const LONG EXPOSURE_BILOG_DEF = -5;
\ No newline at end of file |
