summaryrefslogtreecommitdiff
path: root/avscamera/sys
diff options
context:
space:
mode:
authorkarlf <[email protected]>2016-08-11 13:28:13 -0700
committerkarlf <[email protected]>2016-08-11 13:28:13 -0700
commit96eb96dfb613e4c745db6bd1f53a92fe7e2290fc (patch)
treead5f3ede5cbcd6b598677ce41bcf8318471bdd92 /avscamera/sys
parent687b274aa38fd05c8c26e3068932121876d7f745 (diff)
Updated for "Windows 10 Anniversary Update" (Version 1607)
Diffstat (limited to 'avscamera/sys')
-rw-r--r--avscamera/sys/AvsCamera.cpp108
-rw-r--r--avscamera/sys/AvsCamera.rc21
-rw-r--r--avscamera/sys/AvsCamera.vcxproj246
-rw-r--r--avscamera/sys/AvsCamera.vcxproj.Filters106
-rw-r--r--avscamera/sys/AvsCameraDevice.cpp99
-rw-r--r--avscamera/sys/AvsCameraDevice.h73
-rw-r--r--avscamera/sys/AvsCameraFilter.cpp587
-rw-r--r--avscamera/sys/AvsCameraFilter.h57
-rw-r--r--avscamera/sys/CameraProfile.h54
-rw-r--r--avscamera/sys/Capture.cpp2075
-rw-r--r--avscamera/sys/Capture.h305
-rw-r--r--avscamera/sys/Common.h704
-rw-r--r--avscamera/sys/Dbg.h81
-rw-r--r--avscamera/sys/Device.cpp962
-rw-r--r--avscamera/sys/Device.h449
-rw-r--r--avscamera/sys/ExtendedCameraAngleOffset.h67
-rw-r--r--avscamera/sys/ExtendedEVComp.h105
-rw-r--r--avscamera/sys/ExtendedFieldOfView.h67
-rw-r--r--avscamera/sys/ExtendedMaxVideoFpsForPhotoRes.h91
-rw-r--r--avscamera/sys/ExtendedMetadata.h68
-rw-r--r--avscamera/sys/ExtendedPhotoMode.h73
-rw-r--r--avscamera/sys/ExtendedProperty.h142
-rw-r--r--avscamera/sys/ExtendedVidProcSetting.h164
-rw-r--r--avscamera/sys/Mutex.cpp70
-rw-r--r--avscamera/sys/Mutex.h81
-rw-r--r--avscamera/sys/NV12Synthesizer.cpp183
-rw-r--r--avscamera/sys/NV12Synthesizer.h73
-rw-r--r--avscamera/sys/NonCopyable.h48
-rw-r--r--avscamera/sys/PreviewHwSim.cpp263
-rw-r--r--avscamera/sys/PreviewHwSim.h57
-rw-r--r--avscamera/sys/RGB24Synthesizer.cpp133
-rw-r--r--avscamera/sys/RGB24Synthesizer.h69
-rw-r--r--avscamera/sys/Ref.h185
-rw-r--r--avscamera/sys/Roi.cpp629
-rw-r--r--avscamera/sys/Roi.h279
-rw-r--r--avscamera/sys/Sensor.cpp1260
-rw-r--r--avscamera/sys/Sensor.h554
-rw-r--r--avscamera/sys/SensorSimulation.cpp3496
-rw-r--r--avscamera/sys/SensorSimulation.h280
-rw-r--r--avscamera/sys/Synthesizer.cpp1282
-rw-r--r--avscamera/sys/Synthesizer.h507
-rw-r--r--avscamera/sys/Timer.cpp172
-rw-r--r--avscamera/sys/Timer.h199
-rw-r--r--avscamera/sys/Util.cpp476
-rw-r--r--avscamera/sys/Util.h289
-rw-r--r--avscamera/sys/VideoCapture.cpp2559
-rw-r--r--avscamera/sys/VideoCapture.h34
-rw-r--r--avscamera/sys/VideoHwSim.cpp66
-rw-r--r--avscamera/sys/VideoHwSim.h42
-rw-r--r--avscamera/sys/Waitable.cpp69
-rw-r--r--avscamera/sys/Waitable.h58
-rw-r--r--avscamera/sys/WorkItem.cpp167
-rw-r--r--avscamera/sys/WorkItem.h63
-rw-r--r--avscamera/sys/XRGBSynthesizer.cpp246
-rw-r--r--avscamera/sys/XRGBSynthesizer.h97
-rw-r--r--avscamera/sys/YUVSynthesizer.cpp149
-rw-r--r--avscamera/sys/YUVSynthesizer.h69
-rw-r--r--avscamera/sys/YUY2Synthesizer.cpp137
-rw-r--r--avscamera/sys/YUY2Synthesizer.h68
-rw-r--r--avscamera/sys/avscamera.infbin26788 -> 0 bytes
-rw-r--r--avscamera/sys/filter.cpp4039
-rw-r--r--avscamera/sys/filter.h482
-rw-r--r--avscamera/sys/hwsim.cpp1395
-rw-r--r--avscamera/sys/hwsim.h316
-rw-r--r--avscamera/sys/imagecapture.cpp321
-rw-r--r--avscamera/sys/imagecapture.h44
-rw-r--r--avscamera/sys/imagehwsim.cpp1430
-rw-r--r--avscamera/sys/imagehwsim.h202
68 files changed, 0 insertions, 29342 deletions
diff --git a/avscamera/sys/AvsCamera.cpp b/avscamera/sys/AvsCamera.cpp
deleted file mode 100644
index 3742e69d..00000000
--- a/avscamera/sys/AvsCamera.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- AvsCamera.cpp
-
- Abstract:
-
- Sample Camera driver initialization.
-
- History:
-
- created 5/15/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- DESCRIPTOR AND DISPATCH LAYOUT
-
-**************************************************************************/
-
-//
-// CaptureDeviceDispatch:
-//
-// This is the dispatch table for the capture device. Plug and play
-// notifications as well as power management notifications are dispatched
-// through this table.
-//
-DEFINE_CAMERA_KSDEVICE_DISPATCH( AvsCameraDispatch, CAvsCameraDevice );
-
-//
-// CaptureDeviceDescriptor:
-//
-// This is the device descriptor for the capture device. It points to the
-// dispatch table and contains a list of filter descriptors that describe
-// filter-types that this device supports. Note that the filter-descriptors
-// can be created dynamically and the factories created via
-// KsCreateFilterFactory as well.
-//
-const
-KSDEVICE_DESCRIPTOR
-AvsCameraDeviceDescriptor =
-{
- &AvsCameraDispatch,
- 0,
- NULL
-};
-
-/**************************************************************************
-
- INITIALIZATION CODE
-
-**************************************************************************/
-
-
-extern "C" DRIVER_INITIALIZE DriverEntry;
-
-extern "C"
-NTSTATUS
-DriverEntry (
- _In_ PDRIVER_OBJECT DriverObject,
- _In_ PUNICODE_STRING RegistryPath
-)
-
-/*++
-
-Routine Description:
-
- Driver entry point. Pass off control to the AVStream initialization
- function (KsInitializeDriver) and return the status code from it.
-
-Arguments:
-
- DriverObject -
- The WDM driver object for our driver
-
- RegistryPath -
- The registry path for our registry info
-
-Return Value:
-
- As from KsInitializeDriver
-
---*/
-
-{
- //
- // Simply pass the device descriptor and parameters off to AVStream
- // to initialize us. This will cause filter factories to be set up
- // at add & start. Everything is done based on the descriptors passed
- // here.
- //
- return
- KsInitializeDriver (
- DriverObject,
- RegistryPath,
- &AvsCameraDeviceDescriptor
- );
-
-}
-
diff --git a/avscamera/sys/AvsCamera.rc b/avscamera/sys/AvsCamera.rc
deleted file mode 100644
index 25131b0a..00000000
--- a/avscamera/sys/AvsCamera.rc
+++ /dev/null
@@ -1,21 +0,0 @@
-//+-------------------------------------------------------------------------
-//
-// Microsoft Windows
-//
-// Copyright (C) Microsoft Corporation, 2015
-//
-// File: AvsCam.rc
-//
-//--------------------------------------------------------------------------
-
-#include <windows.h>
-
-#include <ntverp.h>
-
-#define VER_FILETYPE VFT_DRV
-#define VER_FILESUBTYPE VFT2_UNKNOWN
-#define VER_FILEDESCRIPTION_STR "A/V Stream Camera Simulator"
-#define VER_INTERNALNAME_STR "AvsCam.sys"
-#define VER_ORIGINALFILENAME_STR "AvsCam.sys"
-
-#include "common.ver"
diff --git a/avscamera/sys/AvsCamera.vcxproj b/avscamera/sys/AvsCamera.vcxproj
deleted file mode 100644
index 8773f715..00000000
--- a/avscamera/sys/AvsCamera.vcxproj
+++ /dev/null
@@ -1,246 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <ProjectGuid>{BB6E820D-6149-4486-AD06-96E8F33DCE8A}</ProjectGuid>
- <RootNamespace>$(MSBuildProjectName)</RootNamespace>
- <SupportsPackaging>false</SupportsPackaging>
- <RequiresPackageProject>true</RequiresPackageProject>
- <Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
- <Platform Condition="'$(Platform)' == ''">Win32</Platform>
- <SampleGuid>{032DA1CE-AC79-4BEF-ADDE-9A060C7D5E47}</SampleGuid>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>False</UseDebugLibraries>
- <DriverTargetPlatform>Universal</DriverTargetPlatform>
- <DriverType>WDM</DriverType>
- <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
- <ConfigurationType>Driver</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>True</UseDebugLibraries>
- <DriverTargetPlatform>Universal</DriverTargetPlatform>
- <DriverType>WDM</DriverType>
- <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
- <ConfigurationType>Driver</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>False</UseDebugLibraries>
- <DriverTargetPlatform>Universal</DriverTargetPlatform>
- <DriverType>WDM</DriverType>
- <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
- <ConfigurationType>Driver</ConfigurationType>
- </PropertyGroup>
- <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <TargetVersion>Windows10</TargetVersion>
- <UseDebugLibraries>True</UseDebugLibraries>
- <DriverTargetPlatform>Universal</DriverTargetPlatform>
- <DriverType>WDM</DriverType>
- <PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
- <ConfigurationType>Driver</ConfigurationType>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <PropertyGroup>
- <OutDir>$(IntDir)</OutDir>
- </PropertyGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" />
- </ImportGroup>
- <ItemGroup Label="WrappedTaskItems" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <TargetName>AvsCamera</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <TargetName>AvsCamera</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <TargetName>AvsCamera</TargetName>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <TargetName>AvsCamera</TargetName>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\ks.lib;$(DDK_LIB_PATH)\ntoskrnl.lib;$(DDK_LIB_PATH)\cng.lib</AdditionalDependencies>
- </Link>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ResourceCompile>
- <ClCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ClCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </Midl>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\ks.lib;$(DDK_LIB_PATH)\ntoskrnl.lib;$(DDK_LIB_PATH)\cng.lib</AdditionalDependencies>
- </Link>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ResourceCompile>
- <ClCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ClCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </Midl>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\ks.lib;$(DDK_LIB_PATH)\ntoskrnl.lib;$(DDK_LIB_PATH)\cng.lib</AdditionalDependencies>
- </Link>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ResourceCompile>
- <ClCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ClCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </Midl>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Link>
- <AdditionalDependencies>%(AdditionalDependencies);$(DDK_LIB_PATH)\ks.lib;$(DDK_LIB_PATH)\ntoskrnl.lib;$(DDK_LIB_PATH)\cng.lib</AdditionalDependencies>
- </Link>
- <ResourceCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ResourceCompile>
- <ClCompile>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </ClCompile>
- <Midl>
- <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(DDK_INC_PATH);..\common;$(SDK_INC_PATH)\ks</AdditionalIncludeDirectories>
- </Midl>
- </ItemDefinitionGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <NTDDI_VERSION>NTDDI_WINTHRESHOLD</NTDDI_VERSION>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <NTDDI_VERSION>NTDDI_WINTHRESHOLD</NTDDI_VERSION>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <NTDDI_VERSION>NTDDI_WINTHRESHOLD</NTDDI_VERSION>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <NTDDI_VERSION>NTDDI_WINTHRESHOLD</NTDDI_VERSION>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <Link>
- <AdditionalOptions>%(AdditionalOptions) -merge:PAGECONST=PAGE</AdditionalOptions>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <Link>
- <AdditionalOptions>%(AdditionalOptions) -merge:PAGECONST=PAGE</AdditionalOptions>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <Link>
- <AdditionalOptions>%(AdditionalOptions) -merge:PAGECONST=PAGE</AdditionalOptions>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <TreatWarningAsError>true</TreatWarningAsError>
- <WarningLevel>Level4</WarningLevel>
- <ExceptionHandling>
- </ExceptionHandling>
- </ClCompile>
- <Link>
- <AdditionalOptions>%(AdditionalOptions) -merge:PAGECONST=PAGE</AdditionalOptions>
- </Link>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="AvsCamera.cpp" />
- <ClCompile Include="AvsCameraDevice.cpp" />
- <ClCompile Include="AvsCameraFilter.cpp" />
- <ClCompile Include="capture.cpp" />
- <ClCompile Include="device.cpp" />
- <ClCompile Include="filter.cpp" />
- <ClCompile Include="hwsim.cpp" />
- <ClCompile Include="imagecapture.cpp" />
- <ClCompile Include="ImagehwSim.cpp" />
- <ClCompile Include="Mutex.cpp" />
- <ClCompile Include="NV12Synthesizer.cpp" />
- <ClCompile Include="PreviewHwSim.cpp" />
- <ClCompile Include="RGB24Synthesizer.cpp" />
- <ClCompile Include="Roi.cpp" />
- <ClCompile Include="Sensor.cpp" />
- <ClCompile Include="SensorSimulation.cpp" />
- <ClCompile Include="Synthesizer.cpp" />
- <ClCompile Include="Timer.cpp" />
- <ClCompile Include="util.cpp" />
- <ClCompile Include="videocapture.cpp" />
- <ClCompile Include="VideoHwSim.cpp" />
- <ClCompile Include="Waitable.cpp" />
- <ClCompile Include="WorkItem.cpp" />
- <ClCompile Include="XRGBSynthesizer.cpp" />
- <ClCompile Include="YUVSynthesizer.cpp" />
- <ClCompile Include="YUY2Synthesizer.cpp" />
- <ResourceCompile Include="AvsCamera.rc" />
- </ItemGroup>
- <ItemGroup>
- <Inf Exclude="@(Inf)" Include="*.inf" />
- <FilesToPackage Include="$(TargetPath)" Condition="'$(ConfigurationType)'=='Driver' or '$(ConfigurationType)'=='DynamicLibrary'" />
- </ItemGroup>
- <ItemGroup>
- <None Exclude="@(None)" Include="*.txt;*.htm;*.html" />
- <None Exclude="@(None)" Include="*.ico;*.cur;*.bmp;*.dlg;*.rct;*.gif;*.jpg;*.jpeg;*.wav;*.jpe;*.tiff;*.tif;*.png;*.rc2" />
- <None Exclude="@(None)" Include="*.def;*.bat;*.hpj;*.asmx" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Exclude="@(ClInclude)" Include="*.h;*.hpp;*.hxx;*.hm;*.inl;*.xsd" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-</Project> \ No newline at end of file
diff --git a/avscamera/sys/AvsCamera.vcxproj.Filters b/avscamera/sys/AvsCamera.vcxproj.Filters
deleted file mode 100644
index 189d7e9c..00000000
--- a/avscamera/sys/AvsCamera.vcxproj.Filters
+++ /dev/null
@@ -1,106 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx;*</Extensions>
- <UniqueIdentifier>{435FFB2D-4374-4BBF-97B6-52E43DA1C157}</UniqueIdentifier>
- </Filter>
- <Filter Include="Header Files">
- <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
- <UniqueIdentifier>{F0B00B7F-1E80-4427-93E0-FA621775CBBF}</UniqueIdentifier>
- </Filter>
- <Filter Include="Resource Files">
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms;man;xml</Extensions>
- <UniqueIdentifier>{BD39318B-B023-47F9-A201-FAB94C9DBE26}</UniqueIdentifier>
- </Filter>
- <Filter Include="Driver Files">
- <Extensions>inf;inv;inx;mof;mc;</Extensions>
- <UniqueIdentifier>{59B47F1B-A111-4923-BF9B-C8AF5D2F41CF}</UniqueIdentifier>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="AvsCamera.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="AvsCameraDevice.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="AvsCameraFilter.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="capture.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="device.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="filter.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="hwsim.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="imagecapture.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="ImagehwSim.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Mutex.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="NV12Synthesizer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="PreviewHwSim.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="RGB24Synthesizer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Roi.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Sensor.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="SensorSimulation.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Synthesizer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Timer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="util.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="videocapture.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="VideoHwSim.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="Waitable.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="WorkItem.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="XRGBSynthesizer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="YUVSynthesizer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="YUY2Synthesizer.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ResourceCompile Include="AvsCamera.rc">
- <Filter>Resource Files</Filter>
- </ResourceCompile>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/avscamera/sys/AvsCameraDevice.cpp b/avscamera/sys/AvsCameraDevice.cpp
deleted file mode 100644
index ebfb589d..00000000
--- a/avscamera/sys/AvsCameraDevice.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2015, Microsoft Corporation.
-
- File:
-
- AvsCameraDevice.cpp
-
- Abstract:
-
- Device class implementation. Derived from CCaptureDevice.
- This class overloads our base device class implementation.
-
- History:
-
- created 02/24/2015
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-//
-// DispatchCreate():
-//
-// This is the Add Device dispatch for the capture device. It creates
-// the CCaptureDevice and associates it with the device via the bag.
-//
-NTSTATUS
-CAvsCameraDevice::
-DispatchCreate (
- _In_ PKSDEVICE Device
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- CAvsCameraDevice *CapDevice = new (NonPagedPoolNx, 'eviD') CAvsCameraDevice (Device);
- if( !CapDevice)
- {
- //
- // Return failure if we couldn't create the device.
- //
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NTSTATUS Status = CapDevice->Prepare();
- if (!NT_SUCCESS (Status))
- {
- // Init failure.
- delete CapDevice;
- }
-
- DBG_LEAVE("()");
- return Status;
-}
-
-NTSTATUS
-CAvsCameraDevice::
-Initialize()
-{
- PAGED_CODE();
-
- static
- CSensorContext Context[] =
- {
- { L"RFC", &AvsCameraFilterDescriptor, AcpiPldPanelBack },
- { L"FFC", &AvsCameraFilterDescriptorFFC, AcpiPldPanelFront }
- };
-
- m_FilterDescriptorCount = SIZEOF_ARRAY(Context);
- m_Context = Context;
-
- return CCaptureDevice::Initialize();
-}
-
-CSensor *
-CAvsCameraDevice::
-CreateSensor(
- _In_ const KSFILTER_DESCRIPTOR *Descriptors
-)
-{
- PAGED_CODE();
-
- return new (NonPagedPoolNx, 'sneS') CSensorSimulation( this, Descriptors );
-}
-
diff --git a/avscamera/sys/AvsCameraDevice.h b/avscamera/sys/AvsCameraDevice.h
deleted file mode 100644
index ec98e892..00000000
--- a/avscamera/sys/AvsCameraDevice.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2015, Microsoft Corporation.
-
- File:
-
- AvsCameraDevice.h
-
- Abstract:
-
- Device class implementation. Derived from CCaptureDevice.
- This class overloads our base device class implementation.
-
- History:
-
- created 02/24/2015
-
-**************************************************************************/
-
-#pragma once
-
-class CAvsCameraDevice : public CCaptureDevice
-{
-public:
- //
- // DispatchCreate():
- //
- // This is the Add Device dispatch for the capture device. It creates
- // the CCaptureDevice and associates it with the device via the bag.
- //
- static
- NTSTATUS
- DispatchCreate (
- _In_ PKSDEVICE Device
- );
-
-public:
- //
- // CCaptureDevice():
- //
- // The capture device class constructor. Since everything should have
- // been zero'ed by the new operator, don't bother setting anything to
- // zero or NULL. Only initialize non-NULL, non-0 fields.
- //
- CAvsCameraDevice(
- _In_ PKSDEVICE Device
- )
- : CCaptureDevice( Device )
- {}
-
- virtual
- NTSTATUS
- Initialize();
-
-protected:
- virtual
- CSensor *
- CreateSensor(
- _In_ const KSFILTER_DESCRIPTOR *Descriptors
- );
-
-};
-
-// {B27E3887-AD10-4A4E-BFB8-D6765ADD0E38}
-#define STATIC_FrontCamera_Filter \
- 0xb27e3887, 0xad10, 0x4a4e, 0xbf, 0xb8, 0xd6, 0x76, 0x5a, 0xdd, 0xe, 0x38
-
-// {4EE16166-F358-4F10-8889-93107806B7A7}
-#define STATIC_RearCamera_Filter \
- 0x4ee16166, 0xf358, 0x4f10, 0x88, 0x89, 0x93, 0x10, 0x78, 0x6, 0xb7, 0xa7
-
diff --git a/avscamera/sys/AvsCameraFilter.cpp b/avscamera/sys/AvsCameraFilter.cpp
deleted file mode 100644
index bee08fbe..00000000
--- a/avscamera/sys/AvsCameraFilter.cpp
+++ /dev/null
@@ -1,587 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2015, Microsoft Corporation.
-
- File:
-
- AvsCameraFilter.cpp
-
- Abstract:
-
- Filter class implementation. Derived from CCaptureFilter.
- This class overrides the default implementation.
-
- History:
-
- created 02/24/2015
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-CAvsCameraFilter::
-CAvsCameraFilter(
- _In_ PKSFILTER Filter
-)
- : CCaptureFilter( Filter )
-{
- PAGED_CODE();
-}
-
-//
-// ~CCaptureFilter():
-//
-// The capture filter destructor.
-//
-CAvsCameraFilter::
-~CAvsCameraFilter()
-{
- PAGED_CODE();
-}
-
-
-NTSTATUS
-CAvsCameraFilter::
-DispatchCreate (
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp
-)
-
-/*++
-
-Routine Description:
-
- This is the creation dispatch for the capture filter. It creates
- the CCaptureFilter object.
-
-Arguments:
-
- Filter -
- The AVStream filter being created
-
- Irp -
- The creation Irp
-
-Return Value:
-
- Success / failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER("(Filter=0x%p)", Filter);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- CAvsCameraFilter *CapFilter = new (NonPagedPoolNx, 'rtlf') CAvsCameraFilter(Filter);
-
- if (!CapFilter)
- {
- //
- // Return failure if we couldn't create the filter.
- //
- Status = STATUS_INSUFFICIENT_RESOURCES;
-
- }
- else
- {
- // Allocate memory or whatever.
- Status = CapFilter->Initialize();
-
- if (!NT_SUCCESS (Status))
- {
- delete CapFilter;
- }
- else
- {
- Filter -> Context = reinterpret_cast <PVOID> (CapFilter);
- }
- }
-
- DBG_LEAVE( "()=0x%08X", Status );
- return Status;
-}
-
-// Get KSPROPERTY_CUSTOMCONTROL_DUMMY.
-NTSTATUS
-CAvsCameraFilter::
-GetCustomDummy(
- _Inout_ ULONG *pDummy
-)
-{
- PAGED_CODE();
-
- *pDummy = m_CustomValue;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CUSTOMCONTROL_DUMMY.
-NTSTATUS
-CAvsCameraFilter::
-SetCustomDummy(
- _In_ ULONG *pDummy
-)
-{
- PAGED_CODE();
-
- m_CustomValue = *pDummy;
- return STATUS_SUCCESS;
-}
-
-/**************************************************************************
-
- DESCRIPTOR AND DISPATCH LAYOUT
-
-**************************************************************************/
-
-GUID g_PINNAME_VIDEO_CAPTURE = {STATIC_PINNAME_VIDEO_CAPTURE};
-GUID g_PINNAME_VIDEO_PREVIEW = {STATIC_PINNAME_VIDEO_PREVIEW};
-GUID g_PINNAME_IMAGE_CAPTURE = {STATIC_PINNAME_IMAGE};
-
-//
-// CaptureFilterCategories:
-//
-// The list of category GUIDs for the capture filter.
-//
-const
-GUID
-FilterCategories [CAPTURE_FILTER_CATEGORIES_COUNT] =
-{
- STATICGUIDOF (KSCATEGORY_VIDEO_CAMERA),
- STATICGUIDOF (KSCATEGORY_VIDEO),
- STATICGUIDOF (KSCATEGORY_CAPTURE)
-};
-
-DEFINE_KSPROPERTY_TABLE(FocusPropertyItems)
-{
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID, KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S, FocusRect )
-};
-
-DEFINE_KSPROPERTY_TABLE(VideoStabPropertyItems)
-{
- DEFINE_PROP_ITEM( CCaptureFilter, 0, KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S, VideoStabMode )
-};
-
-DEFINE_KSPROPERTY_TABLE(FlashPropertyItems)
-{
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_FLASH_PROPERTY_ID, KSPROPERTY_CAMERACONTROL_FLASH_S, Flash )
-};
-
-DEFINE_KSPROPERTY_TABLE(PinDependencePropertyItems)
-{
- // This control only requires a getter.
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_PROPERTY_ID, KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_S,
- PinDependence )
-};
-
-DEFINE_KSPROPERTY_TABLE(ExtendedPropertyItems)
-{
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE, CExtendedPhotoMode, PhotoMode ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOFRAMERATE, CExtendedProperty, PhotoFrameRate ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE, CExtendedProperty, PhotoMaxFrameRate ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTRIGGERTIME, CExtendedProperty, TriggerTime ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART, CExtendedProperty, WarmStart ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_MAXVIDFPS_PHOTORES, CExtendedMaxVideoFpsForPhotoRes, MaxVideoFpsForPhotoRes ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE, CExtendedProperty, SceneMode ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE, CExtendedProperty, TorchMode ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE, CExtendedProperty, ExtendedFlash ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_OPTIMIZATIONHINT, CExtendedProperty, OptimizationHint ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE, CExtendedVidProcSetting, WhiteBalance ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE, CExtendedVidProcSetting, Exposure ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE, CExtendedVidProcSetting, Focus ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ISO, CExtendedProperty, Iso ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FIELDOFVIEW, CExtendedFieldOfView, FieldOfView ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION, CExtendedEvCompensation, EvCompensation ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_CAMERAANGLEOFFSET, CExtendedCameraAngleOffset, CameraAngleOffset ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION, CExtendedProperty, PhotoConfirmation ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA, CExtendedMetadata, Metadata ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE, CExtendedProperty, FocusState ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY, CExtendedProperty, FocusPriority ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FACEDETECTION, CExtendedVidProcSetting, FaceDetection ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_CONFIGCAPS, CRoiConfig, RoiConfigCaps ),
- DEFINE_KSPROPERTY_ITEM(
- KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL,
- CCaptureFilter::GetRoiIspControl,
- sizeof(KSPROPERTY),
- 0,
- CCaptureFilter::SetRoiIspControl,
- NULL, 0, NULL, NULL, 0
- ),
- DEFINE_PROP_ITEM(CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM, CExtendedVidProcSetting, Zoom),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR, CExtendedProperty, VideoHDR ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_VFR, CExtendedProperty, VFR ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED, CExtendedVidProcSetting, IsoAdvanced ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOSTABILIZATION, CExtendedProperty, VideoStabilization),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_HISTOGRAM, CExtendedProperty, Histogram ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_OIS, CExtendedProperty, OpticalImageStabilization ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO, CExtendedProperty, AdvancedPhoto ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PROFILE, CExtendedProfile, CameraProfile )
-};
-
-// Front-facing cameras often have limited capabilities. One way to express that is to use a restricted automation table such as this one.
-DEFINE_KSPROPERTY_TABLE(ExtendedPropertyItemsFFC)
-{
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE, CExtendedPhotoMode, PhotoMode ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOFRAMERATE, CExtendedProperty, PhotoFrameRate ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE, CExtendedProperty, PhotoMaxFrameRate ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTRIGGERTIME, CExtendedProperty, TriggerTime ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART, CExtendedProperty, WarmStart ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_MAXVIDFPS_PHOTORES, CExtendedMaxVideoFpsForPhotoRes, MaxVideoFpsForPhotoRes ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE, CExtendedProperty, SceneMode ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE, CExtendedProperty, TorchMode ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_OPTIMIZATIONHINT, CExtendedProperty, OptimizationHint ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE, CExtendedVidProcSetting, WhiteBalance ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE, CExtendedVidProcSetting, Exposure ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ISO, CExtendedProperty, Iso ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FIELDOFVIEW, CExtendedFieldOfView, FieldOfView ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION, CExtendedEvCompensation, EvCompensation ),
- DEFINE_PROP_ITEM_NO_SET( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_CAMERAANGLEOFFSET, CExtendedCameraAngleOffset, CameraAngleOffset ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION, CExtendedProperty, PhotoConfirmation ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA, CExtendedMetadata, Metadata ),
- DEFINE_PROP_ITEM(CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM, CExtendedVidProcSetting, Zoom),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_FACEDETECTION, CExtendedVidProcSetting, FaceDetection ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED, CExtendedVidProcSetting, IsoAdvanced ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOSTABILIZATION, CExtendedProperty, VideoStabilization ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO, CExtendedProperty, AdvancedPhoto ),
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXTENDED_PROFILE, CExtendedProfile, CameraProfile )
-};
-
-//--------------------------------------------------------------
-// Legacy Camera Contorl properties
-DEFINE_KSPROPERTY_TABLE(CameraControlPropertyTable)
-{
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_EXPOSURE, KSPROPERTY_CAMERACONTROL_S, Exposure, &ExposureValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_FOCUS, KSPROPERTY_CAMERACONTROL_S, Focus, &FocusValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_ZOOM, KSPROPERTY_CAMERACONTROL_S, Zoom, &ZoomValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE, KSPROPERTY_CAMERACONTROL_S, ZoomRelative, &ZoomRelativeValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_PAN, KSPROPERTY_CAMERACONTROL_S, Pan, &PanValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_ROLL, KSPROPERTY_CAMERACONTROL_S, Roll, &RollValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_TILT, KSPROPERTY_CAMERACONTROL_S, Tilt, &TiltValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH, KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S, FocalLength, NULL)
-};
-
-DEFINE_KSPROPERTY_TABLE(PFSPropertyTable)
-{
- DEFINE_KSPROPERTY_ITEM(
- KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_CAPABILITY,
- CCaptureFilter::GetPFSCaps, // GetSupported or Handler
- sizeof(KSPROPERTY), // MinProperty
- 0, // MinData
- NULL, // SetSupported or Handler
- NULL, // Values
- 0, // RelationsCount
- NULL, // Relations
- NULL, // SupportHandler
- 0 // SerializedSize
- ),
- DEFINE_KSPROPERTY_ITEM(
- KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_SET,
- CCaptureFilter::GetPerFrameSettings, // GetSupported or Handler
- sizeof(KSPROPERTY), // MinProperty
- 0, // MinData
- CCaptureFilter::SetPerFrameSettings, // SetSupported or Handler
- NULL, // Values
- 0, // RelationsCount
- NULL, // Relations
- NULL, // SupportHandler
- 0 // SerializedSize
- ),
- DEFINE_KSPROPERTY_ITEM(
- KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_CLEAR,
- NULL, // GetSupported or Handler
- sizeof(KSPROPERTY), // MinProperty
- 0, // MinData
- CCaptureFilter::ClearPerFrameSettings, // SetSupported or Handler
- NULL, // Values
- 0, // RelationsCount
- NULL, // Relations
- NULL, // SupportHandler
- 0 // SerializedSize
- )
-};
-
-DEFINE_KSPROPERTY_TABLE(FilterVidcapPropertyTable)
-{
- DEFINE_PROP_ITEM( CCaptureFilter, KSPROPERTY_VIDEOCONTROL_MODE, KSPROPERTY_VIDEOCONTROL_MODE_S, VideoControlMode )
-};
-
-DEFINE_KSPROPERTY_TABLE( VideoProcampPropertyTable )
-{
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION, KSPROPERTY_VIDEOPROCAMP_S, BacklightCompensation,
- &BacklightCompensationValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS, KSPROPERTY_VIDEOPROCAMP_S, Brightness, &BrightnessValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_VIDEOPROCAMP_CONTRAST, KSPROPERTY_VIDEOPROCAMP_S, Contrast, &ContrastValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_VIDEOPROCAMP_HUE, KSPROPERTY_VIDEOPROCAMP_S, Hue, &HueValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE, KSPROPERTY_VIDEOPROCAMP_S, WhiteBalance, &WhiteBalanceValues),
- DEFINE_PROP_ITEM_WITH_VALUES(CCaptureFilter, KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY, KSPROPERTY_VIDEOPROCAMP_S, PowerlineFreq, &PLFValues)
-};
-
-DEFINE_KSPROPERTY_TABLE( CustomPropertyTable )
-{
- DEFINE_PROP_ITEM(CAvsCameraFilter, KSPROPERTY_CUSTOMCONTROL_DUMMY, ULONG, CustomDummy)
-};
-
-DEFINE_KSEVENT_TABLE(VidCapRoiEventTable)
-{
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID)
-};
-
-DEFINE_KSEVENT_TABLE(ExtendedPropertyEventTable)
-{
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_ISO),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED),
- DEFINE_STD_EVENT_ITEM(KSPROPERTY_CAMERACONTROL_EXTENDED_PROFILE)
-};
-
-DEFINE_KSPROPERTY_SET_TABLE(PropertySets)
-{
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CAMERACONTROL_REGION_OF_INTEREST, FocusPropertyItems ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CAMERACONTROL_FLASH, FlashPropertyItems ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CAMERACONTROL_VIDEO_STABILIZATION, VideoStabPropertyItems ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_VIDEOCONTROL, FilterVidcapPropertyTable ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CAMERACONTROL_IMAGE_PIN_CAPABILITY, PinDependencePropertyItems ),
- DEFINE_STD_PROPERTY_SET( KSPROPERTYSETID_ExtendedCameraControl, ExtendedPropertyItems ),
- DEFINE_STD_PROPERTY_SET( KSPROPERTYSETID_PerFrameSettingControl, PFSPropertyTable ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CAMERACONTROL, CameraControlPropertyTable ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_VIDEOPROCAMP, VideoProcampPropertyTable ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CUSTOMCONTROL, CustomPropertyTable )
-};
-
-DEFINE_KSEVENT_SET_TABLE(EventSets)
-{
- DEFINE_KSEVENT_SET
- (
- &KSEVENTSETID_ExtendedCameraControl,
- SIZEOF_ARRAY(ExtendedPropertyEventTable),
- ExtendedPropertyEventTable
- ),
- DEFINE_KSEVENT_SET
- (
- &EVENTSETID_VIDCAP_CAMERACONTROL_REGION_OF_INTEREST,
- SIZEOF_ARRAY(VidCapRoiEventTable),
- VidCapRoiEventTable
- )
-};
-
-DEFINE_KSAUTOMATION_TABLE(AvsCameraFilterAutomationTable)
-{
- DEFINE_KSAUTOMATION_PROPERTIES(PropertySets),
- DEFINE_KSAUTOMATION_METHODS_NULL,
- DEFINE_KSAUTOMATION_EVENTS(EventSets)
-};
-
-//FFC
-DEFINE_KSPROPERTY_SET_TABLE(PropertySetsFFC)
-{
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_VIDEOCONTROL, FilterVidcapPropertyTable ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CAMERACONTROL_IMAGE_PIN_CAPABILITY, PinDependencePropertyItems ),
- DEFINE_STD_PROPERTY_SET( KSPROPERTYSETID_ExtendedCameraControl, ExtendedPropertyItemsFFC ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_VIDEOPROCAMP, VideoProcampPropertyTable ),
- DEFINE_STD_PROPERTY_SET( PROPSETID_VIDCAP_CUSTOMCONTROL, CustomPropertyTable )
-};
-
-DEFINE_KSEVENT_SET_TABLE(EventSetsFFC)
-{
- DEFINE_KSEVENT_SET
- (
- &KSEVENTSETID_ExtendedCameraControl,
- SIZEOF_ARRAY(ExtendedPropertyEventTable),
- ExtendedPropertyEventTable
- )
-};
-
-DEFINE_KSAUTOMATION_TABLE(AvsCameraFilterAutomationTableFFC)
-{
- DEFINE_KSAUTOMATION_PROPERTIES(PropertySetsFFC),
- DEFINE_KSAUTOMATION_METHODS_NULL,
- DEFINE_KSAUTOMATION_EVENTS(EventSetsFFC)
-};
-
-//
-// CaptureFilterPinDescriptors:
-//
-// The list of pin descriptors on the capture filter.
-//
-const
-KSPIN_DESCRIPTOR_EX
-PinDescriptors[] =
-{
- //
- // Video Capture Pin
- //
- {
- &VideoCapturePinDispatch,
- NULL,
- {
- 0, // Interfaces (NULL, 0 == default)
- NULL,
- 0, // Mediums (NULL, 0 == default)
- NULL,
- SIZEOF_ARRAY(VideoCapturePinDataRanges),// Range Count
- VideoCapturePinDataRanges, // Ranges
- KSPIN_DATAFLOW_OUT, // Dataflow
- KSPIN_COMMUNICATION_BOTH, // Communication
- &PIN_CATEGORY_CAPTURE, // Category
- &g_PINNAME_VIDEO_CAPTURE, // Name
- 0 // Reserved
- },
- KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY,
- 1, // Instances Possible
- 0, // Instances Necessary
- &VideoCapturePinAllocatorFraming, // Allocator Framing
- reinterpret_cast <PFNKSINTERSECTHANDLEREX>
- (CVideoCapturePin::IntersectHandler)
- },
- //
- // Video Preview Pin
- //
- {
- &VideoCapturePinDispatch,
- NULL,
- {
- 0,
- NULL,
- 0,
- NULL,
- SIZEOF_ARRAY(VideoPreviewPinDataRanges),// Range Count
- VideoPreviewPinDataRanges, // Ranges
- KSPIN_DATAFLOW_OUT, // Dataflow
- KSPIN_COMMUNICATION_BOTH, // Communication
- &PIN_CATEGORY_PREVIEW, // Category
- &g_PINNAME_VIDEO_PREVIEW, // Name
- 0 // Reserved
- },
- KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY,
- 1, // Instances Possible
- 0, // Instances Necessary
- &VideoCapturePinAllocatorFraming, // Allocator Framing
- reinterpret_cast <PFNKSINTERSECTHANDLEREX>
- (CVideoCapturePin::IntersectHandler)
- },
- //
- // Image Capture Pin
- //
- {
- &ImageCapturePinDispatch,
- NULL,
- {
- 0, // Interfaces (NULL, 0 == default)
- NULL,
- 0, // Mediums (NULL, 0 == default)
- NULL,
- SIZEOF_ARRAY(ImageCapturePinDataRanges),// Range Count
- ImageCapturePinDataRanges, // Ranges
- KSPIN_DATAFLOW_OUT, // Dataflow
- KSPIN_COMMUNICATION_BOTH, // Communication
- &PINNAME_IMAGE, // Category
- &g_PINNAME_IMAGE_CAPTURE, // Name
- 0 // Reserved
- },
-//////////////////////////////////////////////////////////////////////////////////////////////////////
- KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL |
-//////////////////////////////////////////////////////////////////////////////////////////////////////
- KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY,
- 1, // Instances Possible
- 0, // Instances Necessary
- &ImageCapturePinAllocatorFraming, // Allocator Framing
- reinterpret_cast <PFNKSINTERSECTHANDLEREX>
- (CImageCapturePin::IntersectHandler)
- }
-};
-
-//
-// CaptureFilterDispatch:
-//
-// This is the dispatch table for the capture filter. It provides notification
-// of creation, closure, processing (for filter-centrics, not for the capture
-// filter), and resets (for filter-centrics, not for the capture filter).
-//
-const
-KSFILTER_DISPATCH
-AvsCameraFilterDispatch =
-{
- CAvsCameraFilter::DispatchCreate, // Filter Create
- CCaptureFilter::DispatchClose, // Filter Close
- NULL, // Filter Process
- NULL // Filter Reset
-};
-
-// {B27E3887-AD10-4A4E-BFB8-D6765ADD0E38}
-const
-GUID
-AvsCam_FrontCamera_Filter = {STATIC_FrontCamera_Filter};
-
-// {4EE16166-F358-4F10-8889-93107806B7A7}
-const
-GUID
-AvsCam_RearCamera_Filter = {STATIC_RearCamera_Filter};
-
-//
-// AvsCameraFilterDescriptor:
-//
-// The descriptor for the capture filter. We don't specify any topology
-// since there's only one pin on the filter. Realistically, there would
-// be some topological relationships here because there would be input
-// pins from crossbars and the like.
-//
-const
-KSFILTER_DESCRIPTOR
-AvsCameraFilterDescriptor =
-{
- &AvsCameraFilterDispatch, // Dispatch Table
- &AvsCameraFilterAutomationTable, // Automation Table
- KSFILTER_DESCRIPTOR_VERSION, // Version
- KSFILTER_FLAG_PRIORITIZE_REFERENCEGUID, // Flags
- &AvsCam_RearCamera_Filter, // Reference GUID
- DEFINE_KSFILTER_PIN_DESCRIPTORS(PinDescriptors),
- DEFINE_KSFILTER_CATEGORIES(FilterCategories),
- 0,
- sizeof (KSNODE_DESCRIPTOR),
- NULL,
- 0,
- NULL,
- NULL // Component ID
-};
-
-const
-KSFILTER_DESCRIPTOR
-AvsCameraFilterDescriptorFFC =
-{
- &AvsCameraFilterDispatch, // Dispatch Table
- &AvsCameraFilterAutomationTableFFC, // Automation Table
- KSFILTER_DESCRIPTOR_VERSION, // Version
- KSFILTER_FLAG_PRIORITIZE_REFERENCEGUID, // Flags
- &AvsCam_FrontCamera_Filter, // Reference GUID
- DEFINE_KSFILTER_PIN_DESCRIPTORS(PinDescriptors),
- DEFINE_KSFILTER_CATEGORIES(FilterCategories),
- 0,
- sizeof (KSNODE_DESCRIPTOR),
- NULL,
- 0,
- NULL,
- NULL // Component ID
-};
-
diff --git a/avscamera/sys/AvsCameraFilter.h b/avscamera/sys/AvsCameraFilter.h
deleted file mode 100644
index ce81cede..00000000
--- a/avscamera/sys/AvsCameraFilter.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2015, Microsoft Corporation.
-
- File:
-
- AvsCameraFilter.h
-
- Abstract:
-
- Filter class implementation. Derived from CCapturefilter.
- This class overloads basic filter behavior for our device.
-
- History:
-
- created 02/24/2015
-
-**************************************************************************/
-
-class CAvsCameraFilter : public CCaptureFilter
-{
-public:
- //
- // Ctor
- //
- CAvsCameraFilter(
- _In_ PKSFILTER Filter
- );
-
- //
- // Dtor
- //
- virtual
- ~CAvsCameraFilter ();
-
- //
- // DispatchCreate():
- //
- // This is the filter creation dispatch for the capture filter. It
- // creates the CCaptureFilter object, associates it with the AVStream
- // object, and bags it for easy cleanup later.
- //
- static
- NTSTATUS
- DispatchCreate (
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp
- );
-
- // Example of adding a new, custom property.
- DECLARE_PROPERTY_HANDLERS( ULONG, CustomDummy )
-
-protected:
- DWORD m_CustomValue;
-};
diff --git a/avscamera/sys/CameraProfile.h b/avscamera/sys/CameraProfile.h
deleted file mode 100644
index 1a2aca8a..00000000
--- a/avscamera/sys/CameraProfile.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/**************************************************************************
-
- AvsCam - An AVStream Simulated Camera Device.
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- CameraProfile.h
-
- Abstract:
-
- This file contains the helper class CExtendedProfile.
-
- History:
-
- created 3/19/2015
-
-**************************************************************************/
-
-//
-// Helper class for CameraProfile
-//
-class CExtendedProfile : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_PROFILE m_Profile;
-
-public:
- CExtendedProfile( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedProfile( flags, result )
- {
- Size = sizeof(*this);
- m_Profile.ProfileId = KSCAMERAPROFILE_Legacy;
- m_Profile.Index = 0;
- m_Profile.Reserved = 0;
- }
-
- CExtendedProfile( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- m_Profile.ProfileId = KSCAMERAPROFILE_Legacy;
- m_Profile.Index = 0;
- m_Profile.Reserved = 0;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() && (Size >= sizeof(*this));
- }
-};
-
-
diff --git a/avscamera/sys/Capture.cpp b/avscamera/sys/Capture.cpp
deleted file mode 100644
index 0f32aac3..00000000
--- a/avscamera/sys/Capture.cpp
+++ /dev/null
@@ -1,2075 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- capture.cpp
-
- Abstract:
-
- This is the implementation of the CCapturePin class.
-
- CCapturePin wraps a PKSPIN object and does:
- 1. Object construction and cleanup,
- 2. State management,
- 3. Accepts new frame buffers for filling,
- 4. Completes frame buffers delivered by the simulation,
- 5. Negotiates for and sets new formats / data ranges, and
- 6. Manages allocator framing.
-
- History:
-
- created 3/8/2001
-
-**************************************************************************/
-
-#include "Common.h"
-#include <ksmedia.h>
-#include "ntintsafe.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-CCapturePin::
-CCapturePin (
- _In_ PKSPIN Pin
-)
- : m_Pin (Pin)
- , m_PinState(PinStopped)
- , m_Clock(nullptr)
- , m_PendIo(FALSE)
- , m_AcquiredResources(FALSE)
- , m_VideoInfoHeader(nullptr)
- , m_pBitmapInfoHeader(nullptr)
- , m_PreviousStreamPointer(nullptr)
- , m_PresentationTime(0)
- , m_FrameNumber(0)
- , m_DroppedFrames(0)
- , m_DesiredFrames(2)
-/*++
-
-Routine Description:
-
- Construct a new capture pin.
-
-Arguments:
-
- Pin -
- The AVStream pin object corresponding to the capture pin
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-
- NT_ASSERT(Pin);
-
- PKSDEVICE Device = KsPinGetDevice (Pin);
-
- NT_ASSERT(Device);
-
- //
- // Set up our device pointer. This gives us access to "hardware I/O"
- // during the capture routines.
- //
- m_Device = CCaptureDevice::Recast(Device);
-
- NT_ASSERT( m_Device );
-
- m_Sensor = m_Device->GetSensor( KsPinGetParentFilter(Pin ) );
-
- NT_ASSERT( m_Sensor );
-}
-
-CCapturePin::
-~CCapturePin()
-{
- PAGED_CODE();
-
- SAFE_FREE( m_pBitmapInfoHeader );
- SAFE_FREE( m_VideoInfoHeader );
-}
-
-/*************************************************/
-
-NTSTATUS
-CCapturePin::
-ReleaseAllFrames()
-
-/*++
-
-Routine Description:
-
- Clean up any references we're holding on frames after we abruptly
- stop the hardware.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
-
- PAGED_CODE();
-
- PKSSTREAM_POINTER Clone = KsPinGetFirstCloneStreamPointer (m_Pin);
- PKSSTREAM_POINTER NextClone = NULL;
-
- //
- // Walk through the clones, deleting them, and setting DataUsed to
- // zero since we didn't use any data!
- //
- while (Clone)
- {
-
- NextClone = KsStreamPointerGetNextClone (Clone);
-
- Clone->StreamHeader->DataUsed = 0;
- KsStreamPointerDelete (Clone);
-
- Clone = NextClone;
-
- }
-
- return STATUS_SUCCESS;
-
-}
-
-NTSTATUS
-CCapturePin::
-Initialize()
-/*++
-
-Routine Description:
-
- Post construction initialization:
- 1. Add us to the Pin's bag,
- 2. Capture information about the image/video format, and
- 3. Update the allocator's framing to match.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- DBG_ENTER("(Pin=%d)", m_Pin->Id);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- if( !m_Sensor )
- {
- // Fail if we couldn't find the sensor.
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- //
- // Add the item to the object bag if we we were successful.
- // Whenever the pin closes, the bag is cleaned up and we will be
- // freed.
- //
- Status = KsAddItemToObjectBag (
- m_Pin->Bag,
- this,
- reinterpret_cast<PFNKSFREE> (Cleanup)
- );
-
- if( NT_SUCCESS(Status) )
- {
- m_Pin->Context = this;
- }
- }
-
- //
- // If we succeeded so far, stash the video info header away and change
- // our allocator framing to reflect the fact that only now do we know
- // the framing requirements based on the connection format.
- //
- if (NT_SUCCESS (Status))
- {
- Status = CaptureBitmapInfoHeader();
- }
-
- if (NT_SUCCESS(Status))
- {
- //
- // Edit the framing descriptors to match our pin's requirements given the current format.
- //
- Status = UpdateAllocatorFraming();
- }
-
- DBG_LEAVE("(Pin=%d)=0x%08X", m_Pin->Id, Status);
- return Status;
-}
-
-/*************************************************/
-
-
-NTSTATUS
-CCapturePin::
-CaptureBitmapInfoHeader()
-/*++
-
-Routine Description:
-
- Capture information about the image/video format for the pin.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- const GUID ImageInfoSpecifier ={ STATICGUIDOF( KSDATAFORMAT_SPECIFIER_IMAGE ) };
- const GUID VideoInfoSpecifier ={ STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ) };
-
- // Free any previous copy of these header.
- SAFE_FREE(m_pBitmapInfoHeader);
- SAFE_FREE(m_VideoInfoHeader);
-
- m_pBitmapInfoHeader = reinterpret_cast <PKS_BITMAPINFOHEADER> (
- ExAllocatePoolWithTag (
- NonPagedPoolNx,
- sizeof(KS_BITMAPINFOHEADER),
- AVSHWS_POOLTAG
- )
- );
- if( !m_pBitmapInfoHeader )
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if( IsEqualGUID( m_Pin->ConnectionFormat->Specifier, ImageInfoSpecifier ) &&
- m_Pin->ConnectionFormat->FormatSize >= sizeof (KS_DATAFORMAT_IMAGEINFO) )
- {
-
- PKS_BITMAPINFOHEADER ConnectionHeader =
- &((reinterpret_cast <PKS_DATAFORMAT_IMAGEINFO>
- (m_Pin->ConnectionFormat))->ImageInfoHeader);
-
- //
- // Copy the connection format video info header into the newly
- // allocated "captured" video info header.
- //
- *m_pBitmapInfoHeader = *ConnectionHeader;
-
- m_VideoInfoHeader = reinterpret_cast <PKS_VIDEOINFOHEADER> (
- ExAllocatePoolWithTag (
- NonPagedPoolNx,
- sizeof(KS_VIDEOINFOHEADER),
- AVSHWS_POOLTAG
- )
- );
- if( !m_VideoInfoHeader )
- {
- SAFE_FREE( m_pBitmapInfoHeader );
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- //
- // Copy the connection format video info header into the newly
- // allocated "captured" video info header.
- //
- m_VideoInfoHeader->bmiHeader = *ConnectionHeader;
-
- // If we don't have a known bit-depth (compressed formats), assume the worse-case.
- if( m_pBitmapInfoHeader->biBitCount==0 )
- {
- m_pBitmapInfoHeader->biBitCount=32;
- }
-
- // Estimate the image size. The derived pin can chose to override this value.
- m_VideoInfoHeader->bmiHeader.biSizeImage =
- (m_pBitmapInfoHeader->biWidth*m_pBitmapInfoHeader->biHeight*m_pBitmapInfoHeader->biBitCount)/8;
-
- // Estimate a frame rate. The derived pin can chose to override this value.
- m_VideoInfoHeader->AvgTimePerFrame = ONESECOND/30;
- }
- else
- if( IsEqualGUID( m_Pin->ConnectionFormat->Specifier, VideoInfoSpecifier ) &&
- m_Pin->ConnectionFormat->FormatSize >= sizeof (KS_DATAFORMAT_VIDEOINFOHEADER) )
- {
- PKS_VIDEOINFOHEADER ConnectionHeader =
- &((reinterpret_cast <PKS_DATAFORMAT_VIDEOINFOHEADER>
- (m_Pin->ConnectionFormat))->
- VideoInfoHeader);
-
- m_VideoInfoHeader = reinterpret_cast <PKS_VIDEOINFOHEADER> (
- ExAllocatePoolWithTag (
- NonPagedPoolNx,
- KS_SIZE_VIDEOHEADER (ConnectionHeader),
- AVSHWS_POOLTAG
- )
- );
- if( !m_VideoInfoHeader )
- {
- SAFE_FREE( m_pBitmapInfoHeader );
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- //
- // Copy the connection format video info header into the newly
- // allocated "captured" video info header.
- //
- RtlCopyMemory (
- m_VideoInfoHeader,
- ConnectionHeader,
- KS_SIZE_VIDEOHEADER (ConnectionHeader)
- );
-
- //
- // Copy the connection format video info header into the newly
- // allocated "captured" video info header.
- //
- *m_pBitmapInfoHeader = m_VideoInfoHeader->bmiHeader;
- }
-
- DBG_TRACE( "+++ AvgTimePerFrame = %lld +++", m_VideoInfoHeader->AvgTimePerFrame );
-
- return STATUS_SUCCESS;
-}
-
-/*************************************************/
-
-NTSTATUS
-CCapturePin::
-SetState (
- _In_ KSSTATE ToState,
- _In_ KSSTATE FromState
-)
-
-/*++
-
-Routine Description:
-
- This is called when the caputre pin transitions state. The routine
- attempts to acquire / release any hardware resources and start up
- or shut down capture based on the states we are transitioning to
- and away from.
-
-Arguments:
-
- ToState -
- The state we're transitioning to
-
- FromState -
- The state we're transitioning away from
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
-
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- DBG_ENTER( "( Pin=%d, ToState=%s, FromState=%s )\n",
- m_Pin->Id, KSStateToStateName(ToState), KSStateToStateName(FromState) ) ;
-
- switch (ToState)
- {
-
- case KSSTATE_STOP:
-
- //
- // First, stop the hardware if we actually did anything to it.
- //
- if (m_PinState != PinStopped)
- {
- Status = m_Sensor->Stop(m_Pin);
- NT_ASSERT (NT_SUCCESS (Status));
-
- m_PinState = PinStopped;
- }
-
- //
- // We've stopped the "fake hardware". It has cleared out
- // it's scatter / gather tables and will no longer be
- // completing clones. We had locks on some frames that were,
- // however, in hardware. This will clean them up. An
- // alternative location would be in the reset dispatch.
- // Note, however, that the reset dispatch can occur in any
- // state and this should be understood.
- //
- // Some hardware may fill all S/G mappings before stopping...
- // in this case, you may not have to do this. The
- // "fake hardware" here simply stops filling mappings and
- // cleans its scatter / gather tables out on the Stop call.
- //
- Status = ReleaseAllFrames ();
-
- //
- // Release any hardware resources related to this pin.
- //
- if (m_AcquiredResources)
- {
- //
- // If we got an interface to the clock, we must release it.
- //
- if (m_Clock)
- {
- m_Clock->Release ();
- m_Clock = NULL;
- }
-
- m_Sensor->ReleaseHardwareResources (m_Pin);
-
- m_AcquiredResources = FALSE;
- }
-
- break;
-
- case KSSTATE_ACQUIRE:
- //
- // Acquire any hardware resources related to this pin. We should
- // only acquire them here -- **NOT** at filter create time.
- // This means we do not fail creation of a filter because of
- // limited hardware resources.
- //
- // TODO: Move this to a derived CCapturePin class - one
- // specifically for testing, not as a sample.
- if(GetAcquireFailureKey())
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- break;
- }
-
- if (FromState == KSSTATE_STOP)
- {
- Status =
- m_Sensor->
- AcquireHardwareResources (
- m_Pin,
- this,
- m_VideoInfoHeader,
- &m_HardwareSimulation
- );
-
- if (NT_SUCCESS (Status))
- {
- m_AcquiredResources = TRUE;
-
- //
- // Attempt to get an interface to the master clock.
- // This will fail if one has not been assigned. Since
- // one must be assigned while the pin is still in
- // KSSTATE_STOP, this is a guranteed method of getting
- // the clock should one be assigned.
- //
- if (!NT_SUCCESS (
- KsPinGetReferenceClockInterface (
- m_Pin,
- &m_Clock
- )
- ))
- {
- //
- // If we could not get an interface to the clock,
- // don't use one.
- //
- m_Clock = NULL;
- }
- }
- else
- {
- m_AcquiredResources = FALSE;
- }
-
- }
-
- //
- // Standard transport pins will always receive transitions in
- // +/- 1 manner. This means we'll always see a PAUSE->ACQUIRE
- // transition before stopping the pin.
- //
-
- m_FrameNumber = 0;
- m_DroppedFrames = 0;
- break;
-
- case KSSTATE_PAUSE:
- //
- // Stop the hardware simulation if we're coming down from run.
- //
- if (FromState == KSSTATE_RUN)
- {
- m_PresentationTime = 0;
- Status = m_Sensor->Pause (m_Pin, TRUE);
-
- if (NT_SUCCESS (Status))
- {
- m_PinState = PinPaused;
- }
- }
- m_FrameNumber = 0;
- break;
-
- case KSSTATE_RUN:
- //
- // Start the hardware simulation or unpause it depending on
- // whether we're initially running or we've paused and restarted.
- //
- if (FromState == KSSTATE_PAUSE && m_PinState == PinPaused)
- {
- Status = m_Sensor->Pause (m_Pin, FALSE);
- }
- else
- {
- Status = m_Sensor->Start (m_Pin);
- }
-
- if (NT_SUCCESS (Status))
- {
- m_PinState = PinRunning;
- }
- break;
-
- }
-
- DBG_LEAVE( "( Pin=%d, ToState=%s, FromState=%s ) = 0x%08X\n",
- m_Pin->Id, KSStateToStateName(ToState), KSStateToStateName(FromState), Status ) ;
-
- return Status;
-
-}
-
-NTSTATUS
-CCapturePin::
-Process()
-
-/*++
-
-Routine Description:
-
- The process dispatch for the pin bridges to this location.
- We handle setting up scatter gather mappings, etc...
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE( );
-
- DBG_ENTER( "( Pin=%d )", m_Pin->Id );
-
- NTSTATUS Status = STATUS_SUCCESS;
- PKSSTREAM_POINTER Leading;
-
- Leading = KsPinGetLeadingEdgeStreamPointer( m_Pin, KSSTREAM_POINTER_STATE_LOCKED );
-
- while( NT_SUCCESS( Status ) && Leading )
- {
-
- PKSSTREAM_POINTER ClonePointer;
- PSTREAM_POINTER_CONTEXT SPContext = NULL;
-
- //
- // If no data is present in the Leading edge stream pointer, just
- // move on to the next frame
- //
- if( NULL == Leading->StreamHeader->Data )
- {
- Status = KsStreamPointerAdvance( Leading );
- continue;
- }
- //
- // For optimization sake in this particular sample, I will only keep
- // one clone stream pointer per frame. This complicates the logic
- // here but simplifies the completions.
- //
- // I'm also choosing to do this since I need to keep track of the
- // virtual addresses corresponding to each mapping since I'm faking
- // DMA. It simplifies that too.
- //
- if( !m_PreviousStreamPointer )
- {
- //
- // First thing we need to do is clone the leading edge. This allows
- // us to keep reference on the frames while they're in DMA.
- //
- Status = KsStreamPointerClone(
- Leading,
- NULL,
- sizeof (STREAM_POINTER_CONTEXT),
- &ClonePointer
- );
-
- //
- // I use this for easy chunking of the buffer. We're not really
- // dealing with physical addresses. This keeps track of what
- // virtual address in the buffer the current scatter / gather
- // mapping corresponds to for the fake hardware.
- //
- if( NT_SUCCESS( Status ) )
- {
- //
- // Set the stream header data used to 0. We update this
- // in the DMA completions. For queues with DMA, we must
- // update this field ourselves.
- //
- ClonePointer->StreamHeader->DataUsed = 0;
-
- SPContext = reinterpret_cast <PSTREAM_POINTER_CONTEXT>
- (ClonePointer->Context);
-
- SPContext->BufferVirtual =
- reinterpret_cast <PUCHAR> (
- ClonePointer->StreamHeader->Data
- );
- }
- }
- else
- {
- ClonePointer = m_PreviousStreamPointer;
- SPContext = reinterpret_cast <PSTREAM_POINTER_CONTEXT>
- (ClonePointer->Context);
- }
-
- //
- // If the clone failed, likely we're out of resources. Break out
- // of the loop for now. We may end up starving DMA.
- //
- if( !NT_SUCCESS( Status ) )
- {
- KsStreamPointerUnlock( Leading, FALSE );
- break;
- }
-
- //
- // Program the fake hardware. I would use Clone->OffsetOut.*, but
- // because of the optimization of one stream pointer per frame, it
- // doesn't make complete sense.
- //
- ULONG MappingsUsed =
- m_Sensor->ProgramScatterGatherMappings(
- m_Pin,
- &ClonePointer,
- &(SPContext->BufferVirtual),
- Leading->OffsetOut.Mappings,
- Leading->OffsetOut.Remaining
- );
-
- //
- // In order to keep one clone per frame and simplify the fake DMA
- // logic, make a check to see if we completely used the mappings in
- // the leading edge. Set a flag.
- //
- if( MappingsUsed == Leading->OffsetOut.Remaining )
- {
- m_PreviousStreamPointer = NULL;
- }
- else
- {
- m_PreviousStreamPointer = ClonePointer;
- }
-
- if( MappingsUsed )
- {
- //
- // If any mappings were added to scatter / gather queues,
- // advance the leading edge by that number of mappings. If
- // we run off the end of the queue, Status will be
- // STATUS_DEVICE_NOT_READY. Otherwise, the leading edge will
- // point to a new frame. The previous one will not have been
- // dismissed (unless "DMA" completed) since there's a clone
- // pointer referencing the frames.
- //
- Status =
- KsStreamPointerAdvanceOffsets(
- Leading,
- 0,
- MappingsUsed,
- FALSE
- );
- }
- else
- {
- //
- // The hardware was incapable of adding more entries. The S/G
- // table is full.
- //
- Status = STATUS_PENDING;
- break;
- }
- }
-
- //
- // If the leading edge failed to lock (this is always possible, remember
- // that locking CAN occassionally fail), don't blow up passing NULL
- // into KsStreamPointerUnlock. Also, set m_PendIo to kick us later...
- //
- if( !Leading )
- {
- m_PendIo = TRUE;
-
- //
- // If the lock failed, there's no point in getting called back
- // immediately. The lock could fail due to insufficient memory,
- // etc... In this case, we don't want to get called back immediately.
- // Return pending. The m_PendIo flag will cause us to get kicked
- // later.
- //
- Status = STATUS_PENDING;
- }
-
- //
- // If we didn't run the leading edge off the end of the queue, unlock it.
- //
- if( NT_SUCCESS( Status ) && Leading )
- {
- KsStreamPointerUnlock( Leading, FALSE );
- }
- else
- {
- //
- // DEVICE_NOT_READY indicates that the advancement ran off the end
- // of the queue. We couldn't lock the leading edge.
- //
- if( Status == STATUS_DEVICE_NOT_READY )
- {
- Status = STATUS_SUCCESS;
- }
- }
-
- //
- // If we failed with something that requires pending, set the pending I/O
- // flag so we know we need to start it again.
- //
- if( !NT_SUCCESS( Status ) || Status == STATUS_PENDING )
- {
- m_PendIo = TRUE;
- }
-
- DBG_LEAVE( "( Pin=%d )=0x%08X", m_Pin->Id, Status );
-
- return Status;
-}
-
-//
-// Emit metadata here for video or preview pin.
-//
-// This function gives us one last chance to tack metadata onto the sample.
-//
-void
-CCapturePin::
-EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
-)
-{
- PAGED_CODE();
-
- NT_ASSERT(pStreamHeader);
-}
-
-
-NTSTATUS
-CCapturePin::
-CompleteMapping(
- _In_ PKSSTREAM_POINTER Clone
- )
-
-/*++
-
-Routine Description:
-
- Called to notify the pin that a given number of scatter / gather
- mappings have completed. Let the buffers go if possible.
-
-Arguments:
-
- Clone -
- The stream pointer for the frame to complete.
- If Clone is null, use the head of the queue.
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER("(Clone=%p)", Clone);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- if( !Clone )
- {
- Clone = KsPinGetFirstCloneStreamPointer(m_Pin);
- }
-
- //
- // If we have completed all remaining mappings in this clone, it
- // is an indication that the clone is ready to be deleted and the
- // buffer released. Set anything required in the stream header which
- // has not yet been set. If we have a clock, we can timestamp the
- // sample.
- //
- if( Clone )
- {
- if( Clone->StreamHeader->DataUsed >= Clone->OffsetOut.Remaining )
- {
- Clone->StreamHeader->Duration =
- m_VideoInfoHeader->AvgTimePerFrame;
-
- Clone->StreamHeader->OptionsFlags |=
- KSSTREAM_HEADER_OPTIONSF_DURATIONVALID;
-
- //
- // Increment the frame number. This is the total count of frames which
- // have attempted capture.
- //
- m_FrameNumber++;
- DBG_TRACE( "m_FrameNumber=%lld", m_FrameNumber );
-
- //
- // Double check the Stream Header size. AVStream makes no guarantee
- // that because StreamHeaderSize is set to a specific size that you
- // will get that size. If the proper data type handlers are not
- // installed, the stream header will be of default size.
- //
- if ( Clone->StreamHeader->Size >= sizeof (KSSTREAM_HEADER) +
- sizeof (KS_FRAME_INFO))
- {
- PKS_FRAME_INFO FrameInfo = reinterpret_cast <PKS_FRAME_INFO> (
- Clone->StreamHeader + 1
- );
-
- FrameInfo->ExtendedHeaderSize = sizeof (KS_FRAME_INFO);
- FrameInfo->dwFrameFlags = KS_VIDEO_FLAG_FRAME;
- FrameInfo->PictureNumber = (LONGLONG)m_FrameNumber;
-
- // I don't really have a way to tell if the device has dropped a frame
- // or was not able to send a frame on time.
- FrameInfo->DropCount = (LONGLONG)m_DroppedFrames;
- }
-
- KsStreamPointerDelete (Clone);
- }
- else
- {
- //
- // If only part of the mappings in this clone have been completed,
- // update the pointers. Since we're guaranteed this won't advance
- // to a new frame by the check above, it won't fail.
- //
- Status =
- KsStreamPointerAdvanceOffsets(
- Clone,
- 0,
- Clone->StreamHeader->DataUsed,
- FALSE
- );
- }
- }
- else
- {
- // We had nothing to process.
- Status = STATUS_UNSUCCESSFUL;
- }
-
- //
- // If we've used all the mappings in hardware and pended, we can kick
- // processing to happen again if we've completed mappings.
- //
- if (m_PendIo)
- {
- KsPinAttemptProcessing (m_Pin, TRUE);
- m_PendIo = FALSE;
- }
-
- DBG_LEAVE("(Clone=%p)=0x%08X", Clone, Status);
- return Status;
-}
-
-
-bool
-CCapturePin::
-GetAcquireFailureKey()
-{
- NTSTATUS ntstatus;
- bool acquireFailure = false;
- UNICODE_STRING RegistryKeyName;
- OBJECT_ATTRIBUTES ObjectAttributes;
- HANDLE handleRegKey = NULL;
- PKEY_VALUE_FULL_INFORMATION pKeyInfo = NULL;
- ULONG ulKeyInfoSizeNeeded = 0;
- UNICODE_STRING ValueName = {0};
-
-
- PAGED_CODE();
-
- // Get the Registry key
- RtlInitUnicodeString(&RegistryKeyName, L"\\Registry\\Machine\\Software\\Microsoft\\wtt\\MachineConfig");
- InitializeObjectAttributes(&ObjectAttributes,
- &RegistryKeyName,
- OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
- NULL, // handle
- NULL);
-
- ntstatus = ZwOpenKey(&handleRegKey, KEY_READ, &ObjectAttributes);
- // If we can't open the key, we're done. Worst case, we cannot stream.
- if(NT_SUCCESS(ntstatus))
- {
- // Get the location from the registry key
- RtlInitUnicodeString(&ValueName, L"AcquireFailure");
-
- // Figure out how big keyInfo needs to be
- ntstatus = ZwQueryValueKey(handleRegKey,
- &ValueName,
- KeyValueFullInformation,
- pKeyInfo,
- 0,
- &ulKeyInfoSizeNeeded );
-
- // We expect one of these errors
- if( (ntstatus == STATUS_BUFFER_TOO_SMALL) || (ntstatus == STATUS_BUFFER_OVERFLOW) )
- {
- // Allocate the memory needed for the key
- pKeyInfo = (PKEY_VALUE_FULL_INFORMATION) new (NonPagedPoolNx) BYTE[ulKeyInfoSizeNeeded];
- RtlZeroMemory(pKeyInfo, ulKeyInfoSizeNeeded);
-
- // Now get the actual key data
- ntstatus = ZwQueryValueKey( handleRegKey,
- &ValueName,
- KeyValueFullInformation,
- pKeyInfo,
- ulKeyInfoSizeNeeded,
- &ulKeyInfoSizeNeeded );
-
- if(ntstatus == STATUS_SUCCESS)
- {
- acquireFailure = true;
- }
-
- delete[] pKeyInfo;
- }
- }
-
- // All done with the registry
- if (NULL != handleRegKey)
- {
- ZwClose(handleRegKey);
- }
-
- return acquireFailure;
-}
-
-
-NTSTATUS
-CCapturePin::
-DispatchClose(
- _In_ PKSPIN Pin,
- _In_ PIRP Irp
-)
-/*++
-
-Routine Description:
-
- Static thunking function to forward Close
-
-Arguments:
-
- Pin -
- Our pin
- Irp -
- The IRP the request came in on.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- NT_ASSERT( Pin );
- NT_ASSERT( Pin->Context );
- if( Pin && Pin->Context )
- {
- CCapturePin *pPin = reinterpret_cast <CCapturePin *> (Pin->Context);
- Status = pPin->Close( Irp );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-NTSTATUS
-CCapturePin::
-DispatchSetState(
- _In_ PKSPIN Pin,
- _In_ KSSTATE ToState,
- _In_ KSSTATE FromState
-)
-/*++
-
-Routine Description:
-
- Static thunking function to forward SetState
-
-Arguments:
-
- Pin -
- Our pin
- Irp -
- The IRP the request came in on.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- NT_ASSERT( Pin );
- NT_ASSERT( Pin->Context );
- if( Pin && Pin->Context )
- {
- CCapturePin *pPin = reinterpret_cast <CCapturePin *> (Pin->Context);
- Status = pPin->SetState( ToState, FromState );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-NTSTATUS
-CCapturePin::
-DispatchSetFormat(
- _In_ PKSPIN Pin,
- _In_opt_ PKSDATAFORMAT OldFormat,
- _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
- _In_ const KSDATARANGE *DataRange,
- _In_opt_ const KSATTRIBUTE_LIST *AttributeRange
-)
-
-/*++
-
-Routine Description:
-
- This is the set data format dispatch for the capture pin. It is called
- in two circumstances.
-
- 1: Before Pin's creation dispatch has been made to verify that
- Pin->ConnectionFormat is an acceptable format for the range
- DataRange. In this case OldFormat is NULL.
-
- 2: After Pin's creation dispatch has been made and an initial format
- selected in order to change the format for the pin. In this case,
- OldFormat will not be NULL.
-
- Validate that the format is acceptible and perform the actions necessary
- to change format if appropriate.
-
-Arguments:
-
- Pin -
- The pin this format is being set on. The format itself will be in
- Pin->ConnectionFormat.
-
- OldFormat -
- The previous format used on this pin. If this is NULL, it is an
- indication that Pin's creation dispatch has not yet been made and
- that this is a request to validate the initial format and not to
- change formats.
-
- OldAttributeList -
- The old attribute list for the prior format
-
- DataRange -
- A range out of our list of data ranges which was determined to be
- at least a partial match for Pin->ConnectionFormat. If the format
- there is unacceptable for the range, STATUS_NO_MATCH should be
- returned.
-
- AttributeRange -
- The attribute range
-
-Return Value:
-
- Success / Failure
-
- STATUS_SUCCESS -
- The format is acceptable / the format has been changed
-
- STATUS_NO_MATCH -
- The format is not-acceptable / the format has not been changed
-
---*/
-
-{
-
- PAGED_CODE( );
-
- DBG_ENTER( "(Pin->Id=%d)", Pin->Id );
-
- NTSTATUS Status = STATUS_NO_MATCH;
- const GUID ImageInfoSpecifier = { STATICGUIDOF( KSDATAFORMAT_SPECIFIER_IMAGE ) };
- const GUID VideoInfoSpecifier = { STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ) };
-
- //
- // Find the pin, if it exists yet. OldFormat will be an indication of
- // this. If we're changing formats, OldFormat will be non-NULL.
- //
- // You cannot use Pin->Context to make the determination. AVStream
- // preinitializes this to the filter's context.
- //
- CCapturePin *CapPin = reinterpret_cast <CCapturePin *> (Pin->Context);
-
- if( IsEqualGUID( Pin->ConnectionFormat->Specifier, ImageInfoSpecifier ) &&
- Pin->ConnectionFormat->FormatSize >= sizeof (KS_DATAFORMAT_IMAGEINFO) )
- {
- PKS_DATAFORMAT_IMAGEINFO ConnectionFormat = reinterpret_cast <PKS_DATAFORMAT_IMAGEINFO> (Pin->ConnectionFormat);
-
- //
- // DataRange comes out of OUR data range list. I know the range
- // is valid as such.
- //
- const KS_DATARANGE_IMAGE *VIRange = reinterpret_cast <const KS_DATARANGE_IMAGE *> (DataRange);
-
- //
- // Check that bmiHeader.biSize is valid since we use it later.
- //
- ULONG ImageHeaderSize = ConnectionFormat->ImageInfoHeader.biSize;
- ULONG DataFormatSize = sizeof (KSDATAFORMAT) +sizeof(KS_BITMAPINFOHEADER);
-
- if( ImageHeaderSize < ConnectionFormat->ImageInfoHeader.biSize ||
- DataFormatSize < ImageHeaderSize ||
- DataFormatSize > ConnectionFormat->DataFormat.FormatSize )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- //
- // Check that the format is a match for the selected range.
- //
- else if( (ConnectionFormat->ImageInfoHeader.biWidth != VIRange->ImageInfoHeader.biWidth) ||
- (ConnectionFormat->ImageInfoHeader.biHeight != VIRange->ImageInfoHeader.biHeight) ||
- (ConnectionFormat->ImageInfoHeader.biCompression != VIRange->ImageInfoHeader.biCompression) )
- {
- Status = STATUS_NO_MATCH;
- }
- else
- {
-
- ULONG ImageSize;
-
- if( !MultiplyCheckOverflow( (ULONG) ConnectionFormat->ImageInfoHeader.biWidth, (ULONG) abs( ConnectionFormat->ImageInfoHeader.biHeight ), &ImageSize ) )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- else if( !MultiplyCheckOverflow( ImageSize, (ULONG) (ConnectionFormat->ImageInfoHeader.biBitCount/8), &ImageSize ) )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- //
- // Valid for the formats we use. Otherwise, this would be
- // checked later.
- //
- else if( ConnectionFormat->ImageInfoHeader.biSizeImage < ImageSize )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- //
- // We can accept the format.
- //
- Status = STATUS_SUCCESS;
-
- //
- // OldFormat is an indication that this is a format change.
- // Since I do not implement the
- // KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, by default, I do
- // not handle dynamic format changes.
- //
- // If something changes while we're in the stop state, we're
- // fine to handle it since we haven't "configured the hardware"
- // yet.
- //
- if( OldFormat && CapPin )
- {
- //
- // If we're in the stop state, we can handle just about any
- // change. We don't support dynamic format changes.
- //
- if( Pin->DeviceState == KSSTATE_STOP )
- {
- Status = CapPin->CaptureBitmapInfoHeader();
- }
- else
- {
- //
- // Because we don't accept dynamic format changes, we
- // should never get here. Just being over-protective.
- //
- Status = STATUS_INVALID_DEVICE_STATE;
- }
- }
- }
- }
- }
-
- else if( IsEqualGUID( Pin->ConnectionFormat->Specifier,
- VideoInfoSpecifier ) &&
- Pin->ConnectionFormat->FormatSize >=
- sizeof (KS_DATAFORMAT_VIDEOINFOHEADER) )
- {
-
- PKS_DATAFORMAT_VIDEOINFOHEADER ConnectionFormat =
- reinterpret_cast <PKS_DATAFORMAT_VIDEOINFOHEADER>
- (Pin->ConnectionFormat);
-
- //
- // DataRange comes out of OUR data range list. I know the range
- // is valid as such.
- //
- const KS_DATARANGE_VIDEO *VIRange =
- reinterpret_cast <const KS_DATARANGE_VIDEO *>
- (DataRange);
-
- //
- // Check that bmiHeader.biSize is valid since we use it later.
- //
- ULONG VideoHeaderSize = KS_SIZE_VIDEOHEADER(
- &ConnectionFormat->VideoInfoHeader
- );
-
- ULONG DataFormatSize = FIELD_OFFSET(
- KS_DATAFORMAT_VIDEOINFOHEADER, VideoInfoHeader
- ) + VideoHeaderSize;
-
- if(
- VideoHeaderSize < ConnectionFormat->
- VideoInfoHeader.bmiHeader.biSize ||
- DataFormatSize < VideoHeaderSize ||
- DataFormatSize > ConnectionFormat->DataFormat.FormatSize
- )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- //
- // Check that the format is a match for the selected range.
- //
- else if(
- (ConnectionFormat->VideoInfoHeader.bmiHeader.biWidth !=
- VIRange->VideoInfoHeader.bmiHeader.biWidth) ||
-
- (ConnectionFormat->VideoInfoHeader.bmiHeader.biHeight !=
- VIRange->VideoInfoHeader.bmiHeader.biHeight) ||
-
- (ConnectionFormat->VideoInfoHeader.bmiHeader.biCompression !=
- VIRange->VideoInfoHeader.bmiHeader.biCompression)
- )
- {
- Status = STATUS_NO_MATCH;
- }
- else
- {
-
- //
- // Compute the minimum size of our buffers to validate against.
- // The image synthesis routines synthesize |biHeight| rows of
- // biWidth pixels in either RGB24 or UYVY. In order to ensure
- // safe synthesis into the buffer, we need to know how large an
- // image this will produce.
- //
- // I do this explicitly because of the method that the data is
- // synthesized. A variation of this may or may not be necessary
- // depending on the mechanism the driver in question fills the
- // capture buffers. The important thing is to ensure that they
- // aren't overrun during capture.
- //
- ULONG ImageSize;
-
- if( !MultiplyCheckOverflow(
- (ULONG) ConnectionFormat->VideoInfoHeader.bmiHeader.biWidth,
- (ULONG) abs( ConnectionFormat->
- VideoInfoHeader.bmiHeader.biHeight ),
- &ImageSize
- ) )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- //
- // We only support KS_BI_RGB (24) and KS_BI_YUV422 (16), so
- // this is valid for those formats.
- //
- else if( !MultiplyCheckOverflow(
- ImageSize,
- (ULONG) (ConnectionFormat->
- VideoInfoHeader.bmiHeader.biBitCount / 8),
- &ImageSize
- ) )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- //
- // Valid for the formats we use. Otherwise, this would be
- // checked later.
- //
- else if( ConnectionFormat->VideoInfoHeader.bmiHeader.biSizeImage <
- ImageSize )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- //
- // We can accept the format.
- //
- Status = STATUS_SUCCESS;
-
- //
- // OldFormat is an indication that this is a format change.
- // Since I do not implement the
- // KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, by default, I do
- // not handle dynamic format changes.
- //
- // If something changes while we're in the stop state, we're
- // fine to handle it since we haven't "configured the hardware"
- // yet.
- //
- if( OldFormat && CapPin )
- {
- //
- // If we're in the stop state, we can handle just about any
- // change. We don't support dynamic format changes.
- //
- if( Pin->DeviceState == KSSTATE_STOP )
- {
- if( !CapPin->CaptureBitmapInfoHeader( ) )
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- }
- else
- {
- //
- // Because we don't accept dynamic format changes, we
- // should never get here. Just being over-protective.
- //
- Status = STATUS_INVALID_DEVICE_STATE;
- }
- }
- }
- }
- }
-
- DBG_LEAVE( "(Pin->Id=%d)=0x%08X", Pin->Id, Status );
- return Status;
-}
-
-NTSTATUS
-CCapturePin::
-IntersectHandler(
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp,
- _In_ PKSP_PIN PinInstance,
- _In_ PKSDATARANGE CallerDataRange,
- _In_ PKSDATARANGE DescriptorDataRange,
- _In_ ULONG BufferSize,
- _Out_opt_ PVOID Data OPTIONAL,
- _Out_ PULONG DataSize
-)
-
-/*++
-
-Routine Description:
-
- This routine handles video pin intersection queries by determining the
- intersection between two data ranges.
-
-Arguments:
-
- Filter -
- Contains a void pointer to the filter structure.
-
- Irp -
- Contains a pointer to the data intersection property request.
-
- PinInstance -
- Contains a pointer to a structure indicating the pin in question.
-
- CallerDataRange -
- Contains a pointer to one of the data ranges supplied by the client
- in the data intersection request. The format type, subtype and
- specifier are compatible with the DescriptorDataRange.
-
- DescriptorDataRange -
- Contains a pointer to one of the data ranges from the pin descriptor
- for the pin in question. The format type, subtype and specifier are
- compatible with the CallerDataRange.
-
- BufferSize -
- Contains the size in bytes of the buffer pointed to by the Data
- argument. For size queries, this value will be zero.
-
- Data -
- Optionally contains a pointer to the buffer to contain the data
- format structure representing the best format in the intersection
- of the two data ranges. For size queries, this pointer will be
- NULL.
-
- DataSize -
- Contains a pointer to the location at which to deposit the size
- of the data format. This information is supplied by the function
- when the format is actually delivered and in response to size
- queries.
-
-Return Value:
-
- STATUS_SUCCESS if there is an intersection and it fits in the supplied
- buffer, STATUS_BUFFER_OVERFLOW for successful size queries,
- STATUS_NO_MATCH if the intersection is empty, or
- STATUS_BUFFER_TOO_SMALL if the supplied buffer is too small.
-
---*/
-
-{
- PAGED_CODE( );
-
- const GUID ImageInfoSpecifier = { STATICGUIDOF( KSDATAFORMAT_SPECIFIER_IMAGE ) };
- const GUID VideoInfoSpecifier = { STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ) };
- ULONG DataFormatSize;
-
- NT_ASSERT( Filter );
- NT_ASSERT( Irp );
- NT_ASSERT( PinInstance );
- NT_ASSERT( CallerDataRange );
- NT_ASSERT( DescriptorDataRange );
- NT_ASSERT( DataSize );
-
- //
- // Specifier FORMAT_VideoInfo for VIDEOINFOHEADER
- //
- if( IsEqualGUID( CallerDataRange->Specifier, ImageInfoSpecifier ) &&
- CallerDataRange->FormatSize >= sizeof (KS_DATARANGE_IMAGE) )
- {
-
- PKS_DATARANGE_IMAGE callerDataRange =
- reinterpret_cast <PKS_DATARANGE_IMAGE> (CallerDataRange);
-
- PKS_DATARANGE_IMAGE descriptorDataRange =
- reinterpret_cast <PKS_DATARANGE_IMAGE> (DescriptorDataRange);
-
- //
- // Check that the other fields match
- //
- if( (RtlCompareMemory( &callerDataRange->ConfigCaps, &descriptorDataRange->ConfigCaps, sizeof (KS_VIDEO_STREAM_CONFIG_CAPS) )
- != sizeof (KS_VIDEO_STREAM_CONFIG_CAPS)) )
- {
- return STATUS_NO_MATCH;
- }
-
- {
- ULONG ImageHeaderSize = ((PKS_DATARANGE_IMAGE) callerDataRange)->ImageInfoHeader.biSize;
- ULONG DataRangeSize = FIELD_OFFSET( KS_DATARANGE_IMAGE, ImageInfoHeader ) + ImageHeaderSize;
-
- if( ImageHeaderSize < callerDataRange->ImageInfoHeader.biSize ||
- DataRangeSize < ImageHeaderSize ||
- DataRangeSize > callerDataRange->DataRange.FormatSize )
- {
- return STATUS_INVALID_PARAMETER;
- }
- }
-
- DataFormatSize = sizeof (KSDATAFORMAT) +sizeof(KS_BITMAPINFOHEADER);
- //
- // If the passed buffer size is 0, it indicates that this is a size
- // only query. Return the size of the intersecting data format and
- // pass back STATUS_BUFFER_OVERFLOW.
- //
- if( BufferSize == 0 )
- {
- *DataSize = DataFormatSize;
- return STATUS_BUFFER_OVERFLOW;
- }
-
- //
- // Verify that the provided structure is large enough to
- // accept the result.
- //
- if( BufferSize < DataFormatSize )
- {
- return STATUS_BUFFER_TOO_SMALL;
- }
-
- //
- // Copy over the KSDATAFORMAT, followed by the actual VideoInfoHeader
- //
- *DataSize = DataFormatSize;
-
- PKS_DATAFORMAT_IMAGEINFO pFormatImageInfoHeader = PKS_DATAFORMAT_IMAGEINFO( Data );
-
- //
- // Copy over the KSDATAFORMAT. This is precisely the same as the
- // KSDATARANGE (it's just the GUIDs, etc... not the format information
- // following any data format.
- //
- RtlCopyMemory( pFormatImageInfoHeader, DescriptorDataRange, sizeof (KSDATAFORMAT) );
- pFormatImageInfoHeader->DataFormat.FormatSize = DataFormatSize;
-
- //
- // Copy over the callers requested KS_BITMAPINFOHEADER
- //
- RtlCopyMemory( &pFormatImageInfoHeader->ImageInfoHeader, &callerDataRange->ImageInfoHeader, sizeof(KS_BITMAPINFOHEADER) );
- return STATUS_SUCCESS;
- }
- else if( IsEqualGUID( CallerDataRange->Specifier, VideoInfoSpecifier ) &&
- CallerDataRange->FormatSize >= sizeof (KS_DATARANGE_VIDEO) )
- {
-
- PKS_DATARANGE_VIDEO callerDataRange =
- reinterpret_cast <PKS_DATARANGE_VIDEO> (CallerDataRange);
-
- PKS_DATARANGE_VIDEO descriptorDataRange =
- reinterpret_cast <PKS_DATARANGE_VIDEO> (DescriptorDataRange);
-
- PKS_DATAFORMAT_VIDEOINFOHEADER FormatVideoInfoHeader;
-
- //
- // Check that the other fields match
- //
- if( (callerDataRange->bFixedSizeSamples !=
- descriptorDataRange->bFixedSizeSamples) ||
- (callerDataRange->bTemporalCompression !=
- descriptorDataRange->bTemporalCompression) ||
- (callerDataRange->StreamDescriptionFlags !=
- descriptorDataRange->StreamDescriptionFlags) ||
- (callerDataRange->MemoryAllocationFlags !=
- descriptorDataRange->MemoryAllocationFlags) ||
- (RtlCompareMemory( &callerDataRange->ConfigCaps,
- &descriptorDataRange->ConfigCaps,
- sizeof (KS_VIDEO_STREAM_CONFIG_CAPS) ) !=
- sizeof (KS_VIDEO_STREAM_CONFIG_CAPS)) )
- {
- return STATUS_NO_MATCH;
- }
-
- //
- // KS_SIZE_VIDEOHEADER() below is relying on bmiHeader.biSize from
- // the caller's data range. This **MUST** be validated; the
- // extended bmiHeader size (biSize) must not extend past the end
- // of the range buffer. Possible arithmetic overflow is also
- // checked for.
- //
- ULONG VideoHeaderSize = KS_SIZE_VIDEOHEADER(
- &callerDataRange->VideoInfoHeader
- );
-
- ULONG DataRangeSize =
- FIELD_OFFSET( KS_DATARANGE_VIDEO, VideoInfoHeader ) +
- VideoHeaderSize;
-
- //
- // Check that biSize does not extend past the buffer. The
- // first two checks are for arithmetic overflow on the
- // operations to compute the alleged size. (On unsigned
- // math, a+b < a iff an arithmetic overflow occurred).
- //
- if(
- VideoHeaderSize < callerDataRange->
- VideoInfoHeader.bmiHeader.biSize ||
- DataRangeSize < VideoHeaderSize ||
- DataRangeSize > callerDataRange->DataRange.FormatSize
- )
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- DataFormatSize =
- sizeof (KSDATAFORMAT) +
- KS_SIZE_VIDEOHEADER( &callerDataRange->VideoInfoHeader );
-
-
- //
- // If the passed buffer size is 0, it indicates that this is a size
- // only query. Return the size of the intersecting data format and
- // pass back STATUS_BUFFER_OVERFLOW.
- //
- if( BufferSize == 0 )
- {
- *DataSize = DataFormatSize;
- return STATUS_BUFFER_OVERFLOW;
- }
-
- //
- // Verify that the provided structure is large enough to
- // accept the result.
- //
- if( BufferSize < DataFormatSize )
- {
- return STATUS_BUFFER_TOO_SMALL;
- }
-
- //
- // Copy over the KSDATAFORMAT, followed by the actual VideoInfoHeader
- //
- *DataSize = DataFormatSize;
-
- FormatVideoInfoHeader = PKS_DATAFORMAT_VIDEOINFOHEADER( Data );
-
- //
- // Copy over the KSDATAFORMAT. This is precisely the same as the
- // KSDATARANGE (it's just the GUIDs, etc... not the format information
- // following any data format.
- //
- RtlCopyMemory(
- &FormatVideoInfoHeader->DataFormat,
- DescriptorDataRange,
- sizeof (KSDATAFORMAT) );
-
- FormatVideoInfoHeader->DataFormat.FormatSize = DataFormatSize;
-
- //
- // Copy over the callers requested VIDEOINFOHEADER
- //
-
- RtlCopyMemory(
- &FormatVideoInfoHeader->VideoInfoHeader,
- &callerDataRange->VideoInfoHeader,
- KS_SIZE_VIDEOHEADER( &callerDataRange->VideoInfoHeader )
- );
-
- //
- // Calculate biSizeImage for this request, and put the result in both
- // the biSizeImage field of the bmiHeader AND in the SampleSize field
- // of the DataFormat.
- //
- // Note that for compressed sizes, this calculation will probably not
- // be just width * height * bitdepth
- //
- FormatVideoInfoHeader->VideoInfoHeader.bmiHeader.biSizeImage =
- FormatVideoInfoHeader->DataFormat.SampleSize =
- KS_DIBSIZE( FormatVideoInfoHeader->VideoInfoHeader.bmiHeader );
-
- //
- // REVIEW - Perform other validation such as cropping and scaling checks
- //
-
- return STATUS_SUCCESS;
-
- } // End of VIDEOINFOHEADER specifier
-
- return STATUS_NO_MATCH;
-}
-
-NTSTATUS
-CCapturePin::
-DispatchProcess(
- _In_ PKSPIN Pin
-)
-/*++
-
-Routine Description:
-
- Static thunking function to forward Process
-
-Arguments:
-
- Pin -
- Our pin
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- NT_ASSERT( Pin );
- NT_ASSERT( Pin->Context );
- if( Pin && Pin->Context )
- {
- CCapturePin *pPin = reinterpret_cast <CCapturePin *> (Pin->Context);
- Status = pPin->Process();
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-void
-CCapturePin::
-DispatchReset(
- _In_ PKSPIN Pin
-)
-/*++
-
-Routine Description:
-
- Static thunking function to forward Reset
-
-Arguments:
-
- Pin -
- Our pin
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- DBG_ENTER("()");
-
- NT_ASSERT( Pin );
- NT_ASSERT( Pin->Context );
- if( Pin && Pin->Context )
- {
- CCapturePin *pPin = reinterpret_cast <CCapturePin *> (Pin->Context);
- pPin->Reset( );
- }
- DBG_LEAVE("()");
-}
-
-NTSTATUS
-CCapturePin::
-DispatchConnect(
- _In_ PKSPIN Pin
-)
-/*++
-
-Routine Description:
-
- Static thunking function to forward Reset
-
-Arguments:
-
- Pin -
- Our pin
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- NT_ASSERT( Pin );
- NT_ASSERT( Pin->Context );
- if( Pin && Pin->Context )
- {
- CCapturePin *pPin = reinterpret_cast <CCapturePin *> (Pin->Context);
- Status = pPin->Connect( );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-void
-CCapturePin::
-DispatchDisconnect(
- _In_ PKSPIN Pin
-)
-/*++
-
-Routine Description:
-
- Static thunking function to forward Disconnect
-
-Arguments:
-
- Pin -
- Our pin
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- DBG_ENTER("()");
-
- NT_ASSERT( Pin );
- NT_ASSERT( Pin->Context );
- if( Pin && Pin->Context )
- {
- CCapturePin *pPin = reinterpret_cast <CCapturePin *> (Pin->Context);
- pPin->Disconnect( );
- }
- DBG_LEAVE("()");
-}
-
-
-NTSTATUS
-CCapturePin::
-Close(
- _In_ PIRP Irp
-)
-/*++
-
-Routine Description:
-
- Close handler.
-
- Replace or overload if you need special handling.
-
-Arguments:
-
- Irp -
- The IRP the request came in on.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- // Some reasonable default behavior.
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CCapturePin::
-SetFormat(
- _In_opt_ PKSDATAFORMAT OldFormat,
- _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
- _In_ const KSDATARANGE *DataRange,
- _In_opt_ const KSATTRIBUTE_LIST *AttributeRange
-)
-/*++
-
-Routine Description:
-
- SetFormat handler.
-
- Replace or overload if you need special handling.
-
-Arguments:
-
- OldFormat -
- The previous format used on this pin. If this is NULL, it is an
- indication that Pin's creation dispatch has not yet been made and
- that this is a request to validate the initial format and not to
- change formats.
-
- OldAttributeList -
- The old attribute list for the prior format
-
- DataRange -
- A range out of our list of data ranges which was determined to be
- at least a partial match for Pin->ConnectionFormat. If the format
- there is unacceptable for the range, STATUS_NO_MATCH should be
- returned.
-
- AttributeRange -
- The attribute range
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- // Some reasonable default behavior here.
- return STATUS_SUCCESS;
-}
-
-void
-CCapturePin::
-Reset()
-/*++
-
-Routine Description:
-
- Reset handler.
-
- Replace or overload if you need special handling.
-
-Arguments:
-
- None.
-
-Return Value:
-
- None.
-
---*/
-{
- PAGED_CODE( );
-
- // Some reasonable default behavior here.
- m_Sensor->Reset(m_Pin);
-}
-
-NTSTATUS
-CCapturePin::
-Connect()
-/*++
-
-Routine Description:
-
- Connect handler.
-
- Replace or overload if you need special handling.
-
-Arguments:
-
- None.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE( );
-
- // Some reasonable default behavior here.
- return STATUS_SUCCESS;
-}
-
-void
-CCapturePin::
-Disconnect()
-/*++
-
-Routine Description:
-
- Disconnect handler.
-
- Replace or overload if you need special handling.
-
-Arguments:
-
- None.
-
-Return Value:
-
- None.
-
---*/
-{
- PAGED_CODE( );
-
- // Some reasonable default behavior here.
-}
-
-// Update the Pin's Allocator Framing
-NTSTATUS
-CCapturePin::
-UpdateAllocatorFraming()
-{
- PAGED_CODE();
-
- // Acquire the lock and update the Pin's allocator framing.
- NTSTATUS Status =
- KsEdit( m_Pin, &m_Pin->Descriptor, AVSHWS_POOLTAG);
-
- if( NT_SUCCESS( Status ) )
- {
- //
- // If the edits proceeded without running out of memory, adjust
- // the framing based on the video info header.
- //
- Status = KsEdit( m_Pin, &m_Pin->Descriptor->AllocatorFraming, AVSHWS_POOLTAG );
-
- if( NT_SUCCESS( Status ) )
- {
- //
- // We've KsEdit'ed this... I'm safe to cast away constness as
- // long as the edit succeeded.
- //
- PKSALLOCATOR_FRAMING_EX Framing =
- const_cast <PKSALLOCATOR_FRAMING_EX> (
- m_Pin->Descriptor->AllocatorFraming
- );
-
- Framing->FramingItem[0].Frames = m_DesiredFrames;
- Framing->FramingItem[0].PhysicalRange.MinFrameSize = m_VideoInfoHeader->bmiHeader.biSize;
- Framing->FramingItem[0].PhysicalRange.MaxFrameSize = m_VideoInfoHeader->bmiHeader.biSize;
- Framing->FramingItem [0].FramingRange.Range.MinFrameSize = m_VideoInfoHeader->bmiHeader.biSize;
- Framing->FramingItem [0].FramingRange.Range.MaxFrameSize = m_VideoInfoHeader->bmiHeader.biSize;
-
- Framing->FramingItem [0].PhysicalRange.Stepping = 0;
- Framing->FramingItem [0].FramingRange.Range.Stepping = 0;
-
- DBG_TRACE( "Advertising Frame requirement: %d", m_DesiredFrames );
- DBG_TRACE("Image size estimate of: %d bytes", m_VideoInfoHeader->bmiHeader.biSize );
- }
- }
-
- DBG_LEAVE("()=0x%08X",Status);
- return Status;
-}
-
diff --git a/avscamera/sys/Capture.h b/avscamera/sys/Capture.h
deleted file mode 100644
index 5056c0d4..00000000
--- a/avscamera/sys/Capture.h
+++ /dev/null
@@ -1,305 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- capture.h
-
- Abstract:
-
- This file contains header for the base capture pin class for a filter.
- The camera sample performs "fake" DMA directly into the capture
- buffers. Common buffer DMA will work slightly differently.
-
- For common buffer DMA, the general technique would be DPC schedules
- processing with KsPinAttemptProcessing. The processing routine grabs
- the leading edge, copies data out of the common buffer and advances.
- Cloning would not be necessary with this technique. It would be
- similiar to the way "AVSSamp" works, but it would be pin-centric.
-
- History:
-
- created 3/8/2001
-
-**************************************************************************/
-
-#pragma once
-#include <initguid.h>
-
-#define DMAX_X 640
-#define DMAX_Y 480
-#define D_X 320
-#define D_Y 240
-
-#define DMAX_X_OS 728
-#define DMAX_Y_OS 576
-#define D_X_OS 384
-#define D_Y_OS 240
-
-///////////////////////////////////////////////////////////////////////////////
-// GUID for primary and FFC cameras
-///////////////////////////////////////////////////////////////////////////////
-// {9D9A0F5E-CDE9-49f5-B464-BF13429DDEB5}
-DEFINE_GUID(PRIMARY_CAMERA_GUID,
- 0x9d9a0f5e, 0xcde9, 0x49f5, 0xb4, 0x64, 0xbf, 0x13, 0x42, 0x9d, 0xde, 0xb5);
-
-// {75D53C4E-963E-4415-AA88-89107F08D1EE}
-DEFINE_GUID(FRONT_FACING_CAMERA_GUID,
- 0x75d53c4e, 0x963e, 0x4415, 0xaa, 0x88, 0x89, 0x10, 0x7f, 0x8, 0xd1, 0xee);
-
-/*
-#define Mpx12_X 4160
-#define Mpx12_Y 3120
-#define Mpx5_X 2592
-#define Mpx5_Y 1944
-#define Mpx8_X 3264
-#define Mpx8_Y 2448
-*/
-//
-// STREAM_POINTER_CONTEXT:
-//
-// This is the context structure we associate with all clone stream pointers.
-// It allows the mapping code to rip apart the buffer into chunks the same
-// size as the scatter/gather mappings in order to fake scatter / gather
-// bus-master DMA.
-//
-typedef struct _STREAM_POINTER_CONTEXT
-{
-
- PUCHAR BufferVirtual;
-
-} STREAM_POINTER_CONTEXT, *PSTREAM_POINTER_CONTEXT;
-
-//
-// CCapturePin:
-//
-// The video capture pin class.
-//
-class CCapturePin :
- public ICapturePin,
- public CNonCopyable
-{
-protected:
- PKSPIN m_Pin; // The AVStream pin we're associated with.
- CCaptureDevice *m_Device; // Pointer to the internal device object for our capture device.
- CSensor *m_Sensor; // The h/w sensor simulation for the filter.
- CHardwareSimulation *m_HardwareSimulation; // The h/w isp simulation for this pin, if the pin has been through KSSTATE_ACQUIRE.
- PIN_STATE m_PinState; // The state we've put the hardware into.
- PIKSREFERENCECLOCK m_Clock; // The clock we've been assigned.
- BOOLEAN m_PendIo; // An indication of whether or not we pended I/O for some reason.
- BOOLEAN m_AcquiredResources; // An indication of whether or not this pin has acquired the necessary hardware resources to operate.
- PKS_VIDEOINFOHEADER m_VideoInfoHeader;
- PKS_BITMAPINFOHEADER m_pBitmapInfoHeader; // Optional info for image formats.
-
- //
- // If we are unable to insert all of the mappings in a stream pointer into
- // the "fake" hardware's scatter / gather table, we set this to the
- // stream pointer that's incomplete. This is done both to make the
- // relasing easier and to make it easier to fake the scatter / gather
- // hardware.
- //
- PKSSTREAM_POINTER m_PreviousStreamPointer;
- LONGLONG m_PresentationTime;
- LONGLONG m_FrameNumber;
- LONGLONG m_DroppedFrames;
-
- ULONG m_DesiredFrames;
-
- //
- // ReleaseAllFrames():
- //
- // Clean up any references we hold on frames in the queue. This is called
- // when we abruptly stop the fake hardware.
- //
- NTSTATUS
- ReleaseAllFrames ();
-
- static
- void
- Cleanup (
- _In_ CCapturePin *Pin)
- {
- delete Pin;
- }
-
- //
- // Emit metadata here for video or preview pin.
- //
- virtual
- void
- EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
- );
-
- // Helper function for finding our filter object.
- CCaptureFilter *
- GetFilter()
- {
- return reinterpret_cast <CCaptureFilter *>
- (KsPinGetParentFilter(m_Pin)->Context);
- }
-
- virtual
- NTSTATUS
- Close(
- _In_ PIRP Irp
- );
-
- // Intended to give the pin an opportunity to do something extra with the selected format.
- virtual
- NTSTATUS
- SetFormat(
- _In_opt_ PKSDATAFORMAT OldFormat,
- _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
- _In_ const KSDATARANGE *DataRange,
- _In_opt_ const KSATTRIBUTE_LIST *AttributeRange
- );
-
- virtual
- NTSTATUS
- Process( );
-
- virtual
- NTSTATUS
- SetState(
- _In_ KSSTATE ToState,
- _In_ KSSTATE FromState
- );
-
- virtual
- void
- Reset();
-
- virtual
- NTSTATUS
- Connect(); // Pin Connect
-
- virtual
- void
- Disconnect(); // Pin Disconnect
-
- virtual
- NTSTATUS
- CaptureBitmapInfoHeader( );
-
- virtual
- NTSTATUS
- Initialize();
-
- void
- SetDesiredFrames( ULONG n )
- {
- m_DesiredFrames = n;
- }
-
-public:
- //
- // CCapturePin():
- //
- // The capture pin's constructor. Initialize any non-0, non-NULL fields
- // (since new will have zero'ed the memory anyway) and set up our
- // device level pointers for access during capture routines.
- //
- CCapturePin( _In_ PKSPIN Pin);
-
- //
- // ~CCapturePin():
- //
- // The capture pin's destructor.
- //
- virtual
- ~CCapturePin();
-
- //
- // ICapturePin::CompleteMapping()
- //
- // This is the capture pin notification mechanism for mapping completion.
- // When the device detects that frames have been completed by the fake
- // hardware, it informs the capture sink through this method.
- //
- virtual
- NTSTATUS
- CompleteMapping(
- _In_ PKSSTREAM_POINTER Clone=nullptr
- );
-
- // Update the Pin's Allocator Framing
- virtual
- NTSTATUS
- UpdateAllocatorFraming();
-
- // TEST: Move this to a derived CCapturePin class - one
- // specifically for testing, not as a sample.
- static
- bool
- GetAcquireFailureKey();
-
- PIN_STATE GetState() const
- {
- return m_PinState;
- }
-
- static
- NTSTATUS
- DispatchClose(
- _In_ PKSPIN Pin,
- _In_ PIRP Irp
- );
- static NTSTATUS DispatchSetState(
- _In_ PKSPIN Pin,
- _In_ KSSTATE ToState,
- _In_ KSSTATE FromState
- );
-
- static NTSTATUS DispatchSetFormat(
- _In_ PKSPIN Pin,
- _In_opt_ PKSDATAFORMAT OldFormat,
- _In_opt_ PKSMULTIPLE_ITEM OldAttributeList,
- _In_ const KSDATARANGE *DataRange,
- _In_opt_ const KSATTRIBUTE_LIST *AttributeRange
- );
-
- static NTSTATUS DispatchProcess( _In_ PKSPIN Pin );
-
- static void DispatchReset( _In_ PKSPIN );
- static NTSTATUS DispatchConnect( _In_ PKSPIN Pin ); // Pin Connect
- static void DispatchDisconnect( _In_ PKSPIN Pin ); // Pin Disconnect
-
- static
- NTSTATUS
- IntersectHandler(
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp,
- _In_ PKSP_PIN PinInstance,
- _In_ PKSDATARANGE CallerDataRange,
- _In_ PKSDATARANGE DescriptorDataRange,
- _In_ ULONG BufferSize,
- _Out_opt_ PVOID Data OPTIONAL,
- _Out_ PULONG DataSize
- );
-};
-
-//
-// Define a dispatch table for a capture pin. It provides notifications
-// about creation, closure, processing, data formats, etc. using naming
-// conventions shared by all CCapturePin derived classes.
-//
-#define DEFINE_CAMERA_KSPIN_DISPATCH( Table, Class ) \
-const \
-KSPIN_DISPATCH \
-Table ={ \
- Class::DispatchCreate, /* Pin Create */ \
- Class::DispatchClose, /* Pin Close */ \
- Class::DispatchProcess, /* Pin Process */ \
- Class::DispatchReset, /* Pin Reset */ \
- Class::DispatchSetFormat, /* Pin Set Data Format */ \
- Class::DispatchSetState, /* Pin Set Device State */ \
- Class::DispatchConnect, /* Pin Connect */ \
- Class::DispatchDisconnect, /* Pin Disconnect */ \
- NULL, /* Clock Dispatch */ \
- NULL /* Allocator Dispatch */ \
-};
-
diff --git a/avscamera/sys/Common.h b/avscamera/sys/Common.h
deleted file mode 100644
index 5ed63b6a..00000000
--- a/avscamera/sys/Common.h
+++ /dev/null
@@ -1,704 +0,0 @@
-
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2015, Microsoft Corporation.
-
- File:
-
- Common.h
-
- Abstract:
-
- Common project header.
-
- History:
-
- created 02/18/2015
-
-**************************************************************************/
-
-#pragma once
-
-#define _NO_SYS_GUID_OPERATOR_EQ_
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <wdm.h>
-#include <windef.h>
-#include <unknown.h>
-#include <ks.h>
-#include <ksmedia.h>
-#include <kcom.h>
-#include <stdunk.h>
-#include <ntstrsafe.h>
-#define NOBITMAP
-#include <mmreg.h>
-#undef NOBITMAP
-#include <acpitabl.h>
-
-#include "MetadataInternal.h"
-#include "CustomProperties.h"
-#include "Dbg.h"
-
-/*************************************************
-
- Add definitions that are missing for C++14.
-
-*************************************************/
-
-/*++
-
-Routine Description:
-
- Array new() operator for creating objects with a specified allocation tag.
-
-Arguments:
-
- iSize -
- The size of the entire allocation.
-
- poolType -
- The type of allocation. Ex: PagedPool or NonPagedPoolNx
-
- tag -
- A 4-byte allocation identifier.
-
-Return Value:
-
- None
-
---*/
-inline
-PVOID
-operator new[](
- size_t iSize,
- _When_((poolType & NonPagedPoolMustSucceed) != 0,
- __drv_reportError("Must succeed pool allocations are forbidden. "
- "Allocation failures cause a system crash"))
- POOL_TYPE poolType,
- ULONG tag
-)
-{
- PVOID result = ExAllocatePoolWithTag(poolType, iSize, tag);
-
- if (result)
- {
- RtlZeroMemory(result, iSize);
- }
-
- return result;
-}
-
-/*++
-
-Routine Description:
-
- Array delete() operator.
-
-Arguments:
-
- pVoid -
- The memory to free.
-
-Return Value:
-
- None
-
---*/
-inline
-void
-__cdecl
-operator delete[](
- PVOID pVoid
-)
-{
- if (pVoid)
- {
- ExFreePool(pVoid);
- }
-}
-
-/*++
-
-Routine Description:
-
- Sized delete() operator.
-
-Arguments:
-
- pVoid -
- The memory to free.
-
- size -
- The size of the memory to free.
-
-Return Value:
-
- None
-
---*/
-inline void __cdecl operator delete
-(
- void *pVoid,
- size_t /*size*/
-)
-{
- if (pVoid)
- {
- ExFreePool(pVoid);
- }
-}
-
-/*++
-
-Routine Description:
-
- Sized delete[]() operator.
-
-Arguments:
-
- pVoid -
- The memory to free.
-
- size -
- The size of the memory to free.
-
-Return Value:
-
- None
-
---*/
-inline void __cdecl operator delete[]
-(
- void *pVoid,
- size_t /*size*/
-)
-{
- if (pVoid)
- {
- ExFreePool(pVoid);
- }
-}
-
-/*************************************************
-
- Misc Definitions
-
-*************************************************/
-#pragma warning (disable : 4100 4127 4131 4189 4701 4706)
-#define STR_MODULENAME "AvsCamera: "
-
-#define IFFAILED_EXIT(status) \
- if (!NT_SUCCESS( Status = (status) )) \
- { \
- goto done; \
- }
-
-#define IFNULL_EXIT(exp) \
- if ( (exp) == nullptr ) \
- { \
- Status = STATUS_INSUFFICIENT_RESOURCES; \
- goto done; \
- }
-
-//
-// Number of 100ns in one second
-//
-#define ONESECOND 10000000
-
-#define ABS(x) ((x) < 0 ? (-(x)) : (x))
-
-#ifndef mmioFOURCC
-#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
- ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
- ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
-#endif
-
-#define FOURCC_YUY2 mmioFOURCC('Y', 'U', 'Y', '2')
-#define FOURCC_NV12 mmioFOURCC('N', 'V', '1', '2')
-
-//Number of filters: FFC, RFC
-#define CAPTURE_FILTER_COUNT 2
-
-//filter index
-#define CAPTURE_FILTER_RFC 0
-#define CAPTURE_FILTER_FFC 1
-
-//Arbitrary Maximum faces
-#define MAX_FACES 15
-
-//
-// CAPTURE_PIN_DATA_RANGE_COUNT:(formats)
-//
-// The number of ranges supported on the capture pin.
-//
-#define IMAGE_CAPTURE_PIN_DATA_RANGE_COUNT 2
-#define VIDEO_CAPTURE_PIN_DATA_RANGE_COUNT 30
-#define VIDEO_PREVIEW_PIN_DATA_RANGE_COUNT 15
-
-//
-// CAPTURE_FILTER_PIN_COUNT:
-//
-// The number of pins on the capture filter.
-//
-#define CAPTURE_FILTER_VIDEO_PIN_COUNT 2
-#define CAPTURE_FILTER_IMAGE_PIN_COUNT 1
-#define CAPTURE_FILTER_PIN_COUNT (CAPTURE_FILTER_VIDEO_PIN_COUNT+CAPTURE_FILTER_IMAGE_PIN_COUNT)
-
-
-#define CAPTURE_FILTER_VIDEO_PIN 0
-#define CAPTURE_FILTER_PREVIEW_PIN 1
-#define CAPTURE_FILTER_STILL_PIN 2
-
-//
-// Define the number of frames needed in the queue for each pin.
-//
-#define IMAGE_CAPTURE_PIN_MINIMUM_FRAMES 3
-#define VIDEO_CAPTURE_PIN_MINIMUM_FRAMES 4
-#define PREVIEW_PIN_MINIMUM_FRAMES 6
-#define IMAGE_CAPTURE_PIN_MAXIMUM_FRAMES 20
-#define IMAGE_CAPTURE_PIN_MAXIMUM_HISTORY_FRAMES 10
-
-//
-// CAPTURE_FILTER_CATEGORIES_COUNT:
-//
-// The number of categories for the capture filter.
-//
-#define CAPTURE_FILTER_CATEGORIES_COUNT 3
-
-#define AVSHWS_POOLTAG 'hSVA'
-
-//
-// Focal length definitions
-//
-
-// These are the definitions found in MSDN for the legacy zoom controls.
-//
-//#define FOCALLENGTH_OCULAR 50
-//#define FOCALLENGTH_OPTICAL_MIN 10
-//#define FOCALLENGTH_OPTICAL_MAX 600
-
-//#define FOCALLENGTH_OCULAR 50
-//#define FOCALLENGTH_OPTICAL_MIN 10
-//#define FOCALLENGTH_OPTICAL_MAX 600
-
-// Note: Despite what MSDN says, they are NOT limits as far as the
-// pipeline is conerned. You should supply values here that are
-// appropriate to your hardware - whatever that may be.
-//
-// Also note that since both optical and ocular focal length are
-// nomally measured in millimeters, and since the optical length is
-// always the numerator and ocular is used as the denominator, the
-// units (millimeters) cancel out. This means you can stick any set
-// of values you like here that can be used to represent the min and
-// maximum zoom value of your hardware as a simple rational number.
-//
-// Again, the rational number is: (Objective length / Ocular length)
-//
-// We use the following definitions in this simulation in order to have the
-// values produced and used in the legacy control be the same as the ones
-// in the new extended zoom control.
-//
-#define FOCALLENGTH_OCULAR (1<<16) // Denominator of 2^16 makes this the same as Q16 format in extended.
-#define FOCALLENGTH_OPTICAL_MIN (FOCALLENGTH_OCULAR/16) // Allow a wide-field view of 1/16th.
-#define FOCALLENGTH_OPTICAL_MAX (FOCALLENGTH_OCULAR*32) // Allow a zoom-in view of 32x.
-
-// Values for Power Line Frequency
-#define POWERLINEFREQ_DISABLED 0
-#define POWERLINEFREQ_50HZ 1
-#define POWERLINEFREQ_60HZ 2
-#define POWERLINEFREQ_DEFAULT POWERLINEFREQ_DISABLED
-
-
-//
-// Q-format definitions.
-//
-#define BASE_Q(n) (((ULONGLONG)1)<<n)
-#define TO_Q31(_x_) (LONGLONG)( (_x_) * BASE_Q(31) )
-#define TO_Q16(_x_) (LONGLONG)( (_x_) * BASE_Q(16) )
-#define FROM_Q16(_x_, _denominator_) ((LONG)( (LONGLONG)(_x_) / ( TO_Q16(1) / (LONGLONG)(_denominator_)) ))
-
-#define MULT_Q16(_x_, _y_) (LONGLONG)((((LONGLONG)(_x_) * (LONGLONG)(_y_)) + (BASE_Q(15)))>>16)
-#define DIV_Q16(_x_, _y_) (LONGLONG)((((LONGLONG)(_x_)<<16)+(_y_/2))/(LONGLONG)(_y_))
-
-#define MAKEWORD(a, b) ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))
-#define MAKELONG(a, b) ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
-
-//
-// Copy of histogram channel bitmask definitions from mfapi.h (not available in wdk).
-//
-#define MF_HISTOGRAM_CHANNEL_Y 0x00000001
-#define MF_HISTOGRAM_CHANNEL_R 0x00000002
-#define MF_HISTOGRAM_CHANNEL_G 0x00000004
-#define MF_HISTOGRAM_CHANNEL_B 0x00000008
-#define MF_HISTOGRAM_CHANNEL_Cb 0x00000010
-#define MF_HISTOGRAM_CHANNEL_Cr 0x00000020
-
-/*************************************************
-
- Externed information
-
-*************************************************/
-//
-// filter.cpp externs:
-//
-extern
-const
-KSFILTER_DISPATCH
-AvsCameraFilterDispatch;
-
-extern
-const
-KSFILTER_DESCRIPTOR
-AvsCameraFilterDescriptor;
-
-extern
-const
-KSFILTER_DESCRIPTOR
-AvsCameraFilterDescriptorFFC;
-
-extern
-const
-KSPIN_DESCRIPTOR_EX
-AvsCameraFilterPinDescriptors [CAPTURE_FILTER_PIN_COUNT];
-
-extern
-const
-KSPIN_DESCRIPTOR_EX
-AvsCameraFilterPinDescriptorsFFC [CAPTURE_FILTER_PIN_COUNT];
-
-extern
-const
-GUID
-AvsCameraFilterCategories [CAPTURE_FILTER_CATEGORIES_COUNT];
-
-//
-// capture.cpp externs:
-//
-extern
-const
-KSALLOCATOR_FRAMING_EX
-VideoCapturePinAllocatorFraming;
-
-extern
-const
-KSALLOCATOR_FRAMING_EX
-ImageCapturePinAllocatorFraming;
-
-extern
-const
-KSPIN_DISPATCH
-VideoCapturePinDispatch;
-
-extern
-const
-KSPIN_DISPATCH
-ImageCapturePinDispatch;
-
-extern
-const
-PKSDATARANGE
-VideoCapturePinDataRanges [VIDEO_CAPTURE_PIN_DATA_RANGE_COUNT];
-
-extern
-const
-PKSDATARANGE
-VideoPreviewPinDataRanges[VIDEO_PREVIEW_PIN_DATA_RANGE_COUNT];
-
-extern
-const
-PKSDATARANGE
-ImageCapturePinDataRanges[IMAGE_CAPTURE_PIN_DATA_RANGE_COUNT];
-
-/*************************************************
-
- Enums / Typedefs
-
-*************************************************/
-
-typedef enum _PIN_STATE
-{
-
- PinStopped = 0,
- PinPaused,
- PinRunning
-
-} PIN_STATE, *PPIN_STATE;
-
-typedef enum _PIN_MODE
-{
-
- PinNormalMode = 0,
- PinBurstMode
-
-} PIN_MODE, *PPIN_MODE;
-
-
-/*************************************************
-
- Class Definitions
-
-*************************************************/
-
-struct ISP_FRAME_SETTINGS
-{
- ULONGLONG ISOMode;
- ULONG ISOValue; // for Manual ISO settings.
- KSCAMERA_EXTENDEDPROP_EVCOMPENSATION EVCompensation;
- ULONGLONG WhiteBalanceMode;
- KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING WhiteBalanceSetting;
- ULONGLONG ExposureMode;
- KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING ExposureSetting;
- ULONGLONG FocusMode;
- KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING FocusSetting;
- ULONGLONG FocusPriority;
- ULONGLONG FlashMode;
- ULONG FlashValue; // Adjustable power setting (0-100)
- BOOLEAN bPhotoConfirmation;
-} ;
-
-struct SOC_CAP_WITH_STEPPING
-{
- KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER Hdr;
- KSPROPERTY_STEPPING_LONG Stepping;
-} ;
-
-struct SOC_CAP_WITH_STEPPING_LONGLONG
-{
- KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER Hdr;
- KSPROPERTY_STEPPING_LONGLONG Stepping;
-} ;
-
-//
-// ICapturePin:
-//
-// This is a capture pin interface. The device level calls back the
-// CompleteMapping method passing the number of completed mappings for
-// the capture pin.
-//
-class ICapturePin
-{
-
-public:
-
- virtual
- NTSTATUS
- CompleteMapping(
- _In_ PKSSTREAM_POINTER Clone=nullptr
- ) = 0;
-
-};
-
-class LockDevice
-{
-public:
-
- LockDevice(PKSDEVICE device) : m_device(device)
- {
- NT_ASSERT(m_device);
- KsAcquireDevice(m_device);
- }
-
- ~LockDevice()
- {
- KsReleaseDevice(m_device);
- }
-private:
- PKSDEVICE m_device;
-};
-
-class LockFilter
-{
-public:
-
- LockFilter(PKSFILTER filter) : m_filter(filter)
- {
- NT_ASSERT(m_filter);
- KsFilterAcquireControl(m_filter);
- }
-
- ~LockFilter()
- {
- KsFilterReleaseControl(m_filter);
- }
-private:
- PKSFILTER m_filter;
-};
-
-// The following class definitions and ctors are used solely
-// to simplify initialization of the parent metadata structures.
-// They are not here for any other purpose.
-
-template <class T, class U>
-class CMetaRational : public U
-{
-public:
- CMetaRational( T Num=1, T Denom=1 )
- {
- Set=TRUE;
- Numerator = Num;
- Denominator = Denom;
- }
-};
-
-typedef CMetaRational<UINT32, METADATA_RATIONAL> CMetadataRational;
-typedef CMetaRational<INT32, METADATA_SRATIONAL> CMetadataSRational;
-
-template <class T, class U>
-class CMetaPrimative : public U
-{
-public:
- CMetaPrimative( T n )
- {
- Set = TRUE;
- Value = n;
- }
-};
-
-typedef CMetaPrimative<UINT16, METADATA_UINT16> CMetadataShort;
-typedef CMetaPrimative<UINT32, METADATA_UINT32> CMetadataLong;
-typedef CMetaPrimative<INT64, METADATA_INT64> CMetadataLongLong;
-typedef CMetaPrimative<UINT64, METADATA_UINT64> CMetadataULongLong;
-
-class CMetadataShortString : public METADATA_SHORTSTRING
-{
-public:
- CMetadataShortString(
- _In_z_ const CHAR *str
- )
- {
- Length = (UINT32) min(strlen(str), sizeof(String));
- strncpy_s( String, str, Length );
- }
-};
-
-class CMetadataEVCompensation : public METADATA_EVCOMP
-{
-public:
- CMetadataEVCompensation(
- _In_ UINT64 flags,
- _In_ UINT32 value
- )
- {
- Set = TRUE;
- Flags = flags;
- Value = value;
- }
-};
-
-typedef struct
-{
- LONG Value;
- ULONG Flags;
- ULONG Capabilities;
-} VIDCAP_PROPERTY, *PVIDCAP_PROPERTY;
-
-typedef struct
-{
- LONG lOcularFocalLength;
- LONG lObjectiveFocalLengthMin;
- LONG lObjectiveFocalLengthMax;
-} FOCAL_LENGTH_PROPERTY, *PFOCAL_LENGTH_PROPERTY;
-
-const ULONG KSCAMERA_EXTENDEDPROP_VERSION = 1;
-
-//
-// Note: I cannot simplify this down to just the FrameIndex.
-// Past frames and non-VPS photos can have a photo confirmation set
-// and those images will not have an index associated with them.
-//
-class PHOTOCONFIRMATION_INFO
-{
-public:
- PHOTOCONFIRMATION_INFO(
- _In_ ULONG FrameIndex,
- _In_ LONGLONG Time
- )
- : m_Index( FrameIndex )
- , m_Time(Time)
- , m_bRequired(TRUE)
- {}
-
- PHOTOCONFIRMATION_INFO()
- : m_Index(0)
- , m_Time(0)
- , m_bRequired( FALSE )
- {}
-
- BOOL
- isRequired()
- {
- return m_bRequired;
- }
-
- ULONG
- getIndex()
- {
- return m_Index;
- }
-
- LONGLONG
- getTime()
- {
- return m_Time;
- }
-
-private:
- BOOL m_bRequired;
- ULONG m_Index;
- LONGLONG m_Time;
-};
-
-/*************************************************
-
- Global Functions
-
-*************************************************/
-
-/*************************************************
-
- Internal Includes
-
-*************************************************/
-
-#include "util.h"
-#include "NonCopyable.h"
-#include "ref.h"
-#include "Mutex.h"
-#include "Waitable.h"
-#include "WorkItem.h"
-#include "Timer.h"
-#include "ExtendedProperty.h"
-#include "ExtendedVidProcSetting.h"
-#include "ExtendedEvComp.h"
-#include "ExtendedMetadata.h"
-#include "ExtendedPhotoMode.h"
-#include "ExtendedMaxVideoFpsForPhotoRes.h"
-#include "ExtendedFieldOfView.h"
-#include "ExtendedCameraAngleOffset.h"
-#include "CameraProfile.h"
-#include "Synthesizer.h"
-#include "XRGBSynthesizer.h"
-#include "RGB24Synthesizer.h"
-#include "YUVSynthesizer.h"
-#include "YUY2Synthesizer.h"
-#include "NV12Synthesizer.h"
-#include "hwsim.h"
-#include "ImageHwSim.h"
-#include "PreviewHwSim.h"
-#include "VideoHwSim.h"
-#include "device.h"
-#include "AvsCameraDevice.h"
-#include "Roi.h"
-#include "Sensor.h"
-#include "SensorSimulation.h"
-#include "filter.h"
-#include "AvsCameraFilter.h"
-#include "capture.h"
-#include "videocapture.h"
-#include "imagecapture.h"
-#include <uuids.h>
-#include <devpkey.h>
diff --git a/avscamera/sys/Dbg.h b/avscamera/sys/Dbg.h
deleted file mode 100644
index b0bc6e80..00000000
--- a/avscamera/sys/Dbg.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/**************************************************************************
-
- AVStream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- Dbg.h
-
- Abstract:
-
- Debug definitions.
-
- History:
-
- created 2/18/2015
-
-**************************************************************************/
-
-#pragma once
-
-#define DEBUGLVL_VERBOSE 2
-#define DEBUGLVL_TERSE 1
-#define DEBUGLVL_ERROR 0
-
-const int DebugLevel = DEBUGLVL_TERSE;
-
-#if (DBG)
-#define _DbgPrintF(lvl, strings) \
-{ \
- if (lvl <= DebugLevel) {\
- DbgPrint(STR_MODULENAME);\
- DbgPrint##strings;\
- DbgPrint("\n");\
- if ((lvl) == DEBUGLVL_ERROR) {\
- NT_ASSERT(0);\
- } \
- }\
-}
-#else // !DBG
-#define _DbgPrintF(lvl, strings)
-#endif // !DBG
-
-// This is for debug output; but we're going to leave it in the
-// driver for now. We can always turn off the Windbg output at
-// the debugger.
-// Enable via debugger: ed Kd_IHVSTREAMING_Mask 0xFFFFFFFF
-#define ENABLE_TRACING 1
-#if ENABLE_TRACING
-
-#define DBG_OUT( FMT, ... ) \
- { \
- LARGE_INTEGER SysTime; \
- LARGE_INTEGER LocalTime; \
- TIME_FIELDS TimeFields; \
- \
- KeQuerySystemTimePrecise( &SysTime ); \
- ExSystemTimeToLocalTime( &SysTime, &LocalTime ); \
- RtlTimeToTimeFields( &LocalTime, &TimeFields ); \
- DbgPrintEx( DPFLTR_IHVSTREAMING_ID, DPFLTR_MASK|DPFLTR_TRACE_LEVEL, \
- "%02d:%02d:%02d.%03d [%p] " ## FMT ## "\n", \
- TimeFields.Hour, TimeFields.Minute, TimeFields.Second, TimeFields.Milliseconds, \
- KeGetCurrentThread(), __VA_ARGS__ ); \
- }
-
-#define DBG_ENTER( FMT, ... ) \
- DBG_OUT( "Entering: " __FUNCTION__ ## FMT, __VA_ARGS__ );
-
-#define DBG_LEAVE( FMT, ... ) \
- DBG_OUT( " Leaving: " __FUNCTION__ ## FMT, __VA_ARGS__ );
-
-#define DBG_TRACE( FMT, ... ) \
- DBG_OUT( " In: " __FUNCTION__ ## " " ## FMT, __VA_ARGS__ );
-
-#else // !ENABLE_TRACING
-#define DBG_ENTER( ... )
-#define DBG_LEAVE( ... )
-#define DBG_TRACE( ... )
-#endif // !ENABLE_TRACING
-
diff --git a/avscamera/sys/Device.cpp b/avscamera/sys/Device.cpp
deleted file mode 100644
index 89eab0ca..00000000
--- a/avscamera/sys/Device.cpp
+++ /dev/null
@@ -1,962 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- device.cpp
-
- Abstract:
-
- This file contains the implementation of CCaptureDevice.
-
- CCaptureDevice is the base device class object. It handles basic PnP
- requests and constructs the filter factories.
-
- History:
-
- created 3/9/2001
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-/////
-/// Structures...
-//// Profile 0
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile0_PreviewMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 },
-};
-
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile0_RecordMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 3840, 2160 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1920, 1080 }, { 120, 1 }, 0, 0, 0, 0, 0 },
- { { 1920, 1080 }, { 90, 1 }, 0, 0, 0, 0, 0 },
- { { 1920, 1080 }, { 60, 1 }, 0, 0, 0, 0, 0 },
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 },
-};
-
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile0_PhotoMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 }
-};
-
-
-//// Profile 1
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile1_PreviewMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 }
-};
-
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile1_PhotoMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 7680, 4320 }, { 0, 1 }, 0, 0, 0, 0, 0 },
- { { 3840, 2160 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 }
-};
-
-//// Profile 2
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile2_PreviewMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 }
-};
-
-static KSCAMERA_PROFILE_MEDIAINFO s_Profile2_RecordMediaInfo[] =
-{
- //{ resolution }, { fps }, Flags, Data0, Data1, Data2, Data 3
- { { 1920, 1080 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 1280, 720 }, { 30, 1 }, 0, 0, 0, 0, 0 },
- { { 640, 360 }, { 30, 1 }, 0, 0, 0, 0, 0 }
-};
-
-static KSCAMERA_PROFILE_PININFO s_Profile0_PinInfo[] =
-{
- { {STATIC_PINNAME_VIDEO_PREVIEW}, 0, ARRAYSIZE(s_Profile0_PreviewMediaInfo), s_Profile0_PreviewMediaInfo },
- { {STATIC_PINNAME_VIDEO_CAPTURE}, 0, ARRAYSIZE(s_Profile0_RecordMediaInfo), s_Profile0_RecordMediaInfo },
- { {STATIC_PINNAME_IMAGE}, 0, ARRAYSIZE(s_Profile0_PhotoMediaInfo), s_Profile0_PhotoMediaInfo }
-};
-
-static KSCAMERA_PROFILE_PININFO s_Profile1_PinInfo[] =
-{
- { {STATIC_PINNAME_VIDEO_PREVIEW}, 0, ARRAYSIZE(s_Profile1_PreviewMediaInfo), s_Profile1_PreviewMediaInfo },
- { {STATIC_PINNAME_IMAGE}, 0, ARRAYSIZE(s_Profile1_PhotoMediaInfo), s_Profile1_PhotoMediaInfo }
-};
-
-static KSCAMERA_PROFILE_PININFO s_Profile2_PinInfo[] =
-{
- { {STATIC_PINNAME_VIDEO_PREVIEW}, 0, ARRAYSIZE(s_Profile2_PreviewMediaInfo), s_Profile2_PreviewMediaInfo },
- { {STATIC_PINNAME_VIDEO_CAPTURE}, 0, ARRAYSIZE(s_Profile2_RecordMediaInfo), s_Profile2_RecordMediaInfo }
-};
-
-static KSCAMERA_PROFILE_INFO s_Profiles[] =
-{
- { {STATIC_KSCAMERAPROFILE_BalancedVideoAndPhoto}, 0, ARRAYSIZE(s_Profile0_PinInfo), s_Profile0_PinInfo },
- { {STATIC_KSCAMERAPROFILE_HighQualityPhoto}, 0, ARRAYSIZE(s_Profile1_PinInfo), s_Profile1_PinInfo },
- { {STATIC_KSCAMERAPROFILE_VideoRecording}, 0, ARRAYSIZE(s_Profile2_PinInfo), s_Profile2_PinInfo }
-};
-
-// The front camera is concurrent with the rear camera, so the front camera concurrency
-// has the back camera's reference GUID and vice versa.
-static KSCAMERA_PROFILE_CONCURRENCYINFO s_Profile2_ConcurrencyInfoFront[] =
-{
- { {STATIC_RearCamera_Filter}, 0, 1, &s_Profiles[2] }
-};
-
-static KSCAMERA_PROFILE_CONCURRENCYINFO s_Profile2_ConcurrencyInfoBack[] =
-{
- { {STATIC_FrontCamera_Filter}, 0, 1, &s_Profiles[2] }
-};
-
-const UINT32 s_ProfileCount = 3;
-
-UINT32
-InitializeDeviceProfiles(
- _In_ BOOL fFrontCamera,
- _Outptr_result_maybenull_
- PKSDEVICE_PROFILE_INFO *ppDeviceProfiles
-)
-{
- UINT32 uiProfileCount = 0;
- PKSDEVICE_PROFILE_INFO pDeviceProfiles = NULL;
-
- pDeviceProfiles = (PKSDEVICE_PROFILE_INFO)ExAllocatePoolWithTag( PagedPool, sizeof(KSDEVICE_PROFILE_INFO) * ARRAYSIZE(s_Profiles) , 'fpSC');
- if( !pDeviceProfiles )
- {
- // Can't publish, we're out of memory, silently fail here.
- *ppDeviceProfiles = nullptr;
- goto Exit;
- }
-
- for (UINT32 i = 0; i < ARRAYSIZE(s_Profiles); i++)
- {
- pDeviceProfiles[i].Type = KSDEVICE_PROFILE_TYPE_CAMERA;
- pDeviceProfiles[i].Size = sizeof(KSDEVICE_PROFILE_INFO);
- pDeviceProfiles[i].Camera.Info = s_Profiles[i];
- pDeviceProfiles[i].Camera.Reserved = 0;
- pDeviceProfiles[i].Camera.ConcurrencyCount = 0;
- pDeviceProfiles[i].Camera.Concurrency = NULL;
- }
-
- pDeviceProfiles[2].Camera.ConcurrencyCount = 1;
- if (fFrontCamera)
- {
- pDeviceProfiles[2].Camera.Concurrency = (PKSCAMERA_PROFILE_CONCURRENCYINFO)&s_Profile2_ConcurrencyInfoFront;
- }
- else
- {
- pDeviceProfiles[2].Camera.Concurrency = (PKSCAMERA_PROFILE_CONCURRENCYINFO)&s_Profile2_ConcurrencyInfoBack;
- }
-
- uiProfileCount = ARRAYSIZE(s_Profiles);
- *ppDeviceProfiles = pDeviceProfiles;
- pDeviceProfiles = NULL;
-
-Exit:
- return uiProfileCount;
-}
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-CCaptureDevice::
-CCaptureDevice (
- _In_ PKSDEVICE Device
-)
- : m_Device (Device)
- , m_FilterDescriptorCount(0)
- , m_Sensor(nullptr)
- , m_Context(nullptr)
-{
- PAGED_CODE();
-}
-
-CCaptureDevice::
-~CCaptureDevice()
-{
- PAGED_CODE();
-
- if( m_Sensor )
- {
- for( size_t i=0; i<m_FilterDescriptorCount; i++ )
- {
- SAFE_DELETE( m_Sensor[i] );
- }
-
- SAFE_DELETE_ARRAY( m_Sensor );
- }
-}
-
-NTSTATUS
-CCaptureDevice::
-Initialize()
-{
- PAGED_CODE();
-
- m_Sensor = new (NonPagedPoolNx, 'iveD') CSensor *[m_FilterDescriptorCount];
-
- if( !m_Sensor )
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- return STATUS_SUCCESS;
-}
-
-ULONG
-CCaptureDevice::
-GetFilterIndex(PKSFILTER Filter)
-{
- PAGED_CODE();
- ULONG i;
-
- for( i=0; i<m_FilterDescriptorCount; i++ )
- {
- if( Filter->Descriptor->ReferenceGuid &&
- IsEqualGUID(*(m_Context[i].Descriptor->ReferenceGuid), *Filter->Descriptor->ReferenceGuid))
- {
- break;
- }
- }
-
- // This is a complete failure. We really need to bail.
- NT_ASSERT(i<m_FilterDescriptorCount);
-
- return i;
-}
-
-NTSTATUS
-CCaptureDevice::
-Prepare()
-{
- PAGED_CODE();
-
- NTSTATUS Status = Initialize();
-
- if( !NT_SUCCESS(Status) )
- {
- return Status;
- }
-
- //
- // Add the item to the object bag if we were successful.
- // Whenever the device goes away, the bag is cleaned up and
- // we will be freed.
- //
- // For backwards compatibility with DirectX 8.0, we must grab
- // the device mutex before doing this. For Windows XP, this is
- // not required, but it is still safe.
- //
- PKSDEVICE Device = m_Device;
- LockDevice Lock(Device);
-
- Status = KsAddItemToObjectBag (
- Device -> Bag,
- reinterpret_cast <PVOID> (this),
- reinterpret_cast <PFNKSFREE> (CCaptureDevice::Cleanup)
- );
-
- if( NT_SUCCESS (Status) )
- {
- Device->Context=this;
- }
- return Status;
-}
-
-NTSTATUS
-CCaptureDevice::
-DispatchCreate (
- _In_ PKSDEVICE Device
-)
-
-/*++
-
-Routine Description:
-
- Create the capture device. This is the creation dispatch for the
- capture device.
-
-Arguments:
-
- Device -
- The AVStream device being created.
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- CCaptureDevice *CapDevice = new (NonPagedPoolNx, 'eviD') CCaptureDevice (Device);
- if( !CapDevice)
- {
- //
- // Return failure if we couldn't create the device.
- //
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- NTSTATUS Status = CapDevice->Prepare();
- if (!NT_SUCCESS (Status))
- {
- // Init failure.
- delete CapDevice;
- }
-
- DBG_LEAVE("()");
- return Status;
-}
-
-//
-// DispatchStart():
-//
-// This is the Pnp Start dispatch for the capture device. It simply
-// bridges to PnpStart() in the context of the CCaptureDevice.
-//
-NTSTATUS
-CCaptureDevice::
-DispatchStart (
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _In_ PCM_RESOURCE_LIST TranslatedResourceList,
- _In_ PCM_RESOURCE_LIST UntranslatedResourceList
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- NTSTATUS Status =
- Recast(Device)->
- PnpStart (
- TranslatedResourceList,
- UntranslatedResourceList
- );
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-//
-// DispatchStop():
-//
-// This is the Pnp stop dispatch for the capture device. It simply
-// bridges to PnpStop() in the context of the CCaptureDevice.
-//
-void
-CCaptureDevice::
-DispatchStop (
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
- Recast(Device)->PnpStop(Irp);
- DBG_LEAVE("()");
-}
-
-NTSTATUS
-CCaptureDevice::
-DispatchPostStart(
- _In_ PKSDEVICE Device
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- NTSTATUS Status =
- Recast(Device)->PnpPostStart();
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-NTSTATUS
-CCaptureDevice::
-DispatchQueryStop(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- NTSTATUS Status =
- Recast(Device)->PnpQueryStop(Irp);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-void
-CCaptureDevice::
-DispatchCancelStop(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
- Recast(Device)->PnpCancelStop(Irp);
- DBG_LEAVE("()");
-}
-
-NTSTATUS
-CCaptureDevice::
-DispatchQueryRemove(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- NTSTATUS Status =
- Recast(Device)->PnpQueryRemove(Irp);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-void
-CCaptureDevice::
-DispatchCancelRemove(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
- Recast(Device)->PnpCancelRemove(Irp);
- DBG_LEAVE("()");
-}
-
-void
-CCaptureDevice::
-DispatchRemove(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
- Recast(Device)->PnpRemove(Irp);
- DBG_LEAVE("()");
-}
-
-void
-CCaptureDevice::
-DispatchSurpriseRemoval(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
- Recast(Device)->PnpSurpriseRemoval(Irp);
- DBG_LEAVE("()");
-}
-
-NTSTATUS
-CCaptureDevice::
-DispatchQueryCapabilities(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _Inout_ PDEVICE_CAPABILITIES Capabilities
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- NTSTATUS Status =
- Recast(Device)->
- PnpQueryCapabilities( Irp, Capabilities );
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-
-// Make Power callbacks non-pageable.
-#ifdef ALLOC_PRAGMA
-#pragma code_seg()
-#endif // ALLOC_PRAGMA
-
-NTSTATUS
-CCaptureDevice::
-DispatchQueryPower(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE DeviceTo,
- _In_ DEVICE_POWER_STATE DeviceFrom,
- _In_ SYSTEM_POWER_STATE SystemTo,
- _In_ SYSTEM_POWER_STATE SystemFrom,
- _In_ POWER_ACTION Action
-)
-{
- // If this device supports the the DO_POWER_INRUSH flag, this function
- // can be called at DISPATCH.
-
- DBG_ENTER("()");
- NTSTATUS Status =
- Recast(Device)->
- PnpQueryPower(
- Irp,
- DeviceTo,
- DeviceFrom,
- SystemTo,
- SystemFrom,
- Action );
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-void
-CCaptureDevice::
-DispatchSetPower(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE To,
- _In_ DEVICE_POWER_STATE From
-)
-{
- // If this device supports the the DO_POWER_INRUSH flag, this function
- // can be called at DISPATCH.
-
- DBG_ENTER("()");
- Recast(Device)->
- PnpSetPower( Irp, To, From );
- DBG_LEAVE("()");
-}
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-NTSTATUS
-CCaptureDevice::
-DispatchQueryInterface(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- NTSTATUS Status =
- Recast(Device)->
- PnpQueryInterface(Irp);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-
-/*************************************************/
-
-
-NTSTATUS
-CCaptureDevice::
-PnpStart (
- _In_ PCM_RESOURCE_LIST TranslatedResourceList,
- _In_ PCM_RESOURCE_LIST UntranslatedResourceList
-)
-
-/*++
-
-Routine Description:
-
- Called at Pnp start. We start up our hardware simulation.
-
-Arguments:
-
- TranslatedResourceList -
- The translated resource list from Pnp
-
- UntranslatedResourceList -
- The untranslated resource list from Pnp
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
-
- PAGED_CODE();
-
- //
- // Normally, we'd do things here like parsing the resource lists and
- // connecting our interrupt. Since this is a simulation, there isn't
- // much to parse. The parsing and connection should be the same as
- // any WDM driver. The sections that will differ are illustrated below
- // in setting up a simulated DMA.
- //
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- //
- // By PnP, it's possible to receive multiple starts without an intervening
- // stop (to reevaluate resources, for example). Thus, we only perform
- // creations of the simulation on the initial start and ignore any
- // subsequent start. Hardware drivers with resources should evaluate
- // resources and make changes on 2nd start.
- //
- // Walk the list of descriptors and enumerate the h/w sims described.
- //
-
- if (!m_Device -> Started)
- {
- // Create the Filter for the device
- for( size_t i=0; i<m_FilterDescriptorCount; i++ )
- {
- PKSFILTERFACTORY FilterFactory=nullptr;
- IFFAILED_EXIT(
- KsCreateFilterFactory( m_Device->FunctionalDeviceObject,
- m_Context[i].Descriptor,
- m_Context[i].Name,
- NULL,
- KSCREATE_ITEM_FREEONSTOP,
- NULL,
- NULL,
- &FilterFactory )
- );
-
- // Set primary camera to its interface, this allows device to be queried by GUID
- if( FilterFactory )
- {
- PKSDEVICE_PROFILE_INFO pDeviceProfiles = nullptr;
- UINT32 uiProfileCount = 0;
- PUNICODE_STRING SymbolicLinkName = KsFilterFactoryGetSymbolicLink(FilterFactory);
- ACPI_PLD_BUFFER pld = {0};
- BOOL fFrontCamera = FALSE;
- pld.Panel = m_Context[i].AcpiPosition;
- static
- const
- GUID FFC_Filter = {STATIC_FrontCamera_Filter};
-
- IFFAILED_EXIT(
- IoSetDeviceInterfacePropertyData(SymbolicLinkName,
- &DEVPKEY_Device_PhysicalDeviceLocation,
- LOCALE_NEUTRAL,
- PLUGPLAY_PROPERTY_PERSISTENT,
- DEVPROP_TYPE_BINARY,
- sizeof(ACPI_PLD_BUFFER),
- (PVOID)&pld)
- );
-
- if( m_Context[i].Descriptor->ReferenceGuid &&
- IsEqualGUID(*(m_Context[i].Descriptor->ReferenceGuid), FFC_Filter))
- {
- fFrontCamera = TRUE;
- }
-
- // Publish our profile here.
- uiProfileCount = InitializeDeviceProfiles(fFrontCamera, &pDeviceProfiles);
- if( uiProfileCount > 0 )
- {
- if( NT_SUCCESS(KsInitializeDeviceProfile(FilterFactory)) )
- {
- for( UINT32 j=0; j<uiProfileCount; j++ )
- {
- if( !NT_SUCCESS(KsPublishDeviceProfile(FilterFactory, &pDeviceProfiles[j])) )
- {
- // Bail...
- break;
- }
- }
- if( !NT_SUCCESS(KsPersistDeviceProfile(FilterFactory)) )
- {
- // Trace here?
- }
- }
-
- ExFreePool(pDeviceProfiles);
- pDeviceProfiles = NULL;
- }
- }
-
- // On a real device this object would be constructed whenever the sensor hardware is ready...
- m_Sensor[i] = CreateSensor( m_Context[i].Descriptor );
- if( !m_Sensor[i] )
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- break;
- }
-
- IFFAILED_EXIT(m_Sensor[i]->Initialize());
- }
- }
-
-done:
- if( !NT_SUCCESS(Status) )
- {
- // Free any sensor objects we created during this failed attempt.
- for( size_t i=0; i<m_FilterDescriptorCount; i++ )
- {
- SAFE_DELETE( m_Sensor[i] );
- }
- }
- return Status;
-}
-
-CSensor *
-CCaptureDevice::
-CreateSensor(
- _In_ const KSFILTER_DESCRIPTOR *Descriptors
-)
-{
- PAGED_CODE();
-
- return new (NonPagedPoolNx, 'sneS') CSensorSimulation( this, Descriptors );
-}
-
-PDEVICE_OBJECT
-CCaptureDevice::
-GetDeviceObject()
-/*++
-
-Routine Description:
-
- Return the pointer to the FDO for our device.
-
-Arguments:
-
- [none]
-
-Return Value:
-
- PDEVICE_OBJECT
-
---*/
-{
- PAGED_CODE();
-
- return m_Device->FunctionalDeviceObject;
-}
-
-/*************************************************/
-
-
-void
-CCaptureDevice::
-PnpStop (
- _In_ PIRP Irp
-)
-
-/*++
-
-Routine Description:
-
- This is the pnp stop dispatch for the capture device. It releases any
- adapter object previously allocated by IoGetDmaAdapter during Pnp Start.
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-
-{
- UNREFERENCED_PARAMETER(Irp);
- PAGED_CODE();
-
- if (m_DmaAdapterObject)
- {
- //
- // Return the DMA adapter back to the system.
- //
- m_DmaAdapterObject -> DmaOperations ->
- PutDmaAdapter (m_DmaAdapterObject);
-
- m_DmaAdapterObject = NULL;
- }
-}
-
-NTSTATUS
-CCaptureDevice::
-PnpPostStart()
-{
- PAGED_CODE();
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CCaptureDevice::
-PnpQueryStop(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
- return STATUS_SUCCESS;
-}
-
-void
-CCaptureDevice::
-PnpCancelStop(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
-}
-
-NTSTATUS
-CCaptureDevice::
-PnpQueryRemove(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
- return STATUS_SUCCESS;
-}
-
-void
-CCaptureDevice::
-PnpCancelRemove(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
-}
-
-void
-CCaptureDevice::
-PnpRemove(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
-}
-
-void
-CCaptureDevice::
-PnpSurpriseRemoval(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
-}
-
-NTSTATUS
-CCaptureDevice::
-PnpQueryCapabilities(
- _In_ PIRP Irp,
- _Inout_ PDEVICE_CAPABILITIES Capabilities
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
- UNREFERENCED_PARAMETER(Capabilities);
- return STATUS_SUCCESS;
-}
-
-// Make Power callbacks non-pageable.
-#ifdef ALLOC_PRAGMA
-#pragma code_seg()
-#endif // ALLOC_PRAGMA
-
-NTSTATUS
-CCaptureDevice::
-PnpQueryPower(
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE DeviceTo,
- _In_ DEVICE_POWER_STATE DeviceFrom,
- _In_ SYSTEM_POWER_STATE SystemTo,
- _In_ SYSTEM_POWER_STATE SystemFrom,
- _In_ POWER_ACTION Action
-)
-{
- UNREFERENCED_PARAMETER(Irp);
- UNREFERENCED_PARAMETER(DeviceTo);
- UNREFERENCED_PARAMETER(DeviceFrom);
- UNREFERENCED_PARAMETER(SystemTo);
- UNREFERENCED_PARAMETER(SystemFrom);
- UNREFERENCED_PARAMETER(Action);
- return STATUS_SUCCESS;
-}
-
-void
-CCaptureDevice::
-PnpSetPower(
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE To,
- _In_ DEVICE_POWER_STATE From
-)
-{
- UNREFERENCED_PARAMETER(Irp);
- UNREFERENCED_PARAMETER(To);
- UNREFERENCED_PARAMETER(From);
-}
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-NTSTATUS
-CCaptureDevice::
-PnpQueryInterface(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Irp);
- return STATUS_SUCCESS;
-}
-
-/*************************************************/
-
diff --git a/avscamera/sys/Device.h b/avscamera/sys/Device.h
deleted file mode 100644
index c3135d04..00000000
--- a/avscamera/sys/Device.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- device.h
-
- Abstract:
-
- This file contains the declaration of CCaptureDevice.
-
- CCaptureDevice is the base device class object. It handles basic PnP
- requests and constructs the filter factories.
-
- History:
-
- created 3/9/2001
-
-**************************************************************************/
-
-//
-// Forward references...
-//
-class CSensor;
-
-struct CSensorContext
-{
- PWSTR Name; // What to call this class of filter.
- const KSFILTER_DESCRIPTOR *Descriptor; // The description of the filter.
- AcpiPldPanel AcpiPosition; // Where the device is located.
-};
-
-class CCaptureDevice
-{
-protected:
-
- //
- // The AVStream device we're associated with.
- //
- PKSDEVICE m_Device;
-
- //
- // Since we don't have physical hardware, this provides the hardware
- // simulation. m_HardwareSimulation provides the fake ISR, fake DPC,
- // etc... m_Synthesizer provides RGB24 and UYVY image synthesis and
- // overlay in software.
- //
-
- //
- // Number of pins with resources acquired. This is used as a locking
- // mechanism for resource acquisition on the device.
- //
-
- // The capture pin. When we complete scatter / gather mappings, we
- // notify the capture pin.
- //
-
- // Number of Filter descriptors & filter factories.
- size_t m_FilterDescriptorCount;
-
- // Pointer to an array of filter descriptor pointers.
- // Typically it's one sensor for each filter factory.
- CSensorContext *m_Context;
-
- // The sensor state for each camera.
- CSensor **m_Sensor;
-
- //
- // The Dma adapter object we acquired through IoGetDmaAdapter() during
- // Pnp start. This must be initialized with AVStream in order to perform
- // Dma directly into the capture buffers.
- //
- PADAPTER_OBJECT m_DmaAdapterObject;
-
- //
- // The number of map registers returned from IoGetDmaAdapter().
- //
- ULONG m_NumberOfMapRegisters;
-
- //
- // Cleanup():
- //
- // This is the free callback for the bagged capture device. Not providing
- // one will call ExFreePool, which is not what we want for a constructed
- // C++ object. This simply deletes the capture device.
- //
- static
- void
- Cleanup (
- _In_ CCaptureDevice *CapDevice
- )
- {
- delete CapDevice;
- }
-
- //
- // Prepare():
- //
- // Called by CCaptureDevice::DispatchCreate to finish AddDevice processing,
- // once the object is created.
- //
- // This is a seperate helper function to allow the derived DispatchCreate
- // implementation to be as simple as is feasible.
- //
- NTSTATUS
- Prepare();
-
-public:
- //
- // DispatchCreate():
- //
- // This is the Add Device dispatch for the capture device. It creates
- // the CCaptureDevice and associates it with the device via the bag.
- //
- static
- NTSTATUS
- DispatchCreate (
- _In_ PKSDEVICE Device
- );
-
- //
- // DispatchStart():
- //
- // This is the Pnp Start dispatch for the capture device. It simply
- // bridges to PnpStart() in the context of the CCaptureDevice.
- //
- static
- NTSTATUS
- DispatchStart (
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _In_ PCM_RESOURCE_LIST TranslatedResourceList,
- _In_ PCM_RESOURCE_LIST UntranslatedResourceList
- );
-
- //
- // DispatchStop():
- //
- // This is the Pnp stop dispatch for the capture device. It simply
- // bridges to PnpStop() in the context of the CCaptureDevice.
- //
- static
- void
- DispatchStop(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- NTSTATUS
- DispatchPostStart(
- _In_ PKSDEVICE Device
- );
-
- static
- NTSTATUS
- DispatchQueryStop(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- void
- DispatchCancelStop(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- NTSTATUS
- DispatchQueryRemove(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- void
- DispatchCancelRemove(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- void
- DispatchRemove(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- void
- DispatchSurpriseRemoval(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
- static
- NTSTATUS
- DispatchQueryCapabilities(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _Inout_ PDEVICE_CAPABILITIES Capabilities
- );
-
- static
- NTSTATUS
- DispatchQueryPower(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE DeviceTo,
- _In_ DEVICE_POWER_STATE DeviceFrom,
- _In_ SYSTEM_POWER_STATE SystemTo,
- _In_ SYSTEM_POWER_STATE SystemFrom,
- _In_ POWER_ACTION Action
- );
-
- static
- void
- DispatchSetPower(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE To,
- _In_ DEVICE_POWER_STATE From
- );
-
- static
- NTSTATUS
- DispatchQueryInterface(
- _In_ PKSDEVICE Device,
- _In_ PIRP Irp
- );
-
-protected:
- //
- // PnpStart():
- //
- // This is the Pnp start routine for our simulated hardware. Note that
- // DispatchStart bridges to here in the context of the CCaptureDevice.
- //
- virtual
- NTSTATUS
- PnpStart (
- _In_ PCM_RESOURCE_LIST TranslatedResourceList,
- _In_ PCM_RESOURCE_LIST UntranslatedResourceList
- );
-
- //
- // PnpStop():
- //
- // This is the Pnp stop routine for our simulated hardware. Note that
- // DispatchStop bridges to here in the context of the CCaptureDevice.
- //
- virtual
- void
- PnpStop (
- _In_ PIRP Irp
- );
-
- virtual
- NTSTATUS
- PnpPostStart();
-
- virtual
- NTSTATUS
- PnpQueryStop(
- _In_ PIRP Irp
- );
-
- virtual
- void
- PnpCancelStop(
- _In_ PIRP Irp
- );
-
- virtual
- NTSTATUS
- PnpQueryRemove(
- _In_ PIRP Irp
- );
-
- virtual
- void
- PnpCancelRemove(
- _In_ PIRP Irp
- );
-
- virtual
- void
- PnpRemove(
- _In_ PIRP Irp
- );
-
- virtual
- void
- PnpSurpriseRemoval(
- _In_ PIRP Irp
- );
-
- virtual
- NTSTATUS
- PnpQueryCapabilities(
- _In_ PIRP Irp,
- _Inout_ PDEVICE_CAPABILITIES Capabilities
- );
-
- virtual
- NTSTATUS
- PnpQueryPower(
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE DeviceTo,
- _In_ DEVICE_POWER_STATE DeviceFrom,
- _In_ SYSTEM_POWER_STATE SystemTo,
- _In_ SYSTEM_POWER_STATE SystemFrom,
- _In_ POWER_ACTION Action
- );
-
- virtual
- void
- PnpSetPower(
- _In_ PIRP Irp,
- _In_ DEVICE_POWER_STATE To,
- _In_ DEVICE_POWER_STATE From
- );
-
- virtual
- NTSTATUS
- PnpQueryInterface(
- _In_ PIRP Irp
- );
-
-protected:
- virtual
- CSensor *
- CreateSensor(
- _In_ const KSFILTER_DESCRIPTOR *Descriptors
- );
-
-public:
- //
- // CCaptureDevice():
- //
- // The capture device class constructor. Since everything should have
- // been zero'ed by the new operator, don't bother setting anything to
- // zero or NULL. Only initialize non-NULL, non-0 fields.
- //
- CCaptureDevice (
- _In_ PKSDEVICE Device
- );
-
- //
- // ~CCaptureDevice():
- //
- // The capture device destructor.
- //
- virtual
- ~CCaptureDevice();
-
- virtual
- NTSTATUS
- Initialize();
-
- //
- // Recast():
- //
- // Helper function. Used to convert from a PKSDEVICE to a CCaptureDevice *
- //
- static
- inline
- CCaptureDevice *
- Recast(
- _In_ PKSDEVICE Device
- )
- {
- return reinterpret_cast <CCaptureDevice *> (Device -> Context);
- }
-
- //
- // QueryInterruptTime():
- //
- // Determine the frame number that this frame corresponds to.
- //
- ULONG
- QueryInterruptTime (LONG ID,
- _In_ PKSPIN Pin
- );
-
- virtual
- PDEVICE_OBJECT
- GetDeviceObject();
-
- PKSDEVICE
- GetKsDevice()
- {
- return m_Device;
- }
-
- ULONG
- GetFilterIndex(PKSFILTER Filter);
-
- ULONG
- GetFilterCount()
- {
- return (ULONG) m_FilterDescriptorCount;
- }
-
- PCWSTR
- GetFilterName(ULONG FilterIndex)
- {
- return (FilterIndex < m_FilterDescriptorCount) ? m_Context[FilterIndex].Name : nullptr;
- }
-
- CSensor *
- GetSensor( PKSFILTER Filter )
- {
- ULONG Index = GetFilterIndex(Filter);
-
- return ( Index < m_FilterDescriptorCount ) ? m_Sensor[ Index ] : nullptr;
- }
-
-};
-
-//
-// Define a dispatch table for a capture pin. It provides notifications
-// about creation, closure, processing, data formats, etc...
-//
-#define DEFINE_CAMERA_KSDEVICE_DISPATCH( Table, Class ) \
-const \
-KSDEVICE_DISPATCH \
-Table = \
-{ \
- Class::DispatchCreate, /* Pnp Add Device */ \
- Class::DispatchStart, /* Pnp Start */ \
- Class::DispatchPostStart, /* Post-Start */ \
- Class::DispatchQueryStop, /* Pnp Query Stop */ \
- Class::DispatchCancelStop, /* Pnp Cancel Stop */ \
- Class::DispatchStop, /* Pnp Stop */ \
- Class::DispatchQueryRemove, /* Pnp Query Remove */ \
- Class::DispatchCancelRemove, /* Pnp Cancel Remove */ \
- Class::DispatchRemove, /* Pnp Remove */ \
- Class::DispatchQueryCapabilities, /* Pnp Query Capabilities */ \
- Class::DispatchSurpriseRemoval, /* Pnp Surprise Removal */ \
- Class::DispatchQueryPower, /* Power Query Power */ \
- Class::DispatchSetPower, /* Power Set Power */ \
- Class::DispatchQueryInterface /* Pnp Query Interface */ \
-};
-
diff --git a/avscamera/sys/ExtendedCameraAngleOffset.h b/avscamera/sys/ExtendedCameraAngleOffset.h
deleted file mode 100644
index dca18ee1..00000000
--- a/avscamera/sys/ExtendedCameraAngleOffset.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ExtendedCameraAngleOffset.h
-
- Abstract:
-
- This file contains the helper class CExtendedCameraAngleOffset.
- The class is provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_CAMERAOFFSET.
-
- History:
-
- created 11/26/2014
-
-**************************************************************************/
-
-//
-// Helper class for Extended Camera Angle Offset.
-//
-class CExtendedCameraAngleOffset
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_CAMERAOFFSET m_Params;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedCameraAngleOffset( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Params, sizeof(m_Params) );
- }
-
- CExtendedCameraAngleOffset( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Params, sizeof(m_Params) );
- }
-
- // Access functions let you more easily fetch the embedded field.
- LONG &
- PitchAngle()
- {
- return m_Params.PitchAngle;
- }
-
- LONG &
- YawAngle()
- {
- return m_Params.YawAngle;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-};
-
diff --git a/avscamera/sys/ExtendedEVComp.h b/avscamera/sys/ExtendedEVComp.h
deleted file mode 100644
index 31f7916b..00000000
--- a/avscamera/sys/ExtendedEVComp.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ExtendedEvComp.h
-
- Abstract:
-
- This file contains the helper class CExtendedEvCompensation.
- The class is provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_EVCOMPENSATION.
-
- History:
-
- created 6/3/2014
-
-**************************************************************************/
-
-//
-// Helper class for Extended Properties.
-//
-class CExtendedEvCompensation
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_EVCOMPENSATION m_EvComp;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedEvCompensation( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- :CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_EvComp, sizeof(m_EvComp) );
- }
-
- CExtendedEvCompensation( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_EvComp, sizeof(m_EvComp) );
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-
- // Access operators let you fetch the value from the value field.
- operator LONG()
- {
- return m_EvComp.Value;
- }
-
- // Assignment operators let you assign a value to the property.
- CExtendedEvCompensation &
- operator =( LONG x )
- {
- Value() = x;
- return *this;
- }
-
- CExtendedEvCompensation &
- operator =( const KSCAMERA_EXTENDEDPROP_EVCOMPENSATION &x )
- {
- m_EvComp = x;
- return *this;
- }
-
- LONG &
- Min()
- {
- return m_EvComp.Min;
- }
-
- LONG &
- Max()
- {
- return m_EvComp.Max;
- }
-
- ULONG &
- Mode()
- {
- return m_EvComp.Mode;
- }
-
- LONG &
- Value()
- {
- return m_EvComp.Value;
- }
-
- LONG &
- GetLONG()
- {
- return m_EvComp.Value;
- }
-};
-
diff --git a/avscamera/sys/ExtendedFieldOfView.h b/avscamera/sys/ExtendedFieldOfView.h
deleted file mode 100644
index 388356a6..00000000
--- a/avscamera/sys/ExtendedFieldOfView.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ExtendedFieldOfView.h
-
- Abstract:
-
- This file contains the helper class CExtendedFieldOfView.
- The class is provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_FIELDOFVIEW.
-
- History:
-
- created 11/26/2014
-
-**************************************************************************/
-
-//
-// Helper class for Extended Field of View.
-//
-class CExtendedFieldOfView
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_FIELDOFVIEW m_Params;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedFieldOfView( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Params, sizeof(m_Params) );
- }
-
- CExtendedFieldOfView( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Params, sizeof(m_Params) );
- }
-
- // Access functions let you more easily fetch the embedded field.
- ULONG &
- NormalizedFocalLengthX()
- {
- return m_Params.NormalizedFocalLengthX;
- }
-
- ULONG &
- NormalizedFocalLengthY()
- {
- return m_Params.NormalizedFocalLengthY;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-};
-
diff --git a/avscamera/sys/ExtendedMaxVideoFpsForPhotoRes.h b/avscamera/sys/ExtendedMaxVideoFpsForPhotoRes.h
deleted file mode 100644
index 29013c82..00000000
--- a/avscamera/sys/ExtendedMaxVideoFpsForPhotoRes.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ExtendedMaxVideoFpsForPhotoRes.h
-
- Abstract:
-
- This file contains the helper class CExtendedMaxVideoFpsForPhotoRes.
- The class is provides initialization and accessor functions for
- KSCAMERA_MAXVIDEOFPS_FORPHOTORES.
-
- History:
-
- created 11/26/2014
-
-**************************************************************************/
-
-//
-// Helper class for Extended Max Video Fps for Photo Resolution.
-//
-class CExtendedMaxVideoFpsForPhotoRes
- : public CExtendedHeader
-{
-public:
- KSCAMERA_MAXVIDEOFPS_FORPHOTORES m_Params;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedMaxVideoFpsForPhotoRes( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Params, sizeof(m_Params) );
- }
-
- CExtendedMaxVideoFpsForPhotoRes( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Params, sizeof(m_Params) );
- }
-
- // Access functions let you more easily fetch the embedded field.
- ULONG &
- PhotoResWidth()
- {
- return m_Params.PhotoResWidth;
- }
-
- ULONG &
- PhotoResHeight()
- {
- return m_Params.PhotoResHeight;
- }
-
- ULONG &
- PreviewFPSNum()
- {
- return m_Params.PreviewFPSNum;
- }
-
- ULONG &
- PreviewFPSDenom()
- {
- return m_Params.PreviewFPSDenom;
- }
-
- ULONG &
- CaptureFPSNum()
- {
- return m_Params.CaptureFPSNum;
- }
-
- ULONG &
- CaptureFPSDenom()
- {
- return m_Params.CaptureFPSDenom;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-};
-
diff --git a/avscamera/sys/ExtendedMetadata.h b/avscamera/sys/ExtendedMetadata.h
deleted file mode 100644
index 27ef4a79..00000000
--- a/avscamera/sys/ExtendedMetadata.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ExtendedMetadata.h
-
- Abstract:
-
- This file contains the helper class CExtendedMetadata.
- The class is provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_METADATAINFO.
-
- History:
-
- created 6/20/2014
-
-**************************************************************************/
-
-//
-// Helper class for Extended Metadata.
-//
-class CExtendedMetadata
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_METADATAINFO m_Info;
-
- // Maximum metadata required ... except for Histogram
- static const ULONG METADATA_MAX=4096;
-
- // Standardized ctors to help ensure a consistant definition.
- CExtendedMetadata(
- _In_ ULONG pinId=0, // Just so we have a default ctor.
- _In_ ULONG size=METADATA_MAX,
- _In_ ULONG align=KSCAMERA_EXTENDEDPROP_MetadataAlignment_32,
- _In_ ULONGLONG flags=(KSCAMERA_EXTENDEDPROP_METADATA_ALIGNMENTREQUIRED | KSCAMERA_EXTENDEDPROP_METADATA_SYSTEMMEMORY),
- _In_ ULONG result=STATUS_SUCCESS
- )
- : CExtendedHeader( flags, result )
- {
- PinId = pinId;
- Size = sizeof(*this);
- m_Info.BufferAlignment = align;
- m_Info.MaxMetadataBufferSize= size;
- }
-
- // Used to modify the metadata allocation size.
- CExtendedMetadata &
- operator =( ULONG x )
- {
- m_Info.MaxMetadataBufferSize = x;
- return *this;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size == sizeof(*this)) &&
- ((Flags & ~(KSCAMERA_EXTENDEDPROP_METADATA_SYSTEMMEMORY | KSCAMERA_EXTENDEDPROP_METADATA_ALIGNMENTREQUIRED)) == 0) && // Only valid flags
- ((m_Info.BufferAlignment-1) & m_Info.BufferAlignment); // Not more than 1 bit set.
- }
-
-};
-
diff --git a/avscamera/sys/ExtendedPhotoMode.h b/avscamera/sys/ExtendedPhotoMode.h
deleted file mode 100644
index daa7c127..00000000
--- a/avscamera/sys/ExtendedPhotoMode.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ExtendedPhotoMode.h
-
- Abstract:
-
- This file contains the helper class CExtendedPhotoMode.
- The class is provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_PHOTOMODE.
-
- History:
-
- created 11/20/2014
-
-**************************************************************************/
-
-//
-// Helper class for Extended Photo Mode.
-//
-class CExtendedPhotoMode
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_PHOTOMODE m_PhotoMode;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedPhotoMode( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_PhotoMode, sizeof(m_PhotoMode) );
- }
-
- CExtendedPhotoMode( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_PhotoMode, sizeof(m_PhotoMode) );
- }
-
- // Access functions let you more easily fetch the embedded field.
- ULONG &
- RequestedHistoryFrames()
- {
- return m_PhotoMode.RequestedHistoryFrames;
- }
-
- ULONG &
- MaxHistoryFrames()
- {
- return m_PhotoMode.MaxHistoryFrames;
- }
-
- ULONG &
- SubMode()
- {
- return m_PhotoMode.SubMode;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-};
-
diff --git a/avscamera/sys/ExtendedProperty.h b/avscamera/sys/ExtendedProperty.h
deleted file mode 100644
index 32affaa6..00000000
--- a/avscamera/sys/ExtendedProperty.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- ExtendedProperty.h
-
- Abstract:
-
- This file contains the helper class CExtendedProperty and the coommon
- base class CExtendedHeader.
-
- CExtendedHeader provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_HEADER.
-
- CExtendedProperty provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_VALUE.
-
- CExtendedProperty also combines KSCAMERA_EXTENDEDPROP_HEADER and
- KSCAMERA_EXTENDEDPROP_VALUE into a single object for use in the
- macros and templates used by our filter and sensor classes.
-
- History:
-
- created 5/21/2013
-
-**************************************************************************/
-
-//
-// Helper class for Extended Properties.
-//
-class CExtendedHeader
- : public KSCAMERA_EXTENDEDPROP_HEADER
-{
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedHeader( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- {
- Version = KSCAMERA_EXTENDEDPROP_VERSION;
- PinId = KSCAMERA_EXTENDEDPROP_FILTERSCOPE;
- Size = sizeof(*this);
- Result = result;
- Capability = 0;
- Flags = flags;
- }
-
- CExtendedHeader( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : KSCAMERA_EXTENDEDPROP_HEADER(hdr)
- {
- Size = sizeof(*this);
- }
-
- bool isValid()
- {
- return Version == KSCAMERA_EXTENDEDPROP_VERSION;
- }
-};
-
-class CExtendedProperty
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_VALUE m_Value;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedProperty( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- m_Value.Value.ull = 0;
- }
-
- CExtendedProperty( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- m_Value.Value.ull = 0;
- }
-
- // Access operators let you fetch the value from the value field.
- operator LONG()
- {
- return m_Value.Value.l;
- }
- operator ULONG()
- {
- return m_Value.Value.ul;
- }
- operator LONGLONG()
- {
- return m_Value.Value.ll;
- }
- operator ULONGLONG()
- {
- return m_Value.Value.ull;
- }
- operator KSCAMERA_EXTENDEDPROP_VALUE()
- {
- return m_Value;
- }
-
- // Assignment operators let you assign a value to the property.
- CExtendedProperty &
- operator =( LONG x )
- {
- m_Value.Value.l = x;
- return *this;
- }
-
- CExtendedProperty &
- operator =( LONGLONG x )
- {
- m_Value.Value.ll = x;
- return *this;
- }
-
- CExtendedProperty &
- operator =( ULONG x )
- {
- m_Value.Value.ul = x;
- return *this;
- }
-
- CExtendedProperty &
- operator =( ULONGLONG x )
- {
- m_Value.Value.ull = x;
- return *this;
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-
-};
-
diff --git a/avscamera/sys/ExtendedVidProcSetting.h b/avscamera/sys/ExtendedVidProcSetting.h
deleted file mode 100644
index 11c22caa..00000000
--- a/avscamera/sys/ExtendedVidProcSetting.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- ExtendedProperty.h
-
- Abstract:
-
- This file contains the helper class CExtendedVidProcSetting.
- The class is provides initialization and accessor functions for
- KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING.
-
- History:
-
- created 5/21/2013
-
-**************************************************************************/
-
-//
-// Helper class for Extended Properties KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING.
-//
-class CExtendedVidProcSetting
- : public CExtendedHeader
-{
-public:
- KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING m_Setting;
-
-public:
- // Standardized ctors to help ensure a consistant definition.
- CExtendedVidProcSetting( ULONGLONG flags=0, ULONG result=STATUS_SUCCESS )
- : CExtendedHeader( flags, result )
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Setting, sizeof(m_Setting) );
- }
-
- CExtendedVidProcSetting( KSCAMERA_EXTENDEDPROP_HEADER &hdr )
- : CExtendedHeader(hdr)
- {
- Size = sizeof(*this);
- RtlZeroMemory( &m_Setting, sizeof(m_Setting) );
- }
-
- bool isValid()
- {
- return CExtendedHeader::isValid() &&
- (Size >= sizeof(*this)) ;
- }
-
- template<class T>
- NTSTATUS
- BoundsCheck( T Value )
- {
- return ::BoundsCheck( Value, m_Setting );
- }
-
- // Access operators let you fetch the value from the value field.
- operator LONG()
- {
- return m_Setting.VideoProc.Value.l;
- }
- operator ULONG()
- {
- return m_Setting.VideoProc.Value.ul;
- }
- operator LONGLONG()
- {
- return m_Setting.VideoProc.Value.ll;
- }
- operator ULONGLONG()
- {
- return m_Setting.VideoProc.Value.ull;
- }
-
- // Assignment operators let you assign a value to the property.
- CExtendedVidProcSetting &
- operator =( LONG x )
- {
- m_Setting.VideoProc.Value.l = x;
- return *this;
- }
-
- CExtendedVidProcSetting &
- operator =( LONGLONG x )
- {
- m_Setting.VideoProc.Value.ll = x;
- return *this;
- }
-
- CExtendedVidProcSetting &
- operator =( ULONG x )
- {
- m_Setting.VideoProc.Value.ul = x;
- return *this;
- }
-
- CExtendedVidProcSetting &
- operator =( ULONGLONG x )
- {
- m_Setting.VideoProc.Value.ull = x;
- return *this;
- }
-
- CExtendedVidProcSetting &
- operator =( const KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING &x )
- {
- m_Setting = x;
- return *this;
- }
-
- LONG &
- Min()
- {
- return m_Setting.Min;
- }
-
- LONG &
- Max()
- {
- return m_Setting.Max;
- }
-
- LONG &
- Step()
- {
- return m_Setting.Step;
- }
-
- ULONG &
- Mode()
- {
- return m_Setting.Mode;
- }
-
- LONG &
- GetLONG()
- {
- return m_Setting.VideoProc.Value.l;
- }
-
- LONGLONG &
- GetLONGLONG()
- {
- return m_Setting.VideoProc.Value.ll;
- }
-
- ULONG &
- GetULONG()
- {
- return m_Setting.VideoProc.Value.ul;
- }
-
- ULONGLONG &
- GetULONGLONG()
- {
- return m_Setting.VideoProc.Value.ull;
- }
-
-};
-
diff --git a/avscamera/sys/Mutex.cpp b/avscamera/sys/Mutex.cpp
deleted file mode 100644
index 1dd3d88c..00000000
--- a/avscamera/sys/Mutex.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- Mutex.cpp
-
- Abstract:
-
- This file provides the implementation of KMutex and KScopedMutex.
-
- KMutex provides a wrapper around a KMUTEX object. KScopedMutex is
- provided as a helper class to ensure all exits release the lock.
-
- History:
-
- created 7/16/2013
-
-**************************************************************************/
-
-#include "Common.h"
-
-//
-// Dummy dtor. Required because the dtor is virtual.
-//
-KMutex::~KMutex()
-{}
-
-//
-// Preferred lock method.
-//
-_IRQL_requires_min_(PASSIVE_LEVEL)
-_When_((Timeout==NULL || Timeout->QuadPart!=0), _IRQL_requires_max_(APC_LEVEL))
-_When_((Timeout!=NULL &&Timeout->QuadPart==0), _IRQL_requires_max_(DISPATCH_LEVEL))
-NTSTATUS
-KMutex::Lock(
- _In_opt_ PLARGE_INTEGER Timeout
-)
-{
- //DBG_ENTER(": Thread Owner = %p", m_Lock.OwnerThread);
-
- NTSTATUS status =
- KeWaitForSingleObject(
- &m_Lock,
- Executive,
- KernelMode,
- FALSE,
- Timeout );
-
- //DBG_LEAVE(": Status = %d Thread Owner = %p", status, m_Lock.OwnerThread);
-
- return status;
-}
-
-//
-// Preferred unlock method.
-//
-_IRQL_requires_max_(DISPATCH_LEVEL)
-void
-KMutex::Unlock()
-{
- //DBG_ENTER(": Thread Owner = %p", m_Lock.OwnerThread);
-
- KeReleaseMutex( &m_Lock, FALSE );
-
- //DBG_LEAVE(": Thread Owner = %p", m_Lock.OwnerThread);
-}
diff --git a/avscamera/sys/Mutex.h b/avscamera/sys/Mutex.h
deleted file mode 100644
index a8157da5..00000000
--- a/avscamera/sys/Mutex.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- Mutex.h
-
- Abstract:
-
- This file provides the declaration of KMutex and KScopedMutex.
-
- KMutex provides a wrapper around a KMUTEX object. KScopedMutex is
- provided as a helper class to ensure all exits release the lock.
-
- History:
-
- created 7/16/2013
-
-**************************************************************************/
-#pragma once
-
-//
-// Specialized class for KMUTEX
-//
-class KMutex : CNonCopyable
-{
- KMUTEX m_Lock;
-
-public:
- KMutex()
- {
- KeInitializeMutex( &m_Lock, 0 );
- }
-
- virtual ~KMutex();
-
- //
- // Preferred lock method.
- //
- _IRQL_requires_min_(PASSIVE_LEVEL)
- _When_((Timeout==NULL || Timeout->QuadPart!=0), _IRQL_requires_max_(APC_LEVEL))
- _When_((Timeout!=NULL &&Timeout->QuadPart==0), _IRQL_requires_max_(DISPATCH_LEVEL))
- NTSTATUS
- Lock(
- _In_opt_ PLARGE_INTEGER Timeout=nullptr
- );
-
- //
- // Preferred unlock method.
- //
- _IRQL_requires_max_(DISPATCH_LEVEL)
- void
- Unlock();
-};
-
-//
-// Use this class to hold a spinlock through a particular scope
-//
-class KScopedMutex : CNonCopyable
-{
- KMutex &m_Lock;
-
-public:
- _IRQL_requires_min_(PASSIVE_LEVEL)
- _IRQL_requires_max_(APC_LEVEL)
- KScopedMutex( KMutex &lock )
- : m_Lock(lock)
- {
- m_Lock.Lock();
- }
-
- _IRQL_requires_max_(DISPATCH_LEVEL)
- ~KScopedMutex(void)
- {
- m_Lock.Unlock();
- }
-};
-
diff --git a/avscamera/sys/NV12Synthesizer.cpp b/avscamera/sys/NV12Synthesizer.cpp
deleted file mode 100644
index 2cdbf71b..00000000
--- a/avscamera/sys/NV12Synthesizer.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- CNV12Synthesizer.h
-
- Abstract:
-
- This file contains the implementation of CNV12Synthesizer.
-
- CNV12Synthesizer is derived from CYUVSynthesizer. It uses the YUV color
- space and defines a Commit() function that reformats pixels into the
- NV12 format. From MSDN:
-
- A format in which all Y samples are found first in memory as an
- array of unsigned char with an even number of lines (possibly with
- a larger stride for memory alignment). This is followed immediately
- by an array of unsigned char containing interleaved Cb and Cr
- samples. If these samples are addressed as a little-endian WORD
- type, Cb would be in the least significant bits and Cr would be in
- the most significant bits with the same total stride as the Y
- samples. NV12 is the preferred 4:2:0 pixel format.
-
- A visual representation of the layout:
- YYYY
- YYYY
- UVUV
-
-
- History:
- created 4/14/2013
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- LOCKED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg()
-#endif // ALLOC_PRAGMA
-
-
-// suppressed due to Esp:773
-#pragma warning (push)
-#pragma warning( disable:26015 ) // Suppress OACR error. Seems nonsensical. TODO: Must revisit.
-#pragma warning( disable:26019 )
-_Success_(return > 0)
-ULONG
-CNV12Synthesizer::
-Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
-)
-/*++
-
-Routine Description:
-
- Copy (and reformat, if necessary) pixels from the internal scratch
- buffer. If the output format decimates chrominance, do it here.
-
-Arguments:
-
- Buffer -
- The output buffer to fill.
-
- Size -
- The size of the output buffer in bytes.
-
- Stride -
- The length of a row in bytes.
-
-Return Value:
-
- Number of bytes copied into Buffer.
-
---*/
-{
- // We assume the output stride is the same as the original width here.
- UNREFERENCED_PARAMETER(Stride);
-
- // The code actually handles this gracefully. It rounds down.
- NT_ASSERT( (m_Width&1) == 0 );
- NT_ASSERT( (m_Height&1) == 0 );
-
- // These are impossible conditions.
- if( !( Buffer &&
- m_Buffer &&
- (Size%6)==0 && // Should be evenly divisible by 1 macropixel
- Size>=6 // At least 1 macropixel
- ) )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- ULONG MacroPixelsWide = m_Width/2;
-
- // Impossible.
- if( MacroPixelsWide==0 )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- // At most, 2/3rds of the available space is used by the Y plane.
- // Notice that we limit the number of macro pixel rows to what will
- // fit in the space available, no matter what is in the original.
- ULONG Y_limit = (Size /3) * 2;
- ULONG MacroPixelsHigh = min( m_Height, Y_limit/m_Width)/2;
-
- // Impossible.
- if( MacroPixelsHigh==0 )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- // Now we work back to arrive at the Y & UV plane sizes.
- ULONG UV_size = MacroPixelsWide * MacroPixelsHigh *2;
- ULONG Y_size = MacroPixelsWide * MacroPixelsHigh *4;
- ULONG YUV_size = Y_size + UV_size;
-
- // Impossible.
- if( Size < YUV_size )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- PWORD pY = (PWORD) Buffer;
- PWORD pUV = (PWORD) (Buffer + Y_size);
-
- for(ULONG row = 0; row < MacroPixelsHigh; row++)
- {
- PKS_RGBQUAD pSrc = (PKS_RGBQUAD) GetImageLocation(0, row*2);
- for(ULONG col = 0; col < MacroPixelsWide; col++)
- {
- KS_RGBQUAD TL = pSrc[0];
- KS_RGBQUAD TR = pSrc[1];
- KS_RGBQUAD BL = pSrc[m_Width+0];
- KS_RGBQUAD BR = pSrc[m_Width+1];
- pSrc += 2;
-
- // Copy luma first
- pY[0] = MAKEWORD(TL.rgbGreen, TR.rgbGreen);
- pY[MacroPixelsWide] = MAKEWORD(BL.rgbGreen, BR.rgbGreen);
- pY++;
-
- LONG
- tU = TL.rgbBlue; //top left
- tU += BL.rgbBlue; //bottom left
- tU += TR.rgbBlue; //top right
- tU += BR.rgbBlue; //bottom right
-
- LONG
- tV = TL.rgbRed; //top left
- tV += BL.rgbRed; //bottom left
- tV += TR.rgbRed; //top right
- tV += BR.rgbRed; //bottom right
-
- // Copy decimated chroma
- *pUV++ = MAKEWORD(((tU+2)>>2), ((tV+2)>>2));
- }
- // Skip a scan line, since we've already copied it.
- pY += MacroPixelsWide;
- }
-
- return (ULONG) (((PUCHAR) pUV) - Buffer);
-}
-// suppressed due to Esp:773
-#pragma warning (pop)
-
diff --git a/avscamera/sys/NV12Synthesizer.h b/avscamera/sys/NV12Synthesizer.h
deleted file mode 100644
index 27bc6ccb..00000000
--- a/avscamera/sys/NV12Synthesizer.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- CNV12Synthesizer.h
-
- Abstract:
-
- This file defines a class that implements NV12 image synthesis.
-
- CNV12Synthesis is derived from CYUVSynthesis. It uses the YUV color
- space and defines a Commit() function that reformats pixels into the
- NV12 format. From MSDN:
-
- A format in which all Y samples are found first in memory as an
- array of unsigned char with an even number of lines (possibly with
- a larger stride for memory alignment). This is followed immediately
- by an array of unsigned char containing interleaved Cb and Cr
- samples. If these samples are addressed as a little-endian WORD
- type, Cb would be in the least significant bits and Cr would be in
- the most significant bits with the same total stride as the Y
- samples. NV12 is the preferred 4:2:0 pixel format.
-
- A visual representation of the layout:
- YYYY
- YYYY
- UVUV
-
-
- History:
- created 4/16/2013
-
-**************************************************************************/
-
-#pragma once
-
-class CNV12Synthesizer :
- public CYUVSynthesizer
-{
-public:
- //
- // DEFAULT CONSTRUCTOR
- //
- CNV12Synthesizer (
- ULONG Width=0,
- ULONG Height=0
- ) :
- CYUVSynthesizer("NV12", Width, Height)
- {
- NT_ASSERT( ( Width % 2 ) == 0 );
- NT_ASSERT( ( Height % 2 ) == 0 );
- }
-
- //
- // Commit
- //
- // Copy (and reformat, if necessary) pixels from the internal scratch
- // buffer. If the output format decimates chrominance, do it here.
- //
- virtual
- _Success_(return > 0)
- ULONG
- Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
- );
-}; \ No newline at end of file
diff --git a/avscamera/sys/NonCopyable.h b/avscamera/sys/NonCopyable.h
deleted file mode 100644
index 98d7bad4..00000000
--- a/avscamera/sys/NonCopyable.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- NonCopyable.h
-
- Abstract:
-
- Simple base class that hides the copy ctor and assignment operators.
-
- Derive from this class any time its not safe (or reasonable) to
- permit copies of an object.
-
- History:
-
- created 5/8/2013
-
-**************************************************************************/
-#pragma once
-
-//
-// General base class for noncopyable objects
-//
-class CNonCopyable
-{
-protected:
- CNonCopyable() {}
- ~CNonCopyable() {}
-
-private:
- CNonCopyable(
- _In_ const CNonCopyable &
- )
- {}
-
- const CNonCopyable &
- operator =(
- _In_ const CNonCopyable &
- )
- {
- return *this;
- }
-};
-
diff --git a/avscamera/sys/PreviewHwSim.cpp b/avscamera/sys/PreviewHwSim.cpp
deleted file mode 100644
index dfe2dc1a..00000000
--- a/avscamera/sys/PreviewHwSim.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- PreviewHwSim.cpp
-
- Abstract:
-
- This file contains the implementation of the CPreviewHardwareSimulation
- class.
-
- This is a specialization of CHardwareSimulation that provides preview-
- specific metadata.
-
- History:
-
- created 5/28/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-
-CPreviewHardwareSimulation::CPreviewHardwareSimulation(
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
-)
- : CHardwareSimulation( Sensor, PinID )
-{
- PAGED_CODE();
-}
-
-
-CPreviewHardwareSimulation::~CPreviewHardwareSimulation()
-{
- PAGED_CODE();
-}
-
-void
-CPreviewHardwareSimulation::
-FakeHardware()
-/*++
-
-Routine Description:
-
- Simulate an interrupt and what the hardware would have done in the
- time since the previous interrupt.
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-
- // Do normal timer handling.
- CHardwareSimulation::FakeHardware();
-
- // Update the zoom.
- m_Sensor->UpdateZoom();
-}
-
-//
-// Helper function that collects the current ISP settings into our metadata
-// structure.
-//
-METADATA_PREVIEWAGGREGATION
-CPreviewHardwareSimulation::
-GetMetadata()
-{
- PAGED_CODE();
-
- METADATA_PREVIEWAGGREGATION Metadata;
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
-
- // Wipe the metadata so all settings will default to "Not Set".
- RtlZeroMemory( &Metadata, sizeof(Metadata) );
-
- // FocusState;
- m_Sensor->GetFocusState( (KSCAMERA_EXTENDEDPROP_FOCUSSTATE *) &Metadata.FocusState );
-
- // ExposureTime;
- Metadata.ExposureTime =
- CMetadataLongLong( GetCurrentExposureTime() );
-
- // EVCompensation;
- Metadata.EVCompensation = CMetadataEVCompensation(pSettings->EVCompensation.Mode, pSettings->EVCompensation.Value);
-
- // ISOSpeed;
- Metadata.ISOSpeed = CMetadataLong(GetCurrentISOSpeed());
- DBG_TRACE("ISO=%d, ISO Flags=0x%016llX", Metadata.ISOSpeed.Value, pSettings->ISOMode);
-
- // LensPosition;
- Metadata.LensPosition = CMetadataLong( pSettings->FocusSetting.VideoProc.Value.ul );
-
- // FlashOn;
- Metadata.FlashOn = CMetadataLong((ULONG) pSettings->FlashMode);
-
- // WhiteBalanceMode;
- Metadata.WhiteBalanceMode = CMetadataLong((ULONG) pSettings->WhiteBalanceMode);
-
- // IsoGains;
- Metadata.IsoAnalogGain =
- CMetadataSRational( GetRandom( (LONG)5000, (LONG)20000 ), (LONG)10000 ); // Some number from 0.5 to 2.0 - for testing.
- Metadata.IsoDigitalGain =
- CMetadataSRational( GetRandom( (LONG)5000, (LONG)20000 ), (LONG)10000 ); // Some number from 0.5 to 2.0 - for testing.
-
- // SensorFrameRate;
- ULARGE_INTEGER FrameRate;
- FrameRate.LowPart = 60 * 60 *24;
- FrameRate.HighPart = (ULONG) ((ONESECOND * FrameRate.LowPart) / m_TimePerFrame); // compute number of frames per day.
- Metadata.SensorFrameRate = CMetadataULongLong( FrameRate.QuadPart );
-
- // WhiteBalanceGains;
- Metadata.WhiteBalanceGain_R = // MF_CAPTURE_METADATA_WHITEBALANCE_GAINS
- CMetadataSRational( GetRandom( (LONG)5000, (LONG)20000 ), (LONG)10000 ); // Some number from 0.5 to 2.0 - for testing.
- Metadata.WhiteBalanceGain_G = // MF_CAPTURE_METADATA_WHITEBALANCE_GAINS
- CMetadataSRational( GetRandom( (LONG)5000, (LONG)20000 ), (LONG)10000 ); // Some number from 0.5 to 2.0 - for testing.
- Metadata.WhiteBalanceGain_B = // MF_CAPTURE_METADATA_WHITEBALANCE_GAINS
- CMetadataSRational( GetRandom( (LONG)5000, (LONG)20000 ), (LONG)10000 ); // Some number from 0.5 to 2.0 - for testing.
-
- return Metadata;
-}
-
-//
-// Emit metadata here for preview pin.
-//
-void
-CPreviewHardwareSimulation::
-EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
-)
-/*++
-
-Routine Description:
-
- Emit metadata for a photo.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- NT_ASSERT(pStreamHeader);
-
- // Add the normal frame info to the metadata
- // Note: This call ensures the KSSTREAM_METADATA_INFO is properly initialized.
- CHardwareSimulation::EmitMetadata( pStreamHeader );
-
- if (0 != (pStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_METADATA))
- {
- PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO)(pStreamHeader + 1);
- PKSSTREAM_METADATA_INFO pMetadata = (PKSSTREAM_METADATA_INFO) (pFrameInfo + 1);
- ULONG BytesLeft = pMetadata->BufferSize - pMetadata->UsedSize;
-
- if(m_PhotoConfirmationEntry.isRequired())
- {
- if(BytesLeft < sizeof(KSCAMERA_METADATA_PHOTOCONFIRMATION))
- {
- //Fatal driver error, should never come here.
- NT_ASSERT(FALSE);
- return;
- }
- PKSCAMERA_METADATA_PHOTOCONFIRMATION pPhotoConfirmation =
- (PKSCAMERA_METADATA_PHOTOCONFIRMATION) (((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
- pPhotoConfirmation->Header.MetadataId = MetadataId_PhotoConfirmation;
- pPhotoConfirmation->Header.Size = sizeof(*pPhotoConfirmation);
- pPhotoConfirmation->PhotoConfirmationIndex = m_PhotoConfirmationEntry.getIndex();
- pMetadata->UsedSize += sizeof(*pPhotoConfirmation);
- BytesLeft -= sizeof(*pPhotoConfirmation);
-
- DBG_TRACE("PhotoConfirmation Header.MetadataId = %u", pPhotoConfirmation->Header.MetadataId);
- DBG_TRACE("PhotoConfirmation Header.Size = %u", pPhotoConfirmation->Header.Size);
- DBG_TRACE("PhotoConfirmation Index = %u", pPhotoConfirmation->PhotoConfirmationIndex);
- }
- else
- {
- DBG_TRACE("Normal frame; no photo confirmation metadata.");
- }
-
- if( BytesLeft >= sizeof(CAMERA_METADATA_PREVIEWAGGREGATION) )
- {
- PCAMERA_METADATA_PREVIEWAGGREGATION pPreviewAggregation =
- (PCAMERA_METADATA_PREVIEWAGGREGATION) (((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
- pPreviewAggregation->Header.MetadataId = (ULONG) MetadataId_Custom_PreviewAggregation;
- pPreviewAggregation->Header.Size = sizeof(*pPreviewAggregation);
- pPreviewAggregation->Data = GetMetadata();
- pMetadata->UsedSize += sizeof(*pPreviewAggregation);
- BytesLeft -= sizeof(*pPreviewAggregation);
- }
-
- // MF_CAPTURE_METADATA_HISTOGRAM
- //
- // Generate the entire Histogram metadata blob here.
- //
- if( BytesLeft >= sizeof(CAMERA_METADATA_HISTOGRAM) )
- {
- PCAMERA_METADATA_HISTOGRAM pHistogram =
- (PCAMERA_METADATA_HISTOGRAM) (((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
- ULONG ChannelMask = m_Synthesizer->GetChannelMask();
- CExtendedProperty Setting;
-
- m_Sensor->GetHistogram( &Setting );
- if( Setting.Flags & KSCAMERA_EXTENDEDPROP_HISTOGRAM_ON &&
- ChannelMask != 0 )
- {
- // Just checking to see if we messed something up here.
- NT_ASSERT( pMetadata->BufferSize >= CExtendedMetadata::METADATA_MAX + sizeof(CAMERA_METADATA_HISTOGRAM) );
-
- pHistogram->Header.MetadataId = (ULONG) MetadataId_Custom_Histogram;
- pHistogram->Header.Size = sizeof(*pHistogram);
-
- // Acquire the data for every channel.
- pHistogram->Data.ChannelMask = ChannelMask;
- pHistogram->Data.Height = m_Height;
- pHistogram->Data.Width = m_Width;
- pHistogram->Data.FourCC = m_Sensor->GetFourCC( m_PinID );
- m_Synthesizer->Histogram( pHistogram->Data.P0Data, pHistogram->Data.P1Data, pHistogram->Data.P2Data );
- pMetadata->UsedSize += sizeof(*pHistogram);
- BytesLeft -= sizeof(*pHistogram);
- }
- }
-
- CExtendedVidProcSetting FaceDetect;
- m_Sensor->GetFaceDetection(&FaceDetect);
-
- if( FaceDetect.Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_PREVIEW )
- {
- DBG_TRACE("PREVIEW");
- EmitFaceMetadata(
- pStreamHeader,
- FaceDetect.GetULONG(),
- FaceDetect.Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_ADVANCED_MASK);
- }
- }
-}
-
diff --git a/avscamera/sys/PreviewHwSim.h b/avscamera/sys/PreviewHwSim.h
deleted file mode 100644
index 92d3eae7..00000000
--- a/avscamera/sys/PreviewHwSim.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- PreviewHwSim.h
-
- Abstract:
-
- This file contains the definition of the CPreviewHardwareSimulation class.
-
- This is a specialization of CHardwareSimulation that provides preview-
- specific metadata.
-
- History:
-
- created 5/28/2014
-
-**************************************************************************/
-
-#pragma once
-
-// forward references
-struct ISP_FRAME_SETTINGS;
-
-class CPreviewHardwareSimulation :
- public CHardwareSimulation
-{
-public:
- CPreviewHardwareSimulation(
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
- );
-
- virtual ~CPreviewHardwareSimulation();
-
- virtual
- void
- FakeHardware();
-
-protected:
- METADATA_PREVIEWAGGREGATION
- CPreviewHardwareSimulation::
- GetMetadata();
-
- // Inject preview pin-specific metadata.
- virtual
- void
- EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
- );
-
-};
-
diff --git a/avscamera/sys/RGB24Synthesizer.cpp b/avscamera/sys/RGB24Synthesizer.cpp
deleted file mode 100644
index 21c6e054..00000000
--- a/avscamera/sys/RGB24Synthesizer.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- RGB24Synthesizer.cpp
-
- Abstract:
-
- This file contains the implementation of CRGB24Synthesizer.
-
- CRGB24Synthesizer is derived from CRGBSynthesizer. It uses the RGB
- color space and defines a Commit() function that reformats pixels into
- the RGB24 format. RGB24 uses 8 bits per primary and 3 bytes per pixel
- in a single plane.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- LOCKED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg()
-#endif // ALLOC_PRAGMA
-
-// suppressed due to Esp:773
-#pragma warning (push)
-#pragma warning( disable:26015 ) // Suppress OACR error. Seems nonsensical. TODO: Must revisit.
-#pragma warning( disable:26019 )
-_Success_(return > 0)
-ULONG
-CRGB24Synthesizer::
-Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
-)
-/*++
-
-Routine Description:
-
- Copy (and reformat, if necessary) pixels from the internal scratch
- buffer. If the output format decimates chrominance, do it here.
-
-Arguments:
-
- Buffer -
- The output buffer to fill.
-
- Size -
- The size of the output buffer in bytes.
-
- Stride -
- The length of a row in bytes.
-
-Return Value:
-
- Number of bytes copied into Buffer.
-
---*/
-{
- // In case stride isn't initialized.
- if( Stride==0 )
- {
- Stride = m_OutputStride;
- }
-
- // These are impossible conditions.
- if( !( Buffer &&
- m_Buffer &&
- (Size&3)==0 && // the rows are dword aligned, so the size must be too.
- Size>3 && // there must be room for at least 1 pixel
- (Stride&3)==0 && // rows should be DWORD aligned
- Stride>3 && // rows should contain at least 1 pixel
- m_Height>0 &&
- m_Width>0
- ) )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- ULONG limit = min( Size/Stride, m_Height );
- for( ULONG row=0; row<limit; row++ )
- {
- PDWORD pSrc = (PDWORD) GetImageLocation( 0, m_FlipVertical ? (m_Height - row -1) : row );
- PUCHAR pDst = Buffer + (row * Stride);
- ULONG col = min( m_Width, Stride/3 );
-
- while( col )
- {
- // This optimizes the copy fairly well on most machines.
- if( col>=4 )
- {
- DWORD P0 = pSrc[0];
- DWORD P1 = pSrc[1];
- DWORD P2 = pSrc[2];
- DWORD P3 = pSrc[3];
- ((PDWORD) pDst)[0] = ((P0 ) & 0x00FFFFFF) | (P1 << 24);
- ((PDWORD) pDst)[1] = ((P1 >> 8) & 0x0000FFFF) | (P2 << 16);
- ((PDWORD) pDst)[2] = ((P2 >> 16) & 0x000000FF) | (P3 << 8);
- pDst += 4 * 3;
- pSrc += 4;
- col -= 4;
- }
- else
- {
- DWORD P0 = *pSrc++;
- *pDst++ = (UCHAR) (P0);
- *pDst++ = (UCHAR) (P0 >> 8);
- *pDst++ = (UCHAR) (P0 >> 16);
- col--;
- }
- }
- }
-
- return limit * Stride;
-}
-// suppressed due to Esp:773
-#pragma warning (pop)
diff --git a/avscamera/sys/RGB24Synthesizer.h b/avscamera/sys/RGB24Synthesizer.h
deleted file mode 100644
index 5a5d8f70..00000000
--- a/avscamera/sys/RGB24Synthesizer.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- RGB24Synthesizer.h
-
- Abstract:
-
- This file contains the definition of CRGB24Synthesizer.
-
- CRGB24Synthesizer is derived from CXRGBSynthesizer. It uses the RGB
- color space and defines a Commit() function that reformats pixels into
- the RGB24 format. RGB24 uses 8 bits per primary and 3 bytes per pixel
- in a single plane.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-/*************************************************
-
- CRGB24Synthesizer
-
- Image synthesizer for RGB24 format.
-
-*************************************************/
-
-class CRGB24Synthesizer
- : public CXRGBSynthesizer
-{
-public:
-
- //
- // Default constructor
- //
- CRGB24Synthesizer(
- LONG Width=0,
- LONG Height=0
- )
- : CXRGBSynthesizer(Width, Height)
- {
- // Round up to the next full dword for a row on output.
- m_OutputStride = (( Width * 3 ) + 3) & ((LONG) ~3);
- m_FormatName = "RGB24";
- }
-
- //
- // Commit
- //
- // Copy (and reformat, if necessary) pixels from the internal scratch
- // buffer. If the output format decimates chrominance, do it here.
- //
- virtual
- _Success_(return > 0)
- ULONG
- Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
- );
-};
-
diff --git a/avscamera/sys/Ref.h b/avscamera/sys/Ref.h
deleted file mode 100644
index c2c4d76c..00000000
--- a/avscamera/sys/Ref.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- ref.h
-
- Abstract:
-
- Implement a reference counting base class. Also implement something
- similar to ComPtr<>, called a CRefPtr<>. The implementation may not
- be as robust as ComPtr<>, but it should do the job here.
-
- History:
-
- created 12/8/2014
-
-**************************************************************************/
-
-#pragma once
-
-class CRef : public CNonCopyable
-{
-private:
- EX_RUNDOWN_REF m_Rundown;
-
-public:
- // Initialize.
- CRef()
- {
- Reset();
- }
-
- // Prevent deletion until the last reference is gone.
- ~CRef()
- {
- Wait();
- }
-
- // Increment the reference.
- BOOLEAN
- Acquire()
- {
- return ExAcquireRundownProtection( &m_Rundown );
- }
-
- // Decrement the reference.
- void
- Release()
- {
- return ExReleaseRundownProtection( &m_Rundown );
- }
-
- // Wait for the last reference to go away.
- // Note: This must be called by the child object's destructor.
- void
- Wait()
- {
- ExWaitForRundownProtectionRelease( &m_Rundown );
- }
-
- // Reinitialize to reuse the associated object.
- void
- Reset()
- {
- ExInitializeRundownProtection( &m_Rundown );
- }
-};
-
-template<class T>
-class CRefPtr
-{
-private:
- T *m_ptr;
-
-public:
- CRefPtr()
- : m_ptr(nullptr)
- {}
-
- // Copy constructor.
- CRefPtr( const CRefPtr<T> &ptr )
- : m_ptr(nullptr)
- {
- // Make an initial assignment.
- if( ptr && ptr->Acquire() )
- {
- m_ptr = ptr;
- }
- }
-
- // Initial construction with a T object.
- CRefPtr( T *ptr )
- : m_ptr(nullptr)
- {
- // Make an initial assignment.
- if( ptr && ptr->Acquire() )
- {
- m_ptr = ptr;
- }
- }
-
- // Decrement the reference on destruction.
- ~CRefPtr()
- {
- // Free any ptr.
- if( m_ptr )
- {
- m_ptr->Release();
- }
- }
-
- // Assignment
- CRefPtr<T> &
- operator = ( T *ptr )
- {
- if( m_ptr )
- {
- m_ptr->Release();
- }
-
- if( ptr )
- {
- ptr->Acquire();
- }
-
- m_ptr = ptr;
- return *this;
- }
-
- // Assignment
- CRefPtr<T> &
- operator = ( CRefPtr<T> &ptr )
- {
- return
- (*this = ptr.m_ptr);
- }
-
- // Dereference the pointer.
- T *
- operator -> ()
- {
- return m_ptr;
- }
-
- // Test for nullptr.
- operator bool()
- {
- return m_ptr != nullptr;
- }
-
- // Test for !nullptr.
- bool
- operator !()
- {
- return !m_ptr;
- }
-
- // Test for equality.
- bool
- operator ==( T *ptr )
- {
- return m_ptr == ptr;
- }
-
- // Unsafe accessor. Use sparingly.
- T *
- get()
- {
- return m_ptr;
- }
-};
-
-// Test for equality.
-template <class T>
-inline
-bool
-operator ==( T *ptr1, CRefPtr<T> &ptr2 )
-{
- return ptr2 == ptr1;
-}
-
diff --git a/avscamera/sys/Roi.cpp b/avscamera/sys/Roi.cpp
deleted file mode 100644
index e1118996..00000000
--- a/avscamera/sys/Roi.cpp
+++ /dev/null
@@ -1,629 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- Roi.cpp
-
- Abstract:
-
- This file contains the implemention of CRoiConfig, CRoiProperty and
- related classes used in the filter to implement ROI handling.
-
- History:
-
- created 6/27/2013
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-// Helper function to diff ptrs.
-inline
-UINT_PTR
-ByteDiffPtrs( PVOID pBase, PVOID pCurrent )
-{
- PAGED_CODE();
-
- return reinterpret_cast<PBYTE>(pCurrent) - reinterpret_cast<PBYTE>(pBase) ;
-}
-
-// Helper function to get the size of an ROI control based just on the ID.
-static
-ULONG
-GetSizeOfRoiInfo( ULONG ControlId )
-{
- PAGED_CODE();
-
- switch( ControlId )
- {
- case KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE:
- return sizeof(KSCAMERA_EXTENDEDPROP_ROI_WHITEBALANCE);
- break;
-
- case KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE:
- return sizeof(KSCAMERA_EXTENDEDPROP_ROI_EXPOSURE);
- break;
-
- case KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE:
- return sizeof(KSCAMERA_EXTENDEDPROP_ROI_FOCUS);
- break;
-
- default:
- NT_ASSERT(FALSE);
- return 0;
- }
-}
-
-// Helper function to get the size of an ROI control.
-static
-ULONG
-GetSize(
- _In_ PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pCtrl
-)
-{
- PAGED_CODE();
-
- // This actually needs to return the type based on the ROI_INFO size
- ULONG RoiInfoSize = GetSizeOfRoiInfo( pCtrl->ControlId );
-
- if( RoiInfoSize )
- {
- return
- sizeof(KSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL) +
- (pCtrl->ROICount * RoiInfoSize);
- }
- else
- {
- NT_ASSERTMSG("GetSizeOfRoiInfo( pCtrl->ControlId ) returned 0! Should never happen!", FALSE);
- return 0;
- }
-}
-
-// Helper function to walk to the next ROI control.
-static
-PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL
-NextCtrl(
- _In_ PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pCtrl
-)
-{
- PAGED_CODE();
-
- ULONG Size = GetSize( pCtrl );
-
- if( Size )
- {
- return
- reinterpret_cast<PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL>
- (((PBYTE) pCtrl) + Size);
- }
- else
- {
- NT_ASSERTMSG("GetSize( pCtrl ) returned 0! Should never happen!", FALSE);
- return nullptr;
- }
-}
-
-PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL
-CRoiProperty::
-Find(
- _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Property
-)
-/*++
-
-Routine Description:
-
- Search this ROI property for a property ID.
-
-Arguments:
-
- Property -
- Which control to find.
-
-Return Value:
-
- A pointer to the ROI control structure.
-
---*/
-{
- PAGED_CODE();
-
- // We assume the controls have been validated first.
- PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pIspCtrl =
- reinterpret_cast<PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL> (this+1);
-
- // Loop thru the controls.
- for( ULONG i=0; i<m_Hdr.ControlCount; i++ )
- {
- if( pIspCtrl->ControlId == (ULONG) Property )
- {
- return pIspCtrl;
- }
-
- // Advance to the next control.
- pIspCtrl = NextCtrl( pIspCtrl );
- }
-
- return nullptr;
-}
-
-PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL
-CRoiProperty::
-Add(
- _In_ PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pCtrl
-)
-/*++
-
-Routine Description:
-
- Add a control to the end of this header.
-
- Note: This function does not reallocate memory. Be careful to ensure
- there is space available.
-
-Arguments:
-
- pCtrl -
- An ROI control to append.
-
-Return Value:
-
- A pointer to the appended ROI control structure.
-
---*/
-{
- PAGED_CODE();
-
- // Only bother to add if there are ROIs.
- if( pCtrl->ROICount > 0 )
- {
- // We assume the controls have been validated first.
- PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pIspCtrl =
- reinterpret_cast<PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL> (this+1);
-
- // Loop thru all the controls.
- for( ULONG i=0; i<m_Hdr.ControlCount; i++ )
- {
- // Advance to the next control.
- pIspCtrl = NextCtrl( pIspCtrl );
- }
-
- ULONG SizeToCopy = ::GetSize(pCtrl);
-
- memcpy( pIspCtrl,
- pCtrl,
- SizeToCopy ) ;
-
- Size += SizeToCopy ; // Adjust our size.
- m_Hdr.Size += SizeToCopy ;
- m_Hdr.ControlCount++ ; // Add one to the control count.
- }
- return nullptr;
-}
-
-bool
-CRoiProperty::
-isValid()
-/*++
-
-Routine Description:
-
- Parse the current ROI Property list and make sure all the control
- structures are self-consistent.
-
- Note: This is a very non-trivial problem.
-
-Arguments:
-
- None
-
-Return Value:
-
- A pointer to the appended ROI control structure.
-
---*/
-{
- PAGED_CODE();
-
- DBG_ENTER( "()" );
-
- ULONGLONG FocusFlags = 0;
- ULONGLONG ExposureFlags = 0;
- ULONGLONG WhiteBalanceFlags = 0;
-
- if( Version < KSCAMERA_EXTENDEDPROP_VERSION ||
- PinId != KSCAMERA_EXTENDEDPROP_FILTERSCOPE ||
- (Capability & ~(KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_CAPS_CANCELLABLE)) != 0 ||
- (Flags & ~KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION) != 0 || // Allow cancellation of ROI.
- Size < sizeof(*this) )
- {
- //NT_ASSERT(FALSE);
- if( Version < KSCAMERA_EXTENDEDPROP_VERSION )
- {
- DBG_TRACE( "Failed: Verison=%d", Version );
- }
- if( PinId != KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- DBG_TRACE( "Failed: PinId=%d", PinId );
- }
- if( (Capability & ~(KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_CAPS_CANCELLABLE)) != 0 )
- {
- DBG_TRACE( "Failed: Capability=0x%016llX", Capability );
- }
- if( (Flags & ~KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION) != 0 )
- {
- DBG_TRACE( "Failed: Flags=0x%016llX", Flags );
- }
- if( Size < sizeof(*this) )
- {
- DBG_TRACE( "Failed(0): Size=%d, should be at least %Iu", Size, sizeof(*this) );
- }
-
- DBG_LEAVE( "()=false" );
- return false;
- }
-
- PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL pIspCtrl =
- reinterpret_cast<PKSCAMERA_EXTENDEDPROP_ROI_ISPCONTROL> (this+1);
-
- // Loop thru the controls.
- for( ULONG i=0; i<m_Hdr.ControlCount; i++ )
- {
- // Make sure there is room to inspect this control
- if( Size < ByteDiffPtrs( this, pIspCtrl+1 ) ||
- m_Hdr.Size < ByteDiffPtrs( &m_Hdr, pIspCtrl+1 ) )
- {
- //NT_ASSERT(FALSE);
- DBG_TRACE( "Failed(1): Size=%d, should be at least %Iu", Size, ByteDiffPtrs( this, pIspCtrl+1 ) );
- DBG_TRACE( " Or: m_Hdr.Size=%d, should be at least %Iu", m_Hdr.Size, ByteDiffPtrs( &m_Hdr, pIspCtrl+1 ) );
- DBG_LEAVE( "()=false" );
- return false;
- }
-
- // Make sure the control is of a known type
- switch( pIspCtrl->ControlId )
- {
- case KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE:
- case KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE:
- case KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE:
- break;
-
- default:
- //NT_ASSERT(FALSE);
- DBG_LEAVE( "()=false : Invalid ControlId = 0x%08X", pIspCtrl->ControlId );
- return false;
- }
-
- // Make sure there is room for the # of ROIs reported
- if( Size < ByteDiffPtrs( this, NextCtrl(pIspCtrl) ) ||
- m_Hdr.Size < ByteDiffPtrs( &m_Hdr, NextCtrl(pIspCtrl) ) )
- {
- //NT_ASSERT(FALSE);
- DBG_TRACE( "Failed(2): Size=%d, should be at least %Iu", Size, ByteDiffPtrs( this, NextCtrl(pIspCtrl) ) );
- DBG_TRACE( " Or: m_Hdr.Size=%d, should be at least %Iu", m_Hdr.Size, ByteDiffPtrs( &m_Hdr, NextCtrl(pIspCtrl) ) );
- DBG_LEAVE( "()=false" );
- return false;
- }
-
- // Validate the ROIs
- for( ULONG j=0; j<pIspCtrl->ROICount; j++ )
- {
- // Index into to the control's ROI list. Get the equivilent of "pIspCtrl->RoiInfo[j]"
- PKSCAMERA_EXTENDEDPROP_ROI_INFO pRoiInfo =
- reinterpret_cast<PKSCAMERA_EXTENDEDPROP_ROI_INFO>
- (((PBYTE) (pIspCtrl+1)) + (j * GetSizeOfRoiInfo(pIspCtrl->ControlId) ));
-
- // Validate the cooridinates
- if( pRoiInfo->Region.top < (LONG) TO_Q31(0) ||
- pRoiInfo->Region.bottom < (LONG) TO_Q31(0) ||
- pRoiInfo->Region.left < (LONG) TO_Q31(0) ||
- pRoiInfo->Region.right < (LONG) TO_Q31(0) )
- {
- //NT_ASSERT(FALSE);
- DBG_TRACE( "Failed: Region out of range." );
- DBG_TRACE( " (top=0x%08X, left=0x%08X, bottom=0x%08X, right=0x%08X)"
- , pRoiInfo->Region.top
- , pRoiInfo->Region.bottom
- , pRoiInfo->Region.left
- , pRoiInfo->Region.right );
- DBG_LEAVE( "()=false" );
- return false;
- }
-
- // Validate the RegionOfInterestType
- switch( pRoiInfo->RegionOfInterestType )
- {
- case KSCAMERA_EXTENDEDPROP_ROITYPE_UNKNOWN:
- case KSCAMERA_EXTENDEDPROP_ROITYPE_FACE:
- break;
- default:
- //NT_ASSERT(FALSE);
- DBG_LEAVE( "()=false Failed: RegionOfInterestType=%d", pRoiInfo->RegionOfInterestType );
- return false;
- }
-
- // Validate the Weight
- if( pRoiInfo->Weight > 100 )
- {
- //NT_ASSERT(FALSE);
- DBG_LEAVE( "()=false Failed: Weight=%d", pRoiInfo->Weight );
- return false;
- }
-
- // Validate the Flags.
- // Note: the driver doesn't allow mis-matched ROI Flags.
- ULONGLONG RoiFlags = pRoiInfo->Flags & ~KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION;
-
- switch( pIspCtrl->ControlId )
- {
- // Exposure & WhiteBalance only support Auto, Manual & Lock.
- case KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE:
- if( j!=0 )
- {
- if( RoiFlags != ExposureFlags )
- {
- DBG_LEAVE( "()=false : Mismatched Exposure Flags" );
- return false;
- }
- }
- else
- {
- switch( RoiFlags &
- (KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO|
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK) )
- {
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO + KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- case 0:
- break;
- default:
- DBG_LEAVE( "()=false : Invalid Exposure Flags" );
- return false;
- }
- ExposureFlags = RoiFlags;
- }
- break;
-
- case KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE:
- if( j!=0 )
- {
- if( RoiFlags != WhiteBalanceFlags )
- {
- DBG_LEAVE( "()=false : Mismatched WhiteBalance Flags" );
- return false;
- }
- }
- else
- {
- switch( RoiFlags &
- (KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO|
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK) )
- {
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO + KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- case 0:
- break;
- default:
- DBG_LEAVE( "()=false : Invalid WhiteBalance Flags" );
- return false;
- }
- WhiteBalanceFlags = RoiFlags;
- }
- break;
-
- // Focus supports additional flags...
- case KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE:
- if( j!=0 )
- {
- if( RoiFlags != FocusFlags )
- {
- DBG_LEAVE( "()=false : Mismatched Focus Flags" );
- return false;
- }
- }
- else
- {
- switch( RoiFlags &
- (KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK) )
- {
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO + KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS + KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK:
- case 0:
- break;
- default:
- DBG_LEAVE( "()=false : Invalid Focus Flags" );
- return false;
- }
-
- switch( RoiFlags & KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MASK )
- {
- case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MACRO:
- case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_NORMAL:
- case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE:
- // Depreciated cases are not supported:
- //case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_INFINITY:
- //case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_HYPERFOCAL:
- case 0:
- break;
- default:
- DBG_LEAVE( "()=false : Invalid Focus Range" );
- return false;
- }
- FocusFlags = RoiFlags;
- }
- break;
- }
- }
-
- // Advance to the next control.
- pIspCtrl = NextCtrl( pIspCtrl ) ;
- }
-
- DBG_LEAVE( "()=true" );
- return true;
-}
-
-// Log to the debug output.
-void
-CRoiProperty::
-Log()
-{
- PAGED_CODE();
-
- DBG_TRACE("Version=%d, PinId=%d, Capability=0x%016llX, Flags=0x%016llX, Size=%d",
- Version, PinId, Capability, Flags, Size );
-
- CRoiIspControl *pIspCtrl = reinterpret_cast<CRoiIspControl *> (this+1);
-
- // Loop thru the controls.
- for( ULONG i=0; i<m_Hdr.ControlCount; i++ )
- {
- pIspCtrl->Log();
-
- // Advance to the next control.
- pIspCtrl = reinterpret_cast<CRoiIspControl *>( NextCtrl( pIspCtrl ) ) ;
- }
-}
-
-//
-// Initialize a block of memory from another ROI control
-//
-// Note: This function assumes enough ROI_INFO structures follow
-// such that this copy will not overrun.
-//
-BOOL
-CRoiIspControl::
-Init(
- _In_ CRoiProperty *pRoiProperty,
- _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Property
-)
-/*++
-
-Routine Description:
-
- Initialize a block of memory from another ROI control
-
- Note: This function assumes enough ROI_INFO structures follow
- such that this copy will not overrun.
-
-Arguments:
-
- pRoiProperty -
- The extended ROI control payload.
-
- Property -
- Which ISP control to copy from the payload.
-
-Return Value:
-
- TRUE - The ROI was set.
- FALSE - The ROI was cleared.
-
---*/
-{
- PAGED_CODE();
-
- CRoiIspControl *
- pCtrl = reinterpret_cast<CRoiIspControl *> (pRoiProperty->Find( Property ));
-
- if( pCtrl )
- {
- memcpy( this,
- pCtrl,
- pCtrl->GetSize() );
- return TRUE;
- }
-
- ControlId = Property;
- ROICount = 0;
- return FALSE;
-}
-
-// Log to the debug output.
-void
-CRoiIspControl::
-Log()
-{
- PAGED_CODE();
-
- switch( ControlId )
- {
- case KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE:
- DBG_TRACE("WhiteBalance");
- break;
-
- case KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE:
- DBG_TRACE("Exposure");
- break;
-
- case KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE:
- DBG_TRACE("Focus");
- break;
-
- default:
- DBG_TRACE("[Unknown]");
- NT_ASSERT(FALSE);
- break;
- }
-
- DBG_TRACE("Result=0x%08X", Result);
-
- for( ULONG i=0; i<ROICount; i++ )
- {
- // Index into to the control's ROI list. Get the equivilent of "pIspCtrl->RoiInfo[j]"
- PKSCAMERA_EXTENDEDPROP_ROI_INFO pRoiInfo =
- reinterpret_cast<PKSCAMERA_EXTENDEDPROP_ROI_INFO>
- (((PBYTE) (this+1)) + (i * GetSizeOfRoiInfo(ControlId) ));
-
- DBG_TRACE(" | Flags=0x%016llX [Top=0x%08X, Left=0x%08X, Bottom=0x%08X, Right=0x%08X]",
- pRoiInfo->Flags,
- pRoiInfo->Region.top,
- pRoiInfo->Region.left,
- pRoiInfo->Region.bottom,
- pRoiInfo->Region.right );
- }
-}
-
-//
-// Initialize a block of memory with an empty control list.
-//
-CRoiIspControl::
-CRoiIspControl(
- _In_ KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY Property
-)
-{
- PAGED_CODE();
-
- ControlId = Property;
- ROICount = 0;
- Result = 0;
- Reserved = 0;
-}
-
-ULONG
-CRoiIspControl::
-GetSize()
-{
- PAGED_CODE();
-
- return (ROICount>0) ? ::GetSize( this ) : 0;
-}
-
diff --git a/avscamera/sys/Roi.h b/avscamera/sys/Roi.h
deleted file mode 100644
index 5149bf24..00000000
--- a/avscamera/sys/Roi.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/**************************************************************************
-
- 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;
- }
-};
-
diff --git a/avscamera/sys/Sensor.cpp b/avscamera/sys/Sensor.cpp
deleted file mode 100644
index e973492c..00000000
--- a/avscamera/sys/Sensor.cpp
+++ /dev/null
@@ -1,1260 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- Sensor.cpp
-
- Abstract:
-
- Base Sensor class implementation.
-
- This class also controls access to the pin simulations. Most cameras
- have a limited set of ISP resources and can only instantiate a fixed
- number of pins. This class grants access to those resources.
-
- History:
-
- created 5/5/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-
-CSensor::CSensor(
- _In_ CCaptureDevice *Device,
- _In_ ULONG PinCount
-)
- : m_Device(Device)
- , m_PinCount(PinCount)
- , m_HardwareSimulation(nullptr)
- , m_Synthesizer(nullptr)
- , m_CapturePin(nullptr)
- , m_VideoInfoHeader(nullptr)
- , m_InterruptTime(nullptr)
- , m_LastMappingsCompleted(nullptr)
- , m_PreviewIndex(INVALID_PIN_INDEX)
- , m_StillIndex(INVALID_PIN_INDEX)
- , m_VideoIndex(INVALID_PIN_INDEX)
- , m_FilterInstanceCount(0)
- , m_pIspSettings(nullptr)
- , m_PfsFrameLimit(0)
- , m_PfsLoopLimit(0)
-{
- PAGED_CODE();
- NT_ASSERT(Device);
- NT_ASSERT(PinCount);
-}
-
-
-CSensor::~CSensor()
-{
- PAGED_CODE();
- for(ULONG i=0; i < m_PinCount; i++)
- {
- if( m_HardwareSimulation)
- {
- SAFE_DELETE( m_HardwareSimulation[i] );
- }
- if( m_Synthesizer )
- {
- SAFE_DELETE( m_Synthesizer[i] );
- }
- if( m_CapturePin )
- {
- m_CapturePin[i] = nullptr;
- }
- if( m_VideoInfoHeader )
- {
- SAFE_DELETE( m_VideoInfoHeader[i] );
- }
- }
-
- SAFE_DELETE_ARRAY( m_pIspSettings );
- SAFE_DELETE_ARRAY( m_HardwareSimulation );
- SAFE_DELETE_ARRAY( m_Synthesizer );
- SAFE_DELETE_ARRAY( m_CapturePin );
- SAFE_DELETE_ARRAY( m_VideoInfoHeader );
- SAFE_DELETE_ARRAY( m_InterruptTime );
- SAFE_DELETE_ARRAY( m_LastMappingsCompleted);
-}
-
-
-NTSTATUS
-CSensor::
-AddFilter(PKSFILTER pFilter)
-{
- PAGED_CODE();
-
- // If your sensor object needs to keep track of the Filters that are
- // attached to it, you would do that here. We only want to keep an
- // outstanding filter count so we know when to reset our defaults.
- UNREFERENCED_PARAMETER(pFilter);
-
- LONG Count = IncrementFilterCount();
- NTSTATUS Status= STATUS_SUCCESS;
-
- // If this is the first filter, reprogram the sensor.
- if( Count==1 )
- {
- Status = ProgramDefaults();
- if( !NT_SUCCESS(Status) )
- {
- Count = DecrementFilterCount();
- }
- }
- DBG_LEAVE("(Count=%d)=0x%08X", Count, Status);
- return Status;
-}
-
-NTSTATUS
-CSensor::
-RemoveFilter(PKSFILTER pFilter)
-{
- PAGED_CODE();
-
- // If your sensor object needs to keep track of the Filters that are
- // attached to it, you would clean up here. We only want to keep an
- // outstanding filter count so we know when to reset our defaults.
- UNREFERENCED_PARAMETER(pFilter);
-
- LONG Count = DecrementFilterCount();
- NT_ASSERT( Count>=0 );
-
- NTSTATUS Status = Count>=0 ? STATUS_SUCCESS : STATUS_INVALID_DEVICE_STATE;
-
- DBG_LEAVE("(Count=%d)=0x%08X", Count, Status);
- return Status;
-}
-
-NTSTATUS
-CSensor::
-ProgramDefaults()
-{
- PAGED_CODE();
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CSensor::
-Initialize()
-{
- PAGED_CODE();
-
- m_HardwareSimulation = new (NonPagedPoolNx, 'sneS') CHardwareSimulation *[m_PinCount];
- m_Synthesizer = new (NonPagedPoolNx, 'sneS') CSynthesizer *[m_PinCount];
- m_CapturePin = new (NonPagedPoolNx, 'sneS') ICapturePin *[m_PinCount];
- m_VideoInfoHeader = new (NonPagedPoolNx, 'sneS') PKS_VIDEOINFOHEADER[m_PinCount];
- m_InterruptTime = new (NonPagedPoolNx, 'sneS') ULONG[m_PinCount];
- m_LastMappingsCompleted = new (NonPagedPoolNx, 'sneS') ULONG[m_PinCount];
-
- if( !m_HardwareSimulation ||
- !m_Synthesizer ||
- !m_CapturePin ||
- !m_VideoInfoHeader ||
- !m_InterruptTime ||
- !m_LastMappingsCompleted )
- {
- SAFE_DELETE_ARRAY( m_HardwareSimulation );
- SAFE_DELETE_ARRAY( m_Synthesizer );
- SAFE_DELETE_ARRAY( m_CapturePin );
- SAFE_DELETE_ARRAY( m_VideoInfoHeader );
- SAFE_DELETE_ARRAY( m_InterruptTime );
- SAFE_DELETE_ARRAY( m_LastMappingsCompleted);
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- for(ULONG i=0; i<m_PinCount; i++)
- {
- m_HardwareSimulation[i] = nullptr;
- m_Synthesizer[i] = nullptr;
- m_CapturePin[i] = nullptr;
- m_VideoInfoHeader[i] = nullptr;
- m_InterruptTime[i] = 0;
- m_LastMappingsCompleted[i] = 0;
- }
- return STATUS_SUCCESS;
-}
-
-void
-CSensor::
-Interrupt(
- _In_ LONG PinIndex
-)
-
-/*++
-
-Routine Description:
-
- This is the "faked" interrupt service routine for this device. It
- is called at dispatch level by the hardware simulation.
-
-Arguments:
-
- PinIndex -
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-
- if( PinIndex<((LONG)m_PinCount) && PinIndex>=0 )
- {
- DBG_ENTER("(PinIndex=%d): m_LastMappingsCompleted[%d]=%d", PinIndex,
- PinIndex, m_LastMappingsCompleted[PinIndex]);
-
- m_InterruptTime[PinIndex]++;
-
- //
- // Realistically, we'd do some hardware manipulation here and then queue
- // a DPC. Since this is fake hardware, we do what's necessary here. This
- // is pretty much what the DPC would look like short of the access
- // of hardware registers (ReadNumberOfMappingsCompleted) which would likely
- // be done in the ISR.
- //
- ULONG LastMappingCompleted = m_LastMappingsCompleted[PinIndex];
- if( PinIndex != (LONG) m_StillIndex )
- {
- while( LastMappingCompleted <
- m_HardwareSimulation[PinIndex]->ReadNumberOfMappingsCompleted() )
- {
- // Complete a frame.
- if( !NT_SUCCESS(m_CapturePin[PinIndex]->CompleteMapping()) )
- {
- break;
- }
- LastMappingCompleted++;
- }
- }
- else
- {
- CImageHardwareSimulation *pImageHw = (CImageHardwareSimulation *) m_HardwareSimulation[PinIndex];
- PKSSTREAM_POINTER pClone = pImageHw->m_pClone;
-
- // Just make sure the image pin actually generate a frame.
- if( pClone )
- {
- // Emit a photo confirmation image (we don't send off a copy of this image),
- // but only if we need one for this photo and if the timestamp is valid.
- if( pImageHw->m_PhotoConfirmationInfo.isRequired() &&
- (pClone->StreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEVALID) &&
- m_PreviewIndex < m_PinCount )
- {
- m_HardwareSimulation[m_PreviewIndex]->
- GeneratePhotoConfirmation(
- pImageHw->m_PhotoConfirmationInfo.getIndex(),
- pImageHw->m_PhotoConfirmationInfo.getTime()
- );
- }
-
- //
- // Inform the capture pin that a given number of scatter / gather
- // mappings have completed.
- //
- if( NT_SUCCESS(m_CapturePin[PinIndex]->CompleteMapping(pClone)) )
- {
- LastMappingCompleted++;
- }
-
- pImageHw->m_pClone = NULL;
- }
- pImageHw->m_PhotoConfirmationInfo = PHOTOCONFIRMATION_INFO();
- }
-
- m_LastMappingsCompleted[PinIndex] = LastMappingCompleted;
- DBG_LEAVE("(PinIndex=%d): LastMappingCompleted=%d", PinIndex, LastMappingCompleted);
- }
-}
-
-NTSTATUS
-CSensor::
-AcquireHardwareResources(
- _In_ PKSPIN Pin,
- _In_ ICapturePin *CapturePin,
- _In_ PKS_VIDEOINFOHEADER VideoInfoHeader,
- _Out_ CHardwareSimulation **pSim
-)
-
-/*++
-
-Routine Description:
-
- Acquire hardware resources for the capture hardware. If the
- resources are already acquired, this will return an error.
- The hardware configuration must be passed as a VideoInfoHeader.
-
-Arguments:
-
- Pin -
- The pin to acquire.
-
- CapturePin -
- The capture pin attempting to acquire resources. When scatter /
- gather mappings are completed, the capture pin specified here is
- what is notified of the completions.
-
- VideoInfoHeader -
- Information about the capture stream. This **MUST** remain
- stable until the caller releases hardware resources. Note
- that this could also be guaranteed by bagging it in the device
- object bag as well.
-
- pSim -
- A location to store a pointer to the simulation object for this pin.
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER( "(Pin=%d, CapturePin=%p, VideoInfoHeader=%p)", Pin->Id, CapturePin, VideoInfoHeader );
-
- NTSTATUS Status = STATUS_SUCCESS;
- LONG lPindex = Pin->Id;
- //
- // If we're the first pin to go into acquire (remember we can have
- // a filter in another graph going simultaneously), grab the resources for Preview
- //
- if( InterlockedCompareExchangePointer(
- (PVOID *) &m_CapturePin[lPindex],
- CapturePin,
- nullptr) == nullptr)
- {
- m_VideoInfoHeader[lPindex] = VideoInfoHeader;
-
- LONG Width = VideoInfoHeader->bmiHeader.biWidth;
- LONG Height= VideoInfoHeader->bmiHeader.biHeight;
-
- //
- // If there's an old hardware simulation sitting around for some
- // reason, blow it away.
- //
- SAFE_DELETE( m_Synthesizer[lPindex] );
-
- DBG_TRACE( "biBitCount =%d", VideoInfoHeader->bmiHeader.biBitCount );
- DBG_TRACE( "biWidth =%d", VideoInfoHeader->bmiHeader.biWidth );
- DBG_TRACE( "biHeight =%d", VideoInfoHeader->bmiHeader.biHeight );
- DBG_TRACE( "biCompression=0x%08X", VideoInfoHeader->bmiHeader.biCompression );
- DBG_TRACE( "biCompression='%04s'", (PSTR) &VideoInfoHeader->bmiHeader.biCompression );
- DBG_TRACE( "AvgTimePerFrame=%lld", VideoInfoHeader->AvgTimePerFrame );
-
- //
- // Create the necessary type of image synthesizer.
- //
- if (VideoInfoHeader->bmiHeader.biBitCount == 24 &&
- VideoInfoHeader->bmiHeader.biCompression == KS_BI_RGB)
- {
- //
- // If we're RGB24, create a new RGB24 synth. RGB24 surfaces
- // can be in either orientation. The origin is lower left if
- // height < 0. Otherwise, it's upper left.
- //
- m_Synthesizer[lPindex] = new (NonPagedPoolNx, 'RysI')
- CRGB24Synthesizer ( Width, Height );
- DBG_TRACE( "Creating CRGB24Synthesizer..." );
- }
- else if (VideoInfoHeader->bmiHeader.biBitCount == 32 &&
- VideoInfoHeader->bmiHeader.biCompression == KS_BI_RGB)
- {
- //
- // If we're RGB32, create a new RGB32 synth. RGB32 surfaces
- // can be in either orientation. The origin is lower left if
- // height < 0. Otherwise, it's upper left.
- //
- m_Synthesizer[lPindex] = new (NonPagedPoolNx, '23RI')
- CXRGBSynthesizer ( Width, Height );
- DBG_TRACE( "Creating CXRGBSynthesizer..." );
- }
- else if (VideoInfoHeader->bmiHeader.biBitCount == 16 &&
- (VideoInfoHeader->bmiHeader.biCompression == FOURCC_YUY2))
- {
- //
- // If we're YUY2, create the YUY2 synth.
- //
- m_Synthesizer[lPindex] = new(NonPagedPoolNx, 'YysI') CYUY2Synthesizer(Width, Height);
- DBG_TRACE( "Creating CYUY2Synthesizer..." );
-
- }
- else if (VideoInfoHeader->bmiHeader.biBitCount == 12 &&
- (VideoInfoHeader->bmiHeader.biCompression == FOURCC_NV12))
- {
-
- m_Synthesizer[lPindex] = new(NonPagedPoolNx, 'Nv12') CNV12Synthesizer(Width, Height);
- DBG_TRACE( "Creating CNV12Synthesizer..." );
-
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- if (NT_SUCCESS(Status) && !m_Synthesizer[lPindex])
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
-
- if (NT_SUCCESS (Status))
- {
- //
- // If everything has succeeded thus far, set the capture pin.
- //
- m_CapturePin[lPindex] = CapturePin;
- *pSim = m_HardwareSimulation[lPindex];
-
- }
- else
- {
- //
- // If anything failed in here, we release the resources we've
- // acquired.
- //
- ReleaseHardwareResources(Pin);
- }
- }
- else
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
-
- DBG_LEAVE( "(Pin=%d, CapturePin=%p, VideoInfoHeader=%p) = 0x%08X", Pin->Id, CapturePin, VideoInfoHeader, Status );
-
- return Status;
-
-}
-
-/*************************************************/
-
-
-NTSTATUS
-CSensor::
-Start (
- _In_ PKSPIN Pin
-)
-
-/*++
-
-Routine Description:
-
- Start the capture device based on the video info header we were told
- about when resources were acquired.
-
-Arguments:
-
- Pin -
- The pin to start
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER( "( Pin=%d )\n", Pin->Id ) ;
-
- LONG lPindex = Pin->Id;
-
- m_LastMappingsCompleted[lPindex] = 0;
- m_InterruptTime[lPindex] = 0;
-
- NT_ASSERT( m_VideoInfoHeader[lPindex] != nullptr );
- if( !m_VideoInfoHeader[lPindex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- // Ideally we'd do this when the filter is constructed; but the
- // simulation is constructed first and these values aren't used until
- // we call start.
-
- if(lPindex != (LONG) m_StillIndex)
- {
- return
- m_HardwareSimulation[lPindex] -> Start (
- m_Synthesizer[lPindex],
- m_VideoInfoHeader[lPindex] -> AvgTimePerFrame,
- m_VideoInfoHeader[lPindex] -> bmiHeader.biWidth,
- ABS (m_VideoInfoHeader[lPindex] -> bmiHeader.biHeight),
- m_VideoInfoHeader[lPindex] -> bmiHeader.biSizeImage
- );
- }
- else
- {
- CImageHardwareSimulation *pHwSim = (CImageHardwareSimulation *) m_HardwareSimulation[lPindex] ;
-
- // The following is necessary if Per-Frame Settings are active.
- if( IsVPSActive() )
- {
- // Program the simulation with our settings
- pHwSim->SetPFS( m_pIspSettings, m_PfsFrameLimit, m_PfsLoopLimit );
- }
- else
- {
- // Clear out any previous settings, if they still exist.
- pHwSim->SetPFS(nullptr, 0, 0);
- }
-
- // Init to the default frame rate.
- LONGLONG TimePerFrame = m_VideoInfoHeader[lPindex]->AvgTimePerFrame;
- DBG_TRACE("Image Pin's AvgTimePerFrame=%lld", TimePerFrame);
-
- // Query our control for the max frame rate and convert it into a "PERFORMACE TIME".
- CExtendedProperty MaxFrameRate;
- GetPhotoMaxFrameRate( &MaxFrameRate );
- LARGE_INTEGER PerformanceTime = { MaxFrameRate.m_Value.Value.ratio.LowPart };
- LONGLONG Frequency = MaxFrameRate.m_Value.Value.ratio.HighPart;
-
- // Handle an user-specified frame-rate override.
- if( Frequency != 0 )
- {
- DBG_TRACE( "MaxFrameRate = %lld/%lld", PerformanceTime.QuadPart, Frequency );
-
- SetPhotoFrameRate(
- KSCONVERT_PERFORMANCE_TIME( Frequency, PerformanceTime )
- );
- }
-
- CExtendedPhotoMode Mode;
- GetPhotoMode( &Mode );
-
- NTSTATUS status = pHwSim -> Start (
- m_Synthesizer[lPindex],
- m_VideoInfoHeader[lPindex] -> bmiHeader.biWidth,
- ABS (m_VideoInfoHeader[lPindex] -> bmiHeader.biHeight),
- m_VideoInfoHeader[lPindex] -> bmiHeader.biSizeImage,
- (Mode.Flags == 0 ? PinNormalMode : PinBurstMode)
- );
-
- if(NT_SUCCESS(status))
- {
- status = pHwSim -> SetClock(Pin);
- }
-
- DBG_LEAVE( "( Pin=%d )=0x%08X\n", Pin->Id, status );
-
- return status;
- }
-}
-
-/*************************************************/
-
-
-NTSTATUS
-CSensor::
-Pause (
- _In_ PKSPIN Pin,
- _In_ BOOLEAN Pausing
-)
-
-/*++
-
-Routine Description:
-
- Pause or unpause the hardware simulation. This is an effective start
- or stop without resetting counters and formats. Note that this can
- only be called to transition from started -> paused -> started. Calling
- this without starting the hardware with Start() does nothing.
-
-Arguments:
-
- Pin -
- The pin to pause.
-
- Pausing -
- An indicatation of whether we are pausing or unpausing
-
- TRUE -
- Pause the hardware simulation
-
- FALSE -
- Unpause the hardware simulation
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
-
- PAGED_CODE();
-
- return
- m_HardwareSimulation[Pin->Id]->Pause(Pausing);
-}
-
-/*************************************************/
-
-
-NTSTATUS
-CSensor::
-Stop (
- _In_ PKSPIN Pin
-)
-
-/*++
-
-Routine Description:
-
- Stop the capture device.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
-
- PAGED_CODE();
-
- LONG lPindex = Pin->Id;
- CHardwareSimulation *pHwSim = m_HardwareSimulation[lPindex];
-
- if( !pHwSim )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- NTSTATUS Status = pHwSim->Stop();
-
- if( lPindex == (LONG) m_StillIndex )
- {
- // Clear out any previous Per Frame Settings, if they still exist.
- ((CImageHardwareSimulation *)pHwSim)->SetPFS(nullptr, 0, 0) ;
- }
-
- return Status;
-}
-
-NTSTATUS
-CSensor::
-Reset(
- _In_ PKSPIN Pin
-)
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- if( Pin->Id == m_StillIndex )
- {
- return Reset();
- }
- return STATUS_SUCCESS;
-}
-
-//Resets both filter's first PIN
-NTSTATUS
-CSensor::
-Reset(
-)
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- CHardwareSimulation *pHwSim = m_HardwareSimulation[m_StillIndex];
-
- pHwSim->Reset();
- m_LastMappingsCompleted[m_StillIndex] = pHwSim->ReadNumberOfMappingsCompleted();
-
- for( ULONG i=0; i<m_PinCount; i++ )
- {
- DBG_TRACE("m_LastMappingsCompleted[%d] = %d", i, m_LastMappingsCompleted[i] );
- }
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-CSensor::
-Trigger (
- _In_ ULONG PinId,
- _In_ LONG mode
-)
-/*++
-
-Routine Description:
-
- For a photo pin, take a picture or begin or end a photo sequence.
-
-Arguments:
-
- PinId -
- This must be a photo pin.
-
- mode -
- The trigger mode, ie: normal or start/stop sequence.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
-
- PAGED_CODE();
-
- if( PinId > m_PinCount ||
- !m_HardwareSimulation[PinId] ||
- m_HardwareSimulation[PinId]->GetState() != PinRunning )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- return
- ((CImageHardwareSimulation *)m_HardwareSimulation[PinId])->Trigger(mode);
-
-}
-
-NTSTATUS
-CSensor::
-SetPhotoFrameRate(
- _In_ ULONGLONG TimePerFrame
-)
-/*++
-
-Routine Description:
-
- For a photo pin, set the desired frame rate.
-
-Arguments:
-
- TimePerFrame -
- Time in 100ns between each frame.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_VideoInfoHeader[m_StillIndex] ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- ULONGLONG AvgTimePerFrame =
- (ULONGLONG) m_VideoInfoHeader[m_StillIndex]->AvgTimePerFrame;
-
- DBG_TRACE( "TimePerFrame=%lld, AvgTimePerFrame=%lld", TimePerFrame, AvgTimePerFrame );
-
- // Handle a reset back to the standard frame rate.
- if( TimePerFrame == 0 )
- {
- TimePerFrame = AvgTimePerFrame;
- }
- // Handle an user-specified frame-rate override.
- else
- {
- // It is unrealistic to allow a frame rate faster than the rate specified for this format.
- TimePerFrame = max( TimePerFrame, AvgTimePerFrame );
- }
-
- DBG_TRACE( "Setting new TimePerFrame=%lld", TimePerFrame );
-
- return
- ((CImageHardwareSimulation *) m_HardwareSimulation[m_StillIndex])->SetPhotoFrameRate( TimePerFrame );
-}
-
-ULONGLONG
-CSensor::
-GetPhotoFrameRate()
-/*++
-
-Routine Description:
-
- Get the desired frame rate for a photo pin.
-
-Arguments:
-
- None
-
-Return Value:
-
- Time in 100ns between each frame.
-
---*/
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- CImageHardwareSimulation *pSim = (CImageHardwareSimulation *) (m_HardwareSimulation[m_StillIndex]);
- return pSim->GetPhotoFrameRate( );
-}
-
-NTSTATUS
-CSensor::
-SetFlashStatus(
- _In_ ULONGLONG ulFlashStatus
-)
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- return
- ((CImageHardwareSimulation *) m_HardwareSimulation[m_StillIndex])->SetFlashStatus (ulFlashStatus);
-}
-
-/*************************************************/
-
-
-NTSTATUS
-CSensor::
-SetPinMode(
- _In_ ULONGLONG Flags,
- _In_ ULONG PastBuffers
-)
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- return
- ((CImageHardwareSimulation *) m_HardwareSimulation[m_StillIndex])->
- SetMode( Flags, PastBuffers );
-}
-
-NTSTATUS
-CSensor::
-GetQPC(
- _Out_ PULONGLONG TriggerTime
-)
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- *TriggerTime =
- ((CImageHardwareSimulation *) m_HardwareSimulation[m_StillIndex])->
- GetTriggerTime();
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CSensor::
-SetQPC(
- _In_ ULONGLONG TriggerTime
-)
-{
- PAGED_CODE();
-
- if( m_StillIndex > m_PinCount ||
- !m_HardwareSimulation[m_StillIndex] )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- ((CImageHardwareSimulation *) m_HardwareSimulation[m_StillIndex])->
- SetTriggerTime( TriggerTime );
-
- return STATUS_SUCCESS;
-}
-
-//
-// Program the Per Frame Settings for simulation
-// We do it before calling start so we can be ready
-// to program our simulation's hardware.
-//
-// Note: We make a local copy.
-//
-NTSTATUS
-CSensor::
-SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
-)
-/*++
-
-Routine Description:
-
- Program the Per Frame Settings for simulation
- We do it before calling start so we can be ready
- to program our simulation's hardware.
-
- Note: We make a local copy.
-
-Arguments:
-
- pIspSettings -
- The Per-Frame Settings to use.
-
- FrameLimit -
- The number of frames to capture.
-
- LoopLimit -
- The number of times to loop over the sequence.
-
-Return Value:
-
- Success / Failure.
-
---*/
-{
- PAGED_CODE();
- KScopedMutex Lock(m_SensorMutex);
-
- // Set the current ISP settings and free any prior.
- // This has to be done at simulation start or stop or we have
- // a synchronization problem.
- SAFE_DELETE_ARRAY( m_pIspSettings );
-
- if( pIspSettings )
- {
- m_pIspSettings = new (NonPagedPoolNx) ISP_FRAME_SETTINGS[FrameLimit];
- if( !m_pIspSettings )
- {
- m_PfsFrameLimit = 0;
- m_PfsLoopLimit = 0;
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- RtlCopyMemory( m_pIspSettings, pIspSettings, FrameLimit*sizeof(ISP_FRAME_SETTINGS) );
- m_PfsLoopLimit = LoopLimit;
- m_PfsFrameLimit = FrameLimit;
- }
- else
- {
- m_PfsFrameLimit = 0;
- m_PfsLoopLimit = 0;
- }
-
- return STATUS_SUCCESS;
-}
-
-/*************************************************/
-
-
-void
-CSensor::
-ReleaseHardwareResources (
- _In_ PKSPIN Pin
-)
-
-/*++
-
-Routine Description:
-
- Release hardware resources. This should only be called by
- an object which has acquired them.
-
-Arguments:
-
- Pin -
- The pin to acquire.
-
-Return Value:
-
- None
-
---*/
-
-{
-
- PAGED_CODE();
-
- DBG_ENTER( "( Pin=%d )\n", Pin->Id ) ;
-
- LONG lPindex = Pin->Id;
- //
- // Blow away the image synth.
- //
- m_HardwareSimulation[lPindex]->Reset();
-
- SAFE_DELETE( m_Synthesizer[lPindex] );
- m_VideoInfoHeader[lPindex] = NULL;
-
- //
- // Release our "lock" on hardware resources. This will allow another
- // pin (perhaps in another graph) to acquire them.
- //
- InterlockedExchangePointer(
- (PVOID *) &(m_CapturePin[lPindex]),
- nullptr
- );
-
- DBG_LEAVE( "( Pin=%d )\n", Pin->Id ) ;
-}
-
-ULONG
-CSensor::
-ProgramScatterGatherMappings (
- _In_ PKSPIN Pin,
- _In_ PKSSTREAM_POINTER *Clone,
- _In_ PUCHAR *Buffer,
- _In_ PKSMAPPING Mappings,
- _In_ ULONG MappingsCount
-)
-
-/*++
-
-Routine Description:
-
- Program the scatter / gather mappings for the "fake" hardware.
-
- Punts the request to the H/W simulation (CHardwareSimulation) object for
- that pin.
-
-Arguments:
-
- Pin -
- The pin to program.
-
- Clone -
- A stream pointer.
-
- Buffer -
- Points to a pointer to the virtual address of the topmost
- scatter / gather chunk. The pointer will be updated as the
- device "programs" mappings. Reason for this is that we get
- the physical addresses and sizes, but must calculate the virtual
- addresses... This is used as scratch space for that.
-
- Mappings -
- An array of mappings to program
-
- MappingsCount -
- The count of mappings in the array
-
-Return Value:
-
- The number of mappings successfully programmed
-
---*/
-
-{
- PAGED_CODE();
-
- return
- m_HardwareSimulation[Pin->Id]->ProgramScatterGatherMappings (
- Clone,
- Buffer,
- Mappings,
- MappingsCount,
- sizeof (KSMAPPING)
- );
-}
-
-// Expose a pointer to the global ISP_FRAME_SETTINGS
-ISP_FRAME_SETTINGS *
-CSensor::
-GetGlobalIspSettings()
-{
- PAGED_CODE();
- return &m_GlobalIspSettings;
-}
-
-void
-CSensor::
-UpdateZoom(void)
-{
- PAGED_CODE();
-}
-
-//
-// This "Null" definition fails the request as if it doesn't exist in the
-// automation table. This is the default behavior for most properties in
-// CSensor.
-//
-#define DEFINE_NULL_PROPERTY_FUNC( _sal_, type, func ) \
-NTSTATUS \
-func( \
- _sal_ type *Value \
- ) \
-{ \
- PAGED_CODE(); \
- UNREFERENCED_PARAMETER(Value); \
- return STATUS_NOT_FOUND; \
-}
-
-#define DEFINE_NULL_SIZEOF_FUNC( func ) \
-ULONG \
-func() \
-{ \
- PAGED_CODE(); \
- return 0; \
-}
-
-#define DEFINE_NULL_PROPERTY_GET( T, type, name ) \
- DEFINE_NULL_PROPERTY_FUNC( _Inout_, type, T::Get##name )
-
-#define DEFINE_NULL_PROPERTY_SET( T, type, name ) \
- DEFINE_NULL_PROPERTY_FUNC( _In_, type, T::Set##name )
-
-#define DEFINE_NULL_PROPERTY( T, type, name ) \
- DEFINE_NULL_PROPERTY_GET( T, type, name ) \
- DEFINE_NULL_PROPERTY_SET( T, type, name )
-
-#define DEFINE_NULL_PROPERTY_ASYNC( T, type, name ) \
- DEFINE_NULL_PROPERTY_GET( T, type, name ) \
- \
-NTSTATUS \
-T:: \
-Set##name##Async( \
- _In_ type *pProperty, \
- _In_ CNotifier *Notifier \
- ) \
-{ \
- PAGED_CODE(); \
- UNREFERENCED_PARAMETER(pProperty); \
- UNREFERENCED_PARAMETER(Notifier); \
- return STATUS_NOT_FOUND; \
-} \
- \
-NTSTATUS \
-T:: \
-Cancel##name() \
-{ \
- PAGED_CODE(); \
- return STATUS_UNSUCCESSFUL; \
-}
-
-#define DEFINE_NULL_PROPERTY_VARSIZE_ASYNC( T, type, name ) \
- DEFINE_NULL_PROPERTY_ASYNC( T, type, name ) \
- \
-ULONG \
-T:: \
-SizeOf##name() \
-{ \
- PAGED_CODE(); \
- return 0; \
-}
-
-//
-// Define a bunch of "not implemented" function stubs.
-//
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S, FocusRect)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedPhotoMode, PhotoMode)
-
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOCONTROL_MODE_S, VideoControlMode)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_FLASH_S, Flash)
-DEFINE_NULL_PROPERTY_GET(CSensor, KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_S, PinDependence)
-
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, TriggerTime)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, TorchMode)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, ExtendedFlash)
-
-DEFINE_NULL_PROPERTY_GET(CSensor, CExtendedProperty, PhotoFrameRate)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedProperty, PhotoMaxFrameRate)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedProperty, WarmStart)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedMaxVideoFpsForPhotoRes, MaxVideoFpsForPhotoRes)
-DEFINE_NULL_PROPERTY_GET(CSensor, CExtendedFieldOfView, FieldOfView)
-DEFINE_NULL_PROPERTY_GET(CSensor, CExtendedCameraAngleOffset, CameraAngleOffset)
-DEFINE_NULL_PROPERTY_GET(CSensor, KSCAMERA_EXTENDEDPROP_FOCUSSTATE, FocusState)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedVidProcSetting, Focus)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedProperty, Iso)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedVidProcSetting, IsoAdvanced)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedEvCompensation, EvCompensation)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedVidProcSetting, WhiteBalance)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedVidProcSetting, Exposure)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedProperty, SceneMode)
-DEFINE_NULL_PROPERTY_ASYNC(CSensor, CExtendedProperty, Thumbnail)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, PhotoConfirmation)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, FocusPriority)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, VideoHDR)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, VFR)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedVidProcSetting, Zoom)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, VideoStabilization)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, Histogram)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedMetadata, Metadata)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, OpticalImageStabilization)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, OptimizationHint)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedProperty, AdvancedPhoto)
-DEFINE_NULL_PROPERTY(CSensor, CExtendedVidProcSetting, FaceDetection)
-
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S, VideoStabMode)
-
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, Exposure)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, Focus)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, Zoom)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, ZoomRelative)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, Pan)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, Roll)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_S, Tilt)
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S, FocalLength)
-
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOPROCAMP_S, BacklightCompensation);
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOPROCAMP_S, Brightness);
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOPROCAMP_S, Contrast);
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOPROCAMP_S, Hue);
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOPROCAMP_S, WhiteBalance);
-DEFINE_NULL_PROPERTY(CSensor, KSPROPERTY_VIDEOPROCAMP_S, PowerlineFreq);
-
-DEFINE_NULL_PROPERTY_GET(CSensor, CRoiConfig, RoiConfigCaps);
-DEFINE_NULL_PROPERTY_VARSIZE_ASYNC(CSensor, CRoiProperty, Roi);
-
-_Success_(return == 0)
-NTSTATUS
-CSensor::
-GetPfsCaps(
- _Inout_opt_ KSCAMERA_PERFRAMESETTING_CAP_HEADER *Caps,
- _Inout_ ULONG *Size
-)
-{
- PAGED_CODE();
- UNREFERENCED_PARAMETER(Caps);
- *Size = 0;
- return STATUS_NOT_FOUND;
-}
diff --git a/avscamera/sys/Sensor.h b/avscamera/sys/Sensor.h
deleted file mode 100644
index 37adc008..00000000
--- a/avscamera/sys/Sensor.h
+++ /dev/null
@@ -1,554 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- Sensor.h
-
- Abstract:
-
- Base Sensor class. Derive from this class to implement an interface
- to your hardware sensor object.
-
- This class provides a set of "knobs" to control a model camera.
-
- This class also controls access to the pin simulations. Most cameras
- have a limited set of ISP resources and can only instantiate a fixed
- number of pins. This class grants access to those resources. Other
- than that, it's just an interface class.
-
- History:
-
- created 5/5/2014
-
-**************************************************************************/
-
-#pragma once
-
-//
-// The following DECLARE_PROPERTY_XXX() macros are used to create consistent
-// function names for each control.
-//
-#define DECLARE_PROPERTY_GET( type, name ) \
- virtual \
- NTSTATUS \
- Get##name( \
- _Inout_ type *pProperty \
- ); \
-
-#define DECLARE_PROPERTY_SIZEOF( name ) \
- virtual \
- ULONG \
- SizeOf##name();
-
-#define DECLARE_PROPERTY_SET( type, name ) \
- virtual \
- NTSTATUS \
- Set##name( \
- _In_ type *pProperty \
- );
-
-#define DECLARE_PROPERTY_SET_ASYNC( type, name ) \
- virtual \
- NTSTATUS \
- Set##name##Async( \
- _In_ type *pProperty, \
- _In_ CNotifier *Notifier \
- );
-
-#define DECLARE_PROPERTY_CANCEL( type, name ) \
- virtual \
- NTSTATUS \
- Cancel##name();
-
-#define DECLARE_PROPERTY( type, name ) \
- DECLARE_PROPERTY_GET( type, name ) \
- DECLARE_PROPERTY_SET( type, name )
-
-#define DECLARE_PROPERTY_ASYNC_NOCANCEL( type, name ) \
- DECLARE_PROPERTY_GET( type, name ) \
- DECLARE_PROPERTY_SET_ASYNC( type, name )
-
-#define DECLARE_PROPERTY_ASYNC( type, name ) \
- DECLARE_PROPERTY_ASYNC_NOCANCEL( type, name ) \
- DECLARE_PROPERTY_CANCEL( type, name )
-
-#define DECLARE_PROPERTY_VARSIZE_ASYNC( type, name ) \
- DECLARE_PROPERTY_ASYNC( type, name ) \
- DECLARE_PROPERTY_SIZEOF( name )
-
-#define DECLARE_PROPERTY_VARSIZE_ASYNC_NOCANCEL( type, name ) \
- DECLARE_PROPERTY_ASYNC_NOCANCEL( type, name ) \
- DECLARE_PROPERTY_SIZEOF( name )
-
-
-//
-// CNotifer
-//
-// A CNotiver is just a wrapper on a KS event. It holds the parameters
-// needed to invoke the KS event successfully and it is referenced counted
-// to make sure the filter does not go away before your sensor is done with
-// the notifier.
-//
-// These objects should be instantiated in the filter and a reference
-// held in your sensor object.
-//
-class CNotifier : public CRef
-{
-private:
- PVOID m_Object;
- GUID m_EventSet;
- ULONG m_EventId;
- ULONG m_DataSize;
- PVOID m_Data;
- PFNKSGENERATEEVENTCALLBACK m_Callback;
- PVOID m_CallbackContext;
-
-public:
- CNotifier(
- _In_ PKSFILTER Filter,
- _In_ const GUID *EventSet,
- _In_ ULONG EventId,
- _In_ ULONG DataSize=0,
- _In_opt_ PVOID Data=nullptr,
- _In_opt_ PFNKSGENERATEEVENTCALLBACK Callback=nullptr,
- _In_opt_ PVOID CallbackContext=nullptr
- )
- : m_Object(Filter)
- , m_EventSet(*EventSet)
- , m_EventId(EventId)
- , m_DataSize(DataSize)
- , m_Data(Data)
- , m_Callback(Callback)
- , m_CallbackContext(CallbackContext)
- {}
-
- CNotifier(
- _In_ PKSPIN Pin,
- _In_ const GUID *EventSet,
- _In_ ULONG EventId,
- _In_ ULONG DataSize=0,
- _In_opt_ PVOID Data=nullptr,
- _In_opt_ PFNKSGENERATEEVENTCALLBACK Callback=nullptr,
- _In_opt_ PVOID CallbackContext=nullptr
- )
- : m_Object(Pin)
- , m_EventSet(*EventSet)
- , m_EventId(EventId)
- , m_DataSize(DataSize)
- , m_Data(Data)
- , m_Callback(Callback)
- , m_CallbackContext(CallbackContext)
- {}
-
- void
- Set()
- {
- KsGenerateEvents(m_Object, &m_EventSet, m_EventId, m_DataSize, m_Data, m_Callback, m_CallbackContext);
- }
-};
-
-class CSensor
-{
-protected:
-
- CCaptureDevice *m_Device;
-
- ULONG m_PinCount;
- LONG m_FilterInstanceCount;
-
- //
- // The AVStream filter object associated with this CCaptureFilter.
- //
- CHardwareSimulation **m_HardwareSimulation;
- CSynthesizer **m_Synthesizer;
- ICapturePin **m_CapturePin;
-
- PKS_VIDEOINFOHEADER *m_VideoInfoHeader;
-
- //
- // The number of ISR's that have occurred since capture started.
- //
- ULONG *m_InterruptTime;
-
- //
- // The last reading of mappings completed.
- //
- ULONG *m_LastMappingsCompleted;
-
- static const ULONG INVALID_PIN_INDEX = 0xffffffff;
-
- ULONG m_PreviewIndex;
- ULONG m_StillIndex;
- ULONG m_VideoIndex;
-
- // Access control mutex.
- KMutex m_SensorMutex;
-
- ULONG m_PfsLoopLimit;
- ULONG m_PfsFrameLimit;
- ISP_FRAME_SETTINGS *m_pIspSettings;
-
- ISP_FRAME_SETTINGS m_GlobalIspSettings;
-
-public:
-
- CSensor(
- _In_ CCaptureDevice *Device,
- _In_ ULONG PinCount
- );
-
- //
- // ~CSensor():
- //
- // The h/w Sensor destructor.
- //
- virtual
- ~CSensor( );
-
- virtual
- NTSTATUS
- Initialize();
-
- virtual
- NTSTATUS
- ProgramDefaults();
-
- virtual
- void
- Interrupt(
- _In_ LONG PinIndex
- );
-
- virtual
- PDEVICE_OBJECT
- GetDeviceObject()
- {
- return m_Device->GetDeviceObject();
- }
-
- //
- // AcquireHardwareResources():
- //
- // Called to acquire hardware resources for the device based on a given
- // video info header. This will fail if another object has already
- // acquired hardware resources since we emulate a single capture
- // device.
- //
- virtual
- NTSTATUS
- AcquireHardwareResources(
- _In_ PKSPIN Pin,
- _In_ ICapturePin *CaptureSink,
- _In_ PKS_VIDEOINFOHEADER VideoInfoHeader,
- _Out_ CHardwareSimulation **pSim
- );
-
- //
- // ReleaseHardwareResources():
- //
- // Called to release hardware resources for the device.
- //
- virtual
- void
- ReleaseHardwareResources(
- _In_ PKSPIN Pin
- //_In_ CHardwareSimulation *pSim
- );
-
- //
- // Start():
- //
- // Called to start the hardware simulation. This causes us to simulate
- // interrupts, simulate filling buffers with synthesized data, etc...
- //
- NTSTATUS
- Start (
- _In_ PKSPIN Pin
- );
-
- //
- // Pause():
- //
- // Called to pause or unpause the hardware simulation. This will be
- // indentical to a start or stop but it will not reset formats and
- // counters.
- //
- NTSTATUS
- Pause(
- _In_ PKSPIN Pin,
- _In_ BOOLEAN Pausing
- );
-
- NTSTATUS
- Trigger(
- _In_ ULONG PinId,
- _In_ LONG mode
- );
-
- NTSTATUS
- SetQPC(
- _In_ ULONGLONG QPC
- );
-
- NTSTATUS
- GetQPC(
- _Out_ PULONGLONG QPC
- );
-
- NTSTATUS
- SetPinMode(
- _In_ ULONGLONG Flags,
- _In_ ULONG PastBuffers
- );
-
- NTSTATUS
- SetPhotoFrameRate(
- _In_ ULONGLONG TimePerFrame
- );
-
- ULONGLONG
- GetPhotoFrameRate();
-
- NTSTATUS
- SetFlashStatus(
- _In_ ULONGLONG ulFlashStatus
- );
-
- bool
- IsPreviewIndex(
- _In_ ULONG Index
- )
- {
- return m_PreviewIndex == Index ;
- }
-
- bool
- IsStillIndex(
- _In_ ULONG Index
- )
- {
- return m_StillIndex == Index ;
- }
-
- bool
- IsVideoIndex(
- _In_ ULONG Index
- )
- {
- return m_VideoIndex == Index ;
- }
-
- bool
- IsValidIndex(
- _In_ ULONG Index
- )
- {
- return Index < GetPinCount() ;
- }
-
- inline ULONG GetPreviewIndex()
- {
- return m_PreviewIndex;
- }
-
- inline ULONG GetStillIndex()
- {
- return m_StillIndex;
- }
-
- inline ULONG GetVideoIndex()
- {
- return m_VideoIndex;
- }
-
- //Not thread safe, for User mode notification only.
- LONG
- GetFilterCount()
- {
- return m_FilterInstanceCount;
- }
-
- NTSTATUS
- AddFilter(PKSFILTER pFilter);
-
- NTSTATUS
- RemoveFilter(PKSFILTER pFilter);
-
- ULONG
- GetPinCount()
- {
- return m_PinCount;
- }
-
- //
- // GetFourCC
- //
- // Return the FourCC code for the current pin.
- //
- ULONG
- GetFourCC(
- _In_ ULONG Index
- )
- {
- return Index<m_PinCount ? m_VideoInfoHeader[Index]->bmiHeader.biCompression : 0;
- }
-
- //
- // Stop():
- //
- // Called to stop the hardware simulation. This causes interrupts to
- // stop issuing. When this call returns, the "fake" hardware has
- // stopped accessing all s/g buffers, etc...
- //
- NTSTATUS
- Stop (
- _In_ PKSPIN
- );
-
- NTSTATUS
- Reset(
- _In_ PKSPIN
- );
-
- NTSTATUS
- Reset(
- );
-
-
- //
- // ProgramScatterGatherMappings():
- //
- // Called to program the hardware simulation's scatter / gather table.
- // This synchronizes with the "fake" ISR and hardware simulation via
- // a spinlock.
- //
- ULONG
- ProgramScatterGatherMappings (
- _In_ PKSPIN Pin,
- _In_ PKSSTREAM_POINTER *Clone,
- _In_ PUCHAR *Buffer,
- _In_ PKSMAPPING Mappings,
- _In_ ULONG MappingsCount
- );
-
- // Lets you know if Variable Photo Sequence is active.
- // Note: This doesn't tell you if the pin is running.
- virtual
- BOOLEAN
- IsVPSActive()
- {
- // VPS isn't supported by default.
- return FALSE;
- }
-
- // Fetch a pointer to the global ISP_FRAME_SETTINGS
- virtual
- ISP_FRAME_SETTINGS *
- GetGlobalIspSettings();
-
- // Program the Per Frame Settings for simulation
- // We do it before calling start so we can be ready
- // to program our simulation's hardware.
- // Note: We make a local copy.
- virtual
- NTSTATUS
- SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
- );
-
- virtual
- void
- UpdateZoom(void);
-
-protected:
- LONG
- IncrementFilterCount()
- {
- return InterlockedIncrement(&m_FilterInstanceCount);
- }
-
- LONG
- DecrementFilterCount()
- {
- return InterlockedDecrement(&m_FilterInstanceCount);
- }
-
-public:
-
- DECLARE_PROPERTY( KSPROPERTY_VIDEOCONTROL_MODE_S, VideoControlMode );
-
- DECLARE_PROPERTY_GET( KSCAMERA_EXTENDEDPROP_FOCUSSTATE, FocusState );
- 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_ASYNC( CExtendedPhotoMode, PhotoMode );
- DECLARE_PROPERTY_GET( CExtendedProperty, PhotoFrameRate );
- DECLARE_PROPERTY_ASYNC( CExtendedProperty, PhotoMaxFrameRate );
- DECLARE_PROPERTY_ASYNC( CExtendedProperty, WarmStart );
- DECLARE_PROPERTY( CExtendedMaxVideoFpsForPhotoRes, MaxVideoFpsForPhotoRes );
- DECLARE_PROPERTY_GET( CExtendedFieldOfView, FieldOfView );
- DECLARE_PROPERTY_GET( CExtendedCameraAngleOffset, CameraAngleOffset );
- DECLARE_PROPERTY( CExtendedProperty, ExtendedFlash );
-
- DECLARE_PROPERTY( CExtendedProperty, TriggerTime );
- DECLARE_PROPERTY( CExtendedProperty, TorchMode );
-
- DECLARE_PROPERTY_ASYNC( CExtendedVidProcSetting, Focus );
- DECLARE_PROPERTY_ASYNC( CExtendedProperty, Iso );
- DECLARE_PROPERTY_ASYNC( CExtendedVidProcSetting, IsoAdvanced );
- DECLARE_PROPERTY_ASYNC( CExtendedEvCompensation, EvCompensation );
- DECLARE_PROPERTY_ASYNC( CExtendedVidProcSetting, WhiteBalance );
- DECLARE_PROPERTY_ASYNC( CExtendedVidProcSetting, Exposure );
- DECLARE_PROPERTY( CExtendedProperty, PhotoConfirmation );
- DECLARE_PROPERTY_ASYNC( CExtendedProperty, SceneMode );
- DECLARE_PROPERTY( CExtendedProperty, FocusPriority );
- DECLARE_PROPERTY_ASYNC( CExtendedProperty, Thumbnail );
- 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_VARSIZE_ASYNC( CRoiProperty, Roi );
-
- DECLARE_PROPERTY( KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S, VideoStabMode );
-
- 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 );
-
- _Success_(return == 0)
- virtual
- NTSTATUS
- GetPfsCaps(
- _Inout_opt_ KSCAMERA_PERFRAMESETTING_CAP_HEADER *Caps,
- _Inout_ ULONG *Size
- );
-};
-
diff --git a/avscamera/sys/SensorSimulation.cpp b/avscamera/sys/SensorSimulation.cpp
deleted file mode 100644
index 6d93c37f..00000000
--- a/avscamera/sys/SensorSimulation.cpp
+++ /dev/null
@@ -1,3496 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- SensorSimulation.cpp
-
- Abstract:
-
- Simulation class implementation. 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
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-//
-// The following macro is used to define a legacy control's range and
-// default value. We use the macro simply to minimize the verbosity of
-// our declarations.
-//
-#define DEFINE_LEGACY_CTRL_CAPS( Control, Minimum, Maximum, SteppingDelta, DefValue ) \
-/*-------------------------------------------------------------- \
- This structure defines what the control is capable of. \
---------------------------------------------------------------*/ \
-KSPROPERTY_STEPPING_LONG Control##RangeAndStep[] = \
-{ \
- { \
- SteppingDelta, /* SteppingDelta */ \
- 0, /* Reserved */ \
- Minimum, /* Minimum */ \
- Maximum /* Maximum */ \
- } \
-}; \
- \
-/* This is the default control value. */ \
-const LONG Control##Default = DefValue; \
- \
-KSPROPERTY_MEMBERSLIST Control##MembersList[] = \
-{ \
- { \
- { \
- KSPROPERTY_MEMBER_STEPPEDRANGES, \
- sizeof (Control##RangeAndStep), \
- SIZEOF_ARRAY(Control##RangeAndStep), \
- 0 \
- }, \
- (PVOID)Control##RangeAndStep, \
- }, \
- { \
- { \
- KSPROPERTY_MEMBER_VALUES, \
- sizeof (Control##Default), \
- 1, \
- KSPROPERTY_MEMBER_FLAG_DEFAULT \
- }, \
- (PVOID)&Control##Default \
- } \
-}; \
- \
-KSPROPERTY_VALUES Control##Values = \
-{ \
- { \
- STATICGUIDOF(KSPROPTYPESETID_General), \
- VT_I4, \
- 0 \
- }, \
- SIZEOF_ARRAY(Control##MembersList), \
- Control##MembersList \
-};
-
-DEFINE_LEGACY_CTRL_CAPS( ZoomRelative, -2, +2, 1, 0 )
-DEFINE_LEGACY_CTRL_CAPS( Zoom, FOCALLENGTH_OPTICAL_MIN, FOCALLENGTH_OPTICAL_MAX, 1, FOCALLENGTH_OCULAR )
-DEFINE_LEGACY_CTRL_CAPS( Pan, -180, 180, 1, 0 )
-DEFINE_LEGACY_CTRL_CAPS( Roll, -180, 180, 1, 0 )
-DEFINE_LEGACY_CTRL_CAPS( Tilt, -180, 180, 1, 0 )
-DEFINE_LEGACY_CTRL_CAPS( BacklightCompensation, 0, 1, 1, 0 )
-DEFINE_LEGACY_CTRL_CAPS( Brightness, -10000, 10000, 1, 750 )
-DEFINE_LEGACY_CTRL_CAPS( Contrast, -10000, 10000, 1, 100 )
-DEFINE_LEGACY_CTRL_CAPS( Hue, -18000, 18000, 1, 0 )
-DEFINE_LEGACY_CTRL_CAPS( PLF, POWERLINEFREQ_DISABLED, POWERLINEFREQ_60HZ, 1, POWERLINEFREQ_DEFAULT )
-DEFINE_LEGACY_CTRL_CAPS( WhiteBalance, WHITEBALANCE_MIN, WHITEBALANCE_MAX, WHITEBALANCE_STEP, WHITEBALANCE_DEF )
-DEFINE_LEGACY_CTRL_CAPS( Exposure, EXPOSURE_BILOG_MIN, EXPOSURE_BILOG_MAX, EXPOSURE_BILOG_STEP, EXPOSURE_BILOG_DEF)
-DEFINE_LEGACY_CTRL_CAPS( Focus, 1, 1200, 1, 100 );
-
-void
-CSensorSimulation::
-FocusConvergence(
- _In_opt_ PVOID Context
-)
-/*++
-
-Routine Description:
-
- A timer callback that simulates focus convergence.
-
- Update the focus state to focused.
-
- Update the position to a random location that is in bounds if we are in
- an auto or continuous auto mode. The new location is probably not
- realistic; but it is important to simulate the change in location for
- testing.
-
- Notice that we do no kick off the timer again on continuous auto focus.
- A camera that is performing continuous auto focus in software would
- probably do something there.
-
-Arguments:
-
- Context -
- In our case, this is a pointer to our simulation object.
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-
- if( Context )
- {
- CSensorSimulation *Sensor = (CSensorSimulation *) Context;
- KScopedMutex lock( Sensor->m_SensorMutex );
-
- if( Sensor->m_FocusNotifier )
- {
- Sensor->m_FocusNotifier->Set();
- Sensor->m_FocusNotifier = nullptr;
- }
-
- // Let's just fake a focus change if we get here from somewhere else.
- // This only applies to auto focus modes and only if we're not focused.
- if( (Sensor->m_GlobalIspSettings.FocusMode &
- (KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO | KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS)) &&
- Sensor->m_FocusState != KSCAMERA_EXTENDEDPROP_FOCUSSTATE_FOCUSED )
- {
- Sensor->m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul =
- GetRandom( Sensor->m_GlobalIspSettings.FocusSetting.Min,
- Sensor->m_GlobalIspSettings.FocusSetting.Max );
- }
- else if( Sensor->m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- switch( Sensor->m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_MASK )
- {
- case KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_INFINITY:
- Sensor->m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul =
- Sensor->m_GlobalIspSettings.FocusSetting.Max;
- break;
-
- case KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_HYPERFOCAL:
- Sensor->m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul =
- Sensor->m_GlobalIspSettings.FocusSetting.Max - Sensor->m_GlobalIspSettings.FocusSetting.Step;
- break;
-
- case KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_NEAREST:
- Sensor->m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul =
- Sensor->m_GlobalIspSettings.FocusSetting.Min;
- break;
-
- }
- }
-
- // TODO:
- // If we're continuous focus, we should probably kick off another focus change here...
- // ... but that tends to mess with testing.
-
- // We always want to transition to here.
- Sensor->m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_FOCUSED;
- }
-}
-
-void
-CSensorSimulation::
-FocusRectConvergence(
- _In_opt_ PVOID Context
-)
-/*++
-
-Routine Description:
-
- A timer callback that simulates FocusRect convergence.
-
-Arguments:
-
- Context -
- In our case, this is a pointer to our simulation object.
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-
- if( Context )
- {
- CSensorSimulation *Sensor = (CSensorSimulation *) Context;
- KScopedMutex lock( Sensor->m_SensorMutex );
-
- if( Sensor->m_FocusRectNotifier )
- {
- Sensor->m_FocusRectNotifier->Set();
- Sensor->m_FocusRectNotifier = nullptr;
- }
-
- // Not much else to do here.
- }
-}
-
-CSensorSimulation::CSensorSimulation(
- _In_ CCaptureDevice *Device,
- _In_ const KSFILTER_DESCRIPTOR *Descriptors
-)
- : CSensor( Device, Descriptors->PinDescriptorsCount )
- , m_Descriptors( Descriptors )
- , m_MetadataInfo( nullptr )
- , m_FocusTimer( nullptr )
- , m_FocusRectTimer( nullptr )
-
-{
- PAGED_CODE();
-
- KeQuerySystemTime (&m_StartTime);
-}
-
-
-CSensorSimulation::~CSensorSimulation()
-{
- PAGED_CODE();
-
- delete m_FocusTimer;
- delete m_FocusRectTimer;
- delete [] m_MetadataInfo;
- delete [] (PBYTE) m_pPerFrameSettings;
- delete [] m_WarmStartEnabled;
-}
-
-NTSTATUS
-CSensorSimulation::
-ProgramDefaults()
-/*++
-
-Routine Description:
-
- Reset our simulation back to the DDI-specified defaults.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
-
- m_FocusNotifier = nullptr;
- m_pPerFrameSettings = nullptr;
-
-
- m_FaceDetectionMax = MAX_FACES;
- m_FaceDetectionFlags = KSCAMERA_EXTENDEDPROP_FACEDETECTION_OFF;
- m_FaceDetectionCurrentMax = 0;
- m_AutoFocusLock = false;
- m_AutoExposureLock = false;
- m_AutoWhitebalanceLock = false;
- m_Flash = 0;
- m_VideoStabMode = 0;
- m_VFR = KSCAMERA_EXTENDEDPROP_VFR_ON;
- m_VideoHDR = KSCAMERA_EXTENDEDPROP_VIDEOHDR_OFF;
- m_VideoStabilization = KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_OFF;
- m_Histogram = KSCAMERA_EXTENDEDPROP_HISTOGRAM_OFF;
- m_OpticalImageStabilization = KSCAMERA_EXTENDEDPROP_OIS_AUTO;
- m_AdvancedPhoto = KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_OFF;
-
- m_FocusRect.left = 0;
- m_FocusRect.top = 0;
- m_FocusRect.right = 0;
- m_FocusRect.bottom = 0;
-
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_UNINITIALIZED;
-
- m_PhotoMode = CExtendedPhotoMode();
- m_PhotoMode.Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE;
- m_PhotoMode.PinId = GetStillIndex();
- m_PhotoMode.MaxHistoryFrames() = IMAGE_CAPTURE_PIN_MAXIMUM_HISTORY_FRAMES;
- m_PhotoMode.RequestedHistoryFrames() = 0;
- m_PhotoMode.SubMode() = KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE_SUB_NONE;
-
- m_MaxFrameRate = CExtendedProperty(); // assume nothing.
- SetQPC( 0 );
- m_TorchMode.Flags = KSCAMERA_EXTENDEDPROP_VIDEOTORCH_OFF;
- m_TorchMode = 50UL;
-
- m_OptimizationHint.Flags = KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO;
-
- m_SceneMode = KSCAMERA_EXTENDEDPROP_SCENEMODE_AUTO;
-
- // Wipe the global settings to zeros for now.
- RtlFillBytes(&m_GlobalIspSettings, sizeof(m_GlobalIspSettings), 0);
-
- m_GlobalIspSettings.FlashMode = KSCAMERA_EXTENDEDPROP_FLASH_OFF;
- m_GlobalIspSettings.FlashValue = 50;
-
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.ISOValue = 200;
-
- m_GlobalIspSettings.EVCompensation.Mode = 0;
- m_GlobalIspSettings.EVCompensation.Min = -2;
- m_GlobalIspSettings.EVCompensation.Max = 2;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
-
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.WhiteBalanceSetting.Max = WHITEBALANCE_MAX;
- m_GlobalIspSettings.WhiteBalanceSetting.Min = WHITEBALANCE_MIN;
- m_GlobalIspSettings.WhiteBalanceSetting.Step = WHITEBALANCE_STEP;
- m_GlobalIspSettings.WhiteBalanceSetting.Reserved = 0;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
-
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.Max = (MAX_EXPOSURE_TIME>LONG_MAX) ? LONG_MAX : (LONG)(LONG_MAX & MAX_EXPOSURE_TIME);
- m_GlobalIspSettings.ExposureSetting.Min = (LONG)MIN_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Step = 1;
- m_GlobalIspSettings.ExposureSetting.Reserved = 0;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
-
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.Max = 1200;
- m_GlobalIspSettings.FocusSetting.Min = 1;
- m_GlobalIspSettings.FocusSetting.Step = 1;
- m_GlobalIspSettings.FocusSetting.Reserved = 0;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- m_GlobalIspSettings.FocusSetting.Mode = 0;
- m_GlobalIspSettings.FocusPriority = KSCAMERA_EXTENDEDPROP_FOCUSPRIORITY_ON;
-
- m_GlobalIspSettings.bPhotoConfirmation = TRUE;
-
- // Defaults to fall back to if we get a cancel.
- m_LastFocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_LastFocusSetting = 100;
-
-
- // Specifies the dynamic range of our fictious camera's lens system
- // Note: Magnification = Lobjective / Locular
-
- // The following values set only the minimum and maximum for the rational number expressing the zoom.
-
- // This specifies the denominator of the rational value used to specify magnification.
- m_FocalLength.lOcularFocalLength = FOCALLENGTH_OCULAR;
- // If lObjectiveFocalLengthMin < lOcularFocalLength, then camera allows Zoom out: aka, wide-field view.
- m_FocalLength.lObjectiveFocalLengthMin = FOCALLENGTH_OPTICAL_MIN;
- // If lObjectiveFocalLengthMax > lOcularFocalLength, then camera allows Zoom in: aka, Magnified, narrow-field view.
- m_FocalLength.lObjectiveFocalLengthMax = FOCALLENGTH_OPTICAL_MAX;
-
- // Cache values for the new extended zoom property.
- m_ExtendedZoom.Flags = KSCAMERA_EXTENDEDPROP_ZOOM_DIRECT;
- m_ExtendedZoom.Min() = (LONG)(TO_Q16(FOCALLENGTH_OPTICAL_MIN) / FOCALLENGTH_OCULAR);
- m_ExtendedZoom.Max() = (LONG)(TO_Q16(FOCALLENGTH_OPTICAL_MAX) / FOCALLENGTH_OCULAR);
- m_ExtendedZoom.Step() = 1; // This avoids the rounding issue.
- m_ExtendedZoom = ZoomDefault;
- //TO_Q16(ZoomRangeAndStep[0].SteppingDelta) / FOCALLENGTH_OCULAR;
-
- // Set up our current zoom.
- m_Zoom.Capabilities =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE |
- KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE;
- m_Zoom.Value = ZoomDefault;
- m_Zoom.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL | KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
-
- // Set up our relative zoom.
- m_ZoomRelative.Capabilities =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- m_ZoomRelative.Value = ZoomRelativeDefault;
- m_ZoomRelative.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL | KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
-
- m_Pan.Capabilities =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- m_Pan.Value = PanDefault;
- m_Pan.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO | KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
-
- m_Roll.Capabilities =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- m_Roll.Value = RollDefault;
- m_Roll.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO | KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
-
- m_Tilt.Capabilities =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- m_Tilt.Value = TiltDefault;
- m_Tilt.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO | KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
-
- m_BacklightCompensation.Capabilities =
- KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL |
- KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO;
- m_BacklightCompensation.Value = BacklightCompensationDefault;
- m_BacklightCompensation.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
-
- m_Brightness.Capabilities =
- KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL |
- KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO;
- m_Brightness.Value = BrightnessDefault;
- m_Brightness.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
-
- m_Contrast.Capabilities =
- KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL |
- KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO;
- m_Contrast.Value = ContrastDefault;
- m_Contrast.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
-
- m_Hue.Capabilities =
- KSPROPERTY_VIDEOPROCAMP_FLAGS_MANUAL |
- KSPROPERTY_VIDEOPROCAMP_FLAGS_AUTO;
- m_Hue.Value = HueDefault;
- m_Hue.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
-
- // Set up our Power Line Frequency defaults.
- m_PowerLineFreq.Capabilities = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- m_PowerLineFreq.Value = POWERLINEFREQ_DEFAULT;
- m_PowerLineFreq.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
-
- m_IsoResult = STATUS_SUCCESS;
- m_EvCompResult = STATUS_SUCCESS;
- m_WhiteBalanceResult= STATUS_SUCCESS;
- m_ExposureResult = STATUS_SUCCESS;
- m_SceneModeResult = STATUS_SUCCESS;
- m_FaceDetectionResult = STATUS_SUCCESS;
- m_FocusResult = STATUS_SUCCESS;
-
- for( ULONG PinIndex=0; PinIndex<GetPinCount(); PinIndex++ )
- {
- // Reset the metadata control.
- m_MetadataInfo[PinIndex] = CExtendedMetadata(PinIndex);
-
- // Reset the warmstart control.
- m_WarmStartEnabled[PinIndex] = CExtendedProperty(KSCAMERA_EXTENDEDPROP_WARMSTART_MODE_DISABLED);
- m_WarmStartEnabled[PinIndex].PinId = PinIndex;
- }
-
- DBG_LEAVE("()");
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CSensorSimulation::
-Initialize()
-/*++
-
-Routine Description:
-
- Perform memory allocations for the simulation. Inspect the descriptors
- for pins and allocate appropriate simulation objects based on the pin's
- type.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- DBG_ENTER("()");
- NTSTATUS Status = STATUS_SUCCESS;
- IFFAILED_EXIT( Status = CSensor::Initialize() );
-
- IFNULL_EXIT( m_FocusTimer = new (NonPagedPoolNx, 'emiT') KPassiveTimer( m_Device->GetDeviceObject() ) );
- IFNULL_EXIT( m_FocusRectTimer = new (NonPagedPoolNx, 'emiT') KPassiveTimer( m_Device->GetDeviceObject() ) );
- IFNULL_EXIT( m_MetadataInfo = new (PagedPool, 'ateM') CExtendedMetadata[GetPinCount()] );
- IFNULL_EXIT( m_WarmStartEnabled = new (PagedPool, 'mraW' ) CExtendedProperty[GetPinCount()] );
-
- if( NT_SUCCESS( Status ) )
- {
- for( ULONG PinIndex=0;
- NT_SUCCESS(Status) && PinIndex<m_Descriptors->PinDescriptorsCount;
- PinIndex++ )
- {
- const KSPIN_DESCRIPTOR_EX *PinDescriptors = m_Descriptors->PinDescriptors;
- CHardwareSimulation *pSim=nullptr;
-
- NT_ASSERT( m_Descriptors->PinDescriptorSize == sizeof( *PinDescriptors ) );
-
- // Video pin type
- if( IsEqualGUID( *PinDescriptors[PinIndex].PinDescriptor.Category, PIN_CATEGORY_CAPTURE ) )
- {
- pSim = new (NonPagedPoolNx, 'ediV') CVideoHardwareSimulation( this, PinIndex );
- m_VideoIndex = PinIndex;
- }
- else if( IsEqualGUID( *PinDescriptors[PinIndex].PinDescriptor.Category, PIN_CATEGORY_PREVIEW ) )
- {
- pSim = new (NonPagedPoolNx, 'verP') CPreviewHardwareSimulation( this, PinIndex );
- m_PreviewIndex = PinIndex; // must set to enable photo confirmation...
- }
- else if( IsEqualGUID( *PinDescriptors[PinIndex].PinDescriptor.Category, PINNAME_IMAGE ) )
- {
- pSim = new (NonPagedPoolNx, 'litS') CImageHardwareSimulation( this, PinIndex );
- m_StillIndex = PinIndex;
- }
- else
- {
- Status = STATUS_INTERNAL_ERROR;
- NT_ASSERT(FALSE);
- }
-
- if( pSim )
- {
- if( pSim->Initialize() )
- {
- m_HardwareSimulation[PinIndex] = pSim;
- }
- else
- {
- //
- // If we couldn't create the hardware simulation, fail.
- //
- delete pSim;
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- }
- else
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- }
- }
-
-done:
- DBG_ENTER("()=0x%08X", Status);
- return Status;
-}
-
-/**************************************************************************
-
- Sensor-level control simulations
-
- 1. Query capabilities and state of the device.
- 2. Issue a command or set state on the device.
-
-**************************************************************************/
-
-// Get for KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID
-NTSTATUS
-CSensorSimulation::
-GetFocusRect(
- _Inout_ PKSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S pRoi
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- pRoi->FocusRect = m_FocusRect;
- pRoi->AutoFocusLock = m_AutoFocusLock;
- pRoi->AutoExposureLock = m_AutoExposureLock;
- pRoi->AutoWhitebalanceLock = m_AutoWhitebalanceLock;
- pRoi->Capabilities = KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_FLAGS_AUTO | KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_FLAGS_ASYNC | KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_CONFIG_FOCUS |
- KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_CONFIG_EXPOSURE;
- return STATUS_SUCCESS;
-}
-
-// Set for KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID
-NTSTATUS
-CSensorSimulation::
-SetFocusRectAsync(
- _In_ PKSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S pRoi,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- if( m_FocusRectNotifier )
- {
- // The last operation is still pending.
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- m_FocusRectNotifier = Notifier;
-
- m_FocusRect = pRoi->FocusRect;
- m_AutoFocusLock = pRoi->AutoFocusLock;
- m_AutoExposureLock = pRoi->AutoExposureLock;
- m_AutoWhitebalanceLock = pRoi->AutoWhitebalanceLock;
-
- if(m_AutoFocusLock)
- {
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- }
- if(m_AutoExposureLock)
- {
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll = DEF_EXPOSURE_TIME;
- DBG_TRACE("ExposureMode=KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO, ExposureTime=%lld00ns",
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll);
- }
- if(m_AutoWhitebalanceLock)
- {
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- }
-
- // Fire a one-shot timer to transition the focus state.
- m_FocusTimer->Set(
- -2500000LL, // 250ms
- FocusRectConvergence,
- this );
-
- return STATUS_SUCCESS;
-}
-
-// Cancel an outstanding KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID Set
-NTSTATUS
-CSensorSimulation::
-CancelFocusRect()
-{
- PAGED_CODE();
-
- // Per spec, this control cannot be cancelled. So we block until complete.
- // Even if we didn't block here, the CNotifier object is reference counted,
- // so the CCaptureFilter would block until the operation completes.
- if( m_FocusRectNotifier )
- {
- m_FocusRectTimer->Wait();
- }
- return STATUS_UNSUCCESSFUL;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FACEDETECTION.
-NTSTATUS
-CSensorSimulation::
-GetFaceDetection(
- _Inout_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedVidProcSetting( m_FaceDetectionFlags );
-
- pProperty->Capability =
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_OFF |
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_PREVIEW |
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_VIDEO |
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_PHOTO |
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_BLINK |
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_SMILE ;
-
- pProperty->Max() = m_FaceDetectionMax;
- pProperty->Min() = 1;
- pProperty->Step() = 1;
- *pProperty = m_FaceDetectionCurrentMax;
- pProperty->Result = m_FaceDetectionResult;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FACEDETECTION.
-NTSTATUS
-CSensorSimulation::
-SetFaceDetection(
- _In_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_FaceDetectionCurrentMax =
- ( KSCAMERA_EXTENDEDPROP_FACEDETECTION_MASK & pProperty->Flags ) ?
- pProperty->GetULONG() : 0;
- m_FaceDetectionFlags = pProperty->Flags;
- m_FaceDetectionResult = STATUS_SUCCESS;
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE
-NTSTATUS
-CSensorSimulation::
-GetFocusState(
- _Out_ KSCAMERA_EXTENDEDPROP_FOCUSSTATE *FocusState
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *FocusState = m_FocusState;
-
- DBG_LEAVE("(%s)", FocusStateDbgTxt(m_FocusState));
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE
-NTSTATUS
-CSensorSimulation::
-GetFocus(
- _Inout_ CExtendedVidProcSetting *pSetting
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // Mode
- pSetting->Flags = m_GlobalIspSettings.FocusMode;
-
- // capabilities.
- pSetting->Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_UNLOCK |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_CAPS_CANCELLABLE |
- KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MACRO |
- KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_NORMAL |
- KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF |
- KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_INFINITY |
- KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_HYPERFOCAL |
- KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_NEAREST
- ;
-
- pSetting->Result = m_FocusResult;
-
- // min/max/step/etc.
- pSetting->m_Setting = m_GlobalIspSettings.FocusSetting;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE
-NTSTATUS
-CSensorSimulation::
-SetFocusAsync(
- _In_ CExtendedVidProcSetting *pSetting,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // Signal immediately if the we are continuous focus.
- bool bSignalImmediately = false;
- ULONGLONG Flags = pSetting->Flags;
-
- // Cache our current focus settings in case we get a cancel request.
- m_LastFocusMode = m_GlobalIspSettings.FocusMode;
- m_LastFocusSetting = m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul;
-
- // If we've been asked to unlock, remove any lock flags.
- if( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_UNLOCK )
- {
- // Mark us as signalling immediately if Focus was not locked.
- bSignalImmediately =
- ( m_GlobalIspSettings.FocusMode &
- ( KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK ) ) == 0;
-
- // Change our operation so we go back to the previous state.
- Flags = m_GlobalIspSettings.FocusMode &
- ~( KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK );
- }
-
- // Handle the stand-alone lock case by setting the appropriate flags.
- if( ( Flags &
- (KSCAMERA_EXTENDEDPROP_FOCUS_MODE_MASK |
- KSCAMERA_EXTENDEDPROP_FOCUS_MODE_ADVANCED_MASK) ) ==
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK )
- {
- if( m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO )
- {
- Flags =
- m_GlobalIspSettings.FocusMode | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
- }
- if( m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS )
- {
- Flags =
- m_GlobalIspSettings.FocusMode |= KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK;
- }
- }
-
- // Record the Focus mode.
- DBG_TRACE("Recording FocusMode = 0x%016llX", Flags);
- m_GlobalIspSettings.FocusMode = Flags;
-
- if(m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL)
- {
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.l = pSetting->GetLONG();
- }
-
- if( bSignalImmediately )
- // Unlock, but nothing really to do.
- {
- Notifier->Set();
- m_FocusNotifier = nullptr;
- }
- else if( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS )
- // Continuous case: Signal immediately.
- // Then prime the timer to switch the state to focused.
- {
- m_FocusNotifier = nullptr;
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_SEARCHING;
- Notifier->Set();
-
- // Fire a one-shot timer to transition the focus state.
- m_FocusTimer->Set(
- -4000000LL, // 400ms
- FocusConvergence,
- this );
- }
- else if( Flags & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO )
- // Normal [auto?] focus operation.
- // Autofocus should be SLOW.
- {
- m_FocusNotifier = Notifier;
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_SEARCHING;
-
- // Fire a one-shot timer to transition the focus state.
- m_FocusTimer->Set(
- -4000000LL, // 400ms
- FocusConvergence,
- this );
- }
- else
- // Handle Manual, lock & unlock cases FAST ~1 frame time.
- {
- m_FocusNotifier = Notifier;
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_SEARCHING;
-
- // Fire a one-shot timer to transition the focus state.
- m_FocusTimer->Set(
- -330000LL, // 33ms
- FocusConvergence,
- this );
- }
-
- m_FocusResult = STATUS_SUCCESS;
- return STATUS_SUCCESS;
-}
-
-// Cancel oustanding set KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE
-NTSTATUS
-CSensorSimulation::
-CancelFocus()
-{
- PAGED_CODE();
-
- // Cancel our timer to prevent a race.
- m_FocusTimer->Cancel();
-
- // Acquire the lock after the cancel to avoid a potential deadlock.
- KScopedMutex lock( m_SensorMutex );
-
- // Now check to see if an operation was still outstanding.
- // We could just check the status from the timer's Cancel(), but I
- // prefer checking to see if the handler cleared the notifier instead.
- if( m_FocusNotifier )
- {
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_LOST;
-
- // Cancel behavior isn't well-defined in the spec. Do something reasonable.
- // In our case, we'll put the focus mode and value back to the last setting.
- m_GlobalIspSettings.FocusMode = m_LastFocusMode;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = m_LastFocusSetting;
-
- m_FocusNotifier->Set();
- m_FocusNotifier = nullptr;
- m_FocusResult = (ULONG) STATUS_CANCELLED;
- return STATUS_SUCCESS;
- }
- return STATUS_UNSUCCESSFUL;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE
-NTSTATUS
-CSensorSimulation::
-GetExtendedFlash(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedProperty( m_GlobalIspSettings.FlashMode );
- *pProperty = m_GlobalIspSettings.FlashValue;
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_FLASH_ON | KSCAMERA_EXTENDEDPROP_FLASH_ON_ADJUSTABLEPOWER |
- KSCAMERA_EXTENDEDPROP_FLASH_AUTO | KSCAMERA_EXTENDEDPROP_FLASH_AUTO_ADJUSTABLEPOWER |
- KSCAMERA_EXTENDEDPROP_FLASH_REDEYEREDUCTION | KSCAMERA_EXTENDEDPROP_FLASH_SINGLEFLASH |
- KSCAMERA_EXTENDEDPROP_FLASH_MULTIFLASHSUPPORTED |
- KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_ON | KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_OFF |
- KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_AUTO
- ;
-
- DBG_TRACE("FlashMode=0x%016llX, FlashValue=%d",
- m_GlobalIspSettings.FlashMode,
- m_GlobalIspSettings.FlashValue );
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE
-NTSTATUS
-CSensorSimulation::
-SetExtendedFlash(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- if(pProperty->Flags & (KSCAMERA_EXTENDEDPROP_FLASH_ON_ADJUSTABLEPOWER |
- KSCAMERA_EXTENDEDPROP_FLASH_AUTO_ADJUSTABLEPOWER) )
- {
- m_GlobalIspSettings.FlashValue = pProperty->m_Value.Value.ul;
- }
- else
- {
- m_GlobalIspSettings.FlashValue = 50;
- }
-
- m_GlobalIspSettings.FlashMode = pProperty->Flags;
- NTSTATUS Status = SetFlashStatus(pProperty->Flags);
-
- DBG_TRACE("FlashMode=0x%016llX, FlashValue=%d, Status=0x%08X",
- m_GlobalIspSettings.FlashMode,
- m_GlobalIspSettings.FlashValue,
- Status );
-
- pProperty->Result = (ULONG) Status;
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ISO
-NTSTATUS
-CSensorSimulation::
-GetIso(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- pProperty->Flags = IsoModeValue2Preset(
- m_GlobalIspSettings.ISOMode,
- m_GlobalIspSettings.ISOValue );
- pProperty->Result = STATUS_SUCCESS;
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_ISO_AUTO |
- KSCAMERA_EXTENDEDPROP_ISO_50 | KSCAMERA_EXTENDEDPROP_ISO_80 |
- KSCAMERA_EXTENDEDPROP_ISO_100 | KSCAMERA_EXTENDEDPROP_ISO_200 |
- KSCAMERA_EXTENDEDPROP_ISO_400 | KSCAMERA_EXTENDEDPROP_ISO_800 |
- KSCAMERA_EXTENDEDPROP_ISO_1600 | KSCAMERA_EXTENDEDPROP_ISO_3200 |
- KSCAMERA_EXTENDEDPROP_ISO_6400 | KSCAMERA_EXTENDEDPROP_ISO_12800 |
- KSCAMERA_EXTENDEDPROP_ISO_25600 |
- KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL;
- pProperty->Result = m_IsoResult;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_ISO
-NTSTATUS
-CSensorSimulation::
-SetIsoAsync(
- _In_ CExtendedProperty *pProperty,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_GlobalIspSettings.ISOMode = (ULONG)pProperty->Flags;
- m_GlobalIspSettings.ISOValue = 0;
-
- // This could be done in a separate work item after the scene mode has been programmed...
- m_IsoResult = STATUS_SUCCESS;
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-#define KSCAMERA_EXTENDEDPROP_ISO_ADVANCED_MASK (KSCAMERA_EXTENDEDPROP_ISO_AUTO | KSCAMERA_EXTENDEDPROP_ISO_MANUAL)
-
-// Create a set of default settings...
-static
-const
-KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING g_IsoAdvancedSettings =
-{
- 0, // Mode - Unused
- 50, // Min
- 25600, // Max
- 1 // Step (advertised doesn't have to be actual)
-};
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED.
-NTSTATUS
-CSensorSimulation::
-GetIsoAdvanced(
- _Inout_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // Initialize the property with defaults + (AUTO | MANUAL)
- pProperty->Flags =
- m_GlobalIspSettings.ISOMode &
- KSCAMERA_EXTENDEDPROP_ISO_ADVANCED_MASK;
- pProperty->Result = STATUS_SUCCESS;
-
- // Advertise basic caps...
- pProperty->Capability =
- KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL |
- KSCAMERA_EXTENDEDPROP_ISO_AUTO |
- KSCAMERA_EXTENDEDPROP_ISO_MANUAL ;
-
- // Advertise the manual caps...
- *pProperty = g_IsoAdvancedSettings;
-
- // If ISO is MANUAL, set the value.
- if( m_GlobalIspSettings.ISOMode == KSCAMERA_EXTENDEDPROP_ISO_MANUAL )
- {
- *pProperty = m_GlobalIspSettings.ISOValue;
- }
- else if( !(m_GlobalIspSettings.ISOMode == KSCAMERA_EXTENDEDPROP_ISO_AUTO) )
- {
- // Try converting any legacy presets to a manual value.
- pProperty->Flags = KSCAMERA_EXTENDEDPROP_ISO_MANUAL;
- // Convert the ISO setting
- *pProperty = IsoPreset2Value( m_GlobalIspSettings.ISOMode );
- // If we weren't able to report a valid number, just report something reasonable...
- if( pProperty->GetLONG() > pProperty->Max() )
- {
- *pProperty = pProperty->Min();
- }
- }
- pProperty->Result = m_IsoResult;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED.
-NTSTATUS
-CSensorSimulation::
-SetIsoAdvancedAsync(
- _In_ CExtendedVidProcSetting *pProperty,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
-
- KScopedMutex lock( m_SensorMutex );
-
- // Just save the parameters
- if( pProperty->Flags & KSCAMERA_EXTENDEDPROP_ISO_MANUAL )
- {
- m_GlobalIspSettings.ISOMode = pProperty->Flags;
- m_GlobalIspSettings.ISOValue= pProperty->GetULONG();
- }
- else if( pProperty->Flags & KSCAMERA_EXTENDEDPROP_ISO_AUTO )
- {
- m_GlobalIspSettings.ISOMode = pProperty->Flags;
- }
-
- // Set regardless - it takes effect immediately for us.
- m_IsoResult = STATUS_SUCCESS;
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION
-NTSTATUS
-CSensorSimulation::
-GetEvCompensation(
- _Inout_ CExtendedEvCompensation *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedEvCompensation( m_GlobalIspSettings.EVCompensation.Mode );
-
- // Return our cached copy; but update the value from the global setting.
- *pProperty = m_GlobalIspSettings.EVCompensation;
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_EVCOMP_SIXTHSTEP | KSCAMERA_EXTENDEDPROP_EVCOMP_QUARTERSTEP |
- KSCAMERA_EXTENDEDPROP_EVCOMP_THIRDSTEP | KSCAMERA_EXTENDEDPROP_EVCOMP_HALFSTEP |
- KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP | KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL;
- pProperty->Result = m_EvCompResult;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION
-NTSTATUS
-CSensorSimulation::
-SetEvCompensationAsync(
- _In_ CExtendedEvCompensation *pProperty,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // Update the Globals
- m_GlobalIspSettings.EVCompensation.Mode = (ULONG) pProperty->Flags;
- m_GlobalIspSettings.EVCompensation.Value = pProperty->Value();
-
- // Update the current setting in case we're queried for it later.
- m_GlobalIspSettings.EVCompensation.Value = pProperty->Value();
-
- // This could be done in a separate work item after the device has been programmed...
- m_EvCompResult = STATUS_SUCCESS;
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE
-NTSTATUS
-CSensorSimulation::
-GetWhiteBalance(
- _Inout_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedVidProcSetting( m_GlobalIspSettings.WhiteBalanceMode );
-
- // Return our cached copy; but update the value from the global setting.
- *pProperty = m_GlobalIspSettings.WhiteBalanceSetting;
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- pProperty->Result = m_WhiteBalanceResult;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE
-NTSTATUS
-CSensorSimulation::
-SetWhiteBalanceAsync(
- _In_ CExtendedVidProcSetting *pProperty,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_GlobalIspSettings.WhiteBalanceMode = pProperty->Flags;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = pProperty->Mode();
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = pProperty->GetULONG();
-
- // This could be done in a separate work item after the device has been programmed...
- m_WhiteBalanceResult = STATUS_SUCCESS;
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSURE
-NTSTATUS
-CSensorSimulation::
-GetExposure(
- _Inout_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedVidProcSetting( m_GlobalIspSettings.ExposureMode );
-
- // Return our cached copy; but update the value from the global setting.
- *pProperty = m_GlobalIspSettings.ExposureSetting;
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- pProperty->Result = m_ExposureResult;
- DBG_TRACE("ExposureMode=0x%016llX, ExposureTime=%lld00ns",
- pProperty->Flags, pProperty->GetLONGLONG());
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSURE
-NTSTATUS
-CSensorSimulation::
-SetExposureAsync(
- _In_ CExtendedVidProcSetting *pProperty,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- DBG_TRACE("ExposureMode=0x%016llX, ExposureTime=%lld00ns",
- pProperty->Flags, pProperty->GetLONGLONG());
- if( pProperty->Flags & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ull = pProperty->GetULONGLONG();
- }
- m_GlobalIspSettings.ExposureMode = pProperty->Flags;
-
- // This could be done in a separate work item after the device has been programmed...
- m_ExposureResult = STATUS_SUCCESS;
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION
-NTSTATUS
-CSensorSimulation::
-GetPhotoConfirmation(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedProperty( m_GlobalIspSettings.bPhotoConfirmation );
- DBG_TRACE( "Is %s", m_GlobalIspSettings.bPhotoConfirmation ? "On" : "Off" );
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION
-NTSTATUS
-CSensorSimulation::
-SetPhotoConfirmation(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // Return our cached copy; but update the value from the global setting.
- m_GlobalIspSettings.bPhotoConfirmation =
- BOOLEAN( (pProperty->Flags & KSCAMERA_EXTENDEDPROP_PHOTOCONFIRMATION_ON)
- == KSCAMERA_EXTENDEDPROP_PHOTOCONFIRMATION_ON);
- DBG_TRACE( "Is %s", m_GlobalIspSettings.bPhotoConfirmation ? "On" : "Off" );
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE
-NTSTATUS
-CSensorSimulation::
-GetSceneMode(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedProperty( m_SceneMode );
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL | KSCAMERA_EXTENDEDPROP_SCENEMODE_MACRO |
- KSCAMERA_EXTENDEDPROP_SCENEMODE_PORTRAIT | KSCAMERA_EXTENDEDPROP_SCENEMODE_SPORT |
- KSCAMERA_EXTENDEDPROP_SCENEMODE_SNOW | KSCAMERA_EXTENDEDPROP_SCENEMODE_NIGHT |
- KSCAMERA_EXTENDEDPROP_SCENEMODE_BEACH | KSCAMERA_EXTENDEDPROP_SCENEMODE_SUNSET |
- KSCAMERA_EXTENDEDPROP_SCENEMODE_CANDLELIGHT | KSCAMERA_EXTENDEDPROP_SCENEMODE_LANDSCAPE |
- KSCAMERA_EXTENDEDPROP_SCENEMODE_NIGHTPORTRAIT | KSCAMERA_EXTENDEDPROP_SCENEMODE_BACKLIT;
- pProperty->Result = m_SceneModeResult;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE
-NTSTATUS
-CSensorSimulation::
-SetSceneModeAsync(
- _In_ CExtendedProperty *pProperty,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_SceneMode = (ULONG)pProperty->Flags;
-
- UpdateSettings( m_SceneMode );
-
- // This could be done in a separate work item after the scene mode has been programmed...
- m_SceneModeResult = STATUS_SUCCESS;
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-// Apply scene mode changes.
-NTSTATUS
-CSensorSimulation::
-UpdateSettings(
- _In_ ULONGLONG ullSceneMode
-)
-{
- PAGED_CODE();
-
- NTSTATUS status = STATUS_SUCCESS;
- KScopedMutex lock( m_SensorMutex );
-
- if( KSCAMERA_EXTENDEDPROP_SCENEMODE_AUTO==ullSceneMode )
- {
- //
- // If the mode was auto, let's randomly replace it with another valid value.
- //
- static
- ULONGLONG ValidModes[] =
- {
- KSCAMERA_EXTENDEDPROP_SCENEMODE_MACRO,
- KSCAMERA_EXTENDEDPROP_SCENEMODE_PORTRAIT, KSCAMERA_EXTENDEDPROP_SCENEMODE_SPORT,
- KSCAMERA_EXTENDEDPROP_SCENEMODE_SNOW, KSCAMERA_EXTENDEDPROP_SCENEMODE_NIGHT,
- KSCAMERA_EXTENDEDPROP_SCENEMODE_BEACH, KSCAMERA_EXTENDEDPROP_SCENEMODE_SUNSET,
- KSCAMERA_EXTENDEDPROP_SCENEMODE_CANDLELIGHT, KSCAMERA_EXTENDEDPROP_SCENEMODE_LANDSCAPE,
- KSCAMERA_EXTENDEDPROP_SCENEMODE_NIGHTPORTRAIT, KSCAMERA_EXTENDEDPROP_SCENEMODE_BACKLIT
- };
-
- ullSceneMode =
- ValidModes[ (ULONG) (1 << GetRandom( (ULONG)0, SIZEOF_ARRAY(ValidModes)-1 )) ];
- }
-
- switch(ullSceneMode)
- {
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_MACRO:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_PORTRAIT:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_SPORT:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_SNOW:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_NIGHT:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_BEACH:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_SUNSET:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_CANDLELIGHT:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_LANDSCAPE:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_NIGHTPORTRAIT:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- case KSCAMERA_EXTENDEDPROP_SCENEMODE_BACKLIT:
- m_GlobalIspSettings.ISOMode = KSCAMERA_EXTENDEDPROP_ISO_AUTO;
- m_GlobalIspSettings.EVCompensation.Value = 0;
- m_GlobalIspSettings.EVCompensation.Mode = KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP;
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = WhiteBalanceDefault;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- m_GlobalIspSettings.WhiteBalanceMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureMode = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ul = DEF_EXPOSURE_TIME;
- m_GlobalIspSettings.ExposureSetting.Mode = 0;
- m_GlobalIspSettings.FocusMode = KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS | KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE;
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = 100;
- break;
- default:
- break;
- }
- DBG_TRACE("ExposureMode=0x%016llX, ExposureTime=%lld00ns",
- m_GlobalIspSettings.ExposureMode, m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll);
- return status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY
-NTSTATUS
-CSensorSimulation::
-GetFocusPriority(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedProperty(m_GlobalIspSettings.FocusPriority);
- DBG_TRACE("Is %s", m_GlobalIspSettings.FocusPriority ? "On" : "Off");
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY
-NTSTATUS
-CSensorSimulation::
-SetFocusPriority(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_GlobalIspSettings.FocusPriority = pProperty->Flags;
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.
-NTSTATUS
-CSensorSimulation::
-GetVideoHDR(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- pProperty->Flags = m_VideoHDR;
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_VIDEOHDR_OFF |
- KSCAMERA_EXTENDEDPROP_VIDEOHDR_ON |
- KSCAMERA_EXTENDEDPROP_VIDEOHDR_AUTO;
- pProperty->PinId = m_VideoIndex;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.
-NTSTATUS
-CSensorSimulation::
-SetVideoHDR(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_VideoHDR = pProperty->Flags;
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VFR.
-NTSTATUS
-CSensorSimulation::
-GetVFR(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedProperty( m_VFR );
- pProperty->PinId = m_VideoIndex;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VFR.
-NTSTATUS
-CSensorSimulation::
-SetVFR(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_VFR = pProperty->Flags;
- return STATUS_SUCCESS;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM Get handler
-NTSTATUS
-CSensorSimulation::
-GetZoom(
- _Inout_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- *pProperty = CExtendedVidProcSetting(m_ExtendedZoom);
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_ZOOM_DEFAULT |
- KSCAMERA_EXTENDEDPROP_ZOOM_DIRECT |
- KSCAMERA_EXTENDEDPROP_ZOOM_SMOOTH ;
-
- // Update the zoom factor.
- //
- // I am using the same pFilter->m_Zoom value here just to keep 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.
- //
- DBG_TRACE("Legacy Zoom Value = %d", m_Zoom.Value);
-
- // To ensure we clear out the high order value in the VideoProc
- // union, we'll assign the LONG to LONGLONG field.
- pProperty->m_Setting.VideoProc.Value.ll = (LONG) (TO_Q16(m_Zoom.Value) / m_FocalLength.lOcularFocalLength);
-
- DBG_TRACE("Extended Zoom Value = %d", pProperty->GetLONG());
-
- return STATUS_SUCCESS;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM Set handler
-NTSTATUS
-CSensorSimulation::
-SetZoom(
- _In_ CExtendedVidProcSetting *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- LONG Zoom = pProperty->GetLONG();
- DBG_TRACE("Extended Zoom Value = %d", Zoom);
-
- m_ExtendedZoom = *pProperty;
- DBG_TRACE("Zoom Flags = 0x%016llX", m_ExtendedZoom.Flags);
-
- // Take us directly to the position if we're doing a direct zoom.
- // Depends on IHVs, KSCAMERA_EXTENDEDPROP_ZOOM_DEFAULT may be either direct zoom or
- // smooth zoom. Here direct zoom will be performed when DEFAULT is specified.
- if( pProperty->Flags != KSCAMERA_EXTENDEDPROP_ZOOM_SMOOTH )
- {
- // Convert back to legacy notation...
- //
- // I am using the same pFilter->m_Zoom value here just to keep 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.
- //
- m_Zoom.Value = FROM_Q16(Zoom, m_FocalLength.lOcularFocalLength);
- DBG_TRACE("Legacy Zoom Value = %d", m_Zoom.Value);
- }
-
- // It's always success; this is a sync control, so this isn't really used.
- m_ExtendedZoom.Result = ntStatus;
-
- DBG_LEAVE("()=0x%08X", ntStatus);
- return ntStatus;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOSTABILIZATION.
-NTSTATUS
-CSensorSimulation::
-GetVideoStabilization(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- *pProperty = CExtendedProperty(m_VideoStabilization);
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_OFF |
- KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_ON |
- KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_AUTO;
- pProperty->PinId = m_VideoIndex;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOSTABILIZATION.
-NTSTATUS
-CSensorSimulation::
-SetVideoStabilization(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- m_VideoStabilization = pProperty->Flags;
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_OIS.
-NTSTATUS
-CSensorSimulation::
-GetOpticalImageStabilization(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- *pProperty = CExtendedProperty(m_OpticalImageStabilization);
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_OIS_OFF |
- KSCAMERA_EXTENDEDPROP_OIS_ON |
- KSCAMERA_EXTENDEDPROP_OIS_AUTO;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_OIS.
-NTSTATUS
-CSensorSimulation::
-SetOpticalImageStabilization(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- m_OpticalImageStabilization = pProperty->Flags;
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO.
-NTSTATUS
-CSensorSimulation::
-GetAdvancedPhoto(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- *pProperty = CExtendedProperty(m_AdvancedPhoto);
- pProperty->PinId = GetStillIndex();
- pProperty->Capability = KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_OFF |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_AUTO |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_HDR |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_FNF |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_ULTRALOWLIGHT;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO.
-NTSTATUS
-CSensorSimulation::
-SetAdvancedPhoto(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- m_AdvancedPhoto = pProperty->Flags;
- return STATUS_SUCCESS;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_FOCUS
-NTSTATUS
-CSensorSimulation::
-GetFocus(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- pKsCameraControl->Flags = KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- if (m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO)
- {
- pKsCameraControl->Flags |= KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else if (m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL)
- {
- pKsCameraControl->Flags |= KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- }
- pKsCameraControl->Value = m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul;
-
- return STATUS_SUCCESS;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_FOCUS
-NTSTATUS
-CSensorSimulation::
-SetFocus(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE)
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_GlobalIspSettings.FocusSetting.VideoProc.Value.ul = pKsCameraControl->Value;
- m_GlobalIspSettings.FocusMode =
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
-
- m_FocusNotifier = nullptr;
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_SEARCHING;
-
- // Fire a one-shot timer to transition the focus state.
- m_FocusTimer->Set(
- -330000LL, // 33ms
- FocusConvergence,
- this);
- }
-
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_GlobalIspSettings.FocusMode = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
-
- m_FocusNotifier = nullptr;
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_SEARCHING;
-
- // Fire a one-shot timer to transition the focus state.
- m_FocusTimer->Set(
- -4000000LL, // 400ms
- FocusConvergence,
- this );
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_EXPOSURE
-NTSTATUS
-CSensorSimulation::
-GetExposure(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- pKsCameraControl->Flags = KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- if (m_GlobalIspSettings.ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO)
- {
- pKsCameraControl->Flags |= KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else if (m_GlobalIspSettings.ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL)
- {
- pKsCameraControl->Flags |= KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- }
-
- pKsCameraControl->Value = Exposure100nsToBinaryLog(m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll);
-
- DBG_TRACE("ExposureMode=0x%016llX, ExposureTime=%lld00ns",
- m_GlobalIspSettings.ExposureMode, m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll);
-
- return STATUS_SUCCESS;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_EXPOSURE
-NTSTATUS
-CSensorSimulation::
-SetExposure(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE || !ExposureBinaryLogIsValid(pKsCameraControl->Value))
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload
- m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll = ExposureBinaryLogTo100ns(pKsCameraControl->Value);
- m_GlobalIspSettings.ExposureMode =
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_GlobalIspSettings.ExposureMode = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
-
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- DBG_TRACE("ExposureMode=0x%016llX, ExposureTime=%lld00ns",
- m_GlobalIspSettings.ExposureMode, m_GlobalIspSettings.ExposureSetting.VideoProc.Value.ll);
-
- return ntStatus;
-}
-
-// Update the zoom factor over time.
-void
-CSensorSimulation::
-SmoothZoom()
-{
- PAGED_CODE();
-
-#define ZOOM_SPEED (LONG) (TO_Q16(1) * 0.07f)
-#define ZOOM_SPEED_VIDEO_RECORDING (LONG) (TO_Q16(1) * 0.02f)
-#define ZOOM_EPSILON (LONG)(TO_Q16(1) * 0.005f)
-
- LONG currentZoom = (LONG)
- (TO_Q16(m_Zoom.Value) /
- m_FocalLength.lOcularFocalLength);
- LONG targetZoom = m_ExtendedZoom.GetLONG();
-
- LONG ZoomDelta = abs(currentZoom - targetZoom);
-
- // Jump to target if we are very close
- if( ZoomDelta <= ZOOM_EPSILON )
- {
- currentZoom = targetZoom;
- }
- else
- {
- // Zoom direction
- bool bZoomIn = (targetZoom > currentZoom);
- LONG OpModeZoomSpeed = ZOOM_SPEED;
-
- // User lower zoom speed for video.
- if( INVALID_PIN_INDEX != m_VideoIndex &&
- PinRunning == m_HardwareSimulation[m_VideoIndex]->GetState() )
- {
- OpModeZoomSpeed = ZOOM_SPEED_VIDEO_RECORDING;
- }
-
- // Calculate zoom step that is relative to current zoom factor.
- // the bigger the current zoom factor the bigger the step.
- LONG ZoomStep;
- if( bZoomIn )
- {
- ZoomStep = MULT_Q16(OpModeZoomSpeed, currentZoom);
- }
- else
- {
- ZoomStep = currentZoom - DIV_Q16(currentZoom, (TO_Q16(1) + OpModeZoomSpeed));
- }
-
- if( ZoomDelta < 2 * ZoomStep)
- {
- // decrease step when close to target
- ZoomStep = MULT_Q16(ZoomDelta, ((LONG)(TO_Q16(1) * 0.4f)));
- }
-
- if (bZoomIn)
- {
- currentZoom += ZoomStep;
- }
- else
- {
- currentZoom -= ZoomStep;
- }
- }
-
- // Convert back to the zoom factor.
- m_Zoom.Value = FROM_Q16(currentZoom, m_FocalLength.lOcularFocalLength);
-
- if (!NT_SUCCESS(BoundsCheckSigned(m_Zoom.Value, ZoomRangeAndStep[0])))
- {
- m_Zoom.Value = FROM_Q16(targetZoom, m_FocalLength.lOcularFocalLength);
- }
-
- DBG_LEAVE(" m_Zoom.Value=%d, FocusMode=0x%016llX", m_Zoom.Value, m_GlobalIspSettings.FocusMode);
-}
-
-
-// Adjust the zoom for each preview frame if the zoom is in motion.
-// This function is used by both the legacy relative zoom control
-// and the extended property smooth zoom control.
-void
-CSensorSimulation::
-UpdateZoom(void)
-{
- PAGED_CODE();
-
- // Legacy zoom relative adjustment.
- LONG Value = m_Zoom.Value + m_ZoomRelative.Value;
-
- if (NT_SUCCESS(BoundsCheckSigned(Value, ZoomRangeAndStep[0])))
- {
- m_Zoom.Value = Value;
- }
- else
- {
- m_ZoomRelative.Value = 0;
- }
-
- // Extended property zoom / smooth zoom adjustment.
- SmoothZoom();
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_ZOOM
-NTSTATUS
-CSensorSimulation::
-GetZoom(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Zoom.Capabilities;
- pKsCameraControl->Flags = m_Zoom.Flags;
- pKsCameraControl->Value = m_Zoom.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_ZOOM
-NTSTATUS
-CSensorSimulation::
-SetZoom(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE)
- {
- pKsCameraControl->Value += m_Zoom.Value;
- }
-
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, ZoomRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Zoom.Value = pKsCameraControl->Value;
- m_Zoom.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Zoom.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE
-NTSTATUS
-CSensorSimulation::
-GetZoomRelative(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_ZoomRelative.Capabilities;
- pKsCameraControl->Flags = m_ZoomRelative.Flags;
- pKsCameraControl->Value = m_ZoomRelative.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE
-NTSTATUS
-CSensorSimulation::
-SetZoomRelative(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE)
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
- else
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, ZoomRelativeRangeAndStep[0]);
- }
-
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_ZoomRelative.Value = pKsCameraControl->Value;
- m_ZoomRelative.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- }
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_PAN
-NTSTATUS
-CSensorSimulation::
-GetPan(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Pan.Capabilities;
- pKsCameraControl->Flags = m_Pan.Flags;
- pKsCameraControl->Value = m_Pan.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_PAN
-NTSTATUS
-CSensorSimulation::
-SetPan(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE)
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- if (NT_SUCCESS(ntStatus))
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, PanRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Pan.Value = pKsCameraControl->Value;
- m_Pan.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- }
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Pan.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_ROLL
-NTSTATUS
-CSensorSimulation::
-GetRoll(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Roll.Capabilities;
- pKsCameraControl->Flags = m_Roll.Flags;
- pKsCameraControl->Value = m_Roll.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_ROLL
-NTSTATUS
-CSensorSimulation::
-SetRoll(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE)
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
- if (NT_SUCCESS(ntStatus))
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, RollRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Roll.Value = pKsCameraControl->Value;
- m_Roll.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- }
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Roll.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_TILT
-NTSTATUS
-CSensorSimulation::
-GetTilt(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Tilt.Capabilities;
- pKsCameraControl->Flags = m_Tilt.Flags;
- pKsCameraControl->Value = m_Tilt.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_TILT
-NTSTATUS
-CSensorSimulation::
-SetTilt(
- _In_ PKSPROPERTY_CAMERACONTROL_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Convert relative values to absolute.
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_RELATIVE)
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
- if (NT_SUCCESS(ntStatus))
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, TiltRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Tilt.Value = pKsCameraControl->Value;
- m_Tilt.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL |
- KSPROPERTY_CAMERACONTROL_FLAGS_ABSOLUTE;
- }
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Tilt.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH
-NTSTATUS
-CSensorSimulation::
-GetFocalLength(
- _Inout_ PKSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->lOcularFocalLength = m_FocalLength.lOcularFocalLength;
- pKsCameraControl->lObjectiveFocalLengthMax = m_FocalLength.lObjectiveFocalLengthMax;
- pKsCameraControl->lObjectiveFocalLengthMin = m_FocalLength.lObjectiveFocalLengthMin;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH
-NTSTATUS
-CSensorSimulation::
-SetFocalLength(
- _In_ PKSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S pKsCameraControl
-)
-{
- PAGED_CODE();
- return STATUS_NOT_FOUND;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION
-NTSTATUS
-CSensorSimulation::
-GetBacklightCompensation(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_BacklightCompensation.Capabilities;
- pKsCameraControl->Flags = m_BacklightCompensation.Flags;
- pKsCameraControl->Value = m_BacklightCompensation.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION
-NTSTATUS
-CSensorSimulation::
-SetBacklightCompensation(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, BacklightCompensationRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_BacklightCompensation.Value = pKsCameraControl->Value;
- m_BacklightCompensation.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_BacklightCompensation.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS
-NTSTATUS
-CSensorSimulation::
-GetBrightness(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Brightness.Capabilities;
- pKsCameraControl->Flags = m_Brightness.Flags;
- pKsCameraControl->Value = m_Brightness.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS
-NTSTATUS
-CSensorSimulation::
-SetBrightness(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, BrightnessRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Brightness.Value = pKsCameraControl->Value;
- m_Brightness.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Brightness.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_CONTRAST
-NTSTATUS
-CSensorSimulation::
-GetContrast(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Contrast.Capabilities;
- pKsCameraControl->Flags = m_Contrast.Flags;
- pKsCameraControl->Value = m_Contrast.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_CONTRAST
-NTSTATUS
-CSensorSimulation::
-SetContrast(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, ContrastRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Contrast.Value = pKsCameraControl->Value;
- m_Contrast.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Contrast.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_HUE
-NTSTATUS
-CSensorSimulation::
-GetHue(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_Hue.Capabilities;
- pKsCameraControl->Flags = m_Hue.Flags;
- pKsCameraControl->Value = m_Hue.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_HUE
-NTSTATUS
-CSensorSimulation::
-SetHue(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, HueRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_Hue.Value = pKsCameraControl->Value;
- m_Hue.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_Hue.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY
-NTSTATUS
-CSensorSimulation::
-GetPowerlineFreq(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = m_PowerLineFreq.Capabilities;
- pKsCameraControl->Flags = m_PowerLineFreq.Flags;
- pKsCameraControl->Value = m_PowerLineFreq.Value;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY
-NTSTATUS
-CSensorSimulation::
-SetPowerlineFreq(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // Bounds check
- ntStatus = BoundsCheckSigned(pKsCameraControl->Value, PLFRangeAndStep[0]);
- if (NT_SUCCESS(ntStatus))
- {
- // We report these changes in the next metadata payload.
- m_PowerLineFreq.Value = pKsCameraControl->Value;
- m_PowerLineFreq.Flags =
- KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- }
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_PowerLineFreq.Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- m_PowerLineFreq.Value = 0;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get [legacy] KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE
-NTSTATUS
-CSensorSimulation::
-GetWhiteBalance(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
-
- pKsCameraControl->Capabilities = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO | KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- if (m_GlobalIspSettings.WhiteBalanceMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO)
- {
- pKsCameraControl->Flags = KSPROPERTY_CAMERACONTROL_FLAGS_AUTO;
- }
- else
- {
- pKsCameraControl->Flags = KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL;
- }
-
- ULONG temperature = m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul;
- if (m_GlobalIspSettings.WhiteBalanceSetting.Mode != KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE)
- {
- temperature = WhiteBalancePreset2Temperature(m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul);
- }
- pKsCameraControl->Value = (LONG)temperature;
-
- return STATUS_SUCCESS;
-}
-
-// Set [legacy] KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE
-NTSTATUS
-CSensorSimulation::
-SetWhiteBalance(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pKsCameraControl
-)
-{
- PAGED_CODE();
- KScopedMutex lock(m_SensorMutex);
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_MANUAL)
- {
- // We report these changes in the next metadata payload.
- m_GlobalIspSettings.WhiteBalanceSetting.VideoProc.Value.ul = pKsCameraControl->Value;
- m_GlobalIspSettings.WhiteBalanceMode =
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- m_GlobalIspSettings.WhiteBalanceSetting.Mode = KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE;
- }
- else if (pKsCameraControl->Flags & KSPROPERTY_CAMERACONTROL_FLAGS_AUTO)
- {
- m_GlobalIspSettings.WhiteBalanceMode =
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_HISTOGRAM.
-NTSTATUS
-CSensorSimulation::
-GetHistogram(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = CExtendedProperty( m_Histogram );
- pProperty->PinId = m_PreviewIndex;
- pProperty->Capability = 0;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_HISTOGRAM.
-NTSTATUS
-CSensorSimulation::
-SetHistogram(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_Histogram = pProperty->Flags;
-
- // Adjust the reported metadata buffer size for preview.
- m_MetadataInfo[m_PreviewIndex] =
- CExtendedMetadata::METADATA_MAX +
- (( m_Histogram == KSCAMERA_EXTENDEDPROP_HISTOGRAM_ON ) ? sizeof(CAMERA_METADATA_HISTOGRAM) : 0 ) ;
-
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA
-NTSTATUS
-CSensorSimulation::
-GetMetadata(
- _Inout_ CExtendedMetadata *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = m_MetadataInfo[pProperty->PinId];
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA
-NTSTATUS
-CSensorSimulation::
-SetMetadata(
- _In_ CExtendedMetadata *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = m_MetadataInfo[pProperty->PinId];
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_OPTIMIZATIONHINT
-NTSTATUS
-CSensorSimulation::
-GetOptimizationHint(
- _Inout_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pProperty = m_OptimizationHint;
- pProperty->Capability =
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_DEFAULT;
-
- DBG_TRACE( "Hint = 0x%016llX", m_OptimizationHint.Flags );
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_OPTIMIZATIONHINT
-NTSTATUS
-CSensorSimulation::
-SetOptimizationHint(
- _In_ CExtendedProperty *pProperty
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_OptimizationHint = *pProperty;
-
- DBG_TRACE( "Hint = 0x%016llX", m_OptimizationHint.Flags );
-
- return STATUS_SUCCESS;
-}
-
-// Get for PROPSETID_VIDCAP_CAMERACONTROL_VIDEO_STABILIZATION:0
-NTSTATUS
-CSensorSimulation::
-GetVideoStabMode(
- _Inout_ KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S *pMode
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- pMode->Capabilities =
- KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_FLAGS_MANUAL ;
- pMode->VideoStabilizationMode = m_VideoStabMode;
- return STATUS_SUCCESS;
-}
-
-// Set for PROPSETID_VIDCAP_CAMERACONTROL_VIDEO_STABILIZATION:0
-NTSTATUS
-CSensorSimulation::
-SetVideoStabMode(
- _In_ KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S *pMode
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_VideoStabMode = pMode->VideoStabilizationMode;
- return STATUS_SUCCESS;
-}
-
-// Get for KSPROPERTY_CAMERACONTROL_FLASH_PROPERTY_ID
-NTSTATUS
-CSensorSimulation::
-GetFlash(
- _Inout_ KSPROPERTY_CAMERACONTROL_FLASH_S *pFlash
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- pFlash->Capabilities =
- KSPROPERTY_CAMERACONTROL_FLASH_FLAGS_AUTO |
- KSPROPERTY_CAMERACONTROL_FLASH_FLAGS_MANUAL ;
- pFlash->Flash = m_Flash;
- return STATUS_SUCCESS;
-}
-
-// Set for KSPROPERTY_CAMERACONTROL_FLASH_PROPERTY_ID
-NTSTATUS
-CSensorSimulation::
-SetFlash(
- _In_ KSPROPERTY_CAMERACONTROL_FLASH_S *pFlash
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_Flash = pFlash->Flash;
- return STATUS_SUCCESS;
-}
-
-// Get for KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_PROPERTY_ID
-NTSTATUS
-CSensorSimulation::
-GetPinDependence(
- _Inout_ KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_S *pCaps
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // Limit capabilities to the valid set.
- pCaps->Capabilities &=
- ( KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_EXCLUSIVE_WITH_RECORD |
- KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_SEQUENCE_EXCLUSIVE_WITH_RECORD );
-
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTRIGGERTIME
-NTSTATUS
-CSensorSimulation::
-GetTriggerTime(
- _Inout_ CExtendedProperty *pQPC
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pQPC = CExtendedProperty(0);
- pQPC->PinId = GetStillIndex();
- NTSTATUS Status = GetQPC( &pQPC->m_Value.Value.ull );
-
- pQPC->Flags = ( pQPC->m_Value.Value.ull != 0 ) ?
- KSPROPERTY_CAMERA_PHOTOTRIGGERTIME_SET :
- KSPROPERTY_CAMERA_PHOTOTRIGGERTIME_CLEAR;
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTRIGGERTIME
-NTSTATUS
-CSensorSimulation::
-SetTriggerTime(
- _In_ CExtendedProperty *pQPC
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- ULONGLONG Time = ( pQPC->Flags & KSPROPERTY_CAMERA_PHOTOTRIGGERTIME_SET ) ? *pQPC : 0;
- return SetQPC( Time );
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE
-NTSTATUS
-CSensorSimulation::
-GetTorchMode(
- _Inout_ CExtendedProperty *pTorchMode
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pTorchMode = m_TorchMode;
- pTorchMode->Capability =
- KSCAMERA_EXTENDEDPROP_VIDEOTORCH_OFF |
- KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON |
- KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON_ADJUSTABLEPOWER;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE
-NTSTATUS
-CSensorSimulation::
-SetTorchMode(
- _In_ CExtendedProperty *pTorchMode
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_TorchMode = *pTorchMode;
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE
-NTSTATUS
-CSensorSimulation::
-GetPhotoMode(
- _Inout_ CExtendedPhotoMode *pPhotoMode
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pPhotoMode = m_PhotoMode;
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE
-NTSTATUS
-CSensorSimulation::
-SetPhotoModeAsync(
- _In_ CExtendedPhotoMode *pPhotoMode,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- DBG_ENTER("()");
-
- m_PhotoMode = *pPhotoMode;
-
- NTSTATUS Status =
- SetPinMode( pPhotoMode->Flags, pPhotoMode->RequestedHistoryFrames() );
-
- // Tell the caller that we're done.
- Notifier->Set();
-
- DBG_LEAVE("()=0x%08X",Status);
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE Get Handler
- */
-NTSTATUS
-CSensorSimulation::
-GetPhotoMaxFrameRate(
- _Inout_ CExtendedProperty *pPhotoMaxFrameRate
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pPhotoMaxFrameRate = m_MaxFrameRate;
- pPhotoMaxFrameRate->Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL;
- pPhotoMaxFrameRate->PinId = GetStillIndex();
- return STATUS_SUCCESS;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE Set Handler
- */
-NTSTATUS
-CSensorSimulation::
-SetPhotoMaxFrameRateAsync(
- _In_ CExtendedProperty *pPhotoMaxFrameRate,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
-
- ULONGLONG TimePerFrame = 0;
- {
- // Note: Don't lock around SetPhotoFrameRate() to avoid a priority inversion.
- KScopedMutex lock( m_SensorMutex );
-
- m_MaxFrameRate = *pPhotoMaxFrameRate;
-
- // Try to apply the setting immediately.
- LARGE_INTEGER PerformanceTime = { m_MaxFrameRate.m_Value.Value.ratio.LowPart };
- LONGLONG Frequency = m_MaxFrameRate.m_Value.Value.ratio.HighPart;
-
- if( Frequency != 0 )
- {
- TimePerFrame = KSCONVERT_PERFORMANCE_TIME( Frequency, PerformanceTime );
- }
- }
-
- DBG_TRACE( "SetPhotoFrameRate(%lld)", TimePerFrame );
-
- // Consume any error; we'll set the rate again when the pin starts.
- SetPhotoFrameRate( TimePerFrame );
-
- // Tell the caller that we're done.
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART
- */
-NTSTATUS
-CSensorSimulation::
-GetWarmStart(
- _Inout_ CExtendedProperty *pWarmStart
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- *pWarmStart = m_WarmStartEnabled[pWarmStart->PinId];
- pWarmStart->Capability =
- KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL |
- KSCAMERA_EXTENDEDPROP_WARMSTART_MODE_DISABLED |
- KSCAMERA_EXTENDEDPROP_WARMSTART_MODE_ENABLED ;
- return STATUS_SUCCESS;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART
- */
-NTSTATUS
-CSensorSimulation::
-SetWarmStartAsync(
- _In_ CExtendedProperty *pWarmStart,
- _In_ CNotifier *Notifier // Use to notify the framework that the control is done.
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- m_WarmStartEnabled[pWarmStart->PinId] = *pWarmStart;
-
- // Tell the caller that we're done.
- Notifier->Set();
-
- return STATUS_SUCCESS;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_MAXVIDFPS_PHOTORES Get Handler
- */
-NTSTATUS
-CSensorSimulation::
-GetMaxVideoFpsForPhotoRes(
- _Inout_ CExtendedMaxVideoFpsForPhotoRes *pPhotoRes
-)
-{
- PAGED_CODE();
-
- // We're just a simulation and have no constraints - set 30FPS.
- pPhotoRes->PreviewFPSNum() =30;
- pPhotoRes->PreviewFPSDenom() = 1;
- pPhotoRes->CaptureFPSNum() = 30;
- pPhotoRes->CaptureFPSDenom() = 1;
-
- return STATUS_SUCCESS;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_MAXVIDFPS_PHOTORES Set Handler
- */
-NTSTATUS
-CSensorSimulation::
-SetMaxVideoFpsForPhotoRes(
- _In_ CExtendedMaxVideoFpsForPhotoRes *pPhotoRes
-)
-{
- PAGED_CODE();
-
- // We don't really use this call.
- return STATUS_SUCCESS;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FIELDOFVIEW
-NTSTATUS
-CSensorSimulation::
-GetFieldOfView(
- _Inout_ CExtendedFieldOfView *pFieldOfView
-)
-{
- PAGED_CODE();
-
- // Report dummy values.
- *pFieldOfView = CExtendedFieldOfView();
- pFieldOfView->NormalizedFocalLengthX() = 35;
- pFieldOfView->NormalizedFocalLengthY() = 35;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FIELDOFVIEW
-NTSTATUS
-CSensorSimulation::
-GetCameraAngleOffset(
- _Inout_ CExtendedCameraAngleOffset *pAngle
-)
-{
- PAGED_CODE();
-
- // Just return zeros. We're dead-on, no tilt.
- *pAngle = CExtendedCameraAngleOffset();
-
- return STATUS_SUCCESS;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_CONFIGCAPS Get handler
-NTSTATUS
-CSensorSimulation::
-GetRoiConfigCaps(
- _Inout_ CRoiConfig *pCaps
-)
-{
- PAGED_CODE();
- // No state accessed...
- //KScopedMutex lock( m_SensorMutex );
-
- // Our CRoiConfig ctor defines our capabilities.
- *pCaps = CRoiConfig();
-
- return STATUS_SUCCESS;
-}
-
-// Per Frame Settings Caps
-struct SOC_PFS_CAPS
-{
- KSCAMERA_PERFRAMESETTING_CAP_HEADER Hdr;
- SOC_CAP_WITH_STEPPING_LONGLONG ExposureTime;
- KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER Flash;
- SOC_CAP_WITH_STEPPING EVCompensation;
- SOC_CAP_WITH_STEPPING Iso;
- SOC_CAP_WITH_STEPPING Focus;
- KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER StillConfirmation;
-} ;
-
-const ULONG SOC_PFS_NUMCAPS = 6;
-
-// Our predefined Variable Photo Sequence capabilities.
-SOC_PFS_CAPS g_PFSCaps =
-{
- // KSCAMERA_PERFRAMESETTING_CAP_HEADER
- { sizeof(SOC_PFS_CAPS), SOC_PFS_NUMCAPS, 0 }, //Hdr
- // ExposureTime
- {
- // SOC_CAP_WITH_STEPPING_LONGLONG
- {
- // KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
- sizeof(g_PFSCaps.ExposureTime), //Size
- KSCAMERA_PERFRAMESETTING_ITEM_EXPOSURE_TIME, //Type
- KSCAMERA_PERFRAMESETTING_AUTO //Flags
- | KSCAMERA_PERFRAMESETTING_MANUAL
- },
- {
- // KSPROPERTY_STEPPING_LONGLONG
- 1000, //SteppingDelta (in us)
- {
- // KSPROPERTY_BOUNDS_LONGLONG
- MIN_EXPOSURE_TIME, //SignedMinimum
- MAX_EXPOSURE_TIME //SignedMaximum (arbitrary - 1 hour)
- }
- }
- },
- // Flash
- {
- // KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
- sizeof(g_PFSCaps.Flash),
- KSCAMERA_PERFRAMESETTING_ITEM_FLASH,
- KSCAMERA_EXTENDEDPROP_FLASH_OFF
- | KSCAMERA_EXTENDEDPROP_FLASH_ON
- | KSCAMERA_EXTENDEDPROP_FLASH_ON_ADJUSTABLEPOWER
- | KSCAMERA_EXTENDEDPROP_FLASH_AUTO
- | KSCAMERA_EXTENDEDPROP_FLASH_AUTO_ADJUSTABLEPOWER
- | KSCAMERA_EXTENDEDPROP_FLASH_REDEYEREDUCTION
- },
- // ExposureCompensation
- {
- // SOC_CAP_WITH_STEPPING
- {
- // KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
- sizeof(g_PFSCaps.EVCompensation), //Size
- KSCAMERA_PERFRAMESETTING_ITEM_EXPOSURE_COMPENSATION, //Type
- KSCAMERA_PERFRAMESETTING_AUTO //Flags
- | KSCAMERA_EXTENDEDPROP_EVCOMP_SIXTHSTEP
- | KSCAMERA_EXTENDEDPROP_EVCOMP_QUARTERSTEP
- | KSCAMERA_EXTENDEDPROP_EVCOMP_THIRDSTEP
- | KSCAMERA_EXTENDEDPROP_EVCOMP_HALFSTEP
- | KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP
- },
- {
- // KSPROPERTY_STEPPING_LONG
- 1, //SteppingDelta
- 0, //Reserved
- {
- // KSPROPERTY_BOUNDS_LONG
- -2, //SignedMinimum
- 2 //SignedMaximum
- }
- }
- },
- // Iso
- {
- // SOC_CAP_WITH_STEPPING
- {
- // KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
- sizeof(g_PFSCaps.Iso),
- KSCAMERA_PERFRAMESETTING_ITEM_ISO,
- KSCAMERA_EXTENDEDPROP_ISO_AUTO
- | KSCAMERA_EXTENDEDPROP_ISO_MANUAL
- },
- {
- // KSPROPERTY_STEPPING_LONG
- 50, //SteppingDelta
- 0, //Reserved
- {
- // KSPROPERTY_BOUNDS_LONG
- 50, //SignedMinimum
- 256000 //SignedMaximum
- }
- }
- },
- // Focus
- {
- // SOC_CAP_WITH_STEPPING
- {
- // KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
- sizeof(g_PFSCaps.Focus), //Size
- KSCAMERA_PERFRAMESETTING_ITEM_FOCUS, //Type
- KSCAMERA_PERFRAMESETTING_AUTO //Flags
- | KSCAMERA_PERFRAMESETTING_MANUAL
- },
- {
- // KSPROPERTY_STEPPING_LONG
- 10, //SteppingDelta (We'll use centimeters for kicks)
- 0, //Reserved
- {
- // KSPROPERTY_BOUNDS_LONG
- 0, //SignedMinimum
- 10000 //SignedMaximum (100 meters max)
- }
- }
- },
- // StillConfirmation
- {
- // KSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
- sizeof(g_PFSCaps.StillConfirmation),
- KSCAMERA_PERFRAMESETTING_ITEM_PHOTOCONFIRMATION,
- 0
- },
-};
-
-// Get KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_CAPABILITY
-_Success_(return == 0)
-NTSTATUS
-CSensorSimulation::
-GetPfsCaps(
- _Inout_opt_ KSCAMERA_PERFRAMESETTING_CAP_HEADER *Caps,
- _Inout_ ULONG *Size
-)
-{
- PAGED_CODE();
-
- if( Caps )
- {
- size_t Length = sizeof(g_PFSCaps);
- if( Size && *Size < Length )
- {
- Length = *Size;
- }
- RtlCopyMemory( Caps, &g_PFSCaps, Length );
- }
-
- *Size = sizeof(g_PFSCaps);
-
- return STATUS_SUCCESS;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL Get handler
-NTSTATUS
-CSensorSimulation::
-GetRoi(
- _Inout_ CRoiProperty *pRoi
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- // *pRoiProperty = ...
- *pRoi = CRoiProperty(); // initialize it.
-
- // Add control properties to it.
- pRoi->Add( &m_RoiWhiteBalance ) ;
- pRoi->Add( &m_RoiExposureMode ) ;
- pRoi->Add( &m_RoiFocusMode ) ;
-
- // Log what we created.
- pRoi->Log();
-
- return STATUS_SUCCESS;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL Set handler
-NTSTATUS
-CSensorSimulation::
-SetRoiAsync(
- _In_ CRoiProperty *pRoi,
- _In_ CNotifier *Notifier
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- if( pRoi->GetControlCount() == 0 )
- {
- // Clear all settings.
- DBG_TRACE("Clearing all settings...");
- m_RoiWhiteBalance = CWhiteBalanceRoiIspControl();
- m_RoiExposureMode = CExposureRoiIspControl();
- m_RoiFocusMode = CFocusRoiIspControl();
- }
- else
- {
- // Parse our settings.
- DBG_TRACE("Parsing new settings...");
- if( m_RoiWhiteBalance.
- Init( pRoi, KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE ) )
- {
- m_GlobalIspSettings.WhiteBalanceMode = m_RoiWhiteBalance.GetFlags();
- m_RoiWhiteBalance.Log();
- }
- if( m_RoiExposureMode.
- Init( pRoi, KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE ) )
- {
- m_GlobalIspSettings.ExposureMode = m_RoiExposureMode.GetFlags();
- m_RoiExposureMode.Log();
- }
- if( m_RoiFocusMode.
- Init( pRoi, KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE ) )
- {
- ULONGLONG Flags = m_RoiFocusMode.GetFlags();
- DBG_TRACE("Requesting FocusMode = 0x%016llX", Flags);
-
- if( Flags )
- {
- // If we've been asked to unlock, remove any lock flags.
- if( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_UNLOCK )
- {
- // Change our operation so we go back to the previous state.
- Flags = m_GlobalIspSettings.FocusMode &
- ~( KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK );
- }
-
- // Handle the stand-alone lock case by setting the appropriate flags.
- if( ( Flags &
- (KSCAMERA_EXTENDEDPROP_FOCUS_MODE_MASK |
- KSCAMERA_EXTENDEDPROP_FOCUS_MODE_ADVANCED_MASK) ) ==
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK )
- {
- if( m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO )
- {
- Flags =
- m_GlobalIspSettings.FocusMode | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
- }
- if( m_GlobalIspSettings.FocusMode & KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS )
- {
- Flags =
- m_GlobalIspSettings.FocusMode |= KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK;
- }
- }
- // Note: We do not simulate deferred completion.
- m_FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_FOCUSED;
-
- // Record the Focus mode.
- DBG_TRACE("Recording FocusMode = 0x%016llX", Flags);
- m_GlobalIspSettings.FocusMode = Flags;
- }
-
- m_RoiFocusMode.Log();
- }
- }
-
- Notifier->Set();
- return STATUS_SUCCESS;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL size handler
-ULONG
-CSensorSimulation::
-SizeOfRoi()
-{
- PAGED_CODE();
-
- return
- sizeof( CRoiProperty ) +
- m_RoiWhiteBalance.GetSize() +
- m_RoiExposureMode.GetSize() +
- m_RoiFocusMode.GetSize() ;
-}
-
-
-// Get KSPROPERTY_VIDEOCONTROL_MODE.
-NTSTATUS
-CSensorSimulation::
-GetVideoControlMode(
- _Inout_ KSPROPERTY_VIDEOCONTROL_MODE_S *pMode
-)
-{
- PAGED_CODE();
- KScopedMutex lock( m_SensorMutex );
-
- pMode->Mode =
- KS_VideoControlFlag_IndependentImagePin |
- KS_VideoControlFlag_Trigger |
- KS_VideoControlFlag_StartPhotoSequenceCapture |
- KS_VideoControlFlag_StopPhotoSequenceCapture;
-
- return STATUS_SUCCESS;
-}
-
-// Set KSPROPERTY_VIDEOCONTROL_MODE.
-NTSTATUS
-CSensorSimulation::
-SetVideoControlMode(
- _In_ KSPROPERTY_VIDEOCONTROL_MODE_S *pMode
-)
-{
- PAGED_CODE();
-
- // Note: Trigger will acquire a lock on the hwsim.
- return Trigger( pMode->StreamIndex, pMode->Mode );
-}
-
diff --git a/avscamera/sys/SensorSimulation.h b/avscamera/sys/SensorSimulation.h
deleted file mode 100644
index ecf043e3..00000000
--- a/avscamera/sys/SensorSimulation.h
+++ /dev/null
@@ -1,280 +0,0 @@
-/**************************************************************************
-
- 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
diff --git a/avscamera/sys/Synthesizer.cpp b/avscamera/sys/Synthesizer.cpp
deleted file mode 100644
index fbb0147f..00000000
--- a/avscamera/sys/Synthesizer.cpp
+++ /dev/null
@@ -1,1282 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- Synthesizer.cpp
-
- Abstract:
-
- This file contains the implementation of CSynthesizer.
-
- The base image synthesis and overlay class. These classes provide
- image synthesis (pixel, color-bar, etc...) onto buffers of various
- formats.
-
- Internally, all CSynthesizer objects represent a pixel as a 32 bit
- quantity with 8 bits per sample. The base CSynthesizer implements
- all rendering functionality with this assumption in mind. It
- simplifies rendering substantially and means we do not need to re-
- implement rendering functions for each format.
-
- Most end formats can be synthesized from this uncompressed format
- with overhead that is slightly worse than a copy. Color spaces are
- handled by using a rendering palette that is unique for each.
-
- History:
-
- created 04/14/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-/**************************************************************************
-
- Constants
-
-**************************************************************************/
-
-//
-// Standard definition of EIA-189-A color bars. The actual color definitions
-// are either in CRGB24Synthesizer or CYUVSynthesizer.
-//
-
-const COLOR CSynthesizer::m_ColorBars[8] =
-{MAGENTA, BLUE, GREEN, BLACK, WHITE, YELLOW, RED, CYAN };
-
-
-//
-// Corner registration block colors.
-//
-const COLOR g_TopLeft = GREY;
-const COLOR g_TopRight = BLUE;
-const COLOR g_BotLeft = RED;
-const COLOR g_BotRight = GREEN;
-
-//
-// Persistent stats.
-//
-LONGLONG CSynthesizer::m_RelPts=0;
-LONGLONG CSynthesizer::m_QpcTime=0;
-ULONG CSynthesizer::m_Frame=0;
-
-//
-// The following is an 8x8 bitmapped font for use in the text overlay
-// code.
-//
-const UCHAR
-CSynthesizer::
-m_FontData [256][8] =
-{
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e},
- {0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e},
- {0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00},
- {0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00},
- {0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c},
- {0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c},
- {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x18, 0x00, 0x00},
- {0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff},
- {0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00},
- {0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff},
- {0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78},
- {0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18},
- {0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0},
- {0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0},
- {0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99},
- {0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x00},
- {0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00},
- {0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18},
- {0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00},
- {0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x00},
- {0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78},
- {0x00, 0x00, 0x00, 0x00, 0x7e, 0x7e, 0x7e, 0x00},
- {0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff},
- {0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x00},
- {0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00},
- {0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00},
- {0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00},
- {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xfe, 0x00, 0x00},
- {0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00},
- {0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x00, 0x00},
- {0x00, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x30, 0x78, 0x78, 0x30, 0x30, 0x00, 0x30, 0x00},
- {0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00},
- {0x30, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x30, 0x00},
- {0x00, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x00},
- {0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x00},
- {0x60, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00},
- {0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00},
- {0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00},
- {0x00, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x60},
- {0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00},
- {0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00},
- {0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x00},
- {0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x00},
- {0x78, 0xcc, 0x0c, 0x38, 0x60, 0xcc, 0xfc, 0x00},
- {0x78, 0xcc, 0x0c, 0x38, 0x0c, 0xcc, 0x78, 0x00},
- {0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0x0c, 0x1e, 0x00},
- {0xfc, 0xc0, 0xf8, 0x0c, 0x0c, 0xcc, 0x78, 0x00},
- {0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x00},
- {0xfc, 0xcc, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x00},
- {0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x00},
- {0x78, 0xcc, 0xcc, 0x7c, 0x0c, 0x18, 0x70, 0x00},
- {0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x00},
- {0x00, 0x30, 0x30, 0x00, 0x00, 0x30, 0x30, 0x60},
- {0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x00},
- {0x00, 0x00, 0xfc, 0x00, 0x00, 0xfc, 0x00, 0x00},
- {0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00},
- {0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00},
- {0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x00},
- {0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x00},
- {0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00},
- {0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x00},
- {0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00},
- {0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00},
- {0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x00},
- {0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x00},
- {0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x00},
- {0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00},
- {0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00},
- {0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x00},
- {0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x00},
- {0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00},
- {0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00},
- {0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00},
- {0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x00},
- {0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x00},
- {0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x00},
- {0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x00},
- {0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},
- {0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00},
- {0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x00},
- {0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x00},
- {0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00},
- {0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00},
- {0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00},
- {0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00},
- {0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
- {0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00},
- {0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x00},
- {0x00, 0x00, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x00},
- {0x1c, 0x0c, 0x0c, 0x7c, 0xcc, 0xcc, 0x76, 0x00},
- {0x00, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
- {0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x00},
- {0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
- {0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00},
- {0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0x0c, 0x00, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78},
- {0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00},
- {0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0x00, 0x00, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x00},
- {0x00, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x00},
- {0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
- {0x00, 0x00, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0},
- {0x00, 0x00, 0x76, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e},
- {0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x00},
- {0x00, 0x00, 0x7c, 0xc0, 0x78, 0x0c, 0xf8, 0x00},
- {0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x00},
- {0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00},
- {0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x00},
- {0x00, 0x00, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x00},
- {0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00},
- {0x00, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
- {0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00},
- {0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x00},
- {0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00},
- {0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00},
- {0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x00},
- {0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x18, 0x0c, 0x78},
- {0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
- {0x1c, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
- {0x7e, 0xc3, 0x3c, 0x06, 0x3e, 0x66, 0x3f, 0x00},
- {0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
- {0xe0, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
- {0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
- {0x00, 0x00, 0x78, 0xc0, 0xc0, 0x78, 0x0c, 0x38},
- {0x7e, 0xc3, 0x3c, 0x66, 0x7e, 0x60, 0x3c, 0x00},
- {0xcc, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
- {0xe0, 0x00, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x00},
- {0xcc, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0x7c, 0xc6, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00},
- {0xe0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0xc6, 0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00},
- {0x30, 0x30, 0x00, 0x78, 0xcc, 0xfc, 0xcc, 0x00},
- {0x1c, 0x00, 0xfc, 0x60, 0x78, 0x60, 0xfc, 0x00},
- {0x00, 0x00, 0x7f, 0x0c, 0x7f, 0xcc, 0x7f, 0x00},
- {0x3e, 0x6c, 0xcc, 0xfe, 0xcc, 0xcc, 0xce, 0x00},
- {0x78, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
- {0x00, 0xcc, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
- {0x00, 0xe0, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
- {0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
- {0x00, 0xe0, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
- {0x00, 0xcc, 0x00, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8},
- {0xc3, 0x18, 0x3c, 0x66, 0x66, 0x3c, 0x18, 0x00},
- {0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00},
- {0x18, 0x18, 0x7e, 0xc0, 0xc0, 0x7e, 0x18, 0x18},
- {0x38, 0x6c, 0x64, 0xf0, 0x60, 0xe6, 0xfc, 0x00},
- {0xcc, 0xcc, 0x78, 0xfc, 0x30, 0xfc, 0x30, 0x30},
- {0xf8, 0xcc, 0xcc, 0xfa, 0xc6, 0xcf, 0xc6, 0xc7},
- {0x0e, 0x1b, 0x18, 0x3c, 0x18, 0x18, 0xd8, 0x70},
- {0x1c, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x7e, 0x00},
- {0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00},
- {0x00, 0x1c, 0x00, 0x78, 0xcc, 0xcc, 0x78, 0x00},
- {0x00, 0x1c, 0x00, 0xcc, 0xcc, 0xcc, 0x7e, 0x00},
- {0x00, 0xf8, 0x00, 0xf8, 0xcc, 0xcc, 0xcc, 0x00},
- {0xfc, 0x00, 0xcc, 0xec, 0xfc, 0xdc, 0xcc, 0x00},
- {0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00, 0x00},
- {0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00},
- {0x30, 0x00, 0x30, 0x60, 0xc0, 0xcc, 0x78, 0x00},
- {0x00, 0x00, 0x00, 0xfc, 0xc0, 0xc0, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00},
- {0xc3, 0xc6, 0xcc, 0xde, 0x33, 0x66, 0xcc, 0x0f},
- {0xc3, 0xc6, 0xcc, 0xdb, 0x37, 0x6f, 0xcf, 0x03},
- {0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00},
- {0x00, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x00, 0x00},
- {0x00, 0xcc, 0x66, 0x33, 0x66, 0xcc, 0x00, 0x00},
- {0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88},
- {0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa},
- {0xdb, 0x77, 0xdb, 0xee, 0xdb, 0x77, 0xdb, 0xee},
- {0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18},
- {0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36},
- {0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36},
- {0x00, 0x00, 0xf8, 0x18, 0xf8, 0x18, 0x18, 0x18},
- {0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36},
- {0x00, 0x00, 0xfe, 0x06, 0xf6, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00},
- {0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00},
- {0x18, 0x18, 0xf8, 0x18, 0xf8, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00},
- {0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18},
- {0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00},
- {0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18},
- {0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36},
- {0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00},
- {0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36},
- {0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00},
- {0x36, 0x36, 0x36, 0x36, 0xff, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18},
- {0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0x36, 0x36, 0x3f, 0x00, 0x00, 0x00},
- {0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18},
- {0x00, 0x00, 0x00, 0x00, 0x3f, 0x36, 0x36, 0x36},
- {0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36},
- {0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0x18, 0x18, 0xf8, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18},
- {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
- {0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff},
- {0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0},
- {0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f},
- {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x76, 0xdc, 0xc8, 0xdc, 0x76, 0x00},
- {0x00, 0x78, 0xcc, 0xf8, 0xcc, 0xf8, 0xc0, 0xc0},
- {0x00, 0xfc, 0xcc, 0xc0, 0xc0, 0xc0, 0xc0, 0x00},
- {0x00, 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00},
- {0xfc, 0xcc, 0x60, 0x30, 0x60, 0xcc, 0xfc, 0x00},
- {0x00, 0x00, 0x7e, 0xd8, 0xd8, 0xd8, 0x70, 0x00},
- {0x00, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0xc0},
- {0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x00},
- {0xfc, 0x30, 0x78, 0xcc, 0xcc, 0x78, 0x30, 0xfc},
- {0x38, 0x6c, 0xc6, 0xfe, 0xc6, 0x6c, 0x38, 0x00},
- {0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x6c, 0xee, 0x00},
- {0x1c, 0x30, 0x18, 0x7c, 0xcc, 0xcc, 0x78, 0x00},
- {0x00, 0x00, 0x7e, 0xdb, 0xdb, 0x7e, 0x00, 0x00},
- {0x06, 0x0c, 0x7e, 0xdb, 0xdb, 0x7e, 0x60, 0xc0},
- {0x38, 0x60, 0xc0, 0xf8, 0xc0, 0x60, 0x38, 0x00},
- {0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x00},
- {0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00},
- {0x30, 0x30, 0xfc, 0x30, 0x30, 0x00, 0xfc, 0x00},
- {0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xfc, 0x00},
- {0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xfc, 0x00},
- {0x0e, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18},
- {0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70},
- {0x30, 0x30, 0x00, 0xfc, 0x00, 0x30, 0x30, 0x00},
- {0x00, 0x76, 0xdc, 0x00, 0x76, 0xdc, 0x00, 0x00},
- {0x38, 0x6c, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00},
- {0x0f, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x1c},
- {0x78, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00},
- {0x70, 0x18, 0x30, 0x60, 0x78, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
-};
-
-BOOLEAN
-CSynthesizer::
-Initialize()
-/*++
-
-Routine Description:
-
- Class initialization.
-
- Set the buffer the synthesizer generates images to.
- Override to do any additional processing you think is needed.
-
-Arguments:
-
- none
-
-Return Value:
-
- TRUE - success.
-
---*/
-{
- PAGED_CODE();
-
- // Capture the working palette.
- // Recast it to a point to an array of primaries.
- if( !(m_Colors = GetPalette()) )
- {
- return FALSE;
- }
-
- // Clear the globals. This occurs redundantly, but hey ...
- // ... test output doesn't make sense if we don't do this.
- m_RelPts=0;
- m_QpcTime=0;
- m_Frame=0;
-
- //
- // Allocate a scratch buffer for the synthesizer.
- //
- NT_ASSERT(m_Length);
- if( !m_Length )
- {
- return FALSE;
- }
-
- m_Buffer = new (PagedPool) UCHAR[m_Length];
- NT_ASSERT(m_Buffer);
- if( !m_Buffer )
- {
- return FALSE;
- }
-
- //
- // Allocate a scratch buffer for the Gradient.
- //
- m_GradientBmp = new (PagedPool) CKsRgbQuad[m_Width * MAX_COLOR];
- NT_ASSERT(m_GradientBmp);
- if( !m_GradientBmp )
- {
- SAFE_DELETE_ARRAY( m_Buffer );
- return FALSE;
- }
-
- return TRUE;
-}
-
-LONGLONG
-ConvertPerfTime(
- _In_ LONGLONG Freq,
- _In_ LONGLONG Time
-)
-{
- PAGED_CODE();
-
- LARGE_INTEGER tL ;
- tL.QuadPart = Time;
- return KSCONVERT_PERFORMANCE_TIME( Freq, tL );
-}
-
-void
-CSynthesizer::
-Destroy()
-/*++
-
-Routine Description:
-
- Clean up from initialize.
-
- Note: A good place to generate synthesis stats.
-
-Arguments:
-
- none
-
-Return Value:
-
- void.
-
---*/
-{
- PAGED_CODE();
-
- SAFE_DELETE_ARRAY( m_Buffer );
- SAFE_DELETE_ARRAY( m_GradientBmp );
-
- // Report rendering times.
- DBG_TRACE( "Synthesis Time - Total = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_SynthesisTime ) );
- DBG_TRACE( " Count = %d", m_SynthesisCount );
- DBG_TRACE( " Avg = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_SynthesisCount ? m_SynthesisTime / m_SynthesisCount : 0 ) );
- DBG_TRACE( " Commit Time - Total = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_CommitTime ) );
- DBG_TRACE( " Count = %d", m_CommitCount );
- DBG_TRACE( " Avg = %lld", ConvertPerfTime( m_Frequency.QuadPart, m_CommitCount ? m_CommitTime / m_CommitCount : 0 ) );
-}
-
-NTSTATUS
-CSynthesizer::
-SynthesizeBars()
-/*++
-
-Routine Description:
-
- Synthesize EIA-189-A standard color bars onto the Image. The image
- in question is the current synthesis buffer.
-
-Arguments:
-
- None
-
-Return Value:
-
- success / failure
-
---*/
-{
- PAGED_CODE();
-
- if( !m_Buffer )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- const COLOR *CurColor = m_ColorBars;
- ULONG ColorCount = SIZEOF_ARRAY (m_ColorBars);
-
- //
- // Set the default cursor...
- //
- GetImageLocation (0, 0);
-
- //
- // Synthesize a single line.
- //
- PUCHAR ImageStart = m_Cursor;
- for (ULONG x = 0; x < m_Width; x++)
- {
- PutPixel (m_ColorBars [((x * ColorCount) / m_Width)]);
- }
-
- PUCHAR ImageEnd = m_Cursor;
-
- //
- // Copy the synthesized line to all subsequent lines.
- //
- for (ULONG line = 0; line < m_Height; line++)
- {
- GetImageLocation (0, line);
-
- RtlCopyMemory (
- m_Cursor,
- ImageStart,
- ImageEnd - ImageStart
- );
- }
-
- // Paint the top left and top right registrations boxes.
- GetImageLocation(0,0);
-
- ImageStart = m_Cursor;
- for(ULONG x =0; x < m_Width; x++)
- {
- if(x < (m_Height/16))
- {
- PutPixel(g_TopLeft);
- }
- else if(x > (m_Width - (m_Height / 16)))
- {
- PutPixel(g_TopRight);
- }
- else
- {
- PutPixel (m_ColorBars [((x * ColorCount) / m_Width)]);
- }
- }
-
- ImageEnd = m_Cursor;
-
- for (ULONG line = 0; line < m_Height/16; line++)
- {
- GetImageLocation (0, line);
-
- RtlCopyMemory (
- m_Cursor,
- ImageStart,
- ImageEnd - ImageStart
- );
- }
-
- // Paint the bottom left and bottom right registrations boxes.
- GetImageLocation(0, (15*m_Height) / 16);
- ImageStart = m_Cursor;
- for(ULONG x =0; x < m_Width; x++)
- {
- if(x < (m_Height/16))
- {
- PutPixel(g_BotLeft);
- }
- else if(x > (m_Width - (m_Height / 16)))
- {
- PutPixel(g_BotRight);
- }
- else
- {
- PutPixel (m_ColorBars [((x * ColorCount) / m_Width)]);
- }
- }
-
- ImageEnd = m_Cursor;
-
- for (ULONG line = 0; line < m_Height/16; line++)
- {
- GetImageLocation (0, line+(15*m_Height) / 16);
-
- RtlCopyMemory (
- m_Cursor,
- ImageStart,
- ImageEnd - ImageStart
- );
- }
-
- return STATUS_SUCCESS;
-}
-
-void
-CSynthesizer::
-EncodeNumber(
- _In_ ULONG LocY,
- _In_ UINT32 Number,
- _In_ COLOR LowColor,
- _In_ COLOR HighColor
-)
-/*
-Routine Description:
-
- Overlays an encoded number over the synthesized image. The image buffer
- used is the set synthesis buffer. The pattern is scaled to fit the image.
-
-Arguments:
-
- LocY -
- The row on the image to begin the overlay. This must
- be inside the image.
-
- Number -
- The number to encode
-
- LowColor -
- The color to represent 0 (a clear bit)
-
- HighColor -
- The color to represent 1 (a set bit)
-
-Return Value:
-
- void
-
-*/
-{
- PAGED_CODE();
-
- if( !m_Buffer )
- {
- return;
- }
-
- NT_ASSERT(LocY <= m_Height);
-
- GetImageLocation(0, LocY);
- UINT32 mask = 0x1;
-
- PUCHAR ImageStart = m_Cursor;
- for(ULONG i = 0; i < 32; i++)
- {
- for(ULONG j = 0; j < m_Width/32; j++)
- {
- if(Number & mask)
- {
- PutPixel(HighColor);
- }
- else
- {
- PutPixel(LowColor);
- }
- }
- mask = mask << 1;
- }
- PUCHAR ImageEnd = m_Cursor;
-
- //
- // Copy the synthesized line to all subsequent lines.
- //
- for (ULONG line = 1; line < m_Height/16; line++)
- {
- RtlCopyMemory (
- GetImageLocation (0, line + LocY),
- ImageStart,
- ImageEnd - ImageStart
- );
- }
-}
-
-void
-CSynthesizer::
-OverlayText (
- _In_ ULONG LocX,
- _In_ ULONG LocY,
- _In_ ULONG Scaling,
- _In_ LPSTR Text,
- _In_ COLOR BgColor,
- _In_ COLOR FgColor
-)
-/*++
-
-Routine Description:
-
- Overlay text onto the synthesized image. Clip to fit the image
- if the overlay does not fit. The image buffer used is the set
- synthesis buffer.
-
-Arguments:
-
- LocX -
- The X location on the image to begin the overlay. This MUST
- be inside the image or no text will be rendered.
- POSITION_CENTER may be used to indicate horizontal centering.
-
- LocY -
- The Y location on the image to begin the overlay. This MUST
- be inside the image or no text will be rendered.
- POSITION_CENTER may be used to indicate vertical centering.
-
- Scaling -
- Normally, the overlay is done in an 8x8 font. A scaling of
- 2 indicates 16x16, 3 indicates 24x24 and so forth.
-
- Text -
- A null terminated character string containing the information to
- overlay
-
- BgColor -
- The background color of the overlay window. For transparency,
- indicate TRANSPARENT here.
-
- FgColor -
- The foreground color for the text overlay.
-
-Return Value:
-
- None
-
---*/
-
-{
- PAGED_CODE();
-
- // Validate internal state.
- if( !m_Buffer )
- {
- return;
- }
-
- NT_ASSERT( (LocX <= m_Width || LocX == POSITION_CENTER) &&
- (LocY <= m_Height || LocY == POSITION_CENTER) &&
- Text !=nullptr &&
- (BgColor < MAX_COLOR || BgColor == TRANSPARENT) &&
- (FgColor < MAX_COLOR || FgColor == TRANSPARENT)
- );
-
- // Validate parameters.
- if( !( (LocX <= m_Width || LocX == POSITION_CENTER) &&
- (LocY <= m_Height || LocY == POSITION_CENTER) &&
- Text !=nullptr &&
- (BgColor < MAX_COLOR || BgColor == TRANSPARENT) &&
- (FgColor < MAX_COLOR || FgColor == TRANSPARENT) ) )
- {
- return;
- }
-
- size_t StrLen = 0;
- PCHAR CurChar;
-
- //
- // Determine the character length of the string.
- //
- if( !NT_SUCCESS( RtlStringCchLengthA( Text, m_Width, &StrLen ) ) )
- {
- // Invalid parameter.
- return;
- }
-
- //
- // Determine the physical size of the string plus border. There is
- // a definable NO_CHARACTER_SEPARATION. If this is defined, there will
- // be no added space between font characters. Otherwise, one empty pixel
- // column is added between characters.
- //
-#ifndef NO_CHARACTER_SEPARATION
- ULONG LenX = (ULONG) ((StrLen * (((size_t)Scaling) << 3)) + 1 + StrLen);
-#else // NO_CHARACTER_SEPARATION
- ULONG LenX = (ULONG) ((StrLen * (((size_t_)Scaling) << 3)) + 2);
-#endif // NO_CHARACTER_SEPARATION
-
- ULONG LenY = 2 + (Scaling << 3);
-
- //
- // Adjust for center overlays.
- //
- // NOTE: If the overlay doesn't fit into the synthesis buffer, this
- // merely left aligns the overlay and clips off the right side.
- //
- if (LocX == POSITION_CENTER)
- {
- //LocX = min( 0, ((LONG)m_Width - (LONG)LenX) >> 1);
- if (LenX >= m_Width)
- {
- LocX = 0;
- }
- else
- {
- LocX = (m_Width - LenX) >> 1;
- }
- }
-
- if (LocY == POSITION_CENTER)
- {
- //LocY = min( 0, ((LONG)m_Width - (LONG)LenY) >> 1);
- if (LenY >= m_Height)
- {
- LocY = 0;
- }
- else
- {
- LocY = (m_Height - LenY) >> 1;
- }
- }
-
- //
- // Determine the amount of space available on the synthesis buffer.
- // We will clip anything that finds itself outside the synthesis buffer.
- //
- ULONG SpaceX = m_Width - LocX;
- ULONG SpaceY = m_Height - LocY;
-
- //
- // Set the default cursor position.
- //
- GetImageLocation (LocX, LocY);
-
- //
- // Overlay a background color row.
- //
- if( SpaceY )
- {
- if( BgColor != TRANSPARENT )
- {
- for (ULONG x = 0; x < LenX && x < SpaceX; x++)
- {
- PutPixel (BgColor);
- }
- }
- SpaceY--;
- }
- LocY++;
-
- //
- // Loop across each row of the image.
- //
- for (ULONG row = 0; row < 8 && SpaceY; row++)
- {
- //
- // Generate a line.
- //
- GetImageLocation (LocX, LocY++);
-
- PUCHAR ImageStart = m_Cursor;
-
- ULONG CurSpaceX = SpaceX;
- if (CurSpaceX)
- {
- PutPixel (BgColor);
- CurSpaceX--;
- }
-
- //
- // Generate the row'th row of the overlay.
- //
- CurChar = Text;
- while( *CurChar )
- {
- UCHAR CharBase = m_FontData [*CurChar++][row];
- for (ULONG mask = 0x80; mask && CurSpaceX; mask >>= 1)
- {
- for (ULONG scale = 0; scale < Scaling && CurSpaceX; scale++)
- {
- if (CharBase & mask)
- {
- PutPixel (FgColor);
- }
- else
- {
- PutPixel (BgColor);
- }
- CurSpaceX--;
- }
- }
-
- //
- // Separate each character by one space. Account for the border
- // space at the end by placing the separator after the last
- // character also.
- //
-#ifndef NO_CHARACTER_SEPARATION
- if (CurSpaceX)
- {
- PutPixel (BgColor);
- CurSpaceX--;
- }
-#endif // NO_CHARACTER_SEPARATION
- }
-
- //
- // If there is no separation character defined, account for the
- // border.
- //
-#ifdef NO_CHARACTER_SEPARATION
- if (CurSpaceX)
- {
- PutPixel (BgColor);
- CurSpaceX--;
- }
-#endif // NO_CHARACTER_SEPARATION
-
-
- PUCHAR ImageEnd = m_Cursor;
- //
- // Copy the line downward scale times.
- //
- for (ULONG scale = 1; scale < Scaling && SpaceY; scale++)
- {
- GetImageLocation (LocX, LocY++);
- RtlCopyMemory (m_Cursor, ImageStart, ImageEnd - ImageStart);
- SpaceY--;
- }
- }
-
- //
- // Add the bottom section of the overlay.
- //
- GetImageLocation (LocX, LocY);
- if (BgColor != TRANSPARENT && SpaceY)
- {
- for (ULONG x = 0; x < LenX && x < SpaceX; x++)
- {
- PutPixel (BgColor);
- }
- }
-}
-
-void
-CSynthesizer::ApplyGradient(
- _In_ ULONG LocY,
- _In_ COLOR Gradient
-)
-/*++
-
-Routine Description:
-
- Synthesize a horizontal gradient bar from a given color
-
-Arguments:
-
- LocY -
- row
-
- Gradient -
- A starting color
-
-Return Value:
-
- void
-
---*/
-{
- PAGED_CODE();
-
- if( !m_Buffer )
- {
- return;
- }
-
- NT_ASSERT(LocY <= m_Height);
-
- PUCHAR Image = GetImageLocation(0, LocY);
- PUCHAR RowBmp = reinterpret_cast<PUCHAR>(&m_GradientBmp[Gradient*m_Width]);
- ULONG Stride = m_Width * sizeof(CKsRgbQuad);
-
- //
- // Copy the synthesized line to all lines.
- //
- for (ULONG line = 0; line < m_Height/16; line++)
- {
- RtlCopyMemory (
- Image,
- RowBmp,
- Stride
- );
- Image += Stride;
- }
-}
-
-//
-// Synthesize
-//
-// Fill the image buffer with some base image. All h/w simulations will
-// call this function to generate a base image - even for jpeg.
-//
-NTSTATUS
-CSynthesizer::
-Synthesize()
-/*++
-
-Routine Description:
-
- Fill the image buffer with some base image. All h/w simulations will
- call this function to generate a base image.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / failure
-
---*/
-{
- PAGED_CODE();
-
- if( !m_Buffer )
- {
- return STATUS_INVALID_DEVICE_STATE;
- }
-
- //
- // Generate a "time stamp" just to overlay it onto the capture image.
- // It makes it more exciting than bars that do nothing.
- //
- SynthesizeBars();
-
- ApplyGradient( (m_Height)/16, RED);
- ApplyGradient( (2*m_Height)/16, GREEN);
- ApplyGradient( (3*m_Height)/16, BLUE);
- ApplyGradient( (4*m_Height)/16, WHITE);
-
- EncodeNumber((5*m_Height)/16, (UINT32)m_Frame, BLACK, WHITE);
- EncodeNumber((6*m_Height)/16, (UINT32)(m_QpcTime), BLACK, WHITE);
-
- CHAR Text [256];
- RtlStringCbPrintfA(Text, sizeof(Text), "Frame: %ld", m_Frame);
-
- //
- // Overlay the frame # onto the scratch space image.
- //
- OverlayText (
- POSITION_CENTER,
- (m_Height - 28),
- 1,
- Text,
- BLACK,
- WHITE
- );
-
- //
- // Add a description of the frame type/width/height.
- //
- RtlStringCbPrintfA(Text, sizeof(Text), "%s (%dx%d)", m_FormatName, m_Width, m_Height);
- OverlayText (
- 0,
- (m_Height - 28),
- 1,
- Text,
- BLACK,
- WHITE
- );
- return STATUS_SUCCESS;
-}
-
-void
-CSynthesizer::PutPixel (
- COLOR Color
-)
-/*++
-
-Routine Description:
-
- Place a pixel at the default cursor location. The cursor location
- must be set via GetImageLocation(x, y).
-
-Arguments:
-
- Color -
- The pixel color to render
-
-Return Value:
-
- void
-
---*/
-{
- PAGED_CODE();
-
- PKS_RGBQUAD &pPixel = (PKS_RGBQUAD &) m_Cursor;
-
- if (Color != TRANSPARENT)
- {
- *pPixel = CKsRgbQuad( m_Colors[Color][2], m_Colors[Color][1], m_Colors[Color][0] );
- }
-
- // Next pixel
- pPixel++;
-}
-
-//
-// PutPixel():
-//
-// Place a pixel at the default cursor location. The cursor location
-// must be set via GetImageLocation(x, y).
-//
-void
-CSynthesizer::PutPixel (
- UCHAR colorR,
- UCHAR colorB,
- UCHAR colorG
-)
-/*++
-
-Routine Description:
-
- Place a pixel at the default cursor location. The cursor location
- must be set via GetImageLocation(x, y).
-
- TODO: Remove. This function appears to be dead code.
-
-Arguments:
-
- colorR -
- The first color primary of the pixel.
-
- colorB -
- The third color primary of the pixel.
-
- colorG -
- The second color primary of the pixel.
-
-
-Return Value:
-
- void
-
---*/
-{
- PAGED_CODE();
-
- PKS_RGBQUAD &pPixel = (PKS_RGBQUAD &) m_Cursor;
-
- *pPixel++ = CKsRgbQuad( colorR, colorG, colorB );
-}
-
-
-//
-// Synthesize
-//
-// Fill the image buffer with some base image. All h/w simulations will
-// call this function to generate a base image - even for jpeg.
-//
-NTSTATUS
-CSynthesizer::
-DoSynthesize()
-{
- PAGED_CODE();
-
- LARGE_INTEGER StartTime = {0};
- LARGE_INTEGER EndTime = {0};
-
- StartTime = KeQueryPerformanceCounter(NULL);
-
- NTSTATUS Status = Synthesize();
-
- m_SynthesisTime += KeQueryPerformanceCounter(NULL).QuadPart - StartTime.QuadPart;
- m_SynthesisCount++;
-
- return Status;
-}
-
-//
-// Commit
-//
-// Copy (and reformat, if necessary) pixels from the internal scratch
-// buffer. If the output format decimates chrominance, do it here.
-//
-_Success_(return > 0)
-ULONG
-CSynthesizer::
-DoCommit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
-)
-{
- PAGED_CODE();
-
- LARGE_INTEGER StartTime = KeQueryPerformanceCounter(NULL);
-
- ULONG n = Commit( Buffer, Size, Stride );
-
- m_CommitTime += KeQueryPerformanceCounter(NULL).QuadPart - StartTime.QuadPart;
- m_CommitCount++;
-
- return n;
-}
-
-//
-// DoCommit
-//
-// Note: The stride needs to be a function of the bits per pixel of the
-// OUTPUT format - not the format we store it in. The class ctor
-// must initialize m_OutputStride to a default stride value.
-//
-_Success_(return > 0)
-ULONG
-CSynthesizer::
-DoCommit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size
-)
-{
- PAGED_CODE();
-
- LARGE_INTEGER StartTime = KeQueryPerformanceCounter(NULL);
-
- ULONG n = Commit( Buffer, Size );
-
- m_CommitTime += KeQueryPerformanceCounter(NULL).QuadPart - StartTime.QuadPart;
- m_CommitCount++;
-
- return n;
-}
-
-#define CLEAR_HISTOGRAM( H ) \
- if( H ) \
- { \
- RtlZeroMemory( H, 256*sizeof(*H) ); \
- }
-
-#define BUMP_HISTOGRAM_PRIMARY( H, C ) \
- if( H ) \
- { \
- H[C]++; \
- }
-
-//
-// Histogram
-//
-// Fill an array with histogram data.
-//
-void
-CSynthesizer::
-Histogram(
- _Out_writes_opt_(256)
- PULONG HistogramP0, // rgbRed
- _Out_writes_opt_(256)
- PULONG HistogramP1, // rgbGreen
- _Out_writes_opt_(256)
- PULONG HistogramP2 // rgbBlue
-)
-/*++
-
-Routine Description:
-
- Fill array(s) with histogram data.
-
-Arguments:
-
- HistogramP0 -
- Stats on the first primary.
-
- HistogramP1 -
- Stats on the second primary.
-
- HistogramP2 -
- Stats on the third primary.
-
-Return Value:
-
- void
-
---*/
-{
- PAGED_CODE();
-
- CLEAR_HISTOGRAM( HistogramP0 );
- CLEAR_HISTOGRAM( HistogramP1 );
- CLEAR_HISTOGRAM( HistogramP2 );
-
- ULONG row, col;
-
- for( row=0; row<m_Height; row++ )
- {
- PKS_RGBQUAD pPixel = (PKS_RGBQUAD) GetImageLocation(0, row);
-
- for( col=0; col<m_Width; col++ )
- {
- BUMP_HISTOGRAM_PRIMARY( HistogramP0, pPixel->rgbRed );
- BUMP_HISTOGRAM_PRIMARY( HistogramP1, pPixel->rgbGreen );
- BUMP_HISTOGRAM_PRIMARY( HistogramP2, pPixel->rgbBlue );
- }
- }
-}
diff --git a/avscamera/sys/Synthesizer.h b/avscamera/sys/Synthesizer.h
deleted file mode 100644
index b39dfb7e..00000000
--- a/avscamera/sys/Synthesizer.h
+++ /dev/null
@@ -1,507 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- Synthesizer.h
-
- Abstract:
-
- This file contains the definition of CSynthesizer.
-
- The base image synthesis and overlay class. These classes provide
- image synthesis (pixel, color-bar, etc...) onto buffers of various
- formats.
-
- Internally, all CSynthesizer objects represent a pixel as a 32 bit
- quantity with 8 bits per sample. The base CSynthesizer implements
- all rendering functionality with this assumption in mind. It
- simplifies rendering substantially and means we do not need to re-
- implement rendering functions for each format.
-
- Most end formats can be synthesized from this uncompressed format
- with overhead that is slightly worse than a copy. Color spaces are
- handled by using a rendering palette that is unique for each.
-
- History:
-
- created 04/14/2014
-
-**************************************************************************/
-
-#pragma once
-
-//
-// COLOR:
-//
-// Pixel color for placement onto the synthesis buffer.
-//
-typedef enum
-{
-
- BLACK = 0,
- WHITE,
- YELLOW,
- CYAN,
- GREEN,
- MAGENTA,
- RED,
- BLUE,
- GREY,
-
- MAX_COLOR,
- TRANSPARENT,
-
-} COLOR;
-
-#define CHANNEL_YCrCb ( MF_HISTOGRAM_CHANNEL_Y | MF_HISTOGRAM_CHANNEL_Cr | MF_HISTOGRAM_CHANNEL_Cb )
-#define CHANNEL_RGB ( MF_HISTOGRAM_CHANNEL_R | MF_HISTOGRAM_CHANNEL_G | MF_HISTOGRAM_CHANNEL_B )
-#define CHANNEL_NONE ( 0 )
-
-//
-// POSITION_CENTER:
-//
-// Only useful for text overlay. This can be substituted for LocX or LocY
-// in order to center the text screen on the synthesis buffer.
-//
-#define POSITION_CENTER ((ULONG)-1)
-
-//
-// Initializer class for a KS_RGBQUAD
-//
-class CKsRgbQuad : public KS_RGBQUAD
-{
-public:
- // Initializer ctor
- CKsRgbQuad(
- BYTE r=0,
- BYTE g=0,
- BYTE b=0 )
- {
- rgbBlue = b;
- rgbGreen = g;
- rgbRed = r;
- rgbReserved = 0;
- }
-};
-
-/*************************************************
-
- CSynthesizer
-
- This class synthesizes images in various formats for output from the
- capture filter. It is capable of performing various text overlays onto
- the image surface.
-
- The base synthesizer is essentially the XRGB Synthesizer. For YUV, we
- repurpose the color primaries and provide a different definition for the
- color pallette. A call to CSynthesizer::Commit(buffer) will reformat the
- internal representation and down-sample the color primaries, as necessary
- into the supplied buffer.
-
-*************************************************/
-
-typedef
-UCHAR UCHAR4[4];
-
-class CSynthesizer :
- public CNonCopyable
-{
-protected:
-
- static
- const UCHAR m_FontData [256][8];
- static
- const COLOR m_ColorBars[8];
-
- // These values are used by Synthesize() for display purposes. They are
- // static so that setting the values on the preview pin affects all pins.
- //
- // TODO: Change to references to a shared object. Use of static values
- // could cause confusion if two (or more) cameras are in use at
- // the same time.
- static
- LONGLONG m_RelPts;
- static
- LONGLONG m_QpcTime;
- static
- ULONG m_Frame;
-
- //
- // The width and height the synthesizer is set to.
- //
- ULONG m_Width;
- ULONG m_Height;
-
- //
- // The synthesis buffer:
- //
- // This buffer points to an array of KS_RGBQUAD. Internally we synthesize
- // images in an uncompressed format, because it is at least as fast to
- // composite an image in such a format and convert to the target compressed
- // format in a final pass over the image.
- //
- // An uncompressed format also has less loss of fidelity. For instance,
- // NV12 only contains 1 chroma sample per macro-pixel (2x2). Once this
- // macro pixel is rendered, compositing additional color information
- // into it results in a loss of color precision / fidelity.
- //
- PUCHAR m_Buffer; // pointer to pixel data
- ULONG m_Length; // size of the buffer in bytes
- LONG m_SynthesisStride; // size of scan line in bytes
-
- //
- // The assumed stride of our output format. Currently used by YUY2 and
- // all image captures, except NV12. This value should be initialized by
- // the derived classes.
- //
- LONG m_OutputStride;
-
- // Bitmap with a gradient applied for each color in the color pallet.
- CKsRgbQuad *m_GradientBmp;
-
- //
- // The default cursor. This is a pointer into the synthesis buffer where
- // a non specific PutPixel will be placed.
- //
- PUCHAR m_Cursor;
-
- //
- // A printable name identifying this format.
- //
- PCCHAR m_FormatName;
-
- //
- // A color palette for this colorspace.
- //
- // Specifying a unique color palette is a cheap method for switching
- // between RGB and YUV color spaces. A derived class is free to assign
- // this to any table it chooses. It can be used to either change the
- // colors used for rendering, or it can be used to support a new (or
- // slightly different) color space.
- //
- const UCHAR4 *m_Colors;
-
- //
- // A bitset specifying the color primaries used by this format.
- // (Used by Histogram.)
- //
- ULONG m_ChannelMask;
-
- //
- // Debugging values
- //
- LARGE_INTEGER m_Frequency;
- LONGLONG m_SynthesisTime;
- ULONG m_SynthesisCount;
- LONGLONG m_CommitTime;
- ULONG m_CommitCount;
-
-public:
-
- //
- // DEFAULT CONSTRUCTOR
- //
- CSynthesizer(
- PCCHAR Name="[Unknown]",
- ULONG ChannelMask=0,
- ULONG Width=0,
- ULONG Height=0
- )
- : m_Width(Width)
- , m_Height(Height)
- , m_Buffer(nullptr)
- , m_Cursor(nullptr)
- , m_GradientBmp(nullptr)
- , m_SynthesisStride(m_Width * sizeof(KS_RGBQUAD))
- , m_OutputStride(0)
- , m_FormatName(Name)
- , m_ChannelMask(ChannelMask)
- , m_SynthesisCount(0)
- , m_SynthesisTime(0)
- , m_CommitCount(0)
- , m_CommitTime(0)
- {
- m_Length = Height * m_SynthesisStride;
- KeQueryPerformanceCounter(&m_Frequency);
- }
-
- //
- // DESTRUCTOR:
- //
- virtual
- ~CSynthesizer()
- {}
-
- //
- // PutPixel():
- //
- // Place a pixel at the default cursor location. The cursor location
- // must be set via GetImageLocation(x, y).
- //
- virtual
- void
- PutPixel (
- COLOR Color
- );
-
- //
- // PutPixel():
- //
- // Place a pixel at the default cursor location. The cursor location
- // must be set via GetImageLocation(x, y).
- //
- virtual
- void
- PutPixel (
- UCHAR colorR,
- UCHAR colorB,
- UCHAR colorG
- );
-
- //
- // Create a horizontal color bar that slowly fades from the specified
- // color to black.
- //
- // Note: To generalize, this function could specify the height of the
- // color bar instead of inferring it.
- //
- void
- ApplyGradient(
- _In_ ULONG LocY,
- _In_ COLOR Gradient
- );
-
-
- //
- // SetImageSize():
- //
- // Set the image size of the synthesis buffer.
- //
- void
- SetImageSize (
- _In_ ULONG Width,
- _In_ ULONG Height
- )
- {
- m_Width = Width;
- m_Height = Height;
- }
-
- //
- // Initialize()
- //
- // Set the buffer the synthesizer generates images to.
- // Override to do any additional processing you think is needed.
- //
- virtual
- BOOLEAN
- Initialize();
-
- //
- // Destroy()
- //
- // Clean up from initialize.
- //
- virtual
- void
- Destroy();
-
- //
- // SynthesizeBars():
- //
- // Synthesize EIA-189-A standard color bars.
- //
- virtual
- NTSTATUS
- SynthesizeBars();
-
- //
- // Synthesize
- //
- // Fill the image buffer with some base image. All h/w simulations will
- // call this function to generate a base image
- //
- virtual
- NTSTATUS
- Synthesize();
-
- //
- // Commit
- //
- // Copy (and reformat, if necessary) pixels from the internal scratch
- // buffer. If the output format decimates chrominance, do it here.
- //
- virtual
- _Success_(return > 0)
- ULONG
- Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
- )=0;
-
- //
- // Commit
- //
- // Note: The stride needs to be a function of the bits per pixel of the
- // OUTPUT format - not the format we store it in. The class ctor
- // must initialize m_OutputStride to a default stride value.
- //
- _Success_(return > 0)
- ULONG
- Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size
- )
- {
- return Commit( Buffer, Size, m_OutputStride );
- }
-
- //
- // Histogram
- //
- // Fill an array with histogram data. Each parameter is optional.
- //
- void
- Histogram(
- _Out_writes_opt_(256)
- PULONG HistogramP0, // rgbRed
- _Out_writes_opt_(256)
- PULONG HistogramP1, // rgbGreen
- _Out_writes_opt_(256)
- PULONG HistogramP2 // rgbBlue
- );
-
- //
- // Synthesize
- //
- // Fill the image buffer with some base image. All h/w simulations will
- // call this function to generate a base image
- //
- NTSTATUS
- DoSynthesize();
-
- //
- // Commit
- //
- // Copy (and reformat, if necessary) pixels from the internal scratch
- // buffer. If the output format decimates chrominance, do it here.
- //
- _Success_(return > 0)
- ULONG
- DoCommit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
- );
-
- //
- // DoCommit
- //
- // Note: The stride needs to be a function of the bits per pixel of the
- // OUTPUT format - not the format we store it in. The class ctor
- // must initialize m_OutputStride to a default stride value.
- //
- _Success_(return > 0)
- ULONG
- DoCommit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size
- );
-
- //
- // OverlayText():
- //
- // Overlay a text string onto the image.
- //
- void
- OverlayText (
- _In_ ULONG LocX,
- _In_ ULONG LocY,
- _In_ ULONG Scaling,
- _In_ LPSTR Text,
- _In_ COLOR BgColor,
- _In_ COLOR FgColor
- );
-
- virtual
- void
- EncodeNumber(
- _In_ ULONG LocY,
- _In_ UINT32 Number,
- _In_ COLOR LowColor,
- _In_ COLOR HighColor
- );
-
- void
- SetRelativePts( LONGLONG Pts )
- {
- m_RelPts = Pts;
- }
-
- void
- SetQpcTime( LONGLONG Pts )
- {
- m_QpcTime = Pts;
- }
-
- void
- SetFrameNumber( ULONG Frame )
- {
- m_Frame = Frame;
- }
-
- //
- // GetChannelMask
- //
- // Get the color channel mask associated with this format.
- //
- ULONG
- GetChannelMask()
- {
- return m_ChannelMask;
- }
-
-protected:
- //
- // GetPalette
- //
- // Get a pointer to an array of palette colors. Used mostly to handle
- // different color primaries. Location of the primary must agree with
- // Commit().
- //
- virtual
- const UCHAR4 *
- GetPalette()
- {
- return nullptr;
- }
-
- //
- // GetImageLocation
- //
- // Get the location into the image buffer for a specific X/Y location.
- // This also sets the synthesizer's default cursor to the position
- // LocX, LocY.
- //
- PUCHAR
- GetImageLocation (
- _In_ ULONG LocX,
- _In_ ULONG LocY
- )
- {
- return
- m_Cursor =
- (m_Buffer + (sizeof(CKsRgbQuad) * LocX) + (LocY * m_SynthesisStride));
- }
-
-};
-
diff --git a/avscamera/sys/Timer.cpp b/avscamera/sys/Timer.cpp
deleted file mode 100644
index 5345a361..00000000
--- a/avscamera/sys/Timer.cpp
+++ /dev/null
@@ -1,172 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- timer.cpp
-
- Abstract:
-
- Contains the implementation of a KTimer and KPassiveTimer.
-
- KTimer wraps a kernel timer object. KPassiveTimer uses a passive
- callback through a KWorkItem.
-
- History:
-
- created 5/30/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-KTimer::
-KTimer( TIMER_TYPE type )
- : m_Period(0)
- , m_Context(NULL)
- , m_Callback(NULL)
-{
- KeInitializeTimerEx( &m_Timer,type ) ;
- KeInitializeDpc( &m_Dpc, KTimer::DpcThunk, this ) ;
-}
-
-KTimer::
-~KTimer()
-{
- Cancel();
-}
-
-//
-// Cancels the timer and ensures no DPC is executing.
-//
-BOOLEAN
-KTimer::
-Cancel()
-{
- // Clear the timer and dequeue the DPC.
- if( !Reset() )
- {
- // If the item wasn't found, flush all the DPC queues.
- KeFlushQueuedDpcs() ;
-
- // Return false because we lost the race.
- return FALSE;
- }
- return TRUE;
-}
-
-//
-// Support for waitable class
-//
-PVOID
-KTimer::
-GetDispatchObject()
-{
- return &m_Timer;
-}
-
-//
-// Dpc Thunking function for KeSetTimerEx
-//
-_Function_class_(KDEFERRED_ROUTINE)
-VOID
-KTimer::
-DpcThunk(
- _In_ PKDPC /*Dpc*/,
- _Inout_opt_ PVOID DeferredContext,
- _Inout_opt_ PVOID /*Arg1*/,
- _Inout_opt_ PVOID /*Arg2*/
-)
-{
- KTimer *pKTimer = (KTimer *) DeferredContext ;
- pKTimer->Func() ;
-}
-
-//
-// Function invoked when a timer expires
-//
-// IRQL <= DISPATCH_LEVEL
-//
-void
-KTimer::
-Func()
-{
- if( m_Callback )
- {
- m_Callback( m_Context ) ;
- }
-}
-
-//
-// Dtor
-//
-// Calls Cancel() here to clean up.
-//
-// Note: KTimer will also call Cancel(), but it will invoke KTimer::Cancel().
-// Since KPassiveTimer::Cancel() first calls KTimer::Cancel() this second
-// call is redudant; but preventing it would probably require an explicit
-// call to Cancel() before destruction. This way you can just delete
-// timers when they are no longer needed, but it make take a bit longer.
-//
-KPassiveTimer::
-~KPassiveTimer()
-{
- Cancel();
-}
-
-//
-// Function invoked when a timer expires
-//
-// IRQL == DISPATCH_LEVEL
-//
-void
-KPassiveTimer::
-Func()
-{
- if( m_Callback )
- {
- // Start the work item. If it fails, there's not much we can do since
- // it can only fail if the owner of this timer is trying to cancel it.
- m_WorkItem.Start();
- }
-}
-
-VOID
-KPassiveTimer::
-WorkThunk(
- _In_ PDEVICE_OBJECT DeviceObject,
- _In_opt_ PVOID Context
-)
-{
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if( Context )
- {
- ((KPassiveTimer *) Context)->KTimer::Func();
- }
-}
-
-//
-// Cancels the timer
-//
-BOOLEAN
-KPassiveTimer::
-Cancel()
-{
- // Kill the timer.
- if( !KTimer::Cancel() )
- {
- // Wait until the work item is idle.
- m_WorkItem.Wait();
-
- // Reset the WorkItem so we can use it again.
- m_WorkItem.Reset();
-
- return FALSE;
- }
- return TRUE;
-}
-
diff --git a/avscamera/sys/Timer.h b/avscamera/sys/Timer.h
deleted file mode 100644
index d4e6322e..00000000
--- a/avscamera/sys/Timer.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- timer.h
-
- Abstract:
-
- Contains the definition of a KTimer and KPassiveTimer.
-
- KTimer wraps a kernel timer object. KPassiveTimer uses a passive
- callback through a KWorkItem.
-
- History:
-
- created 5/30/2014
-
-**************************************************************************/
-
-#pragma once
-
-typedef void (*PKTimerCallback)( PVOID Context ) ;
-
-class KTimer : public KWaitable, public Cancelable
-{
-public:
- KTimer( TIMER_TYPE type=NotificationTimer );
-
- virtual
- ~KTimer();
-
-public:
- //
- // Override function that is invoked when a timer expires
- //
- virtual
- void
- Func() ;
-
- //
- // Cancels the timer
- //
- virtual
- BOOLEAN
- Cancel();
-
- //
- // Returns TRUE is if the timer is signalled
- //
- BOOLEAN
- State()
- {
- return KeReadStateTimer( &m_Timer ) ;
- }
-
- //
- // Resets (Cancels) the timer and DPC.
- //
- // Reset() returns TRUE if the KTIMER or the KDPC are dequeued.
- // If Reset() returns FALSE the DPC may still be executing on another
- // processor.
- //
- BOOLEAN
- Reset()
- {
- // Try cancelling the timer.
- if( !KeCancelTimer( &m_Timer ) )
- {
- // If the timer couldn't be cancelled, try removing the DPC.
- return KeRemoveQueueDpc( &m_Dpc ) ;
- }
- return TRUE;
- }
-
- //
- // Sets the timer
- //
- BOOLEAN
- Set(
- _In_ LARGE_INTEGER DueTime,
- _In_opt_ PKTimerCallback Callback=NULL,
- _In_opt_ PVOID Context=NULL,
- _In_ LONG Period=0
- )
- {
- m_Callback = Callback ;
- m_Context = Context ;
- m_Period = Period ;
- return KeSetTimerEx( &m_Timer, DueTime, Period, &m_Dpc ) ;
- }
-
- //
- // Sets the timer
- //
- BOOLEAN
- Set(
- _In_ LONGLONG DueTime,
- _In_opt_ PKTimerCallback Callback=NULL,
- _In_opt_ PVOID Context=NULL,
- _In_ LONG Period=0
- )
- {
- m_Callback = Callback ;
- m_Context = Context ;
- m_Period = Period ;
- LARGE_INTEGER Due;
- Due.QuadPart = DueTime;
- return KeSetTimerEx( &m_Timer, Due, Period, &m_Dpc ) ;
- }
-
- //
- // Support for waitable class
- //
- virtual
- PVOID
- GetDispatchObject();
-
-private:
- //
- // Dpc Thunking function for KeSetTimerEx
- //
- _Function_class_(KDEFERRED_ROUTINE)
- static
- VOID
- DpcThunk(
- _In_ PKDPC Dpc,
- _Inout_opt_ PVOID DeferredContext,
- _Inout_opt_ PVOID Arg1,
- _Inout_opt_ PVOID Arg2
- ) ;
-
- TIMER_TYPE GetType()
- {
- return m_type;
- }
-
-private:
- KTIMER m_Timer ;
- TIMER_TYPE m_type;
-
- KDPC m_Dpc ;
- LONG m_Period ;
-
-protected:
- PKTimerCallback m_Callback ;
- PVOID m_Context ;
-};
-
-class KPassiveTimer : public KTimer
-{
-public:
- KPassiveTimer(
- _In_ PDEVICE_OBJECT DeviceObj,
- _In_ TIMER_TYPE type=NotificationTimer
- )
- : KTimer( type )
- , m_WorkItem( DeviceObj, WorkThunk, this )
- {}
-
- virtual
- ~KPassiveTimer();
-
- //
- // Override function that is invoked when a timer expires
- //
- virtual
- void
- Func() ;
-
- //
- // Cancels the timer
- //
- virtual
- BOOLEAN
- Cancel();
-
- //
- // Make sure it's in a valid state.
- //
- virtual
- BOOLEAN
- IsValid()
- {
- return m_WorkItem.IsValid();
- }
-private:
- KWorkItem m_WorkItem;
-
- //
- // Dpc Thunking function for KeSetTimerEx
- //
- static
- IO_WORKITEM_ROUTINE
- WorkThunk;
-}; \ No newline at end of file
diff --git a/avscamera/sys/Util.cpp b/avscamera/sys/Util.cpp
deleted file mode 100644
index 76a0d902..00000000
--- a/avscamera/sys/Util.cpp
+++ /dev/null
@@ -1,476 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- util.cpp
-
- Abstract:
-
- Contains miscellaneous helper functions such as random number
- generation and bounds checking functions.
-
- History:
-
- created 7/12/2013
-
-**************************************************************************/
-
-#include "Common.h"
-#include <bcrypt.h>
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg()
-#endif // ALLOC_PRAGMA
-
-//
-// Generate a random number using the standard Crypto library.
-// Fall back to the QPC, if crypto library reports an error.
-//
-ULONG
-GetRandom(
- _In_ ULONG Minimum,
- _In_ ULONG Maximum
-)
-{
- ULONG Value=0;
- NTSTATUS Status = STATUS_UNSUCCESSFUL;
-
- if( KeGetCurrentIrql()==PASSIVE_LEVEL )
- {
- Status=
- BCryptGenRandom( NULL, (PUCHAR) &Value, sizeof(Value), BCRYPT_USE_SYSTEM_PREFERRED_RNG );
- }
-
- // Fallback to QPC if BCRYPT isn't available.
- if( !NT_SUCCESS(Status) )
- {
- LARGE_INTEGER QPC = KeQueryPerformanceCounter(NULL);
- Value = QPC.u.LowPart;
- }
-
- // Make sure we don't divide by 0.
- if( Minimum < Maximum )
- {
- Value = ((Value - Minimum) % (Maximum - Minimum +1)) + Minimum;
- }
- else
- {
- Value = Minimum ;
- }
-
- return Value;
-}
-
-//
-// Generate a random number using the standard Crypto library.
-// Fall back to the QPC, if crypto library reports an error.
-//
-LONG
-GetRandom(
- _In_ LONG Minimum,
- _In_ LONG Maximum
-)
-{
- ULONG Value=0;
- NTSTATUS Status = STATUS_UNSUCCESSFUL;
-
- if( KeGetCurrentIrql()==PASSIVE_LEVEL )
- {
- Status=
- BCryptGenRandom( NULL, (PUCHAR) &Value, sizeof(Value), BCRYPT_USE_SYSTEM_PREFERRED_RNG );
- }
-
- // Fallback to QPC if BCRYPT isn't available.
- if( !NT_SUCCESS(Status) )
- {
- LARGE_INTEGER QPC = KeQueryPerformanceCounter(NULL);
- Value = QPC.u.LowPart;
- }
-
- // Make sure we don't divide by 0.
- if( Minimum < Maximum )
- {
- Value = ((Value - Minimum) % (Maximum - Minimum +1)) + Minimum;
- }
- else
- {
- Value = Minimum ;
- }
-
- return Value;
-}
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-//
-// Convert an EV Compensation flag into the denominator of a fraction.
-//
-LONG
-EVFlags2Denominator(
- _In_ ULONGLONG Flags
-)
-{
- PAGED_CODE( );
-
- static
- LONG val[] = {1,2,3,4,6};
-
- switch( Flags )
- {
- case KSCAMERA_EXTENDEDPROP_EVCOMP_SIXTHSTEP:
- return 6;
- case KSCAMERA_EXTENDEDPROP_EVCOMP_QUARTERSTEP:
- return 4;
- case KSCAMERA_EXTENDEDPROP_EVCOMP_THIRDSTEP:
- return 3;
- case KSCAMERA_EXTENDEDPROP_EVCOMP_HALFSTEP:
- return 2;
- case KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP:
- return 1;
- case KSCAMERA_PERFRAMESETTING_AUTO:
- return val[GetRandom( (ULONG) 0, (ULONG) SIZEOF_ARRAY(val)-1)];
- }
-
- return 0;
-}
-
-// Convert white balance presets to a temperature.
-ULONG
-WhiteBalancePreset2Temperature(
- _In_ ULONG WBPreset
-)
-{
- PAGED_CODE();
-
- ULONG temp = 0;
-
- switch (WBPreset)
- {
- case KSCAMERA_EXTENDEDPROP_WBPRESET_CLOUDY:
- temp = 6000;
- break;
- case KSCAMERA_EXTENDEDPROP_WBPRESET_DAYLIGHT:
- temp = 5200;
- break;
- case KSCAMERA_EXTENDEDPROP_WBPRESET_FLASH:
- temp = 6000;
- break;
- case KSCAMERA_EXTENDEDPROP_WBPRESET_FLUORESCENT:
- temp = 4000;
- break;
- case KSCAMERA_EXTENDEDPROP_WBPRESET_TUNGSTEN:
- temp = 3200;
- break;
- case KSCAMERA_EXTENDEDPROP_WBPRESET_CANDLELIGHT:
- temp = 1000;
- break;
- default:
- temp = 5000;
- break;
- }
-
- return temp;
-}
-
-typedef struct
-{
- LONG exposureBinaryLog;
- LONGLONG exposure100ns;
-} ExposurePresetStruct;
-
-const ExposurePresetStruct ExposurePresets[] =
-{
- { -10, 10000 }, // 1/1024s -> 9765.625 (100 ns) (Min is 1 ms)
- { -9, 19531 }, // 1/512s -> 19531.25 (100 ns)
- { -8, 39063 }, // 1/256s -> 39062.5 (100 ns)
- { -7, 78125 }, // 1/128s -> 78125 (100 ns)
- { -6, 196250 }, // 1/64s -> 196250 (100 ns)
- { -5, 312500 }, // 1/32s -> 312500 (100 ns)
- { -4, 625000 }, // 1/16s -> 625000 (100 ns)
- { -3, 1250000 }, // 1/8s -> 1250000 (100 ns)
- { -2, 2500000 }, // 1/4s -> 2500000 (100 ns)
- { -1, 5000000 }, // 1/2s -> 5000000 (100 ns)
- { 0, 10000000 },// 1s -> 1 * 10000000 (100 ns)
- { 1, 20000000 },// 2s -> 2 * 10000000 (100 ns)
- { 2, 40000000 },// 4s -> 4 * 10000000 (100 ns)
- { 3, 80000000 },// 8s -> 8 * 10000000 (100 ns)
- { 4, 160000000 },// 16s -> 16 * 10000000 (100 ns)
- { 5, 320000000 },// 32s -> 32 * 10000000 (100 ns)
- { 6, 640000000 },// 64s -> 64 * 10000000 (100 ns)
- { 7, 1280000000 },// 128s -> 128 * 10000000 (100 ns)
- { 8, 2560000000 },// 256s -> 256 * 10000000 (100 ns)
- { 9, 3600000000 },// 512s -> 512 * 10000000 (100 ns) (Max is 360 s)
-};
-
-const ExposurePresetStruct ExposureMidpoints[] =
-{
- { -10, 13811 }, // 2^(-9.5) -> .001381067
- { -9, 27621 }, // 2^(-8.5) -> .002762136
- { -8, 55243 }, // 2^(-7.5) -> .005524271
- { -7, 110485 }, // 2^(-6.5) -> .011048543
- { -6, 220970 }, // 2^(-5.5) -> .022097086
- { -5, 441941 }, // 2^(-4.5) -> .044194174
- { -4, 883883 }, // 2^(-3.5) -> .0883883476
- { -3, 1767767 }, // 2^(-2.5) -> .1767766953
- { -2, 3535534 }, // 2^(-1.5) -> .3535533905
- { -1, 7071067 }, // 2^(-0.5) -> .7071067811
- { 0, 14142136 },// 2^(0.5) -> 1.414213562
- { 1, 28284271 },// 2^(1.5) -> 2.828427125
- { 2, 56568542 },// 2^(2.5) -> 5.656854250
- { 3, 113137085 },// 2^(3.5) -> 11.31370850
- { 4, 226274170 },// 2^(4.5) -> 22.62741700
- { 5, 452548340 },// 2^(5.5) -> 45.25483400
- { 6, 905096680 },// 2^(6.5) -> 90.50966799
- { 7, 1810193360 },// 2^(7.5) -> 181.0193360
- { 8, 3080000000 },// Halfway between 8 and Max: 30800
- { 9, 3600000000 },// Above
-};
-
-BOOL
-ExposureBinaryLogIsValid(
- _In_ LONG ExposureBL
-)
-{
- PAGED_CODE();
-
- if( ExposurePresets[0].exposureBinaryLog > ExposureBL ||
- ExposurePresets[_countof(ExposurePresets) - 1].exposureBinaryLog < ExposureBL )
- {
- return FALSE;
- }
-
- return TRUE;
-}
-
-// Changes a Legacy Preset value into 100 ns units for Exposure. If the
-// preset is out of range of what we support, return 0 to indicate failure.
-LONGLONG
-ExposureBinaryLogTo100ns(
- _In_ LONG ExposureBL
-)
-{
- PAGED_CODE( );
-
- for (LONG i = 0; i < _countof(ExposurePresets) - 1; i++)
- {
- if (ExposureBL == ExposurePresets[i].exposureBinaryLog)
- {
- return ExposurePresets[i].exposure100ns;
- }
- }
-
- return 0;
-}
-
-LONG
-Exposure100nsToBinaryLog(
- _In_ LONGLONG Exposure100ns
-)
-{
- PAGED_CODE( );
-
- for(LONG i = 0; i < _countof(ExposureMidpoints) - 1; i++)
- {
- if(Exposure100ns <= ExposureMidpoints[i].exposure100ns)
- {
- return ExposureMidpoints[i].exposureBinaryLog;
- }
- }
-
- return ExposureMidpoints[_countof(ExposureMidpoints) - 1].exposureBinaryLog;
-}
-
-
-static
-ULONGLONG PotentialIsoSetting[] =
-{
- KSCAMERA_EXTENDEDPROP_ISO_50
- , KSCAMERA_EXTENDEDPROP_ISO_80
- , KSCAMERA_EXTENDEDPROP_ISO_100
- , KSCAMERA_EXTENDEDPROP_ISO_200
- , KSCAMERA_EXTENDEDPROP_ISO_400
- , KSCAMERA_EXTENDEDPROP_ISO_800
- , KSCAMERA_EXTENDEDPROP_ISO_1600
- , KSCAMERA_EXTENDEDPROP_ISO_3200
- , KSCAMERA_EXTENDEDPROP_ISO_6400
- , KSCAMERA_EXTENDEDPROP_ISO_12800
- , KSCAMERA_EXTENDEDPROP_ISO_25600
-};
-
-//
-// Convert ISO preset flags to a preset number
-//
-ULONG
-IsoPreset2Value(
- _In_ ULONGLONG Flags
-)
-{
- PAGED_CODE( );
-
- static
- ULONG IsoValue[] =
- {
- 50
- , 80
- , 100
- , 200
- , 400
- , 800
- , 1600
- , 3200
- , 6400
- , 12800
- , 25600
- };
-
- // Simple scan for min
- for( ULONG i=0; i<_countof(PotentialIsoSetting); i++ )
- {
- if( PotentialIsoSetting[i] & Flags )
- {
- return IsoValue[i];
- }
- }
- return MAXULONG;
-}
-
-//
-// Convert ISO Mode & Value to legacy presets.
-//
-// Note: This function will simply pass legacy presets through.
-//
-ULONGLONG
-IsoModeValue2Preset(
- _In_ ULONGLONG Mode,
- _In_ ULONG Value
-)
-{
- PAGED_CODE( );
-
- // These values are staggerred midpoints along a logrithmic scale.
- // Using these pre-calculated values simplifies our search to a
- // simple set of comparisons.
- static
- ULONG IsoValue[] =
- {
- 64 //50 //KSCAMERA_EXTENDEDPROP_ISO_50
- ,90 //, 80 //KSCAMERA_EXTENDEDPROP_ISO_80
- , 142 //, 100 //KSCAMERA_EXTENDEDPROP_ISO_100
- , 283 //, 200 //KSCAMERA_EXTENDEDPROP_ISO_200
- , 566 //, 400 //KSCAMERA_EXTENDEDPROP_ISO_400
- , 1132 //, 800 //KSCAMERA_EXTENDEDPROP_ISO_800
- , 2263 //, 1600 //KSCAMERA_EXTENDEDPROP_ISO_1600
- , 4526 //, 3200 //KSCAMERA_EXTENDEDPROP_ISO_3200
- , 9051 //, 6400 //KSCAMERA_EXTENDEDPROP_ISO_6400
- , 18102 //, 12800 //KSCAMERA_EXTENDEDPROP_ISO_12800
- };
-
- if( Mode & KSCAMERA_EXTENDEDPROP_ISO_MANUAL )
- {
- // Simple scan for min
- for( ULONG i=0; i<_countof(PotentialIsoSetting)-1; i++ )
- {
- if( Value < IsoValue[i] )
- {
- return PotentialIsoSetting[i];
- }
- }
- return KSCAMERA_EXTENDEDPROP_ISO_25600;
- }
- return Mode;
-}
-
-LPCSTR
-KSStateToStateName(
- _In_ KSSTATE state
-)
-{
- PAGED_CODE( );
-
- static const CHAR *txt[] =
- {
- "STOP",
- "ACQUIRE",
- "PAUSE",
- "RUN"
- };
-
- return ((KSSTATE_STOP <= state && KSSTATE_RUN >= state) ? txt[state] : "UNK");
-}
-
-// Debugging helper.
-PCSTR
-FocusStateDbgTxt(
- _In_ KSCAMERA_EXTENDEDPROP_FOCUSSTATE State
-)
-{
- PAGED_CODE();
-
- switch( State )
- {
- case KSCAMERA_EXTENDEDPROP_FOCUSSTATE_UNINITIALIZED:
- return "FOCUSSTATE_UNINITIALIZED";
- case KSCAMERA_EXTENDEDPROP_FOCUSSTATE_LOST:
- return "FOCUSSTATE_LOST";
- case KSCAMERA_EXTENDEDPROP_FOCUSSTATE_SEARCHING:
- return "FOCUSSTATE_SEARCHING";
- case KSCAMERA_EXTENDEDPROP_FOCUSSTATE_FOCUSED:
- return "FOCUSSTATE_FOCUSED";
- case KSCAMERA_EXTENDEDPROP_FOCUSSTATE_FAILED:
- return "FOCUSSTATE_FAILED";
- default:
- return "FOCUSSTATE_unknown";
- }
-}
-
-BOOL
-MultiplyCheckOverflow (
- ULONG a,
- ULONG b,
- ULONG *pab
-)
-
-/*++
-
-Routine Description:
-
- Perform a 32 bit unsigned multiplication and check for arithmetic overflow.
-
-Arguments:
-
- a -
- First operand
-
- b -
- Second operand
-
- pab -
- Result
-
-Return Value:
-
- TRUE -
- no overflow
-
- FALSE -
- overflow occurred
-
---*/
-
-{
- PAGED_CODE();
-
- *pab = a * b;
- if ((a == 0) || (((*pab) / a) == b))
- {
- return TRUE;
- }
- return FALSE;
-}
-
diff --git a/avscamera/sys/Util.h b/avscamera/sys/Util.h
deleted file mode 100644
index 34a3a568..00000000
--- a/avscamera/sys/Util.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2013, Microsoft Corporation.
-
- File:
-
- util.h
-
- Abstract:
-
- Contains miscellaneous helper functions such as random number
- generation and bounds checking functions.
-
- History:
-
- created 7/12/2013
-
-**************************************************************************/
-
-//
-// Generate a random number using the standard Crypto library.
-// Fall back to the QPC, if crypto library reports an error.
-//
-ULONG
-GetRandom(
- _In_ ULONG Minimum,
- _In_ ULONG Maximum
-);
-
-//
-// Generate a random number using the standard Crypto library.
-// Fall back to the QPC, if crypto library reports an error.
-//
-LONG
-GetRandom(
- _In_ LONG Minimum,
- _In_ LONG Maximum
-);
-
-//
-// Convert an EV Compensation flag into the denominator of a fraction.
-//
-LONG
-EVFlags2Denominator(
- _In_ ULONGLONG Flags
-);
-
-//
-// Convert a WhiteBalance Extended Property Enum to temperature
-//
-ULONG
-WhiteBalancePreset2Temperature(
- _In_ ULONG WBPreset
-);
-
-//
-// Checks if a legacy Exposure setting is in range
-//
-BOOL
-ExposureBinaryLogIsValid(
- _In_ LONG ExposureBL
-);
-
-//
-// Converts a legacy Exposure setting into 100 ns
-//
-LONGLONG
-ExposureBinaryLogTo100ns(
- _In_ LONG ExposureBL
-);
-
-//
-// Converts a Exposure setting into a Binary log preset
-//
-LONG
-Exposure100nsToBinaryLog(
- _In_ LONGLONG Exposure100ns
-);
-
-//
-// Convert ISO preset flags to a preset number
-//
-ULONG
-IsoPreset2Value(
- _In_ ULONGLONG Flags
-);
-
-//
-// Convert ISO Mode & Value to legacy presets.
-//
-// Note: This function will simply pass legacy presets through.
-//
-ULONGLONG
-IsoModeValue2Preset(
- _In_ ULONGLONG Mode,
- _In_ ULONG Value
-);
-
-LPCSTR
-KSStateToStateName(
- _In_ KSSTATE state
-);
-
-BOOL
-MultiplyCheckOverflow (
- ULONG a,
- ULONG b,
- ULONG *pab
-);
-
-// Note: I overload this function intentionally. Just use
-// the correct type as the first parameter and the
-// compiler figures out the function to use.
-template<class T>
-inline
-NTSTATUS
-BoundsCheck(
- _In_ T Value,
- _In_ const KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING &Bounds
-)
-{
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( ((Value - T(Bounds.Min) ) % T(Bounds.Step)) != 0 ||
- Value > T(Bounds.Max) ||
- Value < T(Bounds.Min) )
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-inline
-NTSTATUS
-BoundsCheckSigned(
- _In_ LONGLONG Value,
- _In_ const KSCAMERA_EXTENDEDPROP_VIDEOPROCSETTING &Bounds
-)
-{
- return BoundsCheck<LONGLONG>( Value, Bounds );
-}
-
-inline
-NTSTATUS
-BoundsCheckSigned(
- _In_ LONG Value,
- _In_ const KSPROPERTY_STEPPING_LONG &Bounds
-)
-{
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( ((Value - Bounds.Bounds.SignedMinimum) % Bounds.SteppingDelta) != 0 ||
- Value > Bounds.Bounds.SignedMaximum ||
- Value < Bounds.Bounds.SignedMinimum )
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-inline
-NTSTATUS
-BoundsCheckSigned(
- _In_ LONGLONG Value,
- _In_ const KSPROPERTY_STEPPING_LONGLONG &Bounds
-)
-{
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( ((Value - Bounds.Bounds.SignedMinimum) % Bounds.SteppingDelta) != 0 ||
- Value > Bounds.Bounds.SignedMaximum ||
- Value < Bounds.Bounds.SignedMinimum )
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Note: I overload this function intentionally. Just use
-// the correct type as the first parameter and the
-// compiler figures out the function to use.
-inline
-NTSTATUS
-BoundsCheckUnsigned(
- _In_ ULONG Value,
- _In_ const KSPROPERTY_STEPPING_LONG &Bounds
-)
-{
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( ((Value - Bounds.Bounds.UnsignedMinimum) % Bounds.SteppingDelta) != 0 ||
- Value > Bounds.Bounds.UnsignedMaximum ||
- Value < Bounds.Bounds.UnsignedMinimum )
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-inline
-NTSTATUS
-BoundsCheckUnsigned(
- _In_ ULONGLONG Value,
- _In_ const KSPROPERTY_STEPPING_LONGLONG &Bounds
-)
-{
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- if( ((Value - Bounds.Bounds.UnsignedMinimum) % Bounds.SteppingDelta) != 0 ||
- Value > Bounds.Bounds.UnsignedMaximum ||
- Value < Bounds.Bounds.UnsignedMinimum )
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-//
-// This function is used internally to translate KSCAMERA_PERFRAMESETTING
-// AUTO & MANUAL flags to KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG AUTO & MANUAL
-// flags. There is no need to translate them back.
-//
-inline
-ULONGLONG
-TranslatePFS2VideoProcFlags(
- ULONGLONG FromMode
-)
-{
- // The PFS settings and VideoProc flags are mixed.
- // To handle that, we'll first remove any PFS flags
- // and hang onto the rest.
- ULONGLONG ToMode=
- FromMode & ~(KSCAMERA_PERFRAMESETTING_AUTO|KSCAMERA_PERFRAMESETTING_MANUAL);
-
- if( FromMode & KSCAMERA_PERFRAMESETTING_AUTO )
- {
- ToMode |= KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO;
- }
- if( FromMode & KSCAMERA_PERFRAMESETTING_MANUAL )
- {
- ToMode |= KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- }
-
- return ToMode;
-}
-
-//
-// Debugging Helper
-//
-PCSTR
-FocusStateDbgTxt(
- _In_ KSCAMERA_EXTENDEDPROP_FOCUSSTATE State
-);
-
-#define SAFE_FREE(_x_) \
- if( _x_ ) \
- { \
- ExFreePool( _x_ ); \
- _x_ = nullptr; \
- }
-
-#define SAFE_DELETE(_x_) \
- if( _x_ ) \
- { \
- delete _x_; \
- _x_ = nullptr; \
- }
-
-#define SAFE_DELETE_ARRAY(_x_) \
- if( _x_ ) \
- { \
- delete [] _x_; \
- _x_ = nullptr; \
- }
-
-#define SAFE_CLOSE_HANDLE(_x_) \
- if( (_x_ != NULL) && (_x_ != INVALID_HANDLE_VALUE) ) \
- { \
- ZwClose( _x_ ); \
- _x_ = INVALID_HANDLE_VALUE; \
- }
-
diff --git a/avscamera/sys/VideoCapture.cpp b/avscamera/sys/VideoCapture.cpp
deleted file mode 100644
index 63d5c7de..00000000
--- a/avscamera/sys/VideoCapture.cpp
+++ /dev/null
@@ -1,2559 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- videocapture.cpp
-
- Abstract:
-
- Video Capture Pin implementation.
-
- Handles construction and defines pin data ranges.
-
- History:
-
- created 3/8/2001
-
-**************************************************************************/
-
-#include "Common.h"
-#include "ntintsafe.h"
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-
-CVideoCapturePin::CVideoCapturePin(IN PKSPIN Pin) :
- CCapturePin (Pin)
-{
- PAGED_CODE();
-
-}
-
-
-/*************************************************
-
-Routine Description:
-
- Create a new capture pin. This is the creation dispatch for
- the video capture pin.
-
-Arguments:
-
- Pin -
- The pin being created
-
- Irp -
- The creation Irp
-
-Return Value:
-
- Success / Failure
-
-**************************************************/
-
-NTSTATUS
-CVideoCapturePin::
-DispatchCreate(
- IN PKSPIN Pin,
- IN PIRP Irp
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("(Pin=%d)", Pin->Id);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- CCaptureFilter* pFilter = reinterpret_cast <CCaptureFilter*>(KsPinGetParentFilter(Pin)->Context);
- CVideoCapturePin *CapPin = new (NonPagedPoolNx) CVideoCapturePin (Pin);
-
- if( !CapPin )
- {
- // Fail if we couldn't create the pin.
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- else
- {
- Status =
- CapPin->Initialize();
- }
-
- if( NT_SUCCESS (Status) )
- {
- //
- // Adjust the stream header size. The video packets have extended
- // header info (KS_FRAME_INFO).
- //
- pFilter->setPin(CapPin, Pin->Id);
- }
- else
- {
- // Clean up.
- delete CapPin;
- }
-
- DBG_LEAVE("(Pin=%d)=0x%08X", Pin->Id, Status);
- return Status;
-}
-
-/**************************************************************************
-
- DISPATCH AND DESCRIPTOR LAYOUT
-
-**************************************************************************/
-
-//
-// FormatRGB24Bpp_Capture:
-//
-// This is the data range description of the RGB24 capture format we support.
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureQVGA =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- D_X *D_Y * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- D_X,D_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- D_X,D_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- D_X, D_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 30 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 3 * 30 * D_X *D_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- D_X *D_Y * 3 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- D_X, // LONG biWidth;
- D_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- D_X *D_Y * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 30 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 3 * 30 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 3 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-//
-// FormatYUY2_Capture:
-//
-// This is the data range description of the YUY2 format we support.
-//
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureQVGA =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- D_X *D_Y * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- D_X, D_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- D_X, D_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- D_X, D_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 30 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 2 * 30 * D_X * D_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- D_X *D_Y * 2 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- D_X, // LONG biWidth;
- D_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- D_X *D_Y * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 30 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 2 * 30 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 2 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X *DMAX_Y * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-//
-//60 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA_60fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 166833, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 60 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 3 * 60 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 3 * 8 * 60, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 166833, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA_60fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 166833, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 60 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 2 * 60 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 2 * 8 * 60, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 166833, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X *DMAX_Y * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-//
-//90 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA_90fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 111111, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 90 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 3 * 90 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 3 * 8 * 90, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 111111, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA_90fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 111111, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 90 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 2 * 90 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 2 * 8 * 90, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 111111, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X *DMAX_Y * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-//
-//120 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA_120fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 83333, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 120 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 3 * 120 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 3 * 8 * 120, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 83333, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA_120fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 83333, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 120 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 2 * 120 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 2 * 8 * 120, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 83333, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X *DMAX_Y * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureQVGA =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- D_X *D_Y * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- D_X,D_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- D_X,D_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- D_X, D_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 30, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 30 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 4 * 30 * D_X *D_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- D_X *D_Y * 4 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 30, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- D_X, // LONG biWidth;
- D_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- D_X *D_Y * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 30, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 30 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 4 * 30 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 4 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 30, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-//
-//60 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA_60fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 60, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 60 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 4 * 60 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 4 * 8 * 60, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 60, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-//
-//90 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA_90fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 90, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 90 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 4 * 90 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 4 * 8 * 90, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 90, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-//
-//120 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA_120fps =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X,DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X,DMAX_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X,DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X, DMAX_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 120,// MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 120 * DMAX_X * DMAX_Y, // MinBitsPerSecond;
- 8 * 4 * 120 * DMAX_X *DMAX_Y // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0,0,0,0, // RECT rcSource;
- 0,0,0,0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 4 * 8 * 120, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 120, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X *DMAX_Y * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-// Start of Overscan Dataranges. These are related to the above mediatypes, but take into account the increased sizes required.
-// For simulation purposes, we are assuming an additional 20 % on the Width and 20 % on the Height
-//
-// FormatRGB24Bpp_Capture:
-//
-// This is the data range description of the RGB24 capture format we support.
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureQVGAOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- D_X_OS *D_Y_OS * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- D_X_OS, D_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X_OS, D_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- D_X_OS, D_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X_OS, D_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- D_X_OS, D_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 30 * D_X_OS * D_Y_OS, // MinBitsPerSecond;
- 8 * 3 * 30 * D_X_OS *D_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- D_X_OS *D_Y_OS * 3 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- D_X_OS, // LONG biWidth;
- D_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- D_X_OS *D_Y_OS * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGAOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 30 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 3 * 30 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 3 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-//
-// FormatYUY2_Capture:
-//
-// This is the data range description of the YUY2 format we support.
-//
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureQVGAOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- D_X_OS *D_Y_OS * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- D_X_OS, D_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X_OS, D_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- D_X_OS, D_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X_OS, D_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- D_X_OS, D_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 30 * D_X_OS * D_Y_OS, // MinBitsPerSecond;
- 8 * 2 * 30 * D_X_OS * D_Y_OS, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- D_X_OS *D_Y_OS * 2 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- D_X_OS, // LONG biWidth;
- D_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- D_X_OS *D_Y_OS * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGAOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 30 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 2 * 30 * DMAX_X_OS * DMAX_Y_OS, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 2 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-//
-//60 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA_60fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 166833, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 60 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 3 * 60 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 3 * 8 * 60, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 166833, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA_60fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 166833, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 60 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 2 * 60 * DMAX_X_OS * DMAX_Y_OS, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 2 * 8 * 60, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 166833, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-//
-//90 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA_90fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 111111, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 90 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 3 * 90 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 3 * 8 * 90, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 111111, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA_90fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 111111, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 90 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 2 * 90 * DMAX_X_OS * DMAX_Y_OS, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 2 * 8 * 90, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 111111, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-//
-//120 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB24Bpp_CaptureVGA_120fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 3, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7d, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB24,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 83333, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 3 * 120 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 3 * 120 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 3 * 8 * 120, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 83333, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 24, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 3, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2_CaptureVGA_120fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 83333, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 120 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 2 * 120 * DMAX_X_OS * DMAX_Y_OS, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 2 * 8 * 120, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 83333, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureQVGAOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- D_X_OS *D_Y_OS * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- D_X_OS, D_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X_OS, D_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- D_X_OS, D_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X_OS, D_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- D_X_OS, D_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 30, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 30 * D_X_OS * D_Y_OS, // MinBitsPerSecond;
- 8 * 4 * 30 * D_X_OS *D_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- D_X_OS *D_Y_OS * 4 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 30, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- D_X_OS, // LONG biWidth;
- D_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- D_X_OS *D_Y_OS * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGAOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 30, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 30 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 4 * 30 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 4 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 30, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-
-//
-//60 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA_60fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 60, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 60 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 4 * 60 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 4 * 8 * 60, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 60, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-//
-//90 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA_90fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 90, // MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 90 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 4 * 90 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 4 * 8 * 90, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 90, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-//
-//120 fps capture
-//
-const
-KS_DATARANGE_VIDEO
-FormatRGB32Bpp_CaptureVGA_120fpsOverscan =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X_OS *DMAX_Y_OS * 4, // SampleSize
- 0, // Reserved
-
- STATICGUIDOF(KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0xe436eb7e, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20,
- 0xaf, 0x0b, 0xa7, 0x70, // aka. MEDIASUBTYPE_RGB32
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_VIDEOINFO), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X_OS, DMAX_Y_OS, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- DMAX_X_OS, DMAX_Y_OS, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X_OS, DMAX_Y_OS, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- DMAX_X_OS, DMAX_Y_OS, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X_OS, DMAX_Y_OS, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- ONESECOND / 120,// MinFrameInterval, 100 nS units
- ONESECOND, // MaxFrameInterval, 100 nS units
- 8 * 4 * 120 * DMAX_X_OS * DMAX_Y_OS, // MinBitsPerSecond;
- 8 * 4 * 120 * DMAX_X_OS *DMAX_Y_OS // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X_OS *DMAX_Y_OS * 4 * 8 * 120, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- ONESECOND / 120, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X_OS, // LONG biWidth;
- DMAX_Y_OS, // LONG biHeight;
- 1, // WORD biPlanes;
- 32, // WORD biBitCount;
- KS_BI_RGB, // DWORD biCompression;
- DMAX_X_OS *DMAX_Y_OS * 4, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-//
-// CapturePinDispatch:
-//
-// This is the dispatch table for the capture pin. It provides notifications
-// about creation, closure, processing, data formats, etc...
-//
-DEFINE_CAMERA_KSPIN_DISPATCH( VideoCapturePinDispatch, CVideoCapturePin );
-
-//
-// CapturePinAllocatorFraming:
-//
-// This is the simple framing structure for the capture pin. Note that this
-// will be modified via KsEdit when the actual capture format is determined.
-//
-DECLARE_SIMPLE_FRAMING_EX (
- VideoCapturePinAllocatorFraming,
- STATICGUIDOF (KSMEMORY_TYPE_KERNEL_NONPAGED),
- KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY |
- KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY,
- 2,
- 0,
- 2 * PAGE_SIZE,
- 2 * PAGE_SIZE
-);
-
-
-//
-// CapturePinDataRanges:
-//
-// This is the list of data ranges supported on the capture pin. We support
-// RGB24, YUY2, and RGB32
-//
-const
-PKSDATARANGE
-VideoCapturePinDataRanges [VIDEO_CAPTURE_PIN_DATA_RANGE_COUNT] =
-{
- (PKSDATARANGE) &FormatYUY2_CaptureQVGA,
- (PKSDATARANGE) &FormatYUY2_CaptureQVGAOverscan,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA,
- (PKSDATARANGE) &FormatYUY2_CaptureVGAOverscan,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureQVGA,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureQVGAOverscan,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGAOverscan,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_60fps,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_60fpsOverscan,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_60fps,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_60fpsOverscan,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_90fps,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_90fpsOverscan,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_90fps,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_90fpsOverscan,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_120fps,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_120fpsOverscan,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_120fps,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_120fpsOverscan,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGAOverscan,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_60fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_60fpsOverscan,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_90fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_90fpsOverscan,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_120fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_120fpsOverscan,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureQVGA,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureQVGAOverscan,
-};
-
-const
-PKSDATARANGE
-VideoPreviewPinDataRanges[VIDEO_PREVIEW_PIN_DATA_RANGE_COUNT] =
-{
- (PKSDATARANGE) &FormatYUY2_CaptureQVGA,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureQVGA,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_60fps,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_60fps,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_90fps,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_90fps,
- (PKSDATARANGE) &FormatYUY2_CaptureVGA_120fps,
- (PKSDATARANGE) &FormatRGB24Bpp_CaptureVGA_120fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_60fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_90fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureVGA_120fps,
- (PKSDATARANGE) &FormatRGB32Bpp_CaptureQVGA,
-}; \ No newline at end of file
diff --git a/avscamera/sys/VideoCapture.h b/avscamera/sys/VideoCapture.h
deleted file mode 100644
index da08b0a8..00000000
--- a/avscamera/sys/VideoCapture.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- videocapture.h
-
- Abstract:
-
- Video Capture Pin definition.
-
- CVideoCapturePin derived from CCapturePin.
-
- History:
-
- created 3/8/2001
-
-**************************************************************************/
-
-#pragma once
-
-#include "capture.h"
-
-class CVideoCapturePin : public CCapturePin
-{
-public:
- static NTSTATUS DispatchCreate (IN PKSPIN Pin, IN PIRP Irp);
-
-private:
- CVideoCapturePin(IN PKSPIN Pin);
-};
diff --git a/avscamera/sys/VideoHwSim.cpp b/avscamera/sys/VideoHwSim.cpp
deleted file mode 100644
index 33b6de90..00000000
--- a/avscamera/sys/VideoHwSim.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- VideoHwSim.cpp
-
- Abstract:
-
- A fake h/w simulation for the video pin. Provides Video pin specific
- metadata.
-
- History:
-
- created 5/28/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-
-CVideoHardwareSimulation::CVideoHardwareSimulation(
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
-)
- : CHardwareSimulation( Sensor, PinID )
-{}
-
-
-CVideoHardwareSimulation::~CVideoHardwareSimulation()
-{}
-
-//
-// Emit metadata here for video pin.
-//
-void
-CVideoHardwareSimulation::
-EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
-)
-{
- NT_ASSERT(pStreamHeader);
-
- // Add the normal frame info to the metadata
- // Note: This call ensures the KSSTREAM_METADATA_INFO is properly initialized.
- CHardwareSimulation::EmitMetadata( pStreamHeader );
-
- if (0 != (pStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_METADATA))
- {
- CExtendedVidProcSetting FaceDetect;
- m_Sensor->GetFaceDetection(&FaceDetect);
-
- if( FaceDetect.Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_VIDEO )
- {
- DBG_TRACE("VIDEO");
- EmitFaceMetadata(
- pStreamHeader,
- FaceDetect.GetULONG(),
- FaceDetect.Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_ADVANCED_MASK);
- }
- }
-}
-
diff --git a/avscamera/sys/VideoHwSim.h b/avscamera/sys/VideoHwSim.h
deleted file mode 100644
index 40b0b24b..00000000
--- a/avscamera/sys/VideoHwSim.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- VideoHwSim.h
-
- Abstract:
-
- A fake h/w simulation for the video pin. Provides Video pin specific
- metadata.
-
- History:
-
- created 5/28/2014
-
-**************************************************************************/
-
-#pragma once
-class CVideoHardwareSimulation :
- public CHardwareSimulation
-{
-public:
- CVideoHardwareSimulation(
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
- );
-
- virtual ~CVideoHardwareSimulation();
-
- //
- // Emit metadata here for video pin.
- //
- void
- EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
- );
-};
-
diff --git a/avscamera/sys/Waitable.cpp b/avscamera/sys/Waitable.cpp
deleted file mode 100644
index 1de5827a..00000000
--- a/avscamera/sys/Waitable.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- waitable.cpp
-
- Abstract:
-
- Base interface for any object that is waitable.
- In otherwords, it contains a kernel dispatch object.
-
- History:
-
- created 5/30/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-KWaitable::
-KWaitable()
-{}
-
-
-KWaitable::
-~KWaitable()
-{}
-
-NTSTATUS
-KWaitable::
-Wait(
- _In_opt_ PLARGE_INTEGER Timeout
-)
-/*++
-
-Routine Description:
-
- Default Wait implementation.
-
-Arguments:
-
- Timeout -
- An optional timeout value in 100ns units. Negative is relative time.
- If NULL, wait forever.
-
-Return Value:
-
- Success / Failure.
-
---*/
-{
- PVOID pObj = GetDispatchObject() ;
-
- if(pObj != NULL)
- {
- return
- KeWaitForSingleObject(
- pObj,
- Executive,
- KernelMode,
- FALSE,
- Timeout);
- }
- return STATUS_SUCCESS;
-}
diff --git a/avscamera/sys/Waitable.h b/avscamera/sys/Waitable.h
deleted file mode 100644
index 1f092657..00000000
--- a/avscamera/sys/Waitable.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- waitable.h
-
- Abstract:
-
- Base interface for any object that is waitable.
- In otherwords, it contains a kernel dispatch object.
-
- Also implements a Cancelable interface class.
-
- History:
-
- created 5/30/2014
-
-**************************************************************************/
-
-#pragma once
-
-//
-// Interface definitions for KWaitable and Cancelable
-//
-class KWaitable :
- public CNonCopyable
-{
-public:
- KWaitable();
-
- virtual
- ~KWaitable();
-
- virtual
- NTSTATUS
- Wait(
- _In_opt_ PLARGE_INTEGER Timeout = NULL
- );
-
- // Must implement
- virtual
- PVOID
- GetDispatchObject() = 0;
-};
-
-class Cancelable
-{
-public:
- // Must implement
- virtual
- BOOLEAN
- Cancel() = 0;
-};
-
diff --git a/avscamera/sys/WorkItem.cpp b/avscamera/sys/WorkItem.cpp
deleted file mode 100644
index 9bb0d795..00000000
--- a/avscamera/sys/WorkItem.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- workitem.cpp
-
- Abstract:
-
- This module contains an implementation for KWorkItem.
-
- A KWorkItem inherits from CRef and is reference counted. The object
- cannot be destroyed until all references are released. This includes
- the reference held when the workitem is in flight. This allows you
- to store the workitem in an object that has a lifecycle shorter than
- the parent device object.
-
- History:
-
- created 5/30/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-KWorkItem::
-KWorkItem(
- _In_ PDEVICE_OBJECT DeviceObj,
- _In_ PIO_WORKITEM_ROUTINE Callback,
- _In_ PVOID Context,
- _In_ WORK_QUEUE_TYPE QueueType
-)
- : m_Callback( Callback )
- , m_Context ( Context )
- , m_QueueType( QueueType )
-/*++
-
-Routine Description:
-
- Constructor.
-
- Sets up callback handler for the workitem and performs initialization.
-
-Arguments:
-
- None.
-
-Return Value:
-
- None.
-
---*/
-{
- m_WorkItem = IoAllocateWorkItem( DeviceObj );
-}
-
-
-KWorkItem::
-~KWorkItem()
-/*++
-
-Routine Description:
-
- Destructor.
-
- Blocks until all references are released, then frees the workitem.
-
-Arguments:
-
- None.
-
-Return Value:
-
- None.
-
---*/
-{
- // Make sure the work item has been run down.
- Wait();
-
- // Now delete it.
- if( m_WorkItem )
- {
- IoFreeWorkItem( m_WorkItem );
- }
-}
-
-BOOLEAN
-KWorkItem::
-Start()
-/*++
-
-Routine Description:
-
- Enqueue this workitem and acquires a reference on the object.
-
-Arguments:
-
- None.
-
-Return Value:
-
- TRUE - a workitem was scheduled.
-
---*/
-{
- // Make sure construction succeeded.
- if( m_WorkItem )
- {
- // Make sure the work item isn't already in flight and acquire the lock.
- // This is to make sure this KWorkItem doesn't get destroyed until
- // the callback is complete.
- if( Acquire() )
- {
- // Schedule the work item.
- IoQueueWorkItem( m_WorkItem, &KWorkItem::Handler, m_QueueType, this );
-
- // Note: Release() is called in Handler.
- return TRUE;
- }
- }
- return FALSE;
-}
-
-VOID
-KWorkItem::
-Handler(
- _In_ PDEVICE_OBJECT IoObject,
- _In_opt_ PVOID Context
-)
-/*++
-
-Routine Description:
-
- Callback thunking function.
-
- Calls the callback handler registered in the constructor, if one exists.
- Releases the reference on this object.
-
-Arguments:
-
- IoObject -
- The parent device object.
- Context -
- An optional context object.
-
-Return Value:
-
- void
-
---*/
-{
- // Get our "this" pointer (Me).
- KWorkItem *Me = (KWorkItem *) Context;
-
- // Invoke the callback if one exists.
- if( Me->m_Callback )
- {
- Me->m_Callback( IoObject, Me->m_Context );
- }
-
- // Unlock the work item; allow for destruction or re-enqueing.
- Me->Release();
-}
diff --git a/avscamera/sys/WorkItem.h b/avscamera/sys/WorkItem.h
deleted file mode 100644
index dfce3b91..00000000
--- a/avscamera/sys/WorkItem.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- workitem.h
-
- Abstract:
-
- This module contains a class wrapper definition for an IO_WORKITEM.
-
- A KWorkItem inherits from CRef and is reference counted. The object
- cannot be destroyed until all references are released. This includes
- the reference held when the workitem is in flight. This allows you
- to store the workitem in an object that has a lifecycle shorter than
- the parent device object.
-
- History:
-
- created 5/30/2014
-
-**************************************************************************/
-
-#pragma once
-class KWorkItem :
- public CRef // Reference counted...
-{
-private:
- PIO_WORKITEM m_WorkItem;
- PIO_WORKITEM_ROUTINE m_Callback;
- PVOID m_Context;
- WORK_QUEUE_TYPE m_QueueType;
-
-public:
- KWorkItem(
- _In_ PDEVICE_OBJECT DeviceObj,
- _In_ PIO_WORKITEM_ROUTINE Callback,
- _In_ PVOID Context=nullptr,
- _In_ WORK_QUEUE_TYPE QueueType=NormalWorkQueue
- );
-
- virtual
- ~KWorkItem();
-
- BOOLEAN
- IsValid()
- {
- return m_WorkItem != nullptr;
- }
-
- // Returns FALSE if failed to start.
- BOOLEAN
- Start();
-
-private:
- static
- IO_WORKITEM_ROUTINE
- Handler;
-};
-
diff --git a/avscamera/sys/XRGBSynthesizer.cpp b/avscamera/sys/XRGBSynthesizer.cpp
deleted file mode 100644
index 7e768648..00000000
--- a/avscamera/sys/XRGBSynthesizer.cpp
+++ /dev/null
@@ -1,246 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- XRGBSynthesizer.cpp
-
- Abstract:
-
- This file contains the implementation of CXRGBSynthesizer.
-
- CXRGBSynthesizer is derived from CSynthesizer. It uses the RGB
- color space and defines a Commit() function. XRGB is known also
- known as RGB32. It uses 8 bits per primary plus 8 bits of padding
- for 4 bytes per pixel in a single plane.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-// suppressed due to Esp:773
-#pragma warning (push)
-#pragma warning( disable:26015 ) // Suppress OACR error. Seems nonsensical. TODO: Must revisit.
-#pragma warning( disable:6101 )
-_Success_(return > 0)
-ULONG
-CXRGBSynthesizer::
-Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
-)
-/*++
-
-Routine Description:
-
- Copy (and reformat, if necessary) pixels from the internal scratch
- buffer. If the output format decimates chrominance, do it here.
-
-Arguments:
-
- Buffer -
- The output buffer to fill.
-
- Size -
- The size of the output buffer in bytes.
-
- Stride -
- The length of a row in bytes.
-
-Return Value:
-
- Number of bytes copied into Buffer.
-
---*/
-{
- PAGED_CODE();
-
- // In case stride isn't initialized.
- if( Stride==0 )
- {
- Stride = m_OutputStride;
- }
-
- if( !( Buffer &&
- m_Buffer &&
- Size >= sizeof(KS_RGBQUAD) &&
- m_Length >= sizeof(KS_RGBQUAD) &&
- (Stride%4)==0 &&
- (Size%4)==0
- ) )
- {
- NT_ASSERT(FALSE);
- return 0;
- }
-
- ULONG OutputStride = min( Stride, (ULONG) m_OutputStride );
- ULONG OutputSize = min( Size, m_Length );
- ULONG Limit = min( m_Height, OutputSize/Stride );
-
- // Is the row order in the bitmap inverted?
- if( m_FlipVertical )
- {
- PUCHAR Start = Buffer;
- for( ULONG y=Limit; y; y-- )
- {
- // Inverted row copy, with possible stride, width or height difference.
- RtlCopyMemory( Buffer, GetImageLocation( 0, y-1 ), OutputStride );
- Buffer += Stride;
- }
- return (ULONG) (Buffer - Start);
- }
- else
- {
- PUCHAR Start = Buffer;
-
- if( Limit * OutputStride == OutputSize )
- {
- // 1:1 copy case. (Path normally taken, so fastest.)
- RtlCopyMemory( Buffer, m_Buffer, OutputSize );
- return OutputSize;
- }
- else
- {
- for( ULONG y=0; y<Limit; y++ )
- {
- // Normal copy, with possible stride, width or height difference.
- RtlCopyMemory( Buffer, GetImageLocation( 0, y ), OutputStride );
- Buffer += Stride;
- }
- return (ULONG) (Buffer - Start);
- }
- }
-}
-// suppressed due to Esp:773
-#pragma warning (pop)
-
-const UCHAR4 *
-CXRGBSynthesizer::
-GetPalette()
-/*++
-
-Routine Description:
-
- Get a pointer to an array of palette colors. Used mostly to handle
- different color primaries. Location of the primary must agree with
- Commit().
-
-Arguments:
-
- none
-
-Return Value:
-
- A pointer to an array of color primaries used for rendering.
-
---*/
-{
- PAGED_CODE();
-
- static
- UCHAR4 Colors [MAX_COLOR] =
- {
- {0, 0, 0}, // BLACK
- {255, 255, 255}, // WHITE
- {0, 255, 255}, // YELLOW
- {255, 255, 0}, // CYAN
- {0, 255, 0}, // GREEN
- {255, 0, 255}, // MAGENTA
- {0, 0, 255}, // RED
- {255, 0, 0}, // BLUE
- {128, 128, 128} // GREY
- };
-
- return Colors;
-}
-
-// Macros used to do fixed-point arithmetic in initialization.
-#define TO_Q24_8bit_to_32bit(_x_) ( ( (ULONG) (_x_) ) << 24 )
-#define FROM_Q24_32bit_to_8bit(_x_) ((UCHAR) (( (ULONG) (_x_) ) >> 24 ))
-
-BOOLEAN
-CXRGBSynthesizer::
-Initialize()
-/*++
-
-Routine Description:
-
- Class initialization.
-
- Used to pre-initialize a bitmap that contains a gradient bar that starts
- with one of our rendering colors and fades to black. Each row will contain
- the gradient for a single starting color. To paint a gradient bar, simply
- replicate the row as many times as necessary.
-
- This front-loads all gradient calculations to initialization and caches the
- result, allowing us to render a gradient bar in the time it takes to copy
- the pixels even on a relatively slow machine.
-
-Arguments:
-
- none
-
-Return Value:
-
- TRUE - success.
-
---*/
-{
- PAGED_CODE();
-
- // First, do the base class initialization.
- BOOLEAN Status = CSynthesizer::Initialize();
-
- if( Status )
- {
- // Now initialize the Gradient bmp...
- CKsRgbQuad *Bmp = m_GradientBmp;
-
- for( ULONG color=BLACK; color<MAX_COLOR; color++ )
- {
- ULONG HALF = TO_Q24_8bit_to_32bit(1)>>1; // round, don't truncate.
- ULONG B = TO_Q24_8bit_to_32bit(m_Colors[color][0])+HALF;
- ULONG G = TO_Q24_8bit_to_32bit(m_Colors[color][1])+HALF;
- ULONG R = TO_Q24_8bit_to_32bit(m_Colors[color][2])+HALF;
- ULONG BDelta = B-TO_Q24_8bit_to_32bit(m_Colors[BLACK][0]);
- ULONG GDelta = G-TO_Q24_8bit_to_32bit(m_Colors[BLACK][1]);
- ULONG RDelta = R-TO_Q24_8bit_to_32bit(m_Colors[BLACK][2]);
-
- BDelta /= (ULONG) m_Width;
- GDelta /= (ULONG) m_Width;
- RDelta /= (ULONG) m_Width;
-
- for(ULONG i = 0; i < m_Width; i++)
- {
- *Bmp++ = CKsRgbQuad(
- FROM_Q24_32bit_to_8bit(R),
- FROM_Q24_32bit_to_8bit(G),
- FROM_Q24_32bit_to_8bit(B)
- );
- B -= BDelta;
- G -= GDelta;
- R -= RDelta;
- }
- }
- }
- return Status;
-}
diff --git a/avscamera/sys/XRGBSynthesizer.h b/avscamera/sys/XRGBSynthesizer.h
deleted file mode 100644
index 5e7ddd46..00000000
--- a/avscamera/sys/XRGBSynthesizer.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- XRGBSynthesizer.h
-
- Abstract:
-
- This file contains the definition of CXRGBSynthesizer.
-
- CXRGBSynthesizer is derived from CSynthesizer. It uses the RGB
- color space and defines a Commit() function. XRGB is known also
- known as RGB32. It uses 8 bits per primary plus 8 bits of padding
- for 4 bytes per pixel in a single plane.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-/*************************************************
-
- CXRGBSynthesizer
-
- Image synthesizer for XRGB (aka RGB32) format.
-
-*************************************************/
-
-class CXRGBSynthesizer
- : public CSynthesizer
-{
-protected:
- BOOLEAN m_FlipVertical;
-
-public:
- //
- // DEFAULT CONSTRUCTOR:
- //
- CXRGBSynthesizer (
- LONG Width=0,
- LONG Height=0
- ) :
- CSynthesizer("RGB32", CHANNEL_RGB, Width, ABS(Height))
- , m_FlipVertical(Height==ABS(Height))
- {
- m_OutputStride = Width * sizeof(KS_RGBQUAD);
- }
-
- //
- // DESTRUCTOR:
- //
- virtual
- ~CXRGBSynthesizer ()
- {}
-
- //
- // Commit
- //
- // Copy (and reformat, if necessary) pixels from the internal scratch
- // buffer. If the output format decimates chrominance, do it here.
- //
- virtual
- _Success_(return > 0)
- ULONG
- Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
- );
-
- //
- // Initialize()
- //
- // Initialize the Gradient bmp for RGB color space.
- //
- virtual
- BOOLEAN
- Initialize();
-
-protected:
- //
- // GetPalette
- //
- // Get a pointer to an array of palette colors. Used mostly to handle
- // different color primaries. Location of the primary must agree with
- // Commit().
- virtual
- const UCHAR4 *
- GetPalette();
-};
-
diff --git a/avscamera/sys/YUVSynthesizer.cpp b/avscamera/sys/YUVSynthesizer.cpp
deleted file mode 100644
index 41a942ee..00000000
--- a/avscamera/sys/YUVSynthesizer.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- YUVSynthesizer.cpp
-
- Abstract:
-
- This file contains the implementation of CYUVSynthesizer.
-
- A Base image synthesizer for all YUV formats. It provides a YUV color
- palette and sets up cached gradient bars.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-const UCHAR4 *
-CYUVSynthesizer::
-GetPalette()
-/*++
-
-Routine Description:
-
- Get a pointer to an array of palette colors. Used mostly to handle
- different color primaries. Location of the primary must agree with
- Commit().
-
-Arguments:
-
- none
-
-Return Value:
-
- A pointer to an array of color primaries used for rendering.
-
---*/
-{
- PAGED_CODE();
-
- static
- UCHAR4 Colors [MAX_COLOR] =
- {
- {128, 16, 128}, // BLACK
- {128, 235, 128}, // WHITE
- {16, 211, 146}, // YELLOW
- {166, 170, 16}, // CYAN
- {54, 145, 34}, // GREEN
- {202, 106, 222}, // MAGENTA
- {90, 81, 240}, // RED
- {240, 41, 109}, // BLUE
- {128, 125, 128}, // GREY
- };
-
- return Colors;
-};
-
-// Macros used to do fixed-point arithmetic in initialization.
-#define TO_Q24_8bit_to_32bit_signed(_x_) ( ( ( LONG) (_x_) ) << 24 )
-#define FROM_Q24_32bit_to_8bit_signed(_x_) (( CHAR) (( ( LONG) (_x_) ) >> 24 ))
-#define TO_Q24_8bit_to_32bit_unsigned(_x_) ( ( (ULONG) (_x_) ) << 24 )
-#define FROM_Q24_32bit_to_8bit_unsigned(_x_) ((UCHAR) (( (ULONG) (_x_) ) >> 24 ))
-
-BOOLEAN
-CYUVSynthesizer::
-Initialize()
-/*++
-
-Routine Description:
-
- Class initialization.
-
- Used to pre-initialize a bitmap that contains a gradient bar that starts
- with one of our rendering colors and fades to black. Each row will contain
- the gradient for a single starting color. To paint a gradient bar, simply
- replicate the row as many times as necessary.
-
- This front-loads all gradient calculations to initialization and caches the
- result, allowing us to render a gradient bar in the time it takes to copy
- the pixels even on a relatively slow machine.
-
-Arguments:
-
- none
-
-Return Value:
-
- TRUE - success.
-
---*/
-{
- PAGED_CODE();
-
- // First, do the base class initialization.
- BOOLEAN Status = CSynthesizer::Initialize();
-
- if( Status )
- {
- // Now initialize the Gradient bmp...
- CKsRgbQuad *Bmp = m_GradientBmp;
- // {54, 145, 34}, // GREEN to {128, 16, 128}, // BLACK
- for( ULONG color=BLACK; color<MAX_COLOR; color++ )
- {
- // Must treat chroma as signed & luma as unsigned here.
- ULONG HALF = TO_Q24_8bit_to_32bit_unsigned(1)>>1; // round, don't truncate.
- LONG U = TO_Q24_8bit_to_32bit_signed (m_Colors[color][0])+HALF;
- ULONG Y = TO_Q24_8bit_to_32bit_unsigned(m_Colors[color][1])+HALF;
- LONG V = TO_Q24_8bit_to_32bit_signed (m_Colors[color][2])+HALF;
- LONG UDelta = U-TO_Q24_8bit_to_32bit_signed (m_Colors[BLACK][0]);
- ULONG YDelta = Y-TO_Q24_8bit_to_32bit_unsigned(m_Colors[BLACK][1]);
- LONG VDelta = V-TO_Q24_8bit_to_32bit_signed (m_Colors[BLACK][2]);
-
- UDelta /= (LONG) m_Width;
- YDelta /= (LONG) m_Width;
- VDelta /= (LONG) m_Width;
-
- for(ULONG i = 0; i < m_Width; i++)
- {
- *Bmp++ = CKsRgbQuad(
- FROM_Q24_32bit_to_8bit_signed (V),
- FROM_Q24_32bit_to_8bit_unsigned(Y),
- FROM_Q24_32bit_to_8bit_signed (U)
- );
- U -= UDelta;
- Y -= YDelta;
- V -= VDelta;
- }
- }
- }
- return Status;
-}
diff --git a/avscamera/sys/YUVSynthesizer.h b/avscamera/sys/YUVSynthesizer.h
deleted file mode 100644
index 819139e4..00000000
--- a/avscamera/sys/YUVSynthesizer.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- YUVSynthesizer.h
-
- Abstract:
-
- This file contains the definition of CYUVSynthesizer.
-
- A Base image synthesizer for all YUV formats. It provides a YUV color
- palette and sets up cached gradient bars.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-#pragma once
-
-/*************************************************
-
- CYUVSynthesizer
-
- Image synthesizer for YUV format.
-
-*************************************************/
-
-
-class CYUVSynthesizer :
- public CSynthesizer
-{
-protected:
- //
- // GetPalette
- //
- // Get a pointer to an array of palette colors. Used mostly to handle
- // different color primaries. Location of the primary must agree with
- // Commit().
- virtual
- const UCHAR4 *
- GetPalette();
-
- //
- // Initialize()
- //
- // Initialize the Gradient bmp for YUV color space.
- //
- virtual
- BOOLEAN
- Initialize();
-
-public:
-
- //Default constructor
- CYUVSynthesizer (
- PCCHAR Name="[Something YUV]",
- ULONG Width=0,
- ULONG Height=0
- )
- : CSynthesizer(Name, CHANNEL_YCrCb, Width, Height)
- {}
-};
-
diff --git a/avscamera/sys/YUY2Synthesizer.cpp b/avscamera/sys/YUY2Synthesizer.cpp
deleted file mode 100644
index 14a76262..00000000
--- a/avscamera/sys/YUY2Synthesizer.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- YUVSynthesizer.cpp
-
- Abstract:
-
- This file contains the implementation of CYUY2Synthesizer.
-
- CYUY2Synthesizer is derived from CYUVSynthesizer. An image
- synthesizer for YUY2 format. It uses the YUV color space and defines
- a Commit() function.
-
- YUY2 is a 4:2:2 format that uses a single plane that decimates chroma
- samples on the x axis with an effective bit rate of 16 bits per pixel.
- A plane is an array of rows. Rows consist of pairs of pixels in the
- sequence: Y0|U|Y1|V.
-
- The synthesizer stores the YUV information in 32 bit format internally
- for speed and accuracy. The Commit function does the format conversion.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGED CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-// suppressed due to Esp:773
-#pragma warning (push)
-#pragma warning( disable:26015 ) // Suppress OACR error. Seems nonsensical. TODO: Must revisit.
-#pragma warning( disable:26019 )
-_Success_(return > 0)
-ULONG
-CYUY2Synthesizer::
-Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
-)
-/*++
-
-Routine Description:
-
- Copy (and reformat, if necessary) pixels from the internal scratch
- buffer. If the output format decimates chrominance, do it here.
-
-Arguments:
-
- Buffer -
- The output buffer to fill.
-
- Size -
- The size of the output buffer in bytes.
-
- Stride -
- The length of a row in bytes.
-
-Return Value:
-
- Number of bytes copied into Buffer.
-
---*/
-{
- PAGED_CODE();
-
- NT_ASSERT( Buffer );
- NT_ASSERT( m_Buffer );
- NT_ASSERT( Size >= Stride * m_Height );
- NT_ASSERT( (Stride&3)==0 );
- NT_ASSERT( (m_Width&1) == 0 );
- NT_ASSERT( (m_Height&1) == 0 );
- NT_ASSERT( m_Width>1 && m_Height>1 );
- NT_ASSERT( (Size&1)==0 );
-
- // In most cases, stride isn't initialized.
- // If so, just assume its the Width.
- if( Stride==0 )
- {
- Stride = m_OutputStride;
- }
-
- if( !( Buffer &&
- m_Buffer &&
- Size >= Stride * m_Height &&
- (Stride&3)==0 &&
- (m_Width&1) == 0 &&
- (m_Height&1) == 0 &&
- m_Width>1 && m_Height>1 &&
- (Size&1)==0
- ) )
- {
- // Wipe the destination before returning failure.
- return 0;
- }
-
- PKS_RGBQUAD pSrc = (PKS_RGBQUAD) m_Buffer;
- ULONG RowLimit = min( m_Height, Size / Stride );
- ULONG ColLimit = min( m_Width, Stride/sizeof(WORD) ) & ~0x1;
-
- for(ULONG row = 0; row < RowLimit; row++)
- {
- PDWORD pY = (PDWORD) &Buffer[ row * Stride ];
-
- for(ULONG col = 0; col < ColLimit; col+=2)
- {
- KS_RGBQUAD L = pSrc[col+0];
- KS_RGBQUAD R = pSrc[col+1];
-
- *pY++ =
- MAKELONG( MAKEWORD( L.rgbGreen, (ULONG(L.rgbBlue) + R.rgbBlue)/2),
- MAKEWORD( R.rgbGreen, (ULONG(L.rgbRed ) + R.rgbRed )/2) );
- }
- pSrc = (PKS_RGBQUAD) (((PUCHAR) pSrc) + m_SynthesisStride);
- }
-
- return RowLimit * Stride;
-}
-// suppressed due to Esp:773
-#pragma warning (pop)
diff --git a/avscamera/sys/YUY2Synthesizer.h b/avscamera/sys/YUY2Synthesizer.h
deleted file mode 100644
index a304fb43..00000000
--- a/avscamera/sys/YUY2Synthesizer.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2014, Microsoft Corporation.
-
- File:
-
- YUY2Synthesizer.h
-
- Abstract:
-
- This file contains the definition of CYUY2Synthesizer.
-
- CYUY2Synthesizer is derived from CYUVSynthesizer. An image
- synthesizer for YUY2 format. It uses the YUV color space and defines
- a Commit() function.
-
- YUY2 is a 4:2:2 format that uses a single plane that decimates chroma
- samples on the x axis with an effective bit rate of 16 bits per pixel.
- A plane is an array of rows. Rows consist of pairs of pixels in the
- sequence: Y0|U|Y1|V.
-
- The synthesizer stores the YUV information in 32 bit format internally
- for speed, accuracy and simplicity. The Commit function does the
- format conversion.
-
- History:
-
- created 4/14/2014
-
-**************************************************************************/
-
-class CYUY2Synthesizer : public CYUVSynthesizer
-{
-public:
- //
- // DEFAULT CONSTRUCTOR
- //
- CYUY2Synthesizer (
- ULONG Width=0,
- ULONG Height=0
- ) :
- CYUVSynthesizer("YUY2", Width, Height)
- {
- NT_ASSERT( ( Width % 2 ) == 0 );
- m_OutputStride = Width * sizeof(WORD);
- }
-
- //
- // Commit
- //
- // Copy (and reformat, if necessary) pixels from the internal scratch
- // buffer. If the output format decimates chrominance, do it here.
- //
- virtual
- _Success_(return > 0)
- ULONG
- Commit(
- _Out_writes_bytes_(Size)
- PUCHAR Buffer,
- _In_ ULONG Size,
- _In_ ULONG Stride
- );
-
-};
-
-
diff --git a/avscamera/sys/avscamera.inf b/avscamera/sys/avscamera.inf
deleted file mode 100644
index b5a29ce9..00000000
--- a/avscamera/sys/avscamera.inf
+++ /dev/null
Binary files differ
diff --git a/avscamera/sys/filter.cpp b/avscamera/sys/filter.cpp
deleted file mode 100644
index f55c3127..00000000
--- a/avscamera/sys/filter.cpp
+++ /dev/null
@@ -1,4039 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- filter.cpp
-
- Abstract:
-
- This file contains the filter level implementation for the base capture
- filter class. It provides a wrapper on KSFILTER.
-
- CCaptureFilter holds state information for the filter and contains
- implementations for standard camera controls. These implementations
- validate arguments and capabilities of the control according to DDI
- definitions. Once validated, control is passes to a CSensor object
- to manipulate the state of camera.
-
- To add a new control, derive from CCaptureFilter and use one of the
- DECLARE_PROPERTY_XXX() macros below to declare the property handlers.
- You can also use the DEFINE_PROP_ITEM_XXX() and DEFINE_STD_EVENT_ITEM()
- macros as aids in constructing a filter's automation table.
-
- History:
-
- created 3/12/2001
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-CCaptureFilter::CCaptureFilter (
- _In_ PKSFILTER Filter
-):
-/*++
-
-Routine Description:
-
- CCaptureFilter object construction.
-
-Arguments:
-
- Filter -
- The AVStream filter being wrapped.
-
-Return Value:
-
- None
-
---*/
- m_pCaptureDevice(NULL),
- m_pPerFrameSettings(nullptr),
- m_pinArray(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 ),
- m_FocusRectNotifier( Filter, &EVENTSETID_VIDCAP_CAMERACONTROL_REGION_OF_INTEREST, KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID ),
- m_IsoNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_ISO ),
- m_IsoAdvancedNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED ),
- m_EvCompensationNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION ),
- m_WhiteBalanceNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE ),
- m_ExposureNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE ),
- m_SceneModeNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE ),
- m_ThumbnailNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL ),
- m_WarmStartNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART ),
- m_RoiNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL ),
- m_ProfileNotifier( Filter, &KSEVENTSETID_ExtendedCameraControl, KSPROPERTY_CAMERACONTROL_EXTENDED_PROFILE )
-{
-
- PAGED_CODE();
-
- DBG_ENTER("(Filter=%p)", Filter);
-
- m_pKSFilter = Filter;
-
- m_pCaptureDevice = CCaptureDevice::Recast(KsFilterGetDevice(Filter));
-
- KeQuerySystemTime (&m_StartTime);
-
- m_Profile.ProfileId = KSCAMERAPROFILE_Legacy;
- m_Profile.Index = 0;
- m_Profile.Reserved = 0;
-
- DBG_ENTER("(Filter=%p)", Filter);
-}
-
-NTSTATUS
-CCaptureFilter::
-Initialize()
-/*++
-
-Routine Description:
-
- Post construction initialization.
-
-Arguments:
-
- [None]
-
-Return Value:
-
- Success / failure
-
---*/
-{
-
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- DBG_ENTER("(Filter=%S)", GetFilterName());
-
- // Get Sensor object from our parent device object.
-
- m_Sensor = m_pCaptureDevice->GetSensor(m_pKSFilter);
- NT_ASSERT(m_Sensor);
-
- // We get a nullptr back if the Filter doesn't match one of our's.
- if( !m_Sensor )
- {
- Status = STATUS_INVALID_PARAMETER;
- goto done;
- }
-
- // In reality we're just adding a reference to the sensor for this filter.
- // The sensor has no back pointer to the filter since more than one filter
- // can be open at a time.
- IFFAILED_EXIT( m_Sensor->AddFilter(m_pKSFilter) );
-
- IFNULL_EXIT(m_pinArray = new (PagedPool, 'sniP') CCapturePin *[m_Sensor->GetPinCount()]);
-
- for( ULONG i=0; i<m_Sensor->GetPinCount(); i++ )
- {
- m_pinArray[i] = nullptr;
- }
-
-done:
- DBG_LEAVE("(Filter=%S)=0x%08X", GetFilterName(), Status);
- return Status;
-}
-
-void
-CCaptureFilter::Cleanup()
-/*++
-
-Routine Description:
-
- Clean up. Cancels any outstanding operations on the sensor.
-
-Arguments:
-
- [None]
-
-Return Value:
-
- [None]
-
---*/
-{
- PAGED_CODE();
-
- // Cancel all Async operations. Ignore any failures.
- m_Sensor->CancelPhotoMode();
- m_Sensor->CancelPhotoMaxFrameRate();
- m_Sensor->CancelFocus();
- m_Sensor->CancelFocusRect();
- m_Sensor->CancelIso();
- m_Sensor->CancelIsoAdvanced();
- m_Sensor->CancelEvCompensation();
- m_Sensor->CancelWhiteBalance();
- m_Sensor->CancelExposure();
- m_Sensor->CancelSceneMode();
- m_Sensor->CancelThumbnail();
- m_Sensor->CancelWarmStart();
- m_Sensor->CancelRoi();
-}
-
-//
-// ~CCaptureFilter():
-//
-// The capture filter destructor.
-//
-CCaptureFilter::~CCaptureFilter()
-{
- PAGED_CODE();
-
- LPCWSTR Name = GetFilterName();
- DBG_ENTER("(%S)", Name);
-
- delete [] ((PBYTE) m_pPerFrameSettings);
-
- // In reality we're just removing a reference to the sensor for this filter.
- m_Sensor->RemoveFilter(m_pKSFilter);
-
- // The sensor may need to do some cleanup. In particular, the image pin
- // may need to have some things reset.
- m_Sensor->Reset();
-
- delete [] m_pinArray;
-
- DBG_LEAVE("(%S)", Name);
-}
-
-
-NTSTATUS
-CCaptureFilter::
-DispatchCreate (
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp
-)
-/*++
-
-Routine Description:
-
- Static function for creation dispatch for the capture filter. It creates
- the CCaptureFilter object.
-
-Arguments:
-
- Filter -
- The AVStream filter being created
-
- Irp -
- The creation Irp
-
-Return Value:
-
- Success / failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER("(Filter=0x%p)", Filter);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- CCaptureFilter *CapFilter = new (NonPagedPoolNx, 'rtlf') CCaptureFilter (Filter);
-
- if (!CapFilter)
- {
- //
- // Return failure if we couldn't create the filter.
- //
- Status = STATUS_INSUFFICIENT_RESOURCES;
-
- }
- else
- {
- // Allocate memory or whatever.
- Status = CapFilter->Initialize();
-
- if (!NT_SUCCESS (Status))
- {
- delete CapFilter;
- }
- else
- {
- Filter -> Context = reinterpret_cast <PVOID> (CapFilter);
- }
-
- }
-
- DBG_LEAVE( "()=0x%08X", Status );
- return Status;
-}
-
-NTSTATUS
-CCaptureFilter::DispatchClose(
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp
-)
-/*++
-
-Routine Description:
-
- Static function for the close dispatch for the capture filter. It handles
- filter cleanup.
-
-Arguments:
-
- Filter -
- The AVStream filter being closed
-
- Irp -
- The creation Irp
-
-Return Value:
-
- Success / failure
-
---*/
-{
- PAGED_CODE();
-
- CCaptureFilter *pFilter = reinterpret_cast <CCaptureFilter *>(Filter->Context);
-
- if( pFilter )
- {
- pFilter->Cleanup();
- delete pFilter;
- }
- return STATUS_SUCCESS;
-}
-
-void
-CCaptureFilter::
-setPin(
- _In_ CCapturePin *pPin,
- _In_ unsigned Id
-)
-/*++
-
-Routine Description:
-
- Attach a CCapturePin to the filter.
-
-Arguments:
-
- pPin -
- The pin.
- Id -
- The pin index.
-
-Return Value:
-
- Success / failure
-
---*/
-{
- PAGED_CODE( );
-
- if( Id >= m_Sensor->GetPinCount() )
- {
- __debugbreak();
- return;
- }
-
- // Take out a weak reference to the pin object.
- m_pinArray[Id] = pPin;
-}
-
-CCapturePin *
-CCaptureFilter::
-getPin(
- _In_ unsigned Id
-)
-/*++
-
-Routine Description:
-
- Get a pointer to an attached CCapturePin.
-
-Arguments:
-
- Id -
- The pin index.
-
-Return Value:
-
- Success / failure
-
---*/
-{
- PAGED_CODE( );
-
- if( Id >= m_Sensor->GetPinCount() )
- {
- __debugbreak();
- return nullptr;
- }
-
- // Convert back to a strong reference before returning.
- return m_pinArray[Id] ;
-}
-
-NTSTATUS
-CCaptureFilter::
-UpdateAllocatorFraming(
- _In_ ULONG PinId
-)
-/*++
-
-Routine Description:
-
- Update the Pin's Allocator Framing.
-
-Arguments:
-
- PinId -
- A pin's index
-
-Return Value:
-
- Success / failure
-
---*/
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- // Acquire the lock and update the Pin's allocator framing.
- LockFilter Lock(m_pKSFilter);
-
- if( m_pinArray[PinId] )
- {
- Status = m_pinArray[PinId]->UpdateAllocatorFraming();
- }
-
- DBG_LEAVE("()=0x%08X",Status);
- return Status;
-}
-
-/**************************************************************************
-
- Control validation and forwarding.
-
-**************************************************************************/
-
-// Get for KSPROPERTY_CAMERACONTROL_FLASH_PROPERTY_ID
-NTSTATUS
-CCaptureFilter::
-GetFlash(
- _Inout_ KSPROPERTY_CAMERACONTROL_FLASH_S *pFlash
-)
-{
- PAGED_CODE();
-
- return
- m_Sensor->GetFlash( pFlash );
-}
-
-// Set for KSPROPERTY_CAMERACONTROL_FLASH_PROPERTY_ID
-NTSTATUS
-CCaptureFilter::
-SetFlash(
- _In_ KSPROPERTY_CAMERACONTROL_FLASH_S *pFlash
-)
-{
- PAGED_CODE();
-
- KSPROPERTY_CAMERACONTROL_FLASH_S Caps;
-
- RtlZeroMemory( &Caps, sizeof(Caps) );
- NTSTATUS Status = m_Sensor->GetFlash(&Caps);
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- // Validate the parameters against our caps.
- switch( pFlash->Flash )
- {
- case KSPROPERTY_CAMERACONTROL_FLASH_OFF:
- case KSPROPERTY_CAMERACONTROL_FLASH_ON:
- if( Caps.Capabilities & KSPROPERTY_CAMERACONTROL_FLASH_FLAGS_MANUAL )
- {
- Status = STATUS_SUCCESS;
- }
- break;
-
- case KSPROPERTY_CAMERACONTROL_FLASH_AUTO:
- if( Caps.Capabilities & KSPROPERTY_CAMERACONTROL_FLASH_FLAGS_AUTO )
- {
- Status = STATUS_SUCCESS;
- }
- break;
- }
- }
- if( NT_SUCCESS(Status) )
- {
- Status = m_Sensor->SetFlash( pFlash );
- }
-
- return Status;
-}
-
-// Get for PROPSETID_VIDCAP_CAMERACONTROL_VIDEO_STABILIZATION:0
-NTSTATUS
-CCaptureFilter::
-GetVideoStabMode(
- _Inout_ KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S *pVideoStab
-)
-{
- PAGED_CODE();
-
- return
- m_Sensor->GetVideoStabMode( pVideoStab );
-}
-
-// Set for PROPSETID_VIDCAP_CAMERACONTROL_VIDEO_STABILIZATION:0
-NTSTATUS
-CCaptureFilter::
-SetVideoStabMode(
- _In_ KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S *pVideoStab
-)
-{
- PAGED_CODE();
-
- KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S Caps;
-
- RtlZeroMemory( &Caps, sizeof(Caps) );
- NTSTATUS Status = m_Sensor->GetVideoStabMode( &Caps );
-
- DBG_ENTER("(Mode=0x%08X, Caps=0x%08X)", pVideoStab->VideoStabilizationMode, Caps.Capabilities );
-
- if( NT_SUCCESS(Status) )
- {
- Status = STATUS_INVALID_PARAMETER;
- switch( pVideoStab->VideoStabilizationMode )
- {
- case KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_OFF:
- Status = STATUS_SUCCESS;
- break;
-
- case KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_AUTO:
- if( Caps.Capabilities & KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_FLAGS_AUTO )
- {
- Status = STATUS_SUCCESS;
- }
- break;
-
- case KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_LOW:
- case KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_MEDIUM:
- case KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_HIGH:
- if( Caps.Capabilities & KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_FLAGS_MANUAL )
- {
- Status = STATUS_SUCCESS;
- }
- break;
- }
- }
- if( NT_SUCCESS(Status) )
- {
- Status = m_Sensor->SetVideoStabMode( pVideoStab );
- }
- DBG_LEAVE("(Mode=0x%08X, Caps=0x%08X)=0x%08X", pVideoStab->VideoStabilizationMode, Caps.Capabilities, Status );
- return Status;
-}
-
-// Get for KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_PROPERTY_ID
-NTSTATUS
-CCaptureFilter::
-GetPinDependence(
- _Inout_ KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_S *pPinDependence
-)
-{
- PAGED_CODE();
-
- return
- m_Sensor->GetPinDependence( pPinDependence );
-}
-
-//
-// A macro used for consistent asynchronous SET behavior.
-//
-#define INVOKE_SET_ASYNC( SENSOR, PROPERTY, OUTPUT, NOTIFIER ) \
- ( OUTPUT->Flags & KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION ) ? SENSOR->Cancel ## PROPERTY () : \
- SENSOR->Set ## PROPERTY ## Async( OUTPUT, &NOTIFIER );
-
-#define INVOKE_SET_ASYNC_NOT_CANCELLABLE( SENSOR, PROPERTY, OUTPUT, NOTIFIER ) \
- ( OUTPUT->Flags & KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION ) ? STATUS_INVALID_PARAMETER : \
- SENSOR->Set ## PROPERTY ## Async( OUTPUT, &NOTIFIER );
-
-// Get for KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID
-NTSTATUS
-CCaptureFilter::GetFocusRect(
- _Inout_ KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S *pRoi
-)
-{
- PAGED_CODE();
- return m_Sensor->GetFocusRect( pRoi );
-}
-
-// Set for KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_PROPERTY_ID
-NTSTATUS
-CCaptureFilter::
-SetFocusRect(
- _In_ KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S *pRoi
-)
-{
- PAGED_CODE();
-
- return m_Sensor->SetFocusRectAsync( pRoi, &m_FocusRectNotifier );
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE
-NTSTATUS
-CCaptureFilter::GetPhotoMode(
- _Inout_ CExtendedPhotoMode *pMode
-)
-{
- PAGED_CODE();
-
- DBG_ENTER( "()" );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pMode->isValid() &&
- m_Sensor->IsStillIndex( pMode->PinId ) )
- {
- Status = m_Sensor->GetPhotoMode( pMode );
- }
-
- DBG_TRACE( "Capability=0x%016llX", pMode->Capability );
- DBG_TRACE( "PinId=%d", pMode->PinId );
- DBG_TRACE( "MaxHistoryFrames=%d", pMode->MaxHistoryFrames() );
-
- DBG_LEAVE( "()=0x%08X", Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE
-NTSTATUS
-CCaptureFilter::
-SetPhotoMode(
- _In_ CExtendedPhotoMode *pMode
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER( "()" );
-
- if( pMode->isValid() &&
- m_Sensor->IsStillIndex( pMode->PinId ) &&
- (pMode->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) )
- {
- CExtendedPhotoMode Caps(*pMode);
- Status = m_Sensor->GetPhotoMode( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter again.
- Status = STATUS_INVALID_PARAMETER;
-
- if( (pMode->Flags & Caps.Capability) == pMode->Flags )
- {
- // We don't support cancel here.
- switch( pMode->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE:
- {
- // We cache the Per-Frame Settings in the filter as a simplification for the getter.
- // But we can also use it here to tell us basic info about the current PFS.
- PKSCAMERA_PERFRAMESETTING_HEADER pPFS = m_pPerFrameSettings;
- if( pMode->SubMode() == KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE_SUB_VARIABLE &&
- !pPFS )
- {
- DBG_TRACE( "VPS requested without Per Frame Settings." );
- break;
- }
-
- // Reject any request for too many history frames.
- if( pMode->RequestedHistoryFrames() > Caps.MaxHistoryFrames() )
- {
- DBG_TRACE( "Too many history frames requested." );
- break;
- }
-
- DBG_TRACE( "Flags=0x%08X, RequestedHistoryFrames=%d, SubMode=0x%08X",
- (ULONG) pMode->Flags,
- pMode->RequestedHistoryFrames(),
- pMode->SubMode() );
-
- // 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 = max( (Caps.RequestedHistoryFrames() + 1), IMAGE_CAPTURE_PIN_MINIMUM_FRAMES );
-
- // Modify TotalFrames for the VPS case.
- // For VPS, we need LoopCount * FrameCount; but limit by the minimum(3) and maximum (20) frames.
- if( KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE_SUB_VARIABLE==pMode->SubMode() )
- {
- ULONG LoopCount = max( pPFS->LoopCount, 1 );
- ULONG FrameCount= pPFS->FrameCount;
-
- TotalFrames = max( IMAGE_CAPTURE_PIN_MINIMUM_FRAMES, Caps.RequestedHistoryFrames() + (LoopCount * FrameCount) );
- ASSERT( TotalFrames <= IMAGE_CAPTURE_PIN_MAXIMUM_FRAMES );
-
- DBG_TRACE( "TotalFrames=%d, LoopCount=%d, FrameCount=%d", TotalFrames, LoopCount, FrameCount );
- }
-
- TotalFrames = min( TotalFrames, IMAGE_CAPTURE_PIN_MAXIMUM_FRAMES );
- DBG_TRACE( "Advertising Framing requirement: %d", TotalFrames );
-
- Status = UpdateAllocatorFraming( pMode->PinId );
- break;
- }
- case KSCAMERA_EXTENDEDPROP_PHOTOMODE_NORMAL:
- {
- // Set it back to 4 frames.
- Status = UpdateAllocatorFraming( pMode->PinId );
- break;
- }
- }
-
- // Update the sensor object...
- if( NT_SUCCESS(Status) )
- {
- Status = m_Sensor->SetPhotoModeAsync( pMode, &m_PhotoModeNotifier );
- }
- }
- }
- }
-
- DBG_TRACE( "Capability=0x%016llX", pMode->Capability );
- DBG_TRACE( "Flags=0x%016llX", pMode->Flags );
- DBG_TRACE( "PinId=%d", pMode->PinId );
- DBG_TRACE( "MaxHistoryFrames=%d", pMode->MaxHistoryFrames() );
- DBG_TRACE( "RequestedHistoryFrames=%d", pMode->RequestedHistoryFrames() );
- DBG_TRACE( "SubMode=0x%08X", pMode->SubMode() );
- DBG_LEAVE( "()=0x%08X", Status );
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOFRAMERATE Get Handler
- */
-NTSTATUS
-CCaptureFilter::GetPhotoFrameRate(
- _Inout_ CExtendedProperty *pFrameRate
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFrameRate->isValid() &&
- m_Sensor->IsStillIndex(pFrameRate->PinId) )
- {
- ULONGLONG TimePerFrame = m_Sensor->GetPhotoFrameRate( );
- if( TimePerFrame > ULONG_MAX )
- {
- // Handle very large (slow) frame rates in seconds.
- pFrameRate->m_Value.Value.ratio.HighPart = 1;
- pFrameRate->m_Value.Value.ratio.LowPart = (ULONG) (TimePerFrame / ONESECOND);
- }
- else
- {
- // Handle smaller frame rates as 100ns units.
- pFrameRate->m_Value.Value.ratio.HighPart = ONESECOND;
- pFrameRate->m_Value.Value.ratio.LowPart = (ULONG) TimePerFrame;
- }
- Status = STATUS_SUCCESS;
- }
-
- DBG_LEAVE("(PinId=%d, estimated FrameRate=%d/%d)=0x%08X",
- pFrameRate->PinId,
- pFrameRate->m_Value.Value.ratio.HighPart,
- pFrameRate->m_Value.Value.ratio.LowPart,
- Status );
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_MAXVIDFPS_PHOTORES Get Handler
- */
-NTSTATUS
-CCaptureFilter::
-GetMaxVideoFpsForPhotoRes(
- _Inout_ CExtendedMaxVideoFpsForPhotoRes *pFps
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFps->isValid() &&
- pFps->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pFps->Capability == 0 &&
- pFps->Flags == 0 )
- {
- Status = m_Sensor->GetMaxVideoFpsForPhotoRes( pFps );
- }
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_MAXVIDFPS_PHOTORES Set Handler
- */
-NTSTATUS
-CCaptureFilter::SetMaxVideoFpsForPhotoRes(
- _In_ CExtendedMaxVideoFpsForPhotoRes *pFps
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFps->isValid() &&
- pFps->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pFps->Capability == 0 &&
- pFps->Flags == 0 )
- {
- Status = m_Sensor->SetMaxVideoFpsForPhotoRes( pFps );
- }
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE Get Handler
- */
-NTSTATUS
-CCaptureFilter::GetPhotoMaxFrameRate(
- _Inout_ CExtendedProperty *pFrameRate
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFrameRate->isValid() &&
- m_Sensor->IsStillIndex(pFrameRate->PinId) )
- {
- Status = m_Sensor->GetPhotoMaxFrameRate( pFrameRate );
- }
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMAXFRAMERATE Set Handler
- */
-NTSTATUS
-CCaptureFilter::
-SetPhotoMaxFrameRate(
- _In_ CExtendedProperty *pFrameRate
-)
-{
- PAGED_CODE();
-
- DBG_ENTER("(MaxFrameRate = %d/%d)",
- pFrameRate->m_Value.Value.ratio.HighPart,
- pFrameRate->m_Value.Value.ratio.LowPart );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFrameRate->isValid() &&
- m_Sensor->IsStillIndex( pFrameRate->PinId ) &&
- (pFrameRate->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) )
- {
- // Don't allow either the numerator or denominator alone to be 0.
- // We don't want a rate of 0 fps or undefined.
- if( pFrameRate->m_Value.Value.ll == 0 ||
- ( pFrameRate->m_Value.Value.ratio.LowPart != 0 &&
- pFrameRate->m_Value.Value.ratio.HighPart != 0 ) )
- {
- // Take what we're given here; SetPhotoFrameRate handles default setting.
- DBG_TRACE("[Override] MaxFrameRate = %d/%d",
- pFrameRate->m_Value.Value.ratio.HighPart,
- pFrameRate->m_Value.Value.ratio.LowPart );
-
- Status = m_Sensor->SetPhotoMaxFrameRateAsync( pFrameRate, &m_PhotoMaxFrameRateNotifier );
- }
- }
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTRIGGERTIME
-NTSTATUS
-CCaptureFilter::
-GetTriggerTime(
- _Inout_ CExtendedProperty *pTriggerTime
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pTriggerTime->isValid() &&
- m_Sensor->IsStillIndex(pTriggerTime->PinId) )
- {
- Status = m_Sensor->GetTriggerTime( pTriggerTime );
- }
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTRIGGERTIME
-NTSTATUS
-CCaptureFilter::
-SetTriggerTime(
- _In_ CExtendedProperty *pTriggerTime
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pTriggerTime->isValid() &&
- pTriggerTime->Capability == 0 &&
- m_Sensor->IsStillIndex(pTriggerTime->PinId) )
- {
- Status = m_Sensor->SetTriggerTime( pTriggerTime );
- }
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART
- */
-NTSTATUS
-CCaptureFilter::
-GetWarmStart(
- _Inout_ CExtendedProperty *pWarmStart
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pWarmStart->isValid() &&
- m_Sensor->IsValidIndex( pWarmStart->PinId ) )
- {
- Status = m_Sensor->GetWarmStart( pWarmStart );
- }
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pWarmStart->PinId, pWarmStart->Flags, pWarmStart->Capability, Status );
- return Status;
-}
-
-/*
- * KSPROPERTY_CAMERACONTROL_EXTENDED_WARMSTART Set Handler
- */
-NTSTATUS
-CCaptureFilter::SetWarmStart(
- _In_ CExtendedProperty *pWarmStart
-)
-{
- PAGED_CODE();
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)",
- pWarmStart->PinId, pWarmStart->Flags, pWarmStart->Capability );
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pWarmStart->isValid() &&
- m_Sensor->IsValidIndex( pWarmStart->PinId ) &&
- (pWarmStart->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) )
- {
- CExtendedProperty Caps(*pWarmStart);
- Status = m_Sensor->GetWarmStart( &Caps );
-
- if( NT_SUCCESS(Status ) )
- {
- if( pWarmStart->Flags == (pWarmStart->Flags & Caps.Capability) )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, WarmStart, pWarmStart, m_WarmStartNotifier );
- }
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
-
- DBG_LEAVE("()=0x%08X", Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL
-NTSTATUS
-CCaptureFilter::
-SetThumbnail(
- _In_ CExtendedProperty *pThumbnail
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- // Validate
- if( (pThumbnail->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pThumbnail->isValid() &&
- m_Sensor->IsStillIndex(pThumbnail->PinId) )
- {
- CExtendedProperty Caps;
- Status = m_Sensor->GetThumbnail( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- if( pThumbnail->Flags == (Caps.Capability & pThumbnail->Flags) )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, Thumbnail, pThumbnail, m_ThumbnailNotifier );
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL
-NTSTATUS
-CCaptureFilter::
-GetThumbnail(
- _Inout_ CExtendedProperty *pThumbnail
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- // Validate
- if( pThumbnail->isValid() &&
- m_Sensor->IsStillIndex(pThumbnail->PinId) )
- {
- Status = m_Sensor->GetThumbnail( pThumbnail );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE
-NTSTATUS
-CCaptureFilter::
-GetSceneMode(
- _Inout_ CExtendedProperty *pSceneMode
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pSceneMode->isValid() &&
- pSceneMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetSceneMode( pSceneMode );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE
-NTSTATUS
-CCaptureFilter::
-SetSceneMode(
- _In_ CExtendedProperty *pSceneMode
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- if( (pSceneMode->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pSceneMode->isValid() &&
- pSceneMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- CExtendedProperty Caps;
- Status = m_Sensor->GetSceneMode( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- if( pSceneMode->Flags == (Caps.Capability & pSceneMode->Flags) )
- {
- Status = INVOKE_SET_ASYNC_NOT_CANCELLABLE( m_Sensor, SceneMode, pSceneMode, m_SceneModeNotifier );
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE
-NTSTATUS
-CCaptureFilter::
-GetTorchMode(
- _Inout_ CExtendedProperty *pTorchMode
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pTorchMode->isValid() &&
- pTorchMode->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetTorchMode( pTorchMode );
- }
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pTorchMode->PinId, pTorchMode->Flags, pTorchMode->Capability, Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_TORCHMODE
-NTSTATUS
-CCaptureFilter::
-SetTorchMode(
- _In_ CExtendedProperty *pTorchMode
-)
-{
- PAGED_CODE();
-
- 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 )
- {
- CExtendedProperty Caps(*pTorchMode);
- Status = m_Sensor->GetTorchMode(&Caps);
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pTorchMode->Flags == (pTorchMode->Flags & Caps.Capability) )
- {
- switch( pTorchMode->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_VIDEOTORCH_OFF:
- case KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON:
- case KSCAMERA_EXTENDEDPROP_VIDEOTORCH_ON_ADJUSTABLEPOWER:
- 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 );
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE
-NTSTATUS
-CCaptureFilter::
-GetExtendedFlash(
- _Inout_ CExtendedProperty *pFlash
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFlash->isValid() &&
- pFlash->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE)
- {
- Status = m_Sensor->GetExtendedFlash( pFlash );
- }
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pFlash->PinId, pFlash->Flags, pFlash->Capability, Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE
-NTSTATUS
-CCaptureFilter::
-SetExtendedFlash(
- _In_ CExtendedProperty *pFlash
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( !(pFlash->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pFlash->isValid() &&
- pFlash->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE)
- {
- CExtendedProperty Caps;
- Status = m_Sensor->GetExtendedFlash( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pFlash->Flags == (pFlash->Flags & Caps.Capability) )
- {
- // Validate flash settings.
- // First validate the basic flash controls
- switch( pFlash->Flags & KSCAMERA_EXTENDEDPROP_FLASH_MODE_MASK )
- {
- // Valid combinations
- case KSCAMERA_EXTENDEDPROP_FLASH_OFF:
- case KSCAMERA_EXTENDEDPROP_FLASH_ON:
- case KSCAMERA_EXTENDEDPROP_FLASH_ON_ADJUSTABLEPOWER:
- case KSCAMERA_EXTENDEDPROP_FLASH_AUTO:
- case KSCAMERA_EXTENDEDPROP_FLASH_AUTO_ADJUSTABLEPOWER:
- Status = STATUS_SUCCESS;
- break;
- }
-
- // Validate red eye reduction, single flash & multiflash supported.
- if( !(pFlash->Flags &
- ( KSCAMERA_EXTENDEDPROP_FLASH_REDEYEREDUCTION |
- KSCAMERA_EXTENDEDPROP_FLASH_SINGLEFLASH |
- KSCAMERA_EXTENDEDPROP_FLASH_MULTIFLASHSUPPORTED )) ||
- (pFlash->Flags & KSCAMERA_EXTENDEDPROP_FLASH_MODE_MASK) != KSCAMERA_EXTENDEDPROP_FLASH_OFF )
- {
- Status = STATUS_SUCCESS;
- }
-
- // Validate Flash Assistant parameters
- switch( pFlash->Flags & KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_MASK )
- {
- // Valid combinations
- case KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_OFF:
- case KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_ON:
- case KSCAMERA_EXTENDEDPROP_FLASH_ASSISTANT_AUTO:
- Status = STATUS_SUCCESS;
- break;
- }
- }
- }
- }
-
- if( NT_SUCCESS(Status) )
- {
- Status = m_Sensor->SetExtendedFlash( pFlash );
- }
-
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pFlash->PinId, pFlash->Flags, pFlash->Capability, Status );
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_OPTIMIZATIONHINT
-NTSTATUS
-CCaptureFilter::
-GetOptimizationHint(
- _Inout_ CExtendedProperty *pHint
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pHint->isValid() &&
- !(pHint->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pHint->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetOptimizationHint(pHint);
- }
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pHint->PinId, pHint->Flags, pHint->Capability, Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_OPTIMIZATIONHINT
-NTSTATUS
-CCaptureFilter::
-SetOptimizationHint(
- _In_ CExtendedProperty *pHint
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pHint->isValid() &&
- !(pHint->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pHint->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- CExtendedProperty Caps(*pHint);
- Status = m_Sensor->GetOptimizationHint(&Caps);
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pHint->Flags == (pHint->Flags & Caps.Capability) )
- {
- // Inherit the previous primary use flag settings, if they were not set here.
- if( KSCAMERA_EXTENDEDPROP_OPTIMIZATION_DEFAULT == pHint->Flags ||
- 0 == (pHint->Flags & KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PRIMARYUSE_MASK) )
- {
- pHint->Flags |= (Caps.Flags & KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PRIMARYUSE_MASK);
- }
- else
- {
- // Inherit the previous perf flag settings, if they were not set here and if DEFAULT is not set.
- if( 0 == (pHint->Flags & KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PERF_MASK) )
- {
- pHint->Flags |= (Caps.Flags & KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PERF_MASK);
- }
- }
-
- // Make sure the requested flags are a valid capability combination.
- switch( pHint->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO:
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO | KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY:
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO | KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY:
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO | KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO:
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO | KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY:
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO | KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY:
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO | KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_PHOTO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_QUALITY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER :
- case KSCAMERA_EXTENDEDPROP_OPTIMIZATION_VIDEO |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_LATENCY |
- KSCAMERA_EXTENDEDPROP_OPTIMIZATION_POWER :
- Status = m_Sensor->SetOptimizationHint(pHint);
- break;
- }
- }
- }
- }
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pHint->PinId, pHint->Flags, pHint->Capability, Status );
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FIELDOFVIEW
-NTSTATUS
-CCaptureFilter::
-GetFieldOfView(
- _Inout_ CExtendedFieldOfView *pFieldOfView
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFieldOfView->isValid() &&
- pFieldOfView->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetFieldOfView(pFieldOfView);
- }
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_CAMERAANGLEOFFSET
-NTSTATUS
-CCaptureFilter::
-GetCameraAngleOffset(
- _Inout_ CExtendedCameraAngleOffset *pAngleOffset
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pAngleOffset->isValid() &&
- pAngleOffset->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetCameraAngleOffset(pAngleOffset);
- }
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA
-NTSTATUS
-CCaptureFilter::
-GetMetadata(
- _Inout_ CExtendedMetadata *pMetadata
-)
-{
- PAGED_CODE();
-
- if( pMetadata->PinId >= m_Sensor->GetPinCount() )
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- return m_Sensor->GetMetadata( pMetadata );
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA
-NTSTATUS
-CCaptureFilter::
-SetMetadata(
- _In_ CExtendedMetadata *pMetadata
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( !(pMetadata->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pMetadata->isValid() &&
- m_Sensor->IsValidIndex( pMetadata->PinId ) )
- {
- if( m_pinArray[pMetadata->PinId] &&
- m_pinArray[pMetadata->PinId]->GetState() == PinRunning )
- {
- Status = STATUS_INVALID_DEVICE_REQUEST;
- }
- else
- {
- Status = m_Sensor->SetMetadata( pMetadata );
- }
- }
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ISO
-NTSTATUS
-CCaptureFilter::
-GetIso(
- _Inout_ CExtendedProperty *pIso
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pIso->isValid() &&
- m_Sensor->IsStillIndex( pIso->PinId ) )
- {
- Status = m_Sensor->GetIso(pIso);
- }
-
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pIso->PinId, pIso->Flags, pIso->Capability, Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_ISO
-NTSTATUS
-CCaptureFilter::
-SetIso(
- _In_ CExtendedProperty *pIso
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("(Flags=0x%016llX)", pIso->Flags);
-
- if( (pIso->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pIso->isValid() &&
- m_Sensor->IsStillIndex( pIso->PinId ) )
- {
- CExtendedProperty Caps;
- Status = m_Sensor->GetIso( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pIso->Flags == (pIso->Flags & Caps.Capability) )
- {
- // Make sure only one preset was set.
- ULONGLONG presets = pIso->Flags &
- ( KSCAMERA_EXTENDEDPROP_ISO_AUTO |
- KSCAMERA_EXTENDEDPROP_ISO_50 | KSCAMERA_EXTENDEDPROP_ISO_80 |
- KSCAMERA_EXTENDEDPROP_ISO_100 | KSCAMERA_EXTENDEDPROP_ISO_200 |
- KSCAMERA_EXTENDEDPROP_ISO_400 | KSCAMERA_EXTENDEDPROP_ISO_800 |
- KSCAMERA_EXTENDEDPROP_ISO_1600 | KSCAMERA_EXTENDEDPROP_ISO_3200 |
- KSCAMERA_EXTENDEDPROP_ISO_6400 | KSCAMERA_EXTENDEDPROP_ISO_12800 |
- KSCAMERA_EXTENDEDPROP_ISO_25600 ) ;
-
- DBG_TRACE("presets=0x%016llX", presets);
-
- // Check to see if there is exactly one set.
- if( presets && ( (presets-1) & presets ) == 0 )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, Iso, pIso, m_IsoNotifier );
- }
- }
- }
- }
-
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pIso->PinId, pIso->Flags, pIso->Capability, Status );
-
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION
-NTSTATUS
-CCaptureFilter::
-GetEvCompensation(
- _Inout_ CExtendedEvCompensation *pEvComp
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pEvComp->isValid() &&
- pEvComp->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetEvCompensation( pEvComp );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_EVCOMPENSATION
-NTSTATUS
-CCaptureFilter::
-SetEvCompensation(
- _In_ CExtendedEvCompensation *pEvComp
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
- if( (pEvComp->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pEvComp->isValid() &&
- pEvComp->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- CExtendedEvCompensation Caps;
- Status = m_Sensor->GetEvCompensation( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( (pEvComp->Flags & Caps.Capability ) == pEvComp->Flags )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, EvCompensation, pEvComp, m_EvCompensationNotifier );
- }
- }
- }
-
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX)=0x%08X",
- pEvComp->PinId, pEvComp->Flags, pEvComp->Capability, Status );
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE
-NTSTATUS
-CCaptureFilter::
-GetWhiteBalance(
- _Inout_ CExtendedVidProcSetting *pWhiteBalance
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pWhiteBalance->isValid() &&
- pWhiteBalance->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetWhiteBalance( pWhiteBalance );
- }
-
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX, Mode=0x%08X, Val=0x%016llX)=0x%08X",
- pWhiteBalance->PinId, pWhiteBalance->Flags, pWhiteBalance->Capability,
- pWhiteBalance->Mode(), pWhiteBalance->GetLONGLONG(), Status );
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_WHITEBALANCEMODE
-NTSTATUS
-CCaptureFilter::
-SetWhiteBalance(
- _In_ CExtendedVidProcSetting *pWhiteBalance
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
- if( (pWhiteBalance->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pWhiteBalance->isValid() &&
- pWhiteBalance->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- CExtendedVidProcSetting Caps;
- Status = m_Sensor->GetWhiteBalance( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- if( (pWhiteBalance->Flags & Caps.Capability ) == pWhiteBalance->Flags )
- {
- switch( pWhiteBalance->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO:
- break;
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- pWhiteBalance->Flags = KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO | KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK;
- break;
-
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL:
- switch( pWhiteBalance->Mode() )
- {
- case KSCAMERA_EXTENDEDPROP_WHITEBALANCE_TEMPERATURE:
- Status = Caps.BoundsCheck( pWhiteBalance->GetLONGLONG() );
- break;
-
- case KSCAMERA_EXTENDEDPROP_WHITEBALANCE_PRESET:
- switch( pWhiteBalance->GetLONGLONG() )
- {
- case KSCAMERA_EXTENDEDPROP_WBPRESET_CLOUDY:
- case KSCAMERA_EXTENDEDPROP_WBPRESET_DAYLIGHT:
- case KSCAMERA_EXTENDEDPROP_WBPRESET_FLASH:
- case KSCAMERA_EXTENDEDPROP_WBPRESET_FLUORESCENT:
- case KSCAMERA_EXTENDEDPROP_WBPRESET_TUNGSTEN:
- case KSCAMERA_EXTENDEDPROP_WBPRESET_CANDLELIGHT:
- break;
-
- default:
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
- break;
-
- default:
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
- break;
-
- default:
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
-
- if( NT_SUCCESS(Status) )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, WhiteBalance, pWhiteBalance, m_WhiteBalanceNotifier );
- }
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- }
-
- DBG_LEAVE("(PinId=%d, Flags=0x%016llX, Cap=0x%016llX, Mode=0x%08X, Val=0x%016llX)=0x%08X",
- pWhiteBalance->PinId, pWhiteBalance->Flags, pWhiteBalance->Capability,
- pWhiteBalance->Mode(), pWhiteBalance->GetLONGLONG(), Status );
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE
-NTSTATUS
-CCaptureFilter::
-GetExposure(
- _Inout_ CExtendedVidProcSetting *pExposure
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pExposure->isValid() &&
- pExposure->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetExposure( pExposure );
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_EXPOSUREMODE
-NTSTATUS
-CCaptureFilter::
-SetExposure(
- _In_ CExtendedVidProcSetting *pExposure
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
- if( (pExposure->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pExposure->isValid() &&
- pExposure->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- CExtendedVidProcSetting Caps;
- Status = m_Sensor->GetExposure( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- if( (pExposure->Flags & Caps.Capability ) == pExposure->Flags )
- {
- if( pExposure->Flags == KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Status = Caps.BoundsCheck( pExposure->GetULONGLONG() );
- }
-
- if( NT_SUCCESS(Status) )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, Exposure, pExposure, m_ExposureNotifier );
- }
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE
-NTSTATUS
-CCaptureFilter::
-GetFocus(
- _Inout_ CExtendedVidProcSetting *pFocus
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pFocus->isValid() &&
- pFocus->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetFocus( pFocus );
- }
-
- DBG_LEAVE("(FocusMode=0x%016llX)=0x%08X", pFocus->Flags, Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE
-NTSTATUS
-CCaptureFilter::
-SetFocus(
- _In_ CExtendedVidProcSetting *pFocus
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
- ULONGLONG Flags = pFocus->Flags;
-
- DBG_ENTER("(Preset Flags=0x%016llX)", Flags);
-
- CExtendedVidProcSetting Caps(*pFocus);
-
- // This part is just setting validation.
- if( (pFocus->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pFocus->isValid() &&
- pFocus->Mode() == 0 &&
- pFocus->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetFocus( &Caps );
- }
-
- if( NT_SUCCESS(Status) )
- {
- // Make sure we have a valid combinations of Flags
- switch( Flags &
- (KSCAMERA_EXTENDEDPROP_FOCUS_MODE_MASK |
- KSCAMERA_EXTENDEDPROP_FOCUS_MODE_ADVANCED_MASK) )
- {
- // Auto-focus combinations:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- break;
-
- // Continuous-focus combinations:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- case KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUSLOCK |
- KSCAMERA_EXTENDEDPROP_FOCUS_REGIONBASED |
- KSCAMERA_EXTENDEDPROP_FOCUS_DRIVERFALLBACK_OFF:
- break;
-
- // Manual stands alone.
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL:
- Status = BoundsCheckSigned(
- pFocus->GetLONG(),
- Caps.m_Setting );
-
- if( !NT_SUCCESS(Status) )
- {
- DBG_TRACE( "ERROR: Focus request out of bounds. Value=%d", pFocus->GetLONG() );
- }
- break;
-
- // Unlock must stand alone.
- // Also note that by definition unlock is accepted regardless of our current state.
- case KSCAMERA_EXTENDEDPROP_FOCUS_UNLOCK:
- break;
-
- // Lock can stand alone.
- case KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK:
- // Make sure we are actually being asked during an auto or continuous.
- if( !(Caps.Flags &
- (KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO | KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS)) )
- {
- // This is an ambiguous case under the WinBlue DDI. However,
- // producing an error code here will cause a test failure.
- // Instead we will silently consume the error and just skip this
- // request.
- //
- // Actually the WinBlue WinRT layer interprets a "Manual Preset" as
- // a LOCK-only request when there is no value involved. That is kind
- // rediculous since the value is sent without considering the previous
- // mode. Instead, it thinks that just setting a LOCK-only mode is
- // synonymous with "Manual at the current position."
- //
- // Therefore, our interpretation will be, If we're in manual, we can
- // just silently consume the entire request and do nothing.
- if( Caps.Flags & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Status = STATUS_INVALID_LOCK_SEQUENCE;
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- break;
-
- // Anything else is just wrong.
- default:
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
- }
-
- // Validate focus ranges.
- if( NT_SUCCESS(Status) )
- {
- // If AUTO or CONTINUOUS is requested, we may support RANGE flags.
- if( (Flags &
- (KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO |
- KSCAMERA_EXTENDEDPROP_FOCUS_CONTINUOUS)) )
- {
- switch( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MASK )
- {
- case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MACRO:
- case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_NORMAL:
- case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_FULLRANGE:
- // Depreciated flags are not supported:
- //case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_INFINITY:
- //case KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_HYPERFOCAL:
- case 0:
- break;
-
- default:
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
- }
- // Otherwise no RANGE flags are permitted.
- else if( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_RANGE_MASK )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
-
- // Validate focus distances.
- if( NT_SUCCESS(Status) )
- {
- // If MANUAL is requested, we may support DISTANCE flags.
- if( Flags & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- switch( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_MASK )
- {
- case KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_INFINITY:
- case KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_HYPERFOCAL:
- case KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_NEAREST:
- case 0:
- break;
-
- default:
- Status = STATUS_INVALID_PARAMETER;
- break;
- }
- }
- // Otherwise no DISTANCE flags are permitted.
- else if( Flags & KSCAMERA_EXTENDEDPROP_FOCUS_DISTANCE_MASK )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
-
- if( NT_SUCCESS(Status) )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, Focus, pFocus, m_FocusNotifier );
- }
- // This is the failure case. In this case, we don't change state; but
- // if we were ASYNC, we need to signal the client that we completed.
- else
- {
- // Don't need to set the event if this was [erroneously] an sync request.
- if( pFocus->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL )
- {
- m_FocusNotifier.Set();
- }
-
- // Silently consume Lock after Manual requests:
- if( STATUS_INVALID_LOCK_SEQUENCE == Status )
- {
- Status = STATUS_SUCCESS;
- }
- }
- DBG_LEAVE("(Preset Flags=0x%016llX)=0x%08X", Flags, Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION
-NTSTATUS
-CCaptureFilter::
-GetPhotoConfirmation(
- _Inout_ CExtendedProperty *pConfirmation
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pConfirmation->isValid() &&
- pConfirmation->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetPhotoConfirmation( pConfirmation );
- }
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION
-NTSTATUS
-CCaptureFilter::
-SetPhotoConfirmation(
- _In_ CExtendedProperty *pConfirmation
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( !(pConfirmation->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- pConfirmation->isValid() &&
- pConfirmation->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- switch( pConfirmation->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_PHOTOCONFIRMATION_ON:
- case KSCAMERA_EXTENDEDPROP_PHOTOCONFIRMATION_OFF:
- Status = m_Sensor->SetPhotoConfirmation( pConfirmation );
- break;
- }
- }
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_CAPABILITY
-NTSTATUS
-CCaptureFilter::GetPFSCaps(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY 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->m_Sensor->GetPfsCaps( nullptr, &RequiredLength );
-
- // Note: We may want to determine capabilities at runtime in the future.
-
- // We only handle GETs
- if( NT_SUCCESS(Status) )
- {
- 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)
- {
- Status =
- pFilter->m_Sensor->GetPfsCaps(
- (KSCAMERA_PERFRAMESETTING_CAP_HEADER *) pData,
- &RequiredLength );
- pIrp->IoStatus.Information = RequiredLength;
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_SET
-NTSTATUS
-CCaptureFilter::GetPerFrameSettings(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
-)
-{
- PAGED_CODE();
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- 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 ulOutputSize =
- pFilter->m_pPerFrameSettings ? pFilter->m_pPerFrameSettings->Size : 0;
-
- // Only handle GETs
- if (ulOutputBufferLength == 0)
- {
- pIrp->IoStatus.Information = ulOutputSize;
- ntStatus = STATUS_BUFFER_OVERFLOW;
- }
- else if (ulOutputBufferLength < ulOutputSize)
- {
- ntStatus = STATUS_BUFFER_TOO_SMALL;
- }
- else if (pData && ulOutputBufferLength >= ulOutputSize)
- {
- // Return the cached copy.
- RtlCopyMemory( pData, pFilter->m_pPerFrameSettings, ulOutputSize );
- pIrp->IoStatus.Information = ulOutputSize;
- ntStatus = STATUS_SUCCESS;
- }
- else
- {
- ntStatus = STATUS_INVALID_PARAMETER;
- }
-
- return ntStatus;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_SET
-NTSTATUS
-CCaptureFilter::
-SetPerFrameSettings(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_SUCCESS;
-
- 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;
-
- // Only handle SETs
- if (ulOutputBufferLength == 0)
- {
- // This is pretty meaningless.
- // We can't really tell the caller the size of this buffer.
- pIrp->IoStatus.Information =
- sizeof(KSCAMERA_PERFRAMESETTING_HEADER) +
- sizeof(KSCAMERA_PERFRAMESETTING_FRAME_HEADER) +
- sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) ;
- Status = STATUS_BUFFER_OVERFLOW;
- }
- else if (ulOutputBufferLength < sizeof(KSCAMERA_PERFRAMESETTING_HEADER))
- {
- Status = STATUS_BUFFER_TOO_SMALL;
- }
- else
- {
- PKSCAMERA_PERFRAMESETTING_HEADER pPFS =
- (PKSCAMERA_PERFRAMESETTING_HEADER) pData ;
- ISP_FRAME_SETTINGS *pSettings = nullptr;
-
- // Parse, but don't save the PerFrameSettings
- Status = pFilter->ParsePFSBuffer( pPFS, ulOutputBufferLength, &pSettings );
-
- // Cache a copy of the unparsed PFS for the GET.
- // Pass the parsed settings down to the sensor.
- if( NT_SUCCESS(Status) )
- {
- delete [] ((PBYTE) pFilter->m_pPerFrameSettings);
- pFilter->m_pPerFrameSettings = (PKSCAMERA_PERFRAMESETTING_HEADER)
- new (PagedPool, '-SFP') BYTE [pPFS->Size];
-
- if( pFilter->m_pPerFrameSettings )
- {
- // Cache a copy of the settings for the GET.
- RtlCopyMemory( pFilter->m_pPerFrameSettings, pPFS, pPFS->Size );
-
- // Program the sensor with a copy of the parsed settings.
- // The sensor object should copy what it needs.
- pFilter->m_Sensor->SetPFS( pSettings, pPFS->FrameCount, pPFS->LoopCount );
- }
- else
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- }
-
- // Delete the settings buffer ParsePFSBuffer created.
- delete [] pSettings;
- }
-
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_PERFRAMESETTING_CLEAR
-NTSTATUS
-CCaptureFilter::ClearPerFrameSettings(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
-)
-{
- PAGED_CODE();
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- NT_ASSERT(pIrp);
- NT_ASSERT(pProperty);
-
- CCaptureFilter *pFilter = reinterpret_cast <CCaptureFilter *>(KsGetFilterFromIrp(pIrp)->Context);
-
- // Only handle SETs
- delete [] ((PBYTE) pFilter->m_pPerFrameSettings);
- pFilter->m_pPerFrameSettings = nullptr;
- pFilter->m_Sensor->SetPFS( nullptr, 0, 0 );
-
- return ntStatus;
-}
-
-PKSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER
-Find(
- _In_ PKSCAMERA_PERFRAMESETTING_CAP_HEADER Caps,
- _In_ ULONG Type
-)
-/*++
-
-Routine Description:
-
- Helper function that finds a specific PFS capability.
-
-Arguments:
-
- Caps -
- A list of PFS capabilities.
- Type -
- The capability type to search for.
-
-Return Value:
-
- A pointer to the capability item header.
-
---*/
-{
- PAGED_CODE();
-
- if( Caps )
- {
- PKSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER Item =
- (PKSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER) (Caps+1);
-
- for( ULONG i=0; i<Caps->ItemCount; i++ )
- {
- if( Item->Type == Type )
- {
- return Item;
- }
- Item = (PKSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER) (((PBYTE) Item) + Item->Size);
- }
- }
- return nullptr;
-}
-
-// This function can be used to validate PerFrameSettings, or
-// it can be used to populate a buffer containing PFS settings.
-_Success_(return == 0)
-NTSTATUS
-CCaptureFilter::
-ParsePFSBuffer(
- _In_reads_bytes_(BufferLimit)
- PKSCAMERA_PERFRAMESETTING_HEADER pPFS,
- _In_ ULONG BufferLimit,
- _Outptr_opt_result_maybenull_
- ISP_FRAME_SETTINGS **ppSettings
-)
-/*++
-
-Routine Description:
-
- Helper function that parses Per-Frame Settings.
-
- This function validates the API's PerFrameSettings list and optionally
- returns an array of ISP_FRAME_SETTINGS for each frame.
-
- Any returned array of ISP_FRAME_SETTINGS must be deleted by the caller.
-
-Arguments:
-
- pPFS -
- A variable length list of per frame settings.
- BufferLimit -
- The maximum amount of space, in bytes, used by the PFS list.
- ppSettings -
- An optional pointer to an array of frame settings to be populated.
-
-Return Value:
-
- Success / failure
-
---*/
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_SUCCESS;
-
- DBG_ENTER("[%S]()", GetFilterName());
-
- NT_ASSERT(pPFS);
- NT_ASSERT(BufferLimit!=0);
-
- if( !pPFS ||
- BufferLimit == 0 ||
- pPFS->Size > BufferLimit ||
- pPFS->Size < sizeof(KSCAMERA_PERFRAMESETTING_HEADER) ||
- pPFS->FrameCount > MAX_FRAME_COUNT ||
- pPFS->FrameCount == 0 )
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- ULONG i=0 ;
- ISP_FRAME_SETTINGS *pSettings = nullptr;
- LPVOID pEnd = ((LPBYTE) pPFS) + BufferLimit ;
- PKSCAMERA_PERFRAMESETTING_FRAME_HEADER pFrame =
- (PKSCAMERA_PERFRAMESETTING_FRAME_HEADER) &pPFS[1];
-
- // Make sure we have at least one frame in the array.
- ULONG FrameCount = pPFS->FrameCount ? pPFS->FrameCount : 1 ;
-
- // Query the PFS Caps from the Sensor
- PKSCAMERA_PERFRAMESETTING_CAP_HEADER Caps = nullptr;
- ULONG RequiredSize = 0;
- Status = m_Sensor->GetPfsCaps( nullptr, &RequiredSize );
-
- if( NT_SUCCESS(Status) )
- {
- Caps = (PKSCAMERA_PERFRAMESETTING_CAP_HEADER) new (PagedPool, '-SFP') BYTE[RequiredSize];
-
- if( Caps )
- {
- RtlZeroMemory( Caps, RequiredSize );
- Status = m_Sensor->GetPfsCaps( Caps, &RequiredSize );
- }
- else
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- }
-
- if( NT_SUCCESS(Status) )
- {
- // Allocate an array
- pSettings = new (NonPagedPoolNx, '-SFP') ISP_FRAME_SETTINGS[FrameCount];
- if( !pSettings )
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- else
- {
- // Initialize the array to our globals
- pSettings[0] = *m_Sensor->GetGlobalIspSettings();
- for( i=1; i<FrameCount; i++ )
- {
- pSettings[i] = pSettings[0];
- }
-
- while( ((pFrame+1)<=pEnd) )
- {
- PKSCAMERA_PERFRAMESETTING_FRAME_HEADER pNextFrame =
- (PKSCAMERA_PERFRAMESETTING_FRAME_HEADER)
- (((LPBYTE)pFrame) + pFrame->Size);
- PKSCAMERA_PERFRAMESETTING_ITEM_HEADER pItem =
- (PKSCAMERA_PERFRAMESETTING_ITEM_HEADER) &pFrame[1];
-
- // Verify that the frame is within the buffer.
- if( pFrame->Id >= pPFS->FrameCount ||
- pNextFrame > pEnd ||
- pFrame->Size < sizeof(KSCAMERA_PERFRAMESETTING_FRAME_HEADER) )
- {
- DBG_TRACE( "Malformed PFS Buffer. pPFS=%p pFrame=%p",
- pPFS, pFrame );
-
- Status=STATUS_INVALID_PARAMETER;
- break;
- }
-
- DBG_TRACE("Frame Id=%d",pFrame->Id);
-
- ISP_FRAME_SETTINGS &FrameSetting = pSettings[pFrame->Id] ;
-
- // Scan for at most n Items regardless.
- for( i=0;
- i < pFrame->ItemCount &&
- (pItem+1) <= (PVOID)pNextFrame;
- i++ )
- {
- PKSCAMERA_PERFRAMESETTING_ITEM_HEADER pNextItem =
- (PKSCAMERA_PERFRAMESETTING_ITEM_HEADER)
- (((LPBYTE)pItem) + pItem->Size);
-
- PKSCAMERA_PERFRAMESETTING_CAP_ITEM_HEADER ItemCap =
- Find( Caps, pItem->Type );
-
- // Verify that the item is within the frame ...
- // ... and a supported capability.
- if( pNextItem>(LPVOID)pNextFrame ||
- pItem->Size<sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) ||
- !ItemCap )
- {
- Status=STATUS_INVALID_PARAMETER;
- break;
- }
-
- switch( pItem->Type )
- {
- case KSCAMERA_PERFRAMESETTING_ITEM_EXPOSURE_TIME:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_EXPOSURE_TIME");
-
- FrameSetting.ExposureMode =
- TranslatePFS2VideoProcFlags( pItem->Flags );
-
- if( pItem->Flags & KSCAMERA_PERFRAMESETTING_MANUAL )
- {
- if( pItem->Size==
- sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER)+
- sizeof(KSCAMERA_EXTENDEDPROP_VALUE) )
- {
- FrameSetting.ExposureSetting.VideoProc.Value =
- ((PKSCAMERA_EXTENDEDPROP_VALUE) &(pItem[1]))->Value;
- // Make sure the setting is in range.
- Status =
- BoundsCheckSigned(
- FrameSetting.ExposureSetting.VideoProc.Value.ll,
- ((SOC_CAP_WITH_STEPPING_LONGLONG *) ItemCap)->Stepping );
- DBG_TRACE("Status=0x%08X, ExposureMode=KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL, ExposureTime=%lldns, element=%d",
- Status, FrameSetting.ExposureSetting.VideoProc.Value.ll, i);
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- DBG_TRACE("Status=STATUS_INVALID_PARAMETER");
- }
- }
- else if( pItem->Size!=sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) )
- {
- Status=STATUS_INVALID_PARAMETER;
- DBG_TRACE("Status=STATUS_INVALID_PARAMETER");
- }
- break;
-
- case KSCAMERA_PERFRAMESETTING_ITEM_FLASH:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_FLASH");
- FrameSetting.FlashMode = pItem->Flags;
- if( pItem->Flags &
- (KSCAMERA_EXTENDEDPROP_FLASH_ON_ADJUSTABLEPOWER |
- KSCAMERA_EXTENDEDPROP_FLASH_AUTO_ADJUSTABLEPOWER) )
- {
- if( pItem->Size==
- sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER)+
- sizeof(KSCAMERA_EXTENDEDPROP_VALUE) )
- {
- FrameSetting.FlashValue =
- ((PKSCAMERA_EXTENDEDPROP_VALUE) &(pItem[1]))->Value.ul;
-
- // Make sure the setting is in range.
- if( FrameSetting.FlashValue > 100 )
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- else
- {
- DBG_TRACE("FlashPower (%d%) accepted...", FrameSetting.FlashValue);
- }
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- }
- else if( pItem->Size!=sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) )
- {
- Status=STATUS_INVALID_PARAMETER;
- }
-
- if( NT_SUCCESS(Status) )
- {
- DBG_TRACE("FlashMode=0x%016llX, FlashPower=%d", FrameSetting.FlashMode, FrameSetting.FlashValue);
- }
- break;
-
- case KSCAMERA_PERFRAMESETTING_ITEM_EXPOSURE_COMPENSATION:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_EXPOSURE_COMPENSATION");
- {
- LONG Denominator = EVFlags2Denominator( pItem->Flags );
- KSPROPERTY_STEPPING_LONG
- Bounds = ((SOC_CAP_WITH_STEPPING *) ItemCap)->Stepping;
-
- // Adjust the bounds for the step size... (A quirk of EV)
- Bounds.Bounds.SignedMinimum *= Denominator;
- Bounds.Bounds.SignedMaximum *= Denominator;
-
- FrameSetting.EVCompensation.Mode = (ULONG)
- pItem->Flags & ~(KSCAMERA_PERFRAMESETTING_AUTO);
-
- // Validate manual setting
- if( (pItem->Flags != KSCAMERA_PERFRAMESETTING_AUTO) )
- {
- if( pItem->Size==
- sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER)+
- sizeof(KSCAMERA_EXTENDEDPROP_VALUE) &&
- (Denominator != 0) )
- {
- FrameSetting.EVCompensation.Value =
- ((PKSCAMERA_EXTENDEDPROP_VALUE) &(pItem[1]))->Value.l;
-
- // Make sure the setting is in range.
- Status =
- BoundsCheckSigned(
- FrameSetting.EVCompensation.Value,
- Bounds );
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- }
- // Auto can be the only flag, if auto is enabled.
- else //if( pItem->Flags == KSCAMERA_PERFRAMESETTING_AUTO )
- {
- if( pItem->Size==sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) )
- {
- static
- ULONG step[] =
- {
- 0,
- KSCAMERA_EXTENDEDPROP_EVCOMP_FULLSTEP, //1
- KSCAMERA_EXTENDEDPROP_EVCOMP_HALFSTEP, //2
- KSCAMERA_EXTENDEDPROP_EVCOMP_THIRDSTEP, //3
- KSCAMERA_EXTENDEDPROP_EVCOMP_QUARTERSTEP, //4
- 0, //5
- KSCAMERA_EXTENDEDPROP_EVCOMP_SIXTHSTEP //6
- };
-
- // Work back from the randomly selected denominator ...
- /// ... to the step flag.
- FrameSetting.EVCompensation.Mode = step[Denominator];
-
- // Now pick a "random" numerator that is in range.
- FrameSetting.EVCompensation.Value = (LONG)
- GetRandom( Bounds.Bounds.SignedMinimum,
- Bounds.Bounds.SignedMaximum );
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- }
- }
- break;
-
- case KSCAMERA_PERFRAMESETTING_ITEM_ISO:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_ISO: Flags=0x%016llX", pItem->Flags);
-
- FrameSetting.ISOMode = pItem->Flags;
- // Handle Auto.
- if( pItem->Flags == KSCAMERA_EXTENDEDPROP_ISO_AUTO )
- {
- if( pItem->Size==sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) )
- {
- FrameSetting.ISOValue = 0;
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- }
- // Handle manual settings.
- else if( pItem->Flags == KSCAMERA_EXTENDEDPROP_ISO_MANUAL )
- {
- if( pItem->Size==
- sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER)+
- sizeof(KSCAMERA_EXTENDEDPROP_VALUE) )
- {
- FrameSetting.ISOValue =
- ((PKSCAMERA_EXTENDEDPROP_VALUE) &(pItem[1]))->Value.ul;
- // Make sure the setting is in range.
- Status =
- BoundsCheckUnsigned(
- FrameSetting.ISOValue,
- ((SOC_CAP_WITH_STEPPING *)ItemCap)->Stepping );
-
- DBG_TRACE("ISOValue=%d", FrameSetting.ISOValue);
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- break;
-
- case KSCAMERA_PERFRAMESETTING_ITEM_FOCUS:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_FOCUS");
- if( pItem->Flags == KSCAMERA_PERFRAMESETTING_MANUAL )
- {
- if( pItem->Size==
- sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER)+
- sizeof(KSCAMERA_EXTENDEDPROP_VALUE) )
- {
- FrameSetting.FocusMode =
- KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL;
- FrameSetting.FocusSetting.VideoProc =
- *((PKSCAMERA_EXTENDEDPROP_VALUE) &(pItem[1]));
- // Make sure the setting is in range.
- Status =
- BoundsCheckUnsigned(
- FrameSetting.FocusSetting.VideoProc.Value.ul,
- ((SOC_CAP_WITH_STEPPING *)ItemCap)->Stepping );
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- }
- else
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- break;
-
- case KSCAMERA_PERFRAMESETTING_ITEM_PHOTOCONFIRMATION:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_PHOTOCONFIRMATION");
-
- if( pItem->Size!=sizeof(KSCAMERA_PERFRAMESETTING_ITEM_HEADER) )
- {
- Status=STATUS_INVALID_PARAMETER;
- }
- else
- {
- switch( pItem->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_PHOTOCONFIRMATION_ON:
- FrameSetting.bPhotoConfirmation = TRUE;
- DBG_TRACE("PFS Photo Confirmation ON for frame #%d", pFrame->Id);
- break;
-
- case KSCAMERA_EXTENDEDPROP_PHOTOCONFIRMATION_OFF:
- FrameSetting.bPhotoConfirmation = FALSE;
- DBG_TRACE("PFS Photo Confirmation OFF for frame #%d", pFrame->Id);
- break;
-
- default:
- Status=STATUS_INVALID_PARAMETER;
- break;
- }
- }
- break;
-
- case KSCAMERA_PERFRAMESETTING_ITEM_CUSTOM:
- DBG_TRACE("KSCAMERA_PERFRAMESETTING_ITEM_CUSTOM");
- break;
-
- default:
- // We don't understand this item. Do nothing.
- NT_ASSERT(FALSE);
- break;
- }
-
- // Bail here (a little early) if any of the parsing failed.
- if( !NT_SUCCESS(Status) )
- {
- break;
- }
-
- // Move to the next Item
- pItem = pNextItem;
- }
-
- // Bail here (a little early) if any of the parsing failed.
- if( !NT_SUCCESS(Status) )
- {
- DBG_TRACE( "Malformed PFS Buffer. pPFS=%p pItem=%p",
- pPFS, pItem );
- break;
- }
-
- // Move to next Frame
- pFrame = pNextFrame;
- }
-
- // We need to log where in the buffer we encountered an error.
- // For now we just emit info to the debugger.
- }
-
- if( NT_SUCCESS(Status) && ppSettings )
- {
- *ppSettings = pSettings;
- }
- else
- {
- delete [] pSettings;
- }
- }
-
- delete [] ((PBYTE) Caps);
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE
-NTSTATUS
-CCaptureFilter::GetFocusState(
- _Inout_ CExtendedProperty *pState
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pState->isValid() &&
- pState->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- KSCAMERA_EXTENDEDPROP_FOCUSSTATE FocusState = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_UNINITIALIZED;
- Status = m_Sensor->GetFocusState( &FocusState );
- if( NT_SUCCESS(Status) )
- {
- *pState = CExtendedProperty( (ULONGLONG) FocusState );
- pState->Capability = 0;
- }
- }
- DBG_LEAVE("(PinId=%u, Flags=0x%016llX, Version=%u)=0x%08X",
- pState->PinId, pState->Flags, pState->Version, Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY
-NTSTATUS
-CCaptureFilter::
-GetFocusPriority(
- _Inout_ CExtendedProperty *pPriority
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pPriority->isValid() &&
- pPriority->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetFocusPriority( pPriority );
- }
- DBG_LEAVE("(PinId=%u, Flags=0x%016llX, Version=%u)=0x%08X",
- pPriority->PinId, pPriority->Flags, pPriority->Version, Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY
-NTSTATUS
-CCaptureFilter::
-SetFocusPriority(
- _In_ CExtendedProperty *pPriority
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pPriority->isValid() &&
- pPriority->Capability == 0 &&
- pPriority->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- (pPriority->Flags & ~KSCAMERA_EXTENDEDPROP_FOCUSPRIORITY_ON) == 0 )
- {
- Status = m_Sensor->SetFocusPriority( pPriority );
- }
- DBG_LEAVE("(PinId=%u, Flags=0x%016llX, Version=%u)=0x%08X",
- pPriority->PinId, pPriority->Flags, pPriority->Version, Status);
- return Status;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_CONFIGCAPS Get handler
-NTSTATUS
-CCaptureFilter::
-GetRoiConfigCaps(
- _Inout_ CRoiConfig *pOutput
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pOutput->isValid() &&
- pOutput->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetRoiConfigCaps( pOutput );
- }
- return Status;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL Get handler
-//
-// Note: ROI handlers are left as static member functions because
-// it wasn't worth the code needed to generalize handling of a
-// variable length parameter.
-NTSTATUS
-CCaptureFilter::
-GetRoiIspControl(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- NT_ASSERT(pIrp);
- NT_ASSERT(pProperty);
-
- CCaptureFilter *pFilter = reinterpret_cast <CCaptureFilter *>(KsGetFilterFromIrp(pIrp)->Context);
- CSensor *pSensor = pFilter->m_Sensor;
- PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
- ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
- CRoiProperty *pRoi = (reinterpret_cast<CRoiProperty *>(pData));
- ULONG RequiredSize = pSensor->SizeOfRoi();
-
- // Only handle GETs
- if( ulOutputBufferLength == 0 )
- {
- pIrp->IoStatus.Information = RequiredSize;;
- Status = STATUS_BUFFER_OVERFLOW;
- }
- else if( ulOutputBufferLength < RequiredSize )
- {
- Status = STATUS_BUFFER_TOO_SMALL;
- }
- else if( pData )
- {
- Status = pSensor->GetRoi( pRoi );
- if( NT_SUCCESS(Status) )
- {
- pIrp->IoStatus.Information = pRoi->GetSize();
- }
- }
-
- DBG_LEAVE("()=0x%08X",Status);
- return Status;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL Set handler
-NTSTATUS
-CCaptureFilter::
-SetRoiIspControl(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
- NT_ASSERT(pIrp);
- NT_ASSERT(pProperty);
-
- CCaptureFilter *pFilter = reinterpret_cast <CCaptureFilter *>(KsGetFilterFromIrp(pIrp)->Context);
- CSensor *pSensor = pFilter->m_Sensor;
- PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
- ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
- CRoiProperty *pRoi = (reinterpret_cast<CRoiProperty *>(pData));
- ULONG RequiredSize = sizeof(*pRoi);
-
- // Only handle SETs
- if( ulOutputBufferLength == 0 )
- {
- // Minimum size for this control.
- pIrp->IoStatus.Information = RequiredSize;
- Status = STATUS_BUFFER_OVERFLOW;
- }
- else if( ulOutputBufferLength < RequiredSize )
- {
- DBG_TRACE("***BUFFER TOO SMALL*** ulOutputBufferLength=%d, Size=%d",
- ulOutputBufferLength, pRoi->Size );
- Status = STATUS_BUFFER_TOO_SMALL;
- }
- else if( pData && ulOutputBufferLength >= pRoi->Size )
- {
- // Validate the data blob.
- if( pRoi->isValid() &&
- pRoi->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pRoi->Flags == 0 )
- {
- Status = INVOKE_SET_ASYNC( pSensor, Roi, pRoi, pFilter->m_RoiNotifier );
- }
- }
-
- DBG_LEAVE("()=0x%08X",Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED.
-NTSTATUS
-CCaptureFilter::
-GetIsoAdvanced(
- _Inout_ CExtendedVidProcSetting *pIso
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pIso->isValid() &&
- m_Sensor->IsStillIndex(pIso->PinId) )
- {
- Status = m_Sensor->GetIsoAdvanced( pIso );
- }
-
- // Report to the debug output...
- DBG_TRACE(" Flags = 0x%016llX", pIso->Flags);
- DBG_TRACE(" Min = %d", pIso->m_Setting.Min);
- DBG_TRACE(" Max = %d", pIso->m_Setting.Max);
- DBG_TRACE(" Step = %d", pIso->m_Setting.Step);
- DBG_TRACE("VideoProc.Value = %lld", pIso->m_Setting.VideoProc.Value.ll);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED.
-NTSTATUS
-CCaptureFilter::
-SetIsoAdvanced(
- _In_ CExtendedVidProcSetting *pIso
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- // Report to the debug output...
- DBG_TRACE(" Flags = 0x%016llX", pIso->Flags);
- DBG_TRACE(" Min = %d", pIso->m_Setting.Min);
- DBG_TRACE(" Max = %d", pIso->m_Setting.Max);
- DBG_TRACE(" Step = %d", pIso->m_Setting.Step);
- DBG_TRACE("VideoProc.Value = %lld", pIso->m_Setting.VideoProc.Value.ll);
-
- // Validate
- switch( pIso->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_ISO_AUTO:
- case KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION:
- case KSCAMERA_EXTENDEDPROP_ISO_AUTO | KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION:
- case KSCAMERA_EXTENDEDPROP_ISO_MANUAL:
- case KSCAMERA_EXTENDEDPROP_ISO_MANUAL | KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION:
- if( pIso->isValid() &&
- (pIso->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- m_Sensor->IsStillIndex(pIso->PinId) )
- {
- CExtendedVidProcSetting Caps;
- Status = m_Sensor->GetIsoAdvanced(&Caps);
-
- if( NT_SUCCESS(Status) )
- {
- // Just save the parameters
- if( pIso->Flags & KSCAMERA_EXTENDEDPROP_ISO_MANUAL )
- {
- Status = BoundsCheckSigned( pIso->GetLONGLONG(), Caps.m_Setting );
- }
- if( NT_SUCCESS(Status) )
- {
- Status = INVOKE_SET_ASYNC( m_Sensor, IsoAdvanced, pIso, m_IsoAdvancedNotifier )
- }
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- break;
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VFR.
-NTSTATUS
-CCaptureFilter::
-GetVFR(
- _Inout_ CExtendedProperty *pVFR
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsVideoIndex(pVFR->PinId) &&
- pVFR->isValid() )
- {
- //Get the current VFR state
- Status = m_Sensor->GetVFR( pVFR );
- }
- DBG_LEAVE("PinId=%u, VideoIndex=%u, Flags=0x%016llX, Version=%u, Status=0x%08X",
- pVFR->PinId, m_Sensor->GetVideoIndex(), pVFR->Flags, pVFR->Version, Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VFR.
-NTSTATUS
-CCaptureFilter::
-SetVFR(
- _In_ CExtendedProperty *pVFR
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsVideoIndex(pVFR->PinId) &&
- pVFR->isValid() &&
- pVFR->Capability == 0 &&
- (KSCAMERA_EXTENDEDPROP_VFR_OFF == pVFR->Flags ||
- KSCAMERA_EXTENDEDPROP_VFR_ON == pVFR->Flags ||
- KSCAMERA_EXTENDEDPROP_VIDEOHDR_AUTO == pVFR->Flags ) )
- {
- //Set the current VFR state
- Status = m_Sensor->SetVFR( pVFR );
- }
- DBG_LEAVE("PinId=%u, VideoIndex=%u, Flags=0x%016llX, Version=%u, Status=0x%08X",
- pVFR->PinId, m_Sensor->GetVideoIndex(), pVFR->Flags, pVFR->Version, Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.
-NTSTATUS
-CCaptureFilter::
-GetVideoHDR(
- _Inout_ CExtendedProperty *pVideoHDR
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsVideoIndex(pVideoHDR->PinId) &&
- pVideoHDR->isValid() )
- {
- //Get the current Video HDR state
- Status = m_Sensor->GetVideoHDR(pVideoHDR);
- }
- DBG_LEAVE("PinId=%u, VideoIndex=%u, Flags=0x%016llX, Version=%u, Status=0x%08X",
- pVideoHDR->PinId, m_Sensor->GetVideoIndex(), pVideoHDR->Flags, pVideoHDR->Version, Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR.
-NTSTATUS
-CCaptureFilter::
-SetVideoHDR(
- _In_ CExtendedProperty *pVideoHDR
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- // Call must come for Video PIN only and flags must be supported and mutually exclusive and version must be 1
- if( m_Sensor->IsVideoIndex(pVideoHDR->PinId) &&
- pVideoHDR->isValid() &&
- !(pVideoHDR->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- (KSCAMERA_EXTENDEDPROP_VIDEOHDR_OFF == pVideoHDR->Flags ||
- KSCAMERA_EXTENDEDPROP_VIDEOHDR_ON == pVideoHDR->Flags ||
- KSCAMERA_EXTENDEDPROP_VIDEOHDR_AUTO== pVideoHDR->Flags) )
- {
- if( m_pinArray[pVideoHDR->PinId]->GetState() == PinStopped )
- {
- CExtendedProperty Caps(*pVideoHDR);
- Status = m_Sensor->GetVideoHDR( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- // Call must come for Video PIN only and flags must be supported and mutually exclusive and version must be 1
- if( pVideoHDR->Flags == (pVideoHDR->Flags & Caps.Capability) )
- {
- Status = m_Sensor->SetVideoHDR(pVideoHDR);
- }
- }
- }
- else
- {
- Status = STATUS_INVALID_DEVICE_STATE;
- }
- }
-
- DBG_LEAVE("PinId=%u, VideoIndex=%u, Flags=0x%016llX, Version=%u, Status=0x%08X",
- pVideoHDR->PinId, m_Sensor->GetVideoIndex(), pVideoHDR->Flags, pVideoHDR->Version, Status);
- return Status;
-}
-
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_HISTOGRAM.
-NTSTATUS
-CCaptureFilter::
-GetHistogram(
- _Inout_ CExtendedProperty *pHistogram
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsPreviewIndex(pHistogram->PinId) &&
- pHistogram->isValid() &&
- pHistogram->Capability == 0 )
- {
- //Get the histogram state
- Status = m_Sensor->GetHistogram( pHistogram );
- }
- DBG_TRACE("pHistogram->PinId = %u, m_sensor->PreviewIndex = %u, pHistogram->Flags = %016llx, pHistogram->Version = %u",
- pHistogram->PinId, m_Sensor->GetPreviewIndex(), pHistogram->Flags, pHistogram->Version);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_HISTOGRAM.
-NTSTATUS
-CCaptureFilter::
-SetHistogram(
- _In_ CExtendedProperty *pHistogram
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsPreviewIndex(pHistogram->PinId) &&
- pHistogram->isValid() &&
- !(pHistogram->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- (KSCAMERA_EXTENDEDPROP_HISTOGRAM_OFF == pHistogram->Flags ||
- KSCAMERA_EXTENDEDPROP_HISTOGRAM_ON == pHistogram->Flags ) )
- {
- if( m_pinArray[pHistogram->PinId] &&
- m_pinArray[pHistogram->PinId]->GetState() != PinStopped )
- {
- Status = STATUS_INVALID_DEVICE_STATE;
- }
- else
- {
- //Set the histogram state.
- Status = m_Sensor->SetHistogram( pHistogram );
- }
- }
-
- DBG_TRACE("pHistogram->PinId = %u, m_sensor->PreviewIndex = %u, pHistogram->Flags = %016llx, pHistogram->Version = %u",
- pHistogram->PinId, m_Sensor->GetPreviewIndex(), pHistogram->Flags, pHistogram->Version);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_FACEDETECTION.
-NTSTATUS
-CCaptureFilter::
-GetFaceDetection(
- _Inout_ CExtendedVidProcSetting *pFaceDetect
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- if( pFaceDetect->PinId==KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pFaceDetect->isValid() )
- {
- //Get the FaceDetection state
- Status = m_Sensor->GetFaceDetection( pFaceDetect );
- }
-
- DBG_LEAVE("(): PinId=0x%08X, Flags=0x%016llX, Version=%u, Value=%d, Status=0x%08X",
- pFaceDetect->PinId, pFaceDetect->Flags, pFaceDetect->Version, pFaceDetect->GetULONG(), Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_FACEDETECTION.
-NTSTATUS
-CCaptureFilter::
-SetFaceDetection(
- _In_ CExtendedVidProcSetting *pFaceDetect
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("(): PinId=0x%08X, Flags=0x%016llX, Version=%u, Value=%d",
- pFaceDetect->PinId, pFaceDetect->Flags, pFaceDetect->Version, pFaceDetect->GetULONG());
-
- if( pFaceDetect->PinId==KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pFaceDetect->isValid() &&
- ( KSCAMERA_EXTENDEDPROP_FACEDETECTION_OFF == pFaceDetect->Flags ||
- (KSCAMERA_EXTENDEDPROP_FACEDETECTION_MASK & pFaceDetect->Flags) !=0 ) )
- {
- CExtendedVidProcSetting Caps(*pFaceDetect);
- Status = m_Sensor->GetFaceDetection( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pFaceDetect->Flags == (pFaceDetect->Flags & Caps.Capability) &&
- ( KSCAMERA_EXTENDEDPROP_FACEDETECTION_OFF == pFaceDetect->Flags ||
- NT_SUCCESS( Status = Caps.BoundsCheck( pFaceDetect->GetULONG() ) ) ) )
- {
- //Set the FaceDetection state.
- Status = m_Sensor->SetFaceDetection( pFaceDetect );
- }
- }
- }
-
- DBG_LEAVE("(): Status=0x%08X", Status);
- return Status;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM Get handler
-NTSTATUS
-CCaptureFilter::
-GetZoom(
- _Inout_ CExtendedVidProcSetting *pZoom
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pZoom->isValid() &&
- pZoom->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE )
- {
- Status = m_Sensor->GetZoom(pZoom);
- }
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM Set handler
-NTSTATUS
-CCaptureFilter::
-SetZoom(
- _In_ CExtendedVidProcSetting *pZoom
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- DBG_ENTER("()");
-
- // Validate
- if( pZoom->isValid() &&
- pZoom->PinId == KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- !(pZoom->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) )
- {
- CExtendedVidProcSetting Caps(*pZoom);
- Status = m_Sensor->GetZoom( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Report to the debug output...
- DBG_TRACE(" Flags = 0x%016llX", Caps.Flags);
- DBG_TRACE(" Min = %d", Caps.Min());
- DBG_TRACE(" Max = %d", Caps.Max());
- DBG_TRACE(" Step = %d", Caps.Step());
- DBG_TRACE("VideoProc.Value = %d", pZoom->GetLONG());
-
- if( pZoom->Flags == (pZoom->Flags & Caps.Capability) )
- {
- Status = BoundsCheckSigned( pZoom->GetLONG(), Caps.m_Setting );
-
- if (NT_SUCCESS(Status))
- {
- Status = m_Sensor->SetZoom(pZoom);
- }
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
- }
-
- DBG_LEAVE("(PinId = %u, Flags = 0x%016llX, Caps = 0x%016llX)=0x%08X",
- pZoom->PinId, pZoom->Flags, pZoom->Capability, Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOSTABILIZATION.
-NTSTATUS
-CCaptureFilter::
-GetVideoStabilization(
- _Inout_ CExtendedProperty *pVideoStab
-)
-{
- PAGED_CODE();
-
- if (m_Sensor->IsVideoIndex(pVideoStab->PinId) &&
- pVideoStab->isValid())
- {
- //Get the current state
- return m_Sensor->GetVideoStabilization(pVideoStab);
- }
- return STATUS_INVALID_PARAMETER;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOSTABILIZATION.
-NTSTATUS
-CCaptureFilter::
-SetVideoStabilization(
- _In_ CExtendedProperty *pVideoStab
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- // Call must come for Video PIN only and flags must be supported and mutually exclusive and version must be 1
- if( m_Sensor->IsVideoIndex(pVideoStab->PinId) &&
- pVideoStab->isValid() &&
- !(pVideoStab->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- (KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_OFF == pVideoStab->Flags ||
- KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_ON == pVideoStab->Flags ||
- KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_AUTO == pVideoStab->Flags) )
- {
- CExtendedProperty Caps(*pVideoStab);
- Status = m_Sensor->GetVideoStabilization( &Caps );
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- // Call must come for Video PIN only and flags must be supported and mutually exclusive and version must be 1
- if( pVideoStab->Flags == (pVideoStab->Flags & Caps.Capability) )
- {
- LockFilter Lock(m_pKSFilter);
-
- if( m_pinArray[pVideoStab->PinId] &&
- m_pinArray[pVideoStab->PinId]->GetState() != PinStopped )
- {
- Status = STATUS_INVALID_DEVICE_STATE;
- }
- else
- {
- Status = m_Sensor->SetVideoStabilization(pVideoStab);
- }
- }
- }
- }
- DBG_TRACE("pVideoStab = %p, PinId = %u, m_sensor->VideoIndex = %u, Flags = %llu, Version = %u",
- pVideoStab, pVideoStab->PinId, m_Sensor->GetVideoIndex(), pVideoStab->Flags, pVideoStab->Version);
-
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_OIS.
-NTSTATUS
-CCaptureFilter::
-GetOpticalImageStabilization(
- _Inout_ CExtendedProperty *pOIS
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( pOIS->PinId==KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pOIS->isValid() )
- {
- //Get the current state
- Status = m_Sensor->GetOpticalImageStabilization(pOIS);
- }
-
- DBG_TRACE("pOIS = %p, PinId = %u, Flags = %llu, Version = %u",
- pOIS, pOIS->PinId, pOIS->Flags, pOIS->Version);
-
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_OIS.
-NTSTATUS
-CCaptureFilter::
-SetOpticalImageStabilization(
- _In_ CExtendedProperty *pOIS
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- // Call must come for Video PIN only and flags must be supported and mutually exclusive and version must be 1
- if( pOIS->PinId==KSCAMERA_EXTENDEDPROP_FILTERSCOPE &&
- pOIS->isValid() &&
- !(pOIS->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) &&
- (KSCAMERA_EXTENDEDPROP_OIS_OFF == pOIS->Flags ||
- KSCAMERA_EXTENDEDPROP_OIS_ON == pOIS->Flags ||
- KSCAMERA_EXTENDEDPROP_OIS_AUTO== pOIS->Flags))
- {
- CExtendedProperty Caps(*pOIS);
- Status = m_Sensor->GetOpticalImageStabilization(&Caps);
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pOIS->Flags == (pOIS->Flags & Caps.Capability) )
- {
- Status = m_Sensor->SetOpticalImageStabilization(pOIS);
- }
- }
- }
- DBG_TRACE("pOIS = %p, PinId = %u, Flags = %llu, Version = %u",
- pOIS, pOIS->PinId, pOIS->Flags, pOIS->Version);
-
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO.
-NTSTATUS
-CCaptureFilter::
-GetAdvancedPhoto(
- _Inout_ CExtendedProperty *pAdvancedPhoto
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsStillIndex(pAdvancedPhoto->PinId) &&
- pAdvancedPhoto->isValid() )
- {
- //Get the current state
- Status = m_Sensor->GetAdvancedPhoto(pAdvancedPhoto);
- }
-
- DBG_LEAVE(" PinId=%u, Flags=0x%016llX, Version=%u, Status=0x%08X",
- pAdvancedPhoto->PinId, pAdvancedPhoto->Flags, pAdvancedPhoto->Version, Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_ADVANCEDPHOTO.
-NTSTATUS
-CCaptureFilter::
-SetAdvancedPhoto(
- _In_ CExtendedProperty *pAdvancedPhoto
-)
-{
- PAGED_CODE();
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- // Valid request, still pin & no unsupported flags.
- if( m_Sensor->IsStillIndex(pAdvancedPhoto->PinId) &&
- pAdvancedPhoto->isValid() &&
- !(pAdvancedPhoto->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) )
- {
- CExtendedProperty Caps(*pAdvancedPhoto);
- Status = m_Sensor->GetAdvancedPhoto(&Caps);
-
- if( NT_SUCCESS(Status) )
- {
- // Assume an invalid parameter.
- Status = STATUS_INVALID_PARAMETER;
-
- if( pAdvancedPhoto->Flags == (pAdvancedPhoto->Flags & Caps.Capability) )
- {
- // Make sure the requested flags are a valid capability combination.
- switch( pAdvancedPhoto->Flags )
- {
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_OFF :
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_AUTO :
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_HDR :
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_FNF :
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_ULTRALOWLIGHT:
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_AUTO |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_HDR :
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_AUTO |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_FNF :
- case KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_AUTO |
- KSCAMERA_EXTENDEDPROP_ADVANCEDPHOTO_ULTRALOWLIGHT:
- Status = m_Sensor->SetAdvancedPhoto(pAdvancedPhoto);
- }
- }
- }
- }
-
- DBG_LEAVE(" PinId=%u, Flags=0x%016llX, Version=%u, Status=0x%08X",
- pAdvancedPhoto->PinId, pAdvancedPhoto->Flags, pAdvancedPhoto->Version, Status);
- return Status;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_EXPOSURE
-NTSTATUS
-CCaptureFilter::
-GetCameraProfile(
- _Inout_ CExtendedProfile *pProfile
-)
-{
- PAGED_CODE();
- NTSTATUS Status = STATUS_SUCCESS;
-
- pProfile->Version = KSCAMERA_EXTENDEDPROP_VERSION;
- pProfile->PinId = KSCAMERA_EXTENDEDPROP_FILTERSCOPE;
- pProfile->Size = sizeof(KSCAMERA_EXTENDEDPROP_HEADER) + sizeof (KSCAMERA_EXTENDEDPROP_PROFILE);
- pProfile->Result = 0;
- pProfile->Flags = 0;
- pProfile->Capability = KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL;
- pProfile->m_Profile = m_Profile;
-
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_EXTENDED_PROFILE.
-NTSTATUS
-CCaptureFilter::
-SetCameraProfile(
- _In_ CExtendedProfile *pProfile
-)
-{
- PAGED_CODE();
-
- if (pProfile->PinId != KSCAMERA_EXTENDEDPROP_FILTERSCOPE ||
- !pProfile->isValid() ||
- 0 == (pProfile->Capability & KSCAMERA_EXTENDEDPROP_CAPS_ASYNCCONTROL) ||
- pProfile->Flags != 0)
- {
- return STATUS_INVALID_PARAMETER;
- }
- m_Profile = pProfile->m_Profile;
-
- m_ProfileNotifier.Set();
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-CCaptureFilter::
-GetExposure(
- _Inout_ KSPROPERTY_CAMERACONTROL_S *pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetExposure(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_EXPOSURE
-NTSTATUS
-CCaptureFilter::
-SetExposure(
- _In_ KSPROPERTY_CAMERACONTROL_S *pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetExposure(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_FOCUS
-NTSTATUS
-CCaptureFilter::
-GetFocus(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetFocus(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_FOCUS
-NTSTATUS
-CCaptureFilter::
-SetFocus(
- _In_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- m_Sensor->CancelFocus();
-
- NTSTATUS Status = m_Sensor->SetFocus(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_ZOOM
-NTSTATUS
-CCaptureFilter::
-GetZoom(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetZoom(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_ZOOM
-NTSTATUS
-CCaptureFilter::
-SetZoom(
- _In_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetZoom(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get [legacy] KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE
-NTSTATUS
-CCaptureFilter::
-GetZoomRelative(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetZoomRelative(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set [legacy] KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE
-NTSTATUS
-CCaptureFilter::
-SetZoomRelative(
- _In_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetZoomRelative(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_PAN
-NTSTATUS
-CCaptureFilter::
-GetPan(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetPan(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_PAN
-NTSTATUS
-CCaptureFilter::
-SetPan(
- _In_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetPan(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_ROLL
-NTSTATUS
-CCaptureFilter::
-GetRoll(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetRoll(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_ROLL
-NTSTATUS
-CCaptureFilter::
-SetRoll(
- _In_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetRoll(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_TILT
-NTSTATUS
-CCaptureFilter::
-GetTilt(
- _Inout_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetTilt(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_TILT
-NTSTATUS
-CCaptureFilter::
-SetTilt(
- _In_ PKSPROPERTY_CAMERACONTROL_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetTilt(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH
-NTSTATUS
-CCaptureFilter::
-GetFocalLength(
- _Inout_ PKSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetFocalLength(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH
-NTSTATUS
-CCaptureFilter::
-SetFocalLength(
- _In_ PKSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetFocalLength(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION
-NTSTATUS
-CCaptureFilter::
-GetBacklightCompensation(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetBacklightCompensation(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION
-NTSTATUS
-CCaptureFilter::
-SetBacklightCompensation(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetBacklightCompensation(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS
-NTSTATUS
-CCaptureFilter::
-GetBrightness(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetBrightness(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS
-NTSTATUS
-CCaptureFilter::
-SetBrightness(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetBrightness(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_CONTRAST
-NTSTATUS
-CCaptureFilter::
-GetContrast(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetContrast(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_CONTRAST
-NTSTATUS
-CCaptureFilter::
-SetContrast(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetContrast(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_HUE
-NTSTATUS
-CCaptureFilter::
-GetHue(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetHue(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_HUE
-NTSTATUS
-CCaptureFilter::
-SetHue(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetHue(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get [legacy] KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE
-NTSTATUS
-CCaptureFilter::
-GetWhiteBalance(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetWhiteBalance(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set [legacy] KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE
-NTSTATUS
-CCaptureFilter::
-SetWhiteBalance(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetWhiteBalance(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY
-NTSTATUS
-CCaptureFilter::
-GetPowerlineFreq(
- _Inout_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->GetPowerlineFreq(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Set KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY
-NTSTATUS
-CCaptureFilter::
-SetPowerlineFreq(
- _In_ PKSPROPERTY_VIDEOPROCAMP_S pProperty
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = m_Sensor->SetPowerlineFreq(pProperty);
-
- DBG_LEAVE("()=0x%08X", Status);
- return Status;
-}
-
-// Get KSPROPERTY_VIDEOCONTROL_MODE.
-NTSTATUS
-CCaptureFilter::
-GetVideoControlMode(
- _Inout_ KSPROPERTY_VIDEOCONTROL_MODE_S *pMode
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsStillIndex(pMode->StreamIndex) )
- {
- Status = m_Sensor->GetVideoControlMode( pMode );
- }
-
- DBG_LEAVE("( Pin=%d, Mode=0x%08X )=0x%08X",
- pMode->StreamIndex, pMode->Mode, Status );
- return Status;
-}
-
-// Set KSPROPERTY_VIDEOCONTROL_MODE.
-NTSTATUS
-CCaptureFilter::
-SetVideoControlMode(
- _In_ KSPROPERTY_VIDEOCONTROL_MODE_S *pMode
-)
-{
- PAGED_CODE();
- DBG_ENTER("()");
-
- NTSTATUS Status = STATUS_INVALID_PARAMETER;
-
- if( m_Sensor->IsStillIndex(pMode->StreamIndex) )
- {
- KSPROPERTY_VIDEOCONTROL_MODE_S Caps;
- RtlZeroMemory( &Caps, sizeof(Caps) );
-
- Status = m_Sensor->GetVideoControlMode( &Caps );
- if( NT_SUCCESS(Status) )//&&
- // pMode->Mode == (pMode->Mode & Caps.Mode) )
- {
- DBG_TRACE("Mode=0x%08X, Caps.Mode=0x%08X", pMode->Mode, Caps.Mode);
- Status = m_Sensor->SetVideoControlMode( pMode );
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- }
-
- DBG_LEAVE("( Pin=%d, Mode=0x%08X )=0x%08X",
- pMode->StreamIndex, pMode->Mode, Status );
- return Status;
-}
-
diff --git a/avscamera/sys/filter.h b/avscamera/sys/filter.h
deleted file mode 100644
index 5b3c06f5..00000000
--- a/avscamera/sys/filter.h
+++ /dev/null
@@ -1,482 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- filter.h
-
- Abstract:
-
- This file contains the filter level header for the base capture filter
- class. It provides a wrapper on KSFILTER.
-
- CCaptureFilter holds state information for the filter and contains
- implementations for standard camera controls. These implementations
- validate arguments and capabilities of the control according to DDI
- definitions. Once validated, control is passes to a CSensor object
- to manipulate the state of camera.
-
- CCaptureFilter holds a reference to any active CCapturePins that may
- have been created on this filter. The reference is used to obtain
- the state of the pin and potentially modify the pin's allocator
- framing.
-
- To add a new control, derive from CCaptureFilter and use one of the
- DECLARE_PROPERTY_XXX() macros below to declare the property handlers.
- You can also use the DEFINE_PROP_ITEM_XXX() and DEFINE_STD_EVENT_ITEM()
- macros as aids in constructing a filter's automation table.
-
- History:
-
- created 3/12/2001
-
-**************************************************************************/
-
-extern KSPROPERTY_VALUES ZoomRelativeValues;
-extern KSPROPERTY_VALUES ZoomValues;
-extern KSPROPERTY_VALUES PanValues;
-extern KSPROPERTY_VALUES RollValues;
-extern KSPROPERTY_VALUES TiltValues;
-extern KSPROPERTY_VALUES BacklightCompensationValues;
-extern KSPROPERTY_VALUES BrightnessValues;
-extern KSPROPERTY_VALUES ContrastValues;
-extern KSPROPERTY_VALUES HueValues;
-extern KSPROPERTY_VALUES PLFValues;
-extern KSPROPERTY_VALUES WhiteBalanceValues;
-extern KSPROPERTY_VALUES ExposureValues;
-extern KSPROPERTY_VALUES FocusValues;
-
-class CCapturePin;
-class CCaptureFilter
-{
-private:
-
- //
- // The AVStream filter object associated with this CCaptureFilter.
- //
- CCapturePin **m_pinArray;
-
-protected:
- //
- // Setup, memory allocation, etc.
- //
- NTSTATUS
- Initialize();
-
- //
- // Cleanup
- //
- void
- Cleanup();
-
-public:
-
- //
- // setPin()
- //
- // Attach a CCapturePin.
- //
- void
- setPin(
- _In_ CCapturePin *pPin,
- _In_ unsigned Id
- ) ;
-
- //
- // getPin()
- //
- // Query an attached CCapturePin.
- //
- CCapturePin *
- getPin(
- _In_ unsigned Id
- ) ;
-
- //
- // CCaptureFilter()
- //
- // Constructor.
- //
- CCaptureFilter (
- _In_ PKSFILTER Filter
- );
-
- //
- // ~CCaptureFilter():
- //
- // The capture filter destructor.
- //
- virtual
- ~CCaptureFilter ();
-
- //
- // DispatchCreate():
- //
- // This is the filter creation dispatch for the capture filter. It
- // creates the CCaptureFilter object, associates it with the AVStream
- // object, and bags it for easy cleanup later.
- //
- static
- NTSTATUS
- DispatchCreate (
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp
- );
-
- //
- // Close(): Called in response to IRP_MJ_CLOSE.
- //
- static
- NTSTATUS
- DispatchClose(
- _In_ PKSFILTER Filter,
- _In_ PIRP Irp
- );
-
- LARGE_INTEGER m_StartTime;
- CCaptureDevice *m_pCaptureDevice;
- CSensor *m_Sensor;
- PKSFILTER m_pKSFilter;
- PKSCAMERA_PERFRAMESETTING_HEADER m_pPerFrameSettings;
- ULONG m_PFSSize;
-
- CNotifier m_PhotoModeNotifier;
- CNotifier m_PhotoMaxFrameRateNotifier;
- CNotifier m_FocusNotifier;
- CNotifier m_FocusRectNotifier;
- CNotifier m_IsoNotifier;
- CNotifier m_IsoAdvancedNotifier;
- CNotifier m_EvCompensationNotifier;
- CNotifier m_WhiteBalanceNotifier;
- CNotifier m_ExposureNotifier;
- CNotifier m_SceneModeNotifier;
- CNotifier m_ThumbnailNotifier;
- CNotifier m_WarmStartNotifier;
- CNotifier m_RoiNotifier;
- CNotifier m_ProfileNotifier;
-
- //
- // The following static member template function is used to validate
- // most KSPROPERTYs and thunk that call down to a handler that is a non-
- // static member of CCaptureFilter (or a derived class).
- //
- // Note: A separate instance of this thunking function is instantiated for
- // each control, so code space is not conserved. However, performing
- // this logic in only one place ensures consistant behavior across
- // controls and reduces the chances for mistakes.
- //
- template
- <typename OUTPUT, // type of data consumed by the handler.
- typename FILTER,
- NTSTATUS (FILTER::*pFun)( // The local handling function.
- _Inout_ OUTPUT *pOutput )>
- __declspec(code_seg("PAGE")) // Put this function into paged code.
- static
- NTSTATUS
- Prop(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData)
- {
- PAGED_CODE();
- UNREFERENCED_PARAMETER(pProperty);
-
- NTSTATUS Status = STATUS_SUCCESS;
- NT_ASSERT(pIrp);
-
- FILTER *pFilter = reinterpret_cast <FILTER *>(KsGetFilterFromIrp(pIrp)->Context);
- PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
- ULONG ulOutputBufferLength = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
- OUTPUT *pOutput = reinterpret_cast<OUTPUT *>(pData);
-
- if (ulOutputBufferLength == 0)
- {
- pIrp->IoStatus.Information = sizeof(OUTPUT);
- Status = STATUS_BUFFER_OVERFLOW;
- }
- else if (ulOutputBufferLength < sizeof(OUTPUT))
- {
- Status = STATUS_BUFFER_TOO_SMALL;
- }
- else if (pData && ulOutputBufferLength >= sizeof(OUTPUT))
- {
- Status = (pFilter->*pFun)( pOutput );
- if( NT_SUCCESS(Status) )
- {
- pIrp->IoStatus.Information = sizeof(OUTPUT);
- }
- }
- else
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- return Status;
- }
-
- // Get Per Frame Setting Caps
- static
- NTSTATUS
- GetPFSCaps(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
- );
-
- // Get current Per Frame Settings
- static
- NTSTATUS
- GetPerFrameSettings(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
- );
-
- // Set new Per Frame Settings
- static
- NTSTATUS
- SetPerFrameSettings(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
- );
-
- // Clear Per Frame Settings
- static
- NTSTATUS
- ClearPerFrameSettings(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
- );
-
-//
-// DECLARE_PROPERTY_XXX() macros.
-//
-// The follow macros declare a property handler using a common naming
-// convention. This convention is unique to this sample code. The
-// convention is used again in the DEFINE_PROP_ITEM_XXX() macros during
-// construction of the automation tables.
-//
-// Note: These definitions are non-static members of the filter.
-//
-
-// Declare a property's GET handler.
-#define DECLARE_PROPERTY_GET_HANDLER( type, name ) \
- NTSTATUS \
- Get##name( \
- _Inout_ type *pOutput \
- );
-
-// Declare a property's SET handler.
-#define DECLARE_PROPERTY_SET_HANDLER( type, name ) \
- NTSTATUS \
- Set##name( \
- _In_ type *pOutput \
- );
-
-// Declare a property's GET and SET handlers.
-#define DECLARE_PROPERTY_HANDLERS( type, name ) \
-DECLARE_PROPERTY_GET_HANDLER( type, name ) \
-DECLARE_PROPERTY_SET_HANDLER( type, name )
-
- //
- // Declaration of all the standard control handlers that use fixed structures.
- //
- DECLARE_PROPERTY_HANDLERS( CExtendedPhotoMode, PhotoMode );
- DECLARE_PROPERTY_GET_HANDLER( CExtendedProperty, PhotoFrameRate );
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, PhotoMaxFrameRate );
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, WarmStart );
- DECLARE_PROPERTY_HANDLERS( CExtendedMaxVideoFpsForPhotoRes, MaxVideoFpsForPhotoRes );
- DECLARE_PROPERTY_GET_HANDLER( CExtendedFieldOfView, FieldOfView );
- DECLARE_PROPERTY_GET_HANDLER( CExtendedCameraAngleOffset, CameraAngleOffset );
- DECLARE_PROPERTY_HANDLERS( KSPROPERTY_CAMERACONTROL_REGION_OF_INTEREST_S, FocusRect );
- DECLARE_PROPERTY_HANDLERS( CExtendedVidProcSetting, Focus );
- DECLARE_PROPERTY_GET_HANDLER( CExtendedProperty, FocusState );
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, FocusPriority );
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, ExtendedFlash )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, Iso )
- DECLARE_PROPERTY_HANDLERS( CExtendedVidProcSetting, IsoAdvanced )
- DECLARE_PROPERTY_HANDLERS( CExtendedEvCompensation, EvCompensation )
- DECLARE_PROPERTY_HANDLERS( CExtendedVidProcSetting, WhiteBalance )
- DECLARE_PROPERTY_HANDLERS( CExtendedVidProcSetting, Exposure )
- DECLARE_PROPERTY_HANDLERS( CExtendedVidProcSetting, FaceDetection )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, PhotoConfirmation )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, SceneMode )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, VFR )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, VideoHDR )
- DECLARE_PROPERTY_HANDLERS( CExtendedVidProcSetting, Zoom )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, VideoStabilization)
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, Histogram )
- DECLARE_PROPERTY_HANDLERS( CExtendedMetadata, Metadata )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, OpticalImageStabilization )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, OptimizationHint )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, AdvancedPhoto )
- DECLARE_PROPERTY_HANDLERS( CExtendedProfile, CameraProfile )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, Thumbnail )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, TriggerTime )
- DECLARE_PROPERTY_HANDLERS( CExtendedProperty, TorchMode )
-
- DECLARE_PROPERTY_HANDLERS( KSPROPERTY_CAMERACONTROL_VIDEOSTABILIZATION_MODE_S, VideoStabMode )
- DECLARE_PROPERTY_HANDLERS( KSPROPERTY_CAMERACONTROL_FLASH_S, Flash )
- DECLARE_PROPERTY_GET_HANDLER( KSPROPERTY_CAMERACONTROL_IMAGE_PIN_CAPABILITY_S, PinDependence )
-
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, Exposure);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, Focus);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, Zoom);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, ZoomRelative);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, Pan);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, Roll);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_S, Tilt);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH_S, FocalLength);
-
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOPROCAMP_S, BacklightCompensation);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOPROCAMP_S, Brightness);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOPROCAMP_S, Contrast);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOPROCAMP_S, Hue);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOPROCAMP_S, WhiteBalance);
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOPROCAMP_S, PowerlineFreq);
-
- DECLARE_PROPERTY_GET_HANDLER( CRoiConfig, RoiConfigCaps );
-
- DECLARE_PROPERTY_HANDLERS(KSPROPERTY_VIDEOCONTROL_MODE_S, VideoControlMode);
-
- //
- // The following are property handlers that use an atypical variable
- // length (not known at compile-time) parameter list.
- //
- // Since we only have a few, declare them explicitly.
- //
-
- // KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL Get handler
- static
- NTSTATUS
- GetRoiIspControl(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData
- );
-
- // KSPROPERTY_CAMERACONTROL_EXTENDED_ROI_ISPCONTROL Set handler
- static
- NTSTATUS
- SetRoiIspControl(
- _In_ PIRP pIrp,
- _In_ PKSPROPERTY pProperty,
- _Inout_ PVOID pData);
-
- // Make sure the PERFRAMESETTINGs passed to us are valid.
- _Success_(return == 0)
- NTSTATUS
- CCaptureFilter::ParsePFSBuffer(
- _In_reads_bytes_(BufferLimit)
- PKSCAMERA_PERFRAMESETTING_HEADER pPFS,
- _In_ ULONG BufferLimit,
- _Outptr_opt_result_maybenull_
- ISP_FRAME_SETTINGS **ppSettings );
-
- // Helper function for finding our filter object.
- static
- CCaptureFilter *
- GetFilter(
- _In_ PKSPIN Pin
- )
- {
- return reinterpret_cast <CCaptureFilter *>
- (KsPinGetParentFilter(Pin)->Context);
- }
-
- // Accessor to convert a reference to a CCaptureFilter to a PKSFILTER.
- operator PKSFILTER()
- {
- return m_pKSFilter;
- }
-
- // Get the name of the filter from the context structure passed in at initialization.
- LPCWSTR GetFilterName()
- {
- return m_pCaptureDevice->GetFilterName(m_pCaptureDevice->GetFilterIndex(m_pKSFilter));
- }
-
- // Update the pin's allocator to a specific frame count.
- NTSTATUS
- UpdateAllocatorFraming(
- _In_ ULONG PinId
- );
-
-private:
- // An arbitrary limit on Per-Frame settings.
- static
- const ULONG MAX_FRAME_COUNT=512;
-
- // Filter level state information.
- KSCAMERA_EXTENDEDPROP_PROFILE m_Profile;
-};
-
-//
-// Helper definitions for creating custom property sets
-//
-// Note: Property automation tables require a statically defined accessor
-// functions, however our properties functions are (mostly) implemented
-// as non-static member functions. The following macros provide a
-// static member thunking function by invoking a member template
-// function called Prop<>. The Prop<> performs limited validation on
-// the buffer, provides back the size if the buffer size was 0, picks
-// up a pointer to the filter through the IRP and calls the member
-// function that handles the property.
-//
-
-#define DEFINE_PROP_ITEM_NO_SET( T, ctrl, type, name ) \
- DEFINE_KSPROPERTY_ITEM( \
- ctrl, \
- (&T::Prop<type, T, &T::Get##name>), \
- sizeof(KSPROPERTY), \
- 0, \
- NULL, \
- NULL, 0, NULL, NULL, 0 \
- )
-
-#define DEFINE_PROP_ITEM_WITH_VALUES( T, ctrl, type, name, values ) \
- DEFINE_KSPROPERTY_ITEM( \
- ctrl, \
- (&T::Prop<type, T, &T::Get##name>), \
- sizeof(KSPROPERTY), \
- 0, \
- (&T::Prop<type, T, &T::Set##name>), \
- values, 0, NULL, NULL, 0 \
- )
-
-#define DEFINE_PROP_ITEM( T, ctrl, type, name ) \
- DEFINE_PROP_ITEM_WITH_VALUES( T, ctrl, type, name, NULL )
-
-//
-// A simplification for defining a KSEVENT. We only need to specify one parameter.
-//
-#define DEFINE_STD_EVENT_ITEM(EVENTID) \
- DEFINE_KSEVENT_ITEM \
- ( \
- EVENTID, \
- sizeof(KSEVENTDATA), \
- 0, \
- NULL, \
- NULL, \
- NULL \
- )
-
-//
-// A simplification for defining a KSPROPERTY_SET. We only need to specify two parameters.
-//
-#define DEFINE_STD_PROPERTY_SET(SET, PROPERTIES) \
- DEFINE_KSPROPERTY_SET( \
- &SET, \
- SIZEOF_ARRAY(PROPERTIES), \
- PROPERTIES, \
- 0, \
- NULL)
-
-const LONGLONG MAX_EXPOSURE_TIME = 10000000ULL * 60 * 60; // 1 min
-const LONG MIN_EXPOSURE_TIME=10000; // 1 ms
-const LONG DEF_EXPOSURE_TIME=10000 * 30; // 30 ms.
diff --git a/avscamera/sys/hwsim.cpp b/avscamera/sys/hwsim.cpp
deleted file mode 100644
index 2c474e56..00000000
--- a/avscamera/sys/hwsim.cpp
+++ /dev/null
@@ -1,1395 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- hwsim.cpp
-
- Abstract:
-
- This file contains the implementation of CHardwareSimulation used to
- simulate a camera's capture stream.
-
- Our simulation cannot mimic a real camera with any precision. A real
- camera would likely have dedicated hardware to provide interrupts, do
- DMA transfers of frames from an internal buffer as well as do scaling
- and on-the-fly colorspace and planar format conversions so as to supply
- frames for preview, video and photo in varying resolutions and
- colorspaces.
-
- This simulation does not have such hardware, so instead it synthesizes
- a frame on the fly for each local pin as required. The frame is
- synthesized from common state information, so the images produced
- should be comparable from pin to pin. CHardwareSimulation is used as
- a base class for each simulated pin / hardware.
-
- History:
-
- created 3/9/2001
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-
-inline
-CHwSimTimer::
-CHwSimTimer(
- _In_ CHardwareSimulation *Parent
-)
- : KPassiveTimer( Parent->m_Sensor->GetDeviceObject() )
- , m_Parent( Parent )
-/*++
-
-Routine Description:
-
- CHwSimTimer object construction.
-
-Arguments:
-
- Parent -
- The parent CHardwareSimulation.
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-}
-
-void
-CHwSimTimer::Handler(
- _In_opt_ PVOID Context
-)
-/*++
-
-Routine Description:
-
- Punts to the HardwareSim...
-
-Arguments:
-
- Context -
- Our parent CHardwareSimulation.
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
- ((CHardwareSimulation *) Context)->FakeHardware();
-}
-
-/*************************************************/
-
-CHardwareSimulation::
-CHardwareSimulation (
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
-)
- : m_Sensor (Sensor)
- , m_IsrTimer(this)
- , m_ScatterGatherMappingsMax (SCATTER_GATHER_MAPPINGS_MAX)
- , m_TimePerFrame(ONESECOND/30)
- , m_PinID(PinID)
- , m_Synthesizer(nullptr)
- , m_Width(0)
- , m_Height(0)
- , m_ImageSize(0)
- , m_PinState(PinStopped)
- , m_NumMappingsCompleted(0)
- , m_ScatterGatherMappingsQueued(0)
- , m_ScatterGatherBytesQueued(0)
- , m_NumFramesSkipped(0)
- , m_InterruptTime(0)
- , m_LastReportedExposureTime(DEF_EXPOSURE_TIME) // Assume the default exposure time for now.
- , m_LastReportedWhiteBalance(0)
- , m_FaceDetectionDelay(1) // Start out reporting immediately.
-
-/*++
-
-Routine Description:
-
- CHardwareSimulation Construction.
-
-Arguments:
-
- Sensor -
- The parent CSensor object that contains state for the controls.
- PinID -
- The pin index.
-
-Return Value:
-
- None
-
---*/
-{
-
- PAGED_CODE();
-
- //
- // Initialize the timer's, and locks necessary to simulate this hardware.
- //
- InitializeListHead (&m_ScatterGatherMappings);
-
- //
- // Initialize the entry lookaside.
- //
- ExInitializeNPagedLookasideList (
- &m_ScatterGatherLookaside,
- NULL,
- NULL,
- POOL_NX_ALLOCATION,
- sizeof (SCATTER_GATHER_ENTRY),
- 'nEGS',
- 0
- );
-
- m_StartTime.QuadPart = 0;
-}
-
-CHardwareSimulation::
-~CHardwareSimulation()
-{
- PAGED_CODE();
-
- // Cancel the timer, just in case its running.
- m_IsrTimer.Cancel();
-
- //
- // Delete the scatter / gather lookaside list.
- //
- ExDeleteNPagedLookasideList (&m_ScatterGatherLookaside);
-}
-
-/*************************************************/
-
-BOOLEAN
-CHardwareSimulation::
-Initialize()
-
-/*++
-
-Routine Description:
-
- Initialize the hardware simulation
-
-Arguments:
-
- [none]
-
-Return Value:
-
- TRUE - CHardwareSimulation is fully initialized.
-
---*/
-
-{
- PAGED_CODE();
-
- return m_IsrTimer.IsValid() ;
-}
-
-/*************************************************/
-
-NTSTATUS
-CHardwareSimulation::
-Start (
- IN CSynthesizer *ImageSynth,
- IN LONGLONG TimePerFrame,
- IN ULONG Width,
- IN ULONG Height,
- IN ULONG ImageSize
-)
-
-/*++
-
-Routine Description:
-
- Start the hardware simulation. This will kick the interrupts on,
- begin issuing DPC's, filling in capture information, etc...
- We keep track of starvation starting at this point.
-
-Arguments:
-
- ImageSynth -
- The image synthesizer to use to generate pictures to display
- on the capture buffer.
-
- TimePerFrame -
- The time per frame... we issue interrupts this often.
-
- Width -
- The image width
-
- Height -
- The image height
-
- ImageSize -
- The size of the image. We allocate a temporary scratch buffer
- based on this size to fake hardware.
-
-Return Value:
-
- Success / Failure (typical failure will be out of memory on the
- scratch buffer, etc...)
-
---*/
-
-{
-
- PAGED_CODE();
-
- // Prevent state-changes during this call.
- KScopedMutex Lock(m_ListLock);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- m_Synthesizer = ImageSynth;
- m_TimePerFrame = TimePerFrame;
- m_ImageSize = ImageSize;
- m_Height = Height;
- m_Width = Width;
-
- m_NumMappingsCompleted = 0;
- m_ScatterGatherMappingsQueued = 0;
- m_NumFramesSkipped = 0;
- m_InterruptTime = 0;
-
- KeQuerySystemTime (&m_StartTime);
-
- if( !m_Synthesizer->Initialize() )
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
-
- //
- // If everything is ok, start issuing interrupts.
- //
- if (NT_SUCCESS (Status))
- {
- LARGE_INTEGER NextTime;
- NextTime.QuadPart = m_StartTime.QuadPart + m_TimePerFrame;
-
- m_PinState = PinRunning;
- m_IsrTimer.Set( NextTime );
- }
-
- return Status;
-}
-
-/*************************************************/
-
-NTSTATUS
-CHardwareSimulation::
-Pause (
- BOOLEAN Pausing
-)
-
-/*++
-
-Routine Description:
-
- Pause the hardware simulation... When the hardware simulation is told
- to pause, it stops stops the timer, but it does not reset the counters.
-
-Arguments:
-
- Pausing -
- Indicates whether the hardware is pausing or not.
-
- TRUE -
- Pause the hardware
-
- FALSE -
- Unpause the hardware from a previous pause
-
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
-
- PAGED_CODE();
-
- {
- // Prevent state-changes during this call.
- KScopedMutex Lock(m_ListLock);
-
- if (Pausing && m_PinState == PinRunning)
- {
- //
- // If we were running, stop completing mappings, etc...
- //
- m_PinState = PinPaused;
- }
- else if (!Pausing && m_PinState == PinPaused)
- {
- //
- // For unpausing the hardware, we need to compute the relative time
- // and restart interrupts.
- //
- LARGE_INTEGER UnpauseTime;
-
- KeQuerySystemTime (&UnpauseTime);
- m_InterruptTime = (ULONG) (
- (UnpauseTime.QuadPart - m_StartTime.QuadPart) /
- m_TimePerFrame
- );
-
- UnpauseTime.QuadPart = m_StartTime.QuadPart +
- (m_InterruptTime + 1) * m_TimePerFrame;
-
- m_PinState = PinRunning;
- m_IsrTimer.Set( UnpauseTime );
- }
- }
-
- // If we are pausing, it's best to stop the timer and not wait for another frame.
- if( Pausing )
- {
- m_IsrTimer.Cancel();
- }
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CHardwareSimulation::
-Stop()
-
-/*++
-
-Routine Description:
-
- Stop the hardware simulation...
-
- For us, stop the timer, free the synthesizer and flush the queue.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- //
- // If the hardware is told to stop while it's running, we need to
- // halt the interrupts first. If we're already paused, this has
- // already been done.
- //
-
- DBG_ENTER("(): m_PinID=%d", m_PinID);
-
- BOOLEAN bCancel = FALSE;
-
- {
- // Prevent state-changes during this call.
- KScopedMutex Lock(m_ListLock);
-
- bCancel = (m_PinState == PinRunning);
- m_PinState = PinStopped;
-
- // Free the synthesis buffer.
- m_Synthesizer->Destroy();
-
- //
- // Free S/G buffer
- //
- FreeSGList( &m_ScatterGatherMappings, L"StreamPointer Stop SG List" );
-
- m_ScatterGatherMappingsQueued=0;
- m_NumMappingsCompleted = 0;
- m_ScatterGatherBytesQueued = 0;
- }
-
- // If running, stop the timer to make sure we don't try to deliver one last frame.
- if( bCancel )
- {
- m_IsrTimer.Cancel();
- }
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CHardwareSimulation::
-Reset()
-{
- PAGED_CODE();
-
- KScopedMutex Lock( m_ListLock );
- DBG_ENTER("(): m_PinID=%d", m_PinID);
-
- FreeSGList( &m_ScatterGatherMappings, L"StreamPointer Reset SG List" );
-
- m_ScatterGatherMappingsQueued=0;
- m_NumMappingsCompleted = 0;
- m_ScatterGatherBytesQueued = 0;
-
- DBG_LEAVE("(): m_PinID=%d", m_PinID);
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CHardwareSimulation::
-Reset (IN PKSPIN Pin)
-{
- PAGED_CODE();
-
- NTSTATUS status = STATUS_SUCCESS;
- if(Pin->ResetState == KSRESET_END)
- {
- KsPinAttemptProcessing(Pin, TRUE);
- }
- else
- {
- status = Reset();
- }
-
- return status;
-}
-
-ULONG
-CHardwareSimulation::
-ReadNumberOfMappingsCompleted()
-
-/*++
-
-Routine Description:
-
- Read the number of scatter / gather mappings which have been
- completed since the last reset of the simulated hardware
-
-Arguments:
-
- None
-
-Return Value:
-
- Total number of completed mappings.
-
---*/
-
-{
- PAGED_CODE();
-
- return m_NumMappingsCompleted;
-}
-
-/*************************************************/
-
-
-ULONG
-CHardwareSimulation::
-ProgramScatterGatherMappings (
- IN PKSSTREAM_POINTER *Clone,
- IN PUCHAR *Buffer,
- IN PKSMAPPING Mappings,
- IN ULONG MappingsCount,
- IN ULONG MappingStride
-)
-
-/*++
-
-Routine Description:
-
- Add a single entry to our queue. In practice our simulation can only
- accept one frame at a time, but we still base this code off of the
- avshws sample.
-
-Arguments:
-
- Buffer -
- The virtual address of the buffer mapped by the mapping list
-
- ClonePointer
- The KSStreamClone Pointer to be associated with the entry item
-
- Mappings -
- The KSMAPPINGS array corresponding to the buffer
-
- MappingsCount -
- The number of mappings in the mappings array
-
- MappingStride -
- The mapping stride used in initialization of AVStream DMA
-
-Return Value:
-
- Number of mappings actually inserted.
-
---*/
-
-{
- PAGED_CODE();
-
- ULONG MappingsInserted = 0;
-
- DBG_ENTER("(Clone=%p, Buffer=%p, MappingsCount=%d)",
- Clone, Buffer, MappingsCount);
-
- //
- // Protect our S/G list with a spinlock.
- //
- KScopedMutex Lock( m_ListLock );
-
- //
- // Loop through the scatter / gather list and break the buffer up into
- // chunks equal to the scatter / gather mappings. Stuff the virtual
- // addresses of these chunks on a list somewhere. We update the buffer
- // pointer the caller passes as a more convenient way of doing this.
- //
- // If I could just remap physical in the list to virtual easily here,
- // I wouldn't need to do it.
- //
- do
- {
- PSCATTER_GATHER_ENTRY Entry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- ExAllocateFromNPagedLookasideList (
- &m_ScatterGatherLookaside
- )
- );
-
- if (!Entry)
- {
- break;
- }
-
- Entry ->CloneEntry = nullptr;
- Entry -> Virtual = nullptr;
- Entry -> ByteCount = 0;
-
-
- Entry ->CloneEntry = *Clone;
- Entry -> CloneEntry -> StreamHeader -> PresentationTime.Time = 0;
- Entry -> CloneEntry -> StreamHeader -> OptionsFlags &= ~KSSTREAM_HEADER_OPTIONSF_TIMEVALID;
-
- Entry -> Virtual = *Buffer;
- Entry -> ByteCount = MappingsCount;
- Entry->PhotoConfirmationInfo = PHOTOCONFIRMATION_INFO();
-
- //
- // Move forward a specific number of bytes in chunking this into
- // mapping sized va buffers.
- //
- *Buffer += MappingsCount;
- Mappings = reinterpret_cast <PKSMAPPING> (
- (reinterpret_cast <PUCHAR> (Mappings) + MappingStride)
- );
-
- InsertTailList (&m_ScatterGatherMappings, &(Entry -> ListEntry));
- m_ScatterGatherMappingsQueued++;
- MappingsInserted = MappingsCount;
- DBG_TRACE("m_ScatterGatherMappingsQueued=%d", m_ScatterGatherMappingsQueued);
- m_ScatterGatherBytesQueued += MappingsCount;
-
- }
- while(FALSE);
-
- DBG_LEAVE(" MappingsInserted=%d", MappingsInserted );
-
- return MappingsInserted;
-
-}
-
-/**************************************************************************
-
- The following are helper functions used in the production of metadata.
- Since this is just a simulation, most "auto" modes get converted into
- a random value that is in range.
-
- While simple, this still requires writing a helper function for each
- piece of data.
-
-**************************************************************************/
-
-//
-// Translate Exposure settings into a "current value".
-//
-LONGLONG
-CHardwareSimulation::
-GetCurrentExposureTime()
-{
- PAGED_CODE();
-
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
- LONGLONG Value = 0;
- LPCSTR Mode = "[UNKNOWN]";
-
- if( pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO )
- {
- // Get random value in global setting's bound (LONG)
- // I'm abandoning the reported min/max and using something more reasonable.
- Value = GetRandom( MIN_EXPOSURE_TIME*5, DEF_EXPOSURE_TIME*5 );
- Mode = "KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO";
- }
-
- if( pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Value = pSettings->ExposureSetting.VideoProc.Value.ll;
- Mode = "KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL";
- }
-
- // Locked just reports the last value set...
- if( pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK )
- {
- Value = m_LastReportedExposureTime;
- Mode = "KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK";
- }
-
- DBG_TRACE("ExposureMode=0x%016llX (%s), Time=%llu00ns, LastReported=%llu00ns",
- pSettings->ExposureMode, Mode, Value, m_LastReportedExposureTime );
-
- m_LastReportedExposureTime = Value;
- return Value;
-}
-
-//
-// Translate White Balance into a "current value".
-//
-ULONG
-CHardwareSimulation::
-GetCurrentWhiteBalance()
-{
- PAGED_CODE();
-
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
- ULONG Value = 0;
-
- if( pSettings->WhiteBalanceMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO )
- {
- Value = (ULONG) GetRandom( pSettings->WhiteBalanceSetting.Min, pSettings->WhiteBalanceSetting.Max );
- }
-
- if( pSettings->WhiteBalanceMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Value = pSettings->WhiteBalanceSetting.VideoProc.Value.ul;
- }
-
- // Locked just reports the last value set...
- if( pSettings->WhiteBalanceMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK )
- {
- Value = m_LastReportedWhiteBalance;
- }
-
- m_LastReportedWhiteBalance= Value;
- return Value;
-}
-
-//
-// Translate ISO settings into a "current value".
-//
-ULONG
-CHardwareSimulation::
-GetCurrentISOSpeed()
-{
- PAGED_CODE();
-
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
- ULONG Value = 0;
-
- if( pSettings->ISOMode & KSCAMERA_EXTENDEDPROP_ISO_AUTO )
- {
- Value = GetRandom( (ULONG) 50, (ULONG) 3200 );
- }
- else if( pSettings->ISOMode & KSCAMERA_EXTENDEDPROP_ISO_MANUAL )
- {
- Value = pSettings->ISOValue;
- }
- else
- {
- Value = // Try converting any legacy presets to a manual value.
- IsoPreset2Value( pSettings->ISOMode );
- }
- return Value;
-}
-
-//
-// Translate Exposure Mode to an Exif Exposure Program value
-//
-USHORT
-CHardwareSimulation::
-GetExposureProgram()
-{
- PAGED_CODE();
-
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
- USHORT Value = 0; // Undefined.
-
- if( pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Value = 1; // Manual
- }
- if( pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_AUTO )
- {
- Value = 2; // Normal
- }
-
- // TODO: Extend SceneMode to ISP settings so I can use it here to capture Portrait mode, etc.
- return Value;
-}
-
-/*************************************************/
-
-//
-// Emit metadata here that is common to all pins.
-//
-// All derived classes' EmitMetadata() function must
-// call this function first.
-//
-void
-CHardwareSimulation::
-EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
-)
-{
- PAGED_CODE();
-
- NT_ASSERT(pStreamHeader);
-
- if (0 != (pStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_METADATA))
- {
- PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO)(pStreamHeader + 1);
- PKSSTREAM_METADATA_INFO pMetadata = (PKSSTREAM_METADATA_INFO) (pFrameInfo + 1);
- //PBYTE pData = (PBYTE) pMetadata->SystemVa;
- //ULONG BytesLeft = pMetadata->BufferSize;
-
- // A real driver might write focus state or other info here. We've got nothing.
- pMetadata->UsedSize = 0;
- }
- else
- {
- DBG_TRACE("Metadata not present...");
- }
-}
-
-void
-CHardwareSimulation::
-EmitFaceMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader,
- _In_ ULONG Count,
- _In_ ULONGLONG Flags,
- _In_ ULONG DelayLimit
-)
-/*++
-
-Routine Description:
-
- Helper function that emits FaceDetection metadata.
-
- Note: This function assumes a metadata buffer is present.
-
-Arguments:
-
- pStreamHeader -
- The frame's stream header.
-
- Count -
- The maximum number of faces to detect.
-
- Flags -
- A combination of the KSCAMERA_EXTENDEDPROP_FACEDETECTION_BLINK and
- KSCAMERA_EXTENDEDPROP_FACEDETECTION_BLINK flags passed to the face
- detection control. Used to decide what characterization data to
- present in the metadata.
-
- DelayLimit -
- The maximum number of frames to delay before generating the next
- face detection.
-
-Return Value:
-
- None.
-
---*/
-{
- PAGED_CODE();
-
- NT_ASSERT(pStreamHeader);
- NT_ASSERT(Count <= SIZEOF_ARRAY(m_LastFaceDetect.Data));
-
- // Do nothing if we're turned on, but they want no faces.
- if( Count==0 )
- {
- return;
- }
-
- if( --m_FaceDetectionDelay != 0 || // Count down our random delay for new face data.
- Count > m_LastFaceDetect.Count ) // Make sure we never emit more faces than requested.
- {
- ULONG CountReported = GetRandom( 0, Count );
-
- DBG_TRACE("Generating new faces (Count=%d, Flags=0x%016llX, Delay=%d)...",
- Count, Flags, DelayLimit);
-
- // Synthesize a new set of "detected" faces...
- m_LastFaceDetect.Header.MetadataId = (ULONG) MetadataId_Custom_FaceDetection;
- m_LastFaceDetect.Header.Size =
- sizeof(CAMERA_METADATA_FACEHEADER) + (sizeof(METADATA_FACEDATA) * CountReported);
-
- m_LastFaceDetect.Count = CountReported;
- m_LastFaceDetect.Flags = Flags;
- m_LastFaceDetect.Timestamp = pStreamHeader->PresentationTime.Time ;
-
- DBG_TRACE("Count=%d, Flags=0x%016llX, Time=0x%016llX",
- m_LastFaceDetect.Count,
- m_LastFaceDetect.Flags,
- m_LastFaceDetect.Timestamp );
-
- // Report face data...
- for( ULONG i=0; i<CountReported; i++ )
- {
- RtlZeroMemory( &m_LastFaceDetect.Data[i], sizeof(m_LastFaceDetect.Data[i]) );
-
- RECT &rect = m_LastFaceDetect.Data[i].Region;
- rect.top = GetRandom((LONG)0, TO_Q31(1)-2);
- rect.left = GetRandom((LONG)0, TO_Q31(1)-2);
- rect.bottom = GetRandom(rect.top+1, TO_Q31(1)-1);
- rect.right = GetRandom(rect.left+1, TO_Q31(1)-1);
-
- m_LastFaceDetect.Data[i].confidenceLevel = GetRandom((ULONG)25, 100); // Don't bother reporting really low confidence faces.
-
- DBG_TRACE(" #%d: [(0x%08X,0x%08X), (0x%08X,0x%08X)](Conf=%d%%)",
- i,
- rect.top, rect.left, rect.bottom, rect.right,
- m_LastFaceDetect.Data[i].confidenceLevel);
-
- if( Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_BLINK )
- {
- m_LastFaceDetect.Data[i].BlinkScoreLeft = GetRandom((ULONG)0, 100); // Should really skew these numbers more in favor of no blink.
- m_LastFaceDetect.Data[i].BlinkScoreRight = GetRandom((ULONG)0, 100);
-
- DBG_TRACE(" --- Blink(left=%d%%, right=%d%%)",
- m_LastFaceDetect.Data[i].BlinkScoreLeft,
- m_LastFaceDetect.Data[i].BlinkScoreRight);
- }
-
- if( Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_SMILE )
- {
- m_LastFaceDetect.Data[i].FacialExpression = GetRandom((ULONG)0, 1) ? EXPRESSION_SMILE : 0;
- m_LastFaceDetect.Data[i].FacialExpressionScore = GetRandom((ULONG)0, 100);
-
- DBG_TRACE(" --- Smile(exp=%s, score=%d%%)",
- (m_LastFaceDetect.Data[i].FacialExpression==EXPRESSION_SMILE ? "Smile":"[unknown]"),
- m_LastFaceDetect.Data[i].FacialExpressionScore);
- }
- }
-
- // Randomly choose when to generate new facedetection data.
- m_FaceDetectionDelay = GetRandom( 1, DelayLimit );
- DBG_TRACE("Delay to next is %d", m_FaceDetectionDelay);
- }
-
- // The flags can change between face detection updates.
- // Drop the additional characterization data immediately, if requested.
- // We can hardly add it that fast since it might not be generated straight away.
- ULONGLONG LostFlags = m_LastFaceDetect.Flags & ~Flags;
- for( ULONG i=0; i<m_LastFaceDetect.Count; i++ )
- {
- if( LostFlags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_BLINK )
- {
- m_LastFaceDetect.Data[i].BlinkScoreLeft = 0;
- m_LastFaceDetect.Data[i].BlinkScoreRight = 0;
- }
- if( LostFlags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_SMILE )
- {
- m_LastFaceDetect.Data[i].FacialExpression = 0;
- m_LastFaceDetect.Data[i].FacialExpressionScore = 0;
- }
- }
- m_LastFaceDetect.Flags &= Flags;
-
- PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO)(pStreamHeader + 1);
- PKSSTREAM_METADATA_INFO pMetadata = (PKSSTREAM_METADATA_INFO) (pFrameInfo + 1);
- ULONG BytesLeft = pMetadata->BufferSize - pMetadata->UsedSize;
-
- // Write Face Detection Info here
- // Note: If we derived Video and Preview from a common base class, we
- // might use that to emit this information for both types.
- if( BytesLeft >= m_LastFaceDetect.Header.Size )
- {
- // Always write the most recently generated face detection info.
- RtlCopyMemory(
- ((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize,
- &m_LastFaceDetect,
- m_LastFaceDetect.Header.Size );
-
- DBG_TRACE("Emitting Face metadata...");
-
- BytesLeft -= m_LastFaceDetect.Header.Size;
- pMetadata->UsedSize += m_LastFaceDetect.Header.Size;
- }
- else
- {
- DBG_TRACE("WARNING: Out of metadata buffer...");
- }
-}
-
-//
-// PIN_STATE text for debug output.
-//
-static
-const char *
-GetPinStateTxt( PIN_STATE state )
-{
- PAGED_CODE();
-
- switch( state )
- {
- case PinStopped:
- return "STOPPED";
- case PinPaused:
- return "PAUSED";
- case PinRunning:
- return "RUNNING";
- }
- return "[UNKNOWN]";
-}
-
-NTSTATUS
-CHardwareSimulation::
-FillScatterGatherBuffers()
-
-/*++
-
-Routine Description:
-
- The hardware has synthesized a buffer and we're to fill a frame buffer.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER("() m_PinState=%s, m_PinID=0x%08X, m_ImageSize=0x%08X, m_ScatterGatherMappingsQueued=%u, "
- "m_ScatterGatherBytesQueue=0x%08X",
- GetPinStateTxt(m_PinState),
- m_PinID, m_ImageSize, m_ScatterGatherMappingsQueued, m_ScatterGatherBytesQueued);
-
- NTSTATUS ntStatus = STATUS_SUCCESS;
-
- ULONG BufferRemaining = m_ImageSize;
-
- //
- // If there isn't a frame buffer queued, we justskip the frame and consider
- // it starvation.
- //
- while (BufferRemaining &&
- !IsListEmpty(&m_ScatterGatherMappings) &&
- m_ScatterGatherBytesQueued >= BufferRemaining)
- {
- LIST_ENTRY *listEntry = RemoveHeadList (&m_ScatterGatherMappings);
- m_ScatterGatherMappingsQueued--;
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- listEntry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
-
- // Deal with cancellation.
- PIRP pIrp = KsStreamPointerGetIrp(SGEntry->CloneEntry, FALSE, FALSE);
- if (pIrp)
- {
- if (pIrp->Cancel)
- {
- DBG_TRACE( "Cancelling..." );
- FreeSGEntry( listEntry, L"StreamPointer Cancel SG List" );
- continue;
- }
- }
-
- //
- // Since we're software, we'll be accessing this by virtual address...
- //
- ULONG Stride = 0;
- if ( SGEntry->CloneEntry -> StreamHeader -> Size >= sizeof (KSSTREAM_HEADER) +
- sizeof (KS_FRAME_INFO))
- {
- PKS_FRAME_INFO FrameInfo = reinterpret_cast <PKS_FRAME_INFO> (SGEntry->CloneEntry->StreamHeader+1);
- Stride = (ULONG) ABS(FrameInfo->lSurfacePitch);
- }
-
- // Have the synthesizer output a frame to the buffer.
- ULONG BytesCopied = m_Synthesizer->DoCommit( SGEntry->Virtual, SGEntry->ByteCount, Stride );
- NT_ASSERT( BytesCopied );
- DBG_TRACE( "BytesCopied = %d", BytesCopied );
-
- //Adding time stamp
- if(m_PhotoConfirmationEntry.isRequired())
- {
- SGEntry -> CloneEntry -> StreamHeader -> PresentationTime.Time =
- m_PhotoConfirmationEntry.getTime();
- DBG_TRACE("Using Photo Confirmation time = 0x%016llX", m_PhotoConfirmationEntry.getTime());
- }
- else
- {
- SGEntry -> CloneEntry -> StreamHeader -> PresentationTime.Time = ConvertQPCtoTimeStamp(NULL);
- DBG_TRACE("PresentationTime = 0x%016llX", SGEntry->CloneEntry->StreamHeader->PresentationTime.Time );
- }
-
- SGEntry -> CloneEntry -> StreamHeader -> PresentationTime.Numerator =
- SGEntry -> CloneEntry -> StreamHeader -> PresentationTime.Denominator = 1;
-
- SGEntry -> CloneEntry -> StreamHeader -> OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_TIMEVALID ;
-
- // Add metadata to the sample.
- EmitMetadata( SGEntry -> CloneEntry -> StreamHeader );
-
- BufferRemaining = 0; //-= BytesCopied;
- m_NumMappingsCompleted++;
- m_ScatterGatherBytesQueued -= SGEntry -> ByteCount;
-
- //
- // Release the scatter / gather entry back to our lookaside.
- //
- ExFreeToNPagedLookasideList (
- &m_ScatterGatherLookaside,
- reinterpret_cast <PVOID> (SGEntry)
- );
-
- }
-
- // Report an error if we used the last buffer.
- if (BufferRemaining)
- {
- //DBG_TRACE("BufferRemaining=%u", BufferRemaining);
- ntStatus = STATUS_INSUFFICIENT_RESOURCES;
- }
-
- DBG_LEAVE("() = 0x%08X", ntStatus);
- return ntStatus;
-}
-
-/**************************************************************************
-
- Debug helpers
-
-**************************************************************************/
-
-PCCHAR
-DVS_Text( ULONGLONG Flags )
-{
- PAGED_CODE();
-
- switch( Flags )
- {
- case KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_OFF: return "Off";
- case KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_ON: return "On";
- case KSCAMERA_EXTENDEDPROP_VIDEOSTABILIZATION_AUTO: return "Auto";
- default: return "Unknown";
- }
-}
-
-PCCHAR
-OIS_Text( ULONGLONG Flags )
-{
- PAGED_CODE();
-
- switch( Flags )
- {
- case KSCAMERA_EXTENDEDPROP_OIS_OFF: return "Off";
- case KSCAMERA_EXTENDEDPROP_OIS_ON: return "On";
- case KSCAMERA_EXTENDEDPROP_OIS_AUTO: return "Auto";
- default: return "Unknown";
- }
-}
-
-/**************************************************************************/
-
-void
-CHardwareSimulation::
-FakeHardware (
-)
-
-/*++
-
-Routine Description:
-
- Simulate an interrupt and what the hardware would have done in the
- time since the previous interrupt.
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-
-{
- PAGED_CODE();
-
- KScopedMutex Lock( m_ListLock );
-
- m_InterruptTime++;
-
- //
- // The hardware can be in a pause state in which case, it issues interrupts
- // but does not complete mappings. In this case, don't bother synthesizing
- // a frame and doing the work of looking through the mappings table.
- //
- if (m_PinState == PinRunning)
- {
- //
- // Generate a "time stamp" just to overlay it onto the capture image.
- // It makes it more exciting than bars that do nothing.
- //
- ULONGLONG time = ConvertQPCtoTimeStamp(NULL);
- DBG_TRACE("QPC=0x%016llX", time);
-
- m_Synthesizer->SetFrameNumber( m_InterruptTime );
- m_Synthesizer->SetRelativePts( (m_InterruptTime + 1) * m_TimePerFrame );
- m_Synthesizer->SetQpcTime( time );
-
- m_Synthesizer->DoSynthesize();
-
- CHAR Text[64];
-
- CExtendedProperty Control;
- m_Sensor->GetVideoStabilization( &Control );
- RtlStringCbPrintfA(Text, sizeof(Text), "DVS: %s", DVS_Text(Control.Flags));
- m_Synthesizer->OverlayText( 0, m_Height-38, 1, Text, BLACK, WHITE );
-
- m_Sensor->GetOpticalImageStabilization( &Control );
- RtlStringCbPrintfA(Text, sizeof(Text), "OIS: %s", OIS_Text(Control.Flags));
- m_Synthesizer->OverlayText( 0, m_Height-48, 1, Text, BLACK, WHITE );
-
- //
- // Fill scatter gather buffers
- //
- if (!NT_SUCCESS (FillScatterGatherBuffers ()))
- {
- InterlockedIncrement (PLONG (&m_NumFramesSkipped));
- }
-
- }
-
- //
- // Issue an interrupt to our hardware sink. This is a "fake" interrupt.
- // It will occur at DISPATCH_LEVEL.
- //
- m_Sensor -> Interrupt (m_PinID);
-
- //
- // Schedule the timer for the next interrupt time, if the pin is still running.
- //
- if( m_PinState == PinRunning )
- {
- LARGE_INTEGER NextTime;
- NextTime.QuadPart = m_StartTime.QuadPart +
- (m_TimePerFrame * (m_InterruptTime + 1));
-
-#ifdef ENABLE_TRACING // To keep us from a tight spin when trying to debug this code...
- LARGE_INTEGER Now;
- KeQuerySystemTime(&Now);
-
- if( Now.QuadPart >= NextTime.QuadPart )
- {
- NextTime.QuadPart = 0LL - m_TimePerFrame ;
- }
-
-#endif
- m_IsrTimer.Set( NextTime );
- }
-}
-
-ULONGLONG
-CHardwareSimulation::
-ConvertQPCtoTimeStamp(
- _In_opt_ PLARGE_INTEGER pQpcTime
-)
-/*++
-
-Routine Description:
-
- Get the QPC measured in 100ns units.
-
-Arguments:
-
- pQpcTime -
- An optional time value to convert. If NULL, use the current QPC.
-
-Return Value:
-
- ULONLONG -
- The time in 100ns increments.
-
---*/
-{
- PAGED_CODE();
-
- LARGE_INTEGER qpcTime = {0};
- LARGE_INTEGER qpcFrequency;
-
- qpcTime = KeQueryPerformanceCounter(&qpcFrequency);
-
- if( pQpcTime )
- {
- qpcTime = *pQpcTime;
- }
-
- return KSCONVERT_PERFORMANCE_TIME( qpcFrequency.QuadPart, qpcTime );
-}
-
-NTSTATUS
-CHardwareSimulation::
-GeneratePhotoConfirmation(
- _In_ ULONG PfsFrameNumber,
- _In_ LONGLONG time
-)
-/*++
-
-Routine Description:
-
- So a photo sim can ask a preview sim for a confirmation frame.
-
-Arguments:
-
- PfsFrameNumber -
- The VPS shot number.
- time -
- The precise time of the associated photo.
-
-Return Value:
-
- None
-
---*/
-{
- PAGED_CODE();
-
- KScopedMutex Lock( m_ListLock );
-
- if( PinRunning != m_PinState )
- {
- return STATUS_DEVICE_NOT_READY;
- }
-
- DBG_ENTER("( Index=%d, Time=0x%016llX )", PfsFrameNumber, time );
-
- m_PhotoConfirmationEntry = PHOTOCONFIRMATION_INFO( PfsFrameNumber, time );
-
- // We basically used the previously synthesized preview image
- NTSTATUS status = FillScatterGatherBuffers();
-
- //Clean up the photo confiramtion flag
- m_PhotoConfirmationEntry = PHOTOCONFIRMATION_INFO();
-
- if(NT_SUCCESS(status))
- {
- m_Sensor->Interrupt (m_PinID);
- }
-
- DBG_LEAVE("() = 0x%08X", status);
-
- return status;
-}
-
-void
-CHardwareSimulation::
-FreeSGEntry(
- _In_ PLIST_ENTRY Entry,
- _In_ PCWSTR EventName,
- _In_opt_ LPCGUID Activity,
- _In_ ULONG DataUsed
-)
-{
- PAGED_CODE();
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- Entry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
-
- NT_ASSERT(SGEntry->CloneEntry);
- NT_ASSERT(SGEntry->CloneEntry->StreamHeader);
-
- SGEntry->CloneEntry->StreamHeader->DataUsed = DataUsed;
-
- KsStreamPointerDelete(SGEntry->CloneEntry);
-
- //
- // Release the scatter / gather entry back to our lookaside.
- //
- ExFreeToNPagedLookasideList (
- &m_ScatterGatherLookaside,
- SGEntry
- );
-}
-
-void
-CHardwareSimulation::
-FreeSGList(
- _In_ PLIST_ENTRY List,
- _In_ PCWSTR EventName,
- _In_opt_ LPCGUID Activity
-)
-{
- PAGED_CODE();
-
- while(!IsListEmpty(List))
- {
- PLIST_ENTRY head = RemoveHeadList(List);
- m_ScatterGatherMappingsQueued--;
- FreeSGEntry( head, EventName, Activity );
- }
-}
-
-//
-// Get the current frame settings.
-//
-ISP_FRAME_SETTINGS *
-CHardwareSimulation::
-GetIspSettings(void)
-{
- PAGED_CODE();
-
- return m_Sensor->GetGlobalIspSettings();
-}
diff --git a/avscamera/sys/hwsim.h b/avscamera/sys/hwsim.h
deleted file mode 100644
index 247de1f0..00000000
--- a/avscamera/sys/hwsim.h
+++ /dev/null
@@ -1,316 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- hwsim.h
-
- Abstract:
-
- This file contains the definition of the base class, CHardwareSimulation,
- used to simulate a camera's capture stream.
-
- Our simulation cannot mimic a real camera with any precision. A real
- camera would likely have dedicated hardware to provide interrupts, do
- DMA transfers of frames from an internal buffer as well as do scaling
- and on-the-fly colorspace and planar format conversions so as to supply
- frames for preview, video and photo in varying resolutions and
- colorspaces.
-
- This simulation does not have such hardware, so instead it synthesizes
- a frame on the fly for each local pin as required. The frame is
- synthesized from common state information, so the images produced
- should be comparable from pin to pin. CHardwareSimulation is used as
- a base class for each simulated pin / hardware.
-
- A CHardwareSimulation contains state, a list of frame bufferss and a
- timer that is used in place of a hardware interrupt. The timer
- schedules a workitem that is used to synthesize an image, select a
- buffer and copy that image into the buffer.
-
- Specializations of CHardwareSimulation provide differing metadata and
- implement specialized functionality for photo sequence and variable
- photo sequence.
-
- History:
-
- created 3/9/2001
-
-**************************************************************************/
-
-#define SCATTER_GATHER_MAPPINGS_MAX 128
-
-// forward class references
-class CSensor;
-class CHardwareSimulation;
-class CHwSimTimer;
-
-// internal structure definitions
-
-// Face metadata structure. Face metadata can be synthesized on any pin.
-class CAMERA_METADATA_FACE_DETECTION
- : public CAMERA_METADATA_FACEHEADER
-{
-public:
- METADATA_FACEDATA Data[MAX_FACES];
-};
-
-// Information about each frame buffer in the queue.
-typedef struct _SCATTER_GATHER_ENTRY
-{
- LIST_ENTRY ListEntry;
- PKSSTREAM_POINTER CloneEntry;
- PUCHAR Virtual;
- ULONG ByteCount;
- PHOTOCONFIRMATION_INFO PhotoConfirmationInfo;
-} SCATTER_GATHER_ENTRY, *PSCATTER_GATHER_ENTRY;
-
-//
-// A specialization of a KPassiveTimer that holds a back pointer to the
-// CHardwareSimulation that owns it.
-//
-class CHwSimTimer
- : public KPassiveTimer
-{
- CHardwareSimulation *m_Parent;
-
-public:
- CHwSimTimer(
- _In_ CHardwareSimulation *Parent
- );
-
- //
- // Sets the timer
- //
- BOOLEAN
- Set(
- _In_ LARGE_INTEGER DueTime
- );
-
-private:
- static
- void
- Handler(
- _In_opt_ PVOID Context
- );
-};
-
-class CHardwareSimulation
-{
-protected:
- CSynthesizer *m_Synthesizer; // Synthesizer for various formats.
- LONGLONG m_TimePerFrame;
- ULONG m_Width;
- ULONG m_Height;
- ULONG m_ImageSize;
- LONG m_PinID;
- KMutex m_ListLock;
- LIST_ENTRY m_ScatterGatherMappings;
-
- NPAGED_LOOKASIDE_LIST m_ScatterGatherLookaside;
- PIN_STATE m_PinState;
- ULONG m_ScatterGatherMappingsMax;
- ULONG m_NumMappingsCompleted;
- ULONG m_ScatterGatherMappingsQueued;
- ULONG m_ScatterGatherBytesQueued;
- ULONG m_NumFramesSkipped;
- ULONG m_InterruptTime;
- LARGE_INTEGER m_StartTime;
-
- CSensor *m_Sensor;
- CHwSimTimer m_IsrTimer;
-
- PHOTOCONFIRMATION_INFO m_PhotoConfirmationEntry;
-
- // Cached values used for Locking simulated state.
- LONGLONG m_LastReportedExposureTime;
- ULONG m_LastReportedWhiteBalance;
-
- // Used to simulate the skipping of frames when reporting face detection data.
- ULONG m_FaceDetectionDelay;
- CAMERA_METADATA_FACE_DETECTION m_LastFaceDetect;
-
- // Copy a synthesized framebuffer.
- virtual
- NTSTATUS
- FillScatterGatherBuffers();
-
- // Overloadable function for attaching metadata to a frame.
- virtual
- void
- EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
- );
-
- // Helper function to generate random face metadata.
- void
- EmitFaceMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader,
- _In_ ULONG Count,
- _In_ ULONGLONG Flags,
- _In_ ULONG DelayLimit=30
- );
-
- // Release an entry from our queue.
- void
- FreeSGEntry(
- _In_ PLIST_ENTRY Entry,
- _In_ PCWSTR EventName=L"StreamPointer freed",
- _In_opt_ LPCGUID Activity=NULL,
- _In_ ULONG DataUsed=0
- );
-
- // Release our entire queue.
- void
- FreeSGList(
- _In_ PLIST_ENTRY List,
- _In_ PCWSTR EventName=L"StreamPointer freed",
- _In_opt_ LPCGUID Activity=NULL
- );
-
-public:
-
- // Debug helper
- LONG GetSkippedFrameCount()
- {
- return m_NumFramesSkipped;
- }
-
- // Constructor
- CHardwareSimulation (
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
- );
-
- // Destructor
- virtual
- ~CHardwareSimulation ();
-
- // Periodic interrupt handling
- virtual
- void
- FakeHardware (
- );
-
- // Start streaming.
- virtual
- NTSTATUS
- Start (
- CSynthesizer *ImageSynth,
- IN LONGLONG TimePerFrame,
- IN ULONG Width,
- IN ULONG Height,
- IN ULONG ImageSize
- );
-
- // Pause streaming
- virtual
- NTSTATUS
- Pause (
- IN BOOLEAN Pausing
- );
-
- // Stop streaming.
- virtual
- NTSTATUS
- Stop();
-
- // Reset streaming.
- virtual
- NTSTATUS
- Reset(
- IN PKSPIN Pin
- );
-
- // Reset streaming.
- virtual
- NTSTATUS
- Reset();
-
- // Add a frame buffer to our queue.
- virtual
- ULONG
- ProgramScatterGatherMappings (
- IN PKSSTREAM_POINTER *Clone,
- IN PUCHAR *Buffer,
- IN PKSMAPPING Mappings,
- IN ULONG MappingsCount,
- IN ULONG MappingStride
- );
-
- // Initialization.
- virtual
- BOOLEAN
- Initialize();
-
- // Number of frames completed during this run.
- ULONG
- ReadNumberOfMappingsCompleted();
-
- // Get the QPC measured in 100ns units.
- ULONGLONG
- ConvertQPCtoTimeStamp(
- _In_opt_ PLARGE_INTEGER pQpcTime
- );
-
- // Get the current frame settings.
- virtual
- ISP_FRAME_SETTINGS *
- GetIspSettings(void);
-
- // So a photo sim can ask a preview sim for a confirmation frame.
- NTSTATUS
- GeneratePhotoConfirmation(
- _In_ ULONG PfsFrameNumber,
- _In_ LONGLONG time
- );
-
- // Get the exposure value for the current frame.
- LONGLONG
- GetCurrentExposureTime();
-
- // Get the White balance for the current frame.
- ULONG
- GetCurrentWhiteBalance();
-
- // Get the ISO Speed value for the current frame.
- ULONG
- GetCurrentISOSpeed();
-
- // Get the Lens position for the current frame.
- ULONG
- GetCurrentLensPosition();
-
- // Get the Scene Mode for the current frame.
- ULONG
- GetCurrentSceneMode();
-
- // Translate Exposure Mode to an Exif Exposure Program value
- USHORT
- GetExposureProgram();
-
- // Pin state accessor...
- PIN_STATE
- GetState()
- {
- return m_PinState;
- }
-
- friend class CHwSimTimer;
-};
-
-//
-// Sets the timer using our callback and our parent CHardwareSimulation.
-//
-inline
-BOOLEAN
-CHwSimTimer::
-Set(
- _In_ LARGE_INTEGER DueTime
-)
-{
- return KPassiveTimer::Set( DueTime, Handler, m_Parent );
-}
diff --git a/avscamera/sys/imagecapture.cpp b/avscamera/sys/imagecapture.cpp
deleted file mode 100644
index b236f141..00000000
--- a/avscamera/sys/imagecapture.cpp
+++ /dev/null
@@ -1,321 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- imagecapture.cpp
-
- Abstract:
-
- An implementation of CImageCapturePin
-
- History:
-
- created 3/8/2001
-
-**************************************************************************/
-
-#include "Common.h"
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-CImageCapturePin::
-CImageCapturePin(
- _In_ PKSPIN Pin
-) : CCapturePin (Pin)
-{
- PAGED_CODE();
-}
-
-NTSTATUS
-CImageCapturePin::
-DispatchCreate(
- _In_ PKSPIN Pin,
- _In_ PIRP Irp
-)
-/*++
-
-Routine Description:
-
- Static member function called when a pin is created. Instantiate a
- CImageCapturePin and attach it to our filter object.
-
-Arguments:
-
- Pin -
- The KSPIN to wrap.
-
- Irp -
- The IRP assocated with this request.
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- DBG_ENTER("(Pin=%d)", Pin->Id);
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- CCaptureFilter* pFilter = reinterpret_cast <CCaptureFilter*>(KsPinGetParentFilter(Pin)->Context);
- CImageCapturePin *CapPin = new (NonPagedPoolNx) CImageCapturePin (Pin);
-
- if( !CapPin )
- {
- // Fail if we couldn't create the pin.
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
- else
- {
- // Query the filter for the PhotoMode so we can figure out how many frames should be allocated.
- CExtendedPhotoMode Mode;
- Mode.PinId = Pin->Id; // Use Pin ID from KS.
- Status = pFilter->GetPhotoMode( &Mode );
-
- // CSensor::GetPhotoMode could fail if the framework gives us a Pin ID that doesn't match our descriptors...
- if( NT_SUCCESS(Status) )
- {
- // Override the number of frames.
- CapPin->SetDesiredFrames(
- ( (Mode.Flags & KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE) ?
- Mode.RequestedHistoryFrames() : 1)
- + IMAGE_CAPTURE_PIN_MINIMUM_FRAMES );
-
- Status =
- CapPin->Initialize();
- }
- }
-
- if (NT_SUCCESS (Status))
- {
- //
- // Adjust the stream header size. The video packets have extended
- // header info (KS_FRAME_INFO).
- //
- pFilter->setPin(CapPin, Pin->Id);
- }
- else
- {
- // Clean up.
- delete CapPin;
- }
-
- DBG_LEAVE("(Pin=%d)=0x%08X", Pin->Id, Status);
- return Status;
-}
-
-
-NTSTATUS
-CImageCapturePin::
-Close(
- _In_ PIRP Irp
-)
-{
- PAGED_CODE();
-
- Reset();
-
- return STATUS_SUCCESS;
-}
-
-// ImageCapturePinDispatch:
-//
-// This is the dispatch table for the capture pin. It provides notifications
-// about creation, closure, processing, data formats, etc...
-// just a copy of CapturePinDispatch for now.
-//
-DEFINE_CAMERA_KSPIN_DISPATCH( ImageCapturePinDispatch, CImageCapturePin );
-
-
-//
-// ImagePinAllocatorFraming:
-//
-// This is the simple framing structure for the capture pin. Note that this
-// will be modified via KsEdit when the actual capture format is determined.
-// just a copy of CapturePinAllocatorFraming for now.
-//
-DECLARE_SIMPLE_FRAMING_EX (
- ImageCapturePinAllocatorFraming,
- STATICGUIDOF (KSMEMORY_TYPE_KERNEL_NONPAGED),
- KSALLOCATOR_REQUIREMENTF_SYSTEM_MEMORY |
- KSALLOCATOR_REQUIREMENTF_PREFERENCES_ONLY,
- 4,
- 0,
- 2 * PAGE_SIZE,
- 2 * PAGE_SIZE
-);
-
-const
-KS_DATARANGE_VIDEO
-FormatYUY2Image_Capture =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- DMAX_X *DMAX_Y * 2, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x32595559, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_YUY2,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 8 * 2 * 30 * D_X * D_Y, // MinBitsPerSecond;
- 8 * 2 * 30 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 2 * 8 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 16, // WORD biBitCount;
- FOURCC_YUY2, // DWORD biCompression;
- DMAX_X *DMAX_Y * 2, // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-const
-KS_DATARANGE_VIDEO
-FormatNV12Image_Capture =
-{
-
- //
- // KSDATARANGE
- //
- {
- sizeof (KS_DATARANGE_VIDEO), // FormatSize
- 0, // Flags
- 0, // SampleSize
- 0, // Reserved
- STATICGUIDOF (KSDATAFORMAT_TYPE_VIDEO), // aka. MEDIATYPE_Video
- 0x3231564E, 0x0000, 0x0010, 0x80, 0x00,
- 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71, //aka. MEDIASUBTYPE_NV12,
- STATICGUIDOF (KSDATAFORMAT_SPECIFIER_VIDEOINFO) // aka. FORMAT_VideoInfo
- },
-
- TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
- FALSE, // BOOL, bTemporalCompression (all I frames?)
- 0, // Reserved (was StreamDescriptionFlags)
- 0, // Reserved (was MemoryAllocationFlags
- // (KS_VIDEO_ALLOC_*))
-
- //
- // _KS_VIDEO_STREAM_CONFIG_CAPS
- //
- {
- STATICGUIDOF( KSDATAFORMAT_SPECIFIER_VIDEOINFO ), // GUID
- KS_AnalogVideo_None, // AnalogVideoStandard
- DMAX_X, DMAX_Y, // InputSize, (the inherent size of the incoming signal
- // with every digitized pixel unique)
- D_X,D_Y, // MinCroppingSize, smallest rcSrc cropping rect allowed
- DMAX_X, DMAX_Y, // MaxCroppingSize, largest rcSrc cropping rect allowed
- 8, // CropGranularityX, granularity of cropping size
- 1, // CropGranularityY
- 8, // CropAlignX, alignment of cropping rect
- 1, // CropAlignY;
- D_X, D_Y, // MinOutputSize, smallest bitmap stream can produce
- DMAX_X, DMAX_Y, // MaxOutputSize, largest bitmap stream can produce
- 8, // OutputGranularityX, granularity of output bitmap size
- 1, // OutputGranularityY;
- 0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
- 0, // StretchTapsY
- 0, // ShrinkTapsX
- 0, // ShrinkTapsY
- 333667, // MinFrameInterval, 100 nS units
- 640000000, // MaxFrameInterval, 100 nS units
- 12 * 30 * D_X * D_Y, // MinBitsPerSecond;
- 12 * 30 * DMAX_X * DMAX_Y, // MaxBitsPerSecond;
- },
-
- //
- // KS_VIDEOINFOHEADER (default format)
- //
- {
- 0, 0, 0, 0, // RECT rcSource;
- 0, 0, 0, 0, // RECT rcTarget;
- DMAX_X *DMAX_Y * 12 * 30, // DWORD dwBitRate;
- 0L, // DWORD dwBitErrorRate;
- 333667, // REFERENCE_TIME AvgTimePerFrame;
- sizeof (KS_BITMAPINFOHEADER), // DWORD biSize;
- DMAX_X, // LONG biWidth;
- DMAX_Y, // LONG biHeight;
- 1, // WORD biPlanes;
- 12, // WORD biBitCount;
- FOURCC_NV12, // DWORD biCompression;
- DWORD(DMAX_X *DMAX_Y * 1.5), // DWORD biSizeImage;
- 0, // LONG biXPelsPerMeter;
- 0, // LONG biYPelsPerMeter;
- 0, // DWORD biClrUsed;
- 0 // DWORD biClrImportant;
- }
-};
-
-
-//
-// CapturePinDataRanges:
-//
-// This is the list of data ranges supported on the capture pin. We support
-// two: one RGB24, and one YUY2.
-//
-const
-PKSDATARANGE
-ImageCapturePinDataRanges [IMAGE_CAPTURE_PIN_DATA_RANGE_COUNT] =
-{
- (PKSDATARANGE) &FormatYUY2Image_Capture,
- (PKSDATARANGE) &FormatNV12Image_Capture
-}; \ No newline at end of file
diff --git a/avscamera/sys/imagecapture.h b/avscamera/sys/imagecapture.h
deleted file mode 100644
index 1e11c31a..00000000
--- a/avscamera/sys/imagecapture.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- imagecapture.h
-
- Abstract:
-
- Image Capture Pin - A specialization of a capture pin.
-
- CImageCapturePin defines a unique list of data ranges for the image
- pin.
-
- History:
-
- created 3/8/2001
-
-**************************************************************************/
-#pragma once
-
-#include "capture.h"
-
-class CImageCapturePin : public CCapturePin
-{
-public:
- static NTSTATUS DispatchCreate(
- _In_ PKSPIN Pin,
- _In_ PIRP Irp
- );
-
-private:
- virtual
- NTSTATUS Close(
- _In_ PIRP Irp
- );
-
- CImageCapturePin(
- _In_ PKSPIN Pin
- );
-};
diff --git a/avscamera/sys/imagehwsim.cpp b/avscamera/sys/imagehwsim.cpp
deleted file mode 100644
index 64d5eb5d..00000000
--- a/avscamera/sys/imagehwsim.cpp
+++ /dev/null
@@ -1,1430 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- ImageHwSim.cpp
-
- Abstract:
-
- This file contains the implementation of the CImageHardwareSimulation
- class.
-
- This is a specialization of CHardwareSimulation that provides photo-
- specific metadata and implements specialized functionality for photo,
- photo sequence and variable photo sequence.
-
- History:
-
- created 3/9/2001
-
-**************************************************************************/
-
-#include "Common.h"
-
-/**************************************************************************
-
- PAGEABLE CODE
-
-**************************************************************************/
-
-#ifdef ALLOC_PRAGMA
-#pragma code_seg("PAGE")
-#endif // ALLOC_PRAGMA
-
-
-CImageHardwareSimulation::
-CImageHardwareSimulation (
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
-)
- : CHardwareSimulation( Sensor, PinID )
- , m_Clock(NULL)
- , m_PfsLoopLimit(0)
- , m_PfsFrameLimit(0)
- , m_pIspSettings(nullptr)
- , m_PfsLoopNumber(0)
- , m_PfsFrameNumber(0)
- , m_GlobalFrameNumber(0)
- , m_bEndOfSequence(FALSE)
- , m_PastBufferCount(0) // Zero only when the simulation inits.
-
-/*++
-
-Routine Description:
-
- Construct a hardware simulation
-
-Arguments:
-
- Sensor -
- The hardware sink interface. This is used to trigger
- fake interrupt service routines from.
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- InitializeListHead (&m_BurstList);
-}
-
-CImageHardwareSimulation::
-~CImageHardwareSimulation()
-{
-
- PAGED_CODE();
-
- SAFE_DELETE( m_pIspSettings );
-
- if (m_Clock)
- {
- m_Clock -> Release ();
- m_Clock = NULL;
- }
-}
-
-/*************************************************/
-
-NTSTATUS
-CImageHardwareSimulation::
-Start (
- _In_ CSynthesizer *ImageSynth,
- _In_ ULONG Width,
- _In_ ULONG Height,
- _In_ ULONG ImageSize,
- _In_ PIN_MODE pinMode
-)
-
-/*++
-
-Routine Description:
-
- Start capturing frames. This turns on the timer and begins frame capture,
- but it we do not deliver frames until we receive a Trigger. We keep track
- of starvation starting at this point.
-
-Arguments:
-
- ImageSynth -
- The image synthesizer to use to generate pictures to display
- on the capture buffer.
-
- Width -
- The image width
-
- Height -
- The image height
-
- ImageSize -
- The size of the image. We allocate a temporary scratch buffer
- based on this size to fake hardware.
-
- PinMode -
- Normal or photosequence.
-
-
-Return Value:
-
- Success / Failure (typical failure will be out of memory on the
- scratch buffer, etc...)
-
---*/
-
-{
-
- PAGED_CODE();
-
- DBG_ENTER("(Width=%d, Height=%d, ImageSize=%d, pinMode=%s): m_PinID=%d",
- Width, Height, ImageSize, pinMode?"PinBurstMode":"PinNormalMode", m_PinID );
-
- NTSTATUS Status = STATUS_SUCCESS;
-
- // Prevent state-changes during this call.
- KScopedMutex Lock(m_ListLock);
-
- m_Synthesizer = ImageSynth;
-
- NT_ASSERT(ImageSize);
- m_ImageSize = ImageSize;
- m_Height = Height;
- m_Width = Width;
-
- m_NumMappingsCompleted = 0;
- m_ScatterGatherMappingsQueued = 0;
- m_NumFramesSkipped = 0;
- m_InterruptTime = 0;
- m_bTriggered = FALSE;
- m_bEndOfSequence = FALSE;
- m_pClone = NULL;
- m_bPastBufferTrigger = FALSE;
- m_PinMode = pinMode;
- m_TriggerTime = 0;
- m_bFlashed = FALSE;
-
- DBG_TRACE("m_bTriggered=FALSE, m_bPastBufferTrigger=FALSE");
-
- m_FlashStatus = 0;
-
- // Initialize VPS counters.
- m_PfsLoopNumber = 0 ;
- m_PfsFrameNumber= 0 ;
- m_GlobalFrameNumber = 0;
-
- KeQuerySystemTime (&m_StartTime);
-
- if( !m_Synthesizer->Initialize() )
- {
- Status = STATUS_INSUFFICIENT_RESOURCES;
- }
-
- //
- // If everything is ok, start issuing interrupts.
- //
- if (NT_SUCCESS (Status))
- {
- LARGE_INTEGER NextTime;
- NextTime.QuadPart = m_StartTime.QuadPart + m_TimePerFrame;
-
- m_PinState = PinRunning;
- m_IsrTimer.Set( NextTime );
-
- }
-
- DBG_LEAVE("(Width=%d, Height=%d, ImageSize=%d, pinMode=%s): m_PinID=%d, Status=0x%08X",
- Width, Height, ImageSize, pinMode?"PinBurstMode":"PinNormalMode", m_PinID, Status );
-
- return Status;
-
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-Trigger(
- _In_ LONG mode
-)
-/*++
-
-Routine Description:
-
- Take a picture / Begin delivering frames.
-
-Arguments:
-
- mode -
- Normal trigger, start or stop photo sequence.
-
-
-Return Value:
-
- Success / Failure (typical failure will be out of memory on the
- scratch buffer, etc...)
-
---*/
-
-{
- PAGED_CODE();
-
- NTSTATUS status = STATUS_SUCCESS;
-
- DBG_ENTER( "(mode=0x%08X), m_PinMode=%d", mode, m_PinMode );
-
- KScopedMutex Lock( m_ListLock );
-
- //Start Trigger for Burst Mode
- if(mode & KS_VideoControlFlag_StartPhotoSequenceCapture)
- {
- if(m_bTriggered == FALSE && m_PinMode == PinBurstMode)
- {
- m_bPastBufferTrigger = TRUE;
- m_bTriggered = TRUE;
- DBG_TRACE("m_bTriggered=TRUE, m_bPastBufferTrigger=TRUE");
-
- status = STATUS_SUCCESS;
- }
- else
- {
- status = STATUS_INVALID_PARAMETER;
- }
- }
- //Stop Trigger for Burst Mode
- else if(mode & KS_VideoControlFlag_StopPhotoSequenceCapture)
- {
- if(m_bTriggered == TRUE && m_PinMode == PinBurstMode)
- {
- m_bTriggered = FALSE;
- DBG_TRACE("m_bTriggered=FALSE");
-
- // reset the PFS EOS, frame number and loop count.
- m_bEndOfSequence = FALSE;
- m_PfsFrameNumber = 0;
- m_PfsLoopNumber = 0;
-
- m_bFlashed = FALSE;
- status = STATUS_SUCCESS;
- }
- else
- {
- status = STATUS_INVALID_PARAMETER;
- }
- }
- //Normal Trigger
- else if(mode & KS_VideoControlFlag_Trigger )
- {
- if(m_PinMode == PinBurstMode)
- {
- status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- m_bTriggered = TRUE;
- m_bEndOfSequence = FALSE;
- DBG_TRACE("m_bTriggered=TRUE");
- }
- }
-
- DBG_LEAVE("()");
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS
-CImageHardwareSimulation::
-SetMode(
- _In_ ULONGLONG Flags,
- _In_ ULONG PastBuffers
-)
-/*++
-
-Routine Description:
-
- Set the photo sequence mode.
-
-Arguments:
-
- Flags -
- Normal or photo sequence.
-
- PastBuffers -
- Number of history frames to gather.
-
-
-Return Value:
-
- Success / Failure (typical failure will be out of memory on the
- scratch buffer, etc...)
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER( "(Flags=0x%016llX, PastBuffers=%d)", Flags, PastBuffers );
-
- if(m_bTriggered == TRUE)
- {
- return STATUS_INVALID_TRANSACTION;
- }
-
- m_PastBufferCount = PastBuffers;
-
- if(Flags & KSCAMERA_EXTENDEDPROP_PHOTOMODE_SEQUENCE)
- {
- m_PinMode = PinBurstMode;
- }
- else
- {
- m_PinMode = PinNormalMode;
- }
-
- DBG_LEAVE("()");
-
- return STATUS_SUCCESS;
-}
-
-//
-// Set the interval between frames here.
-//
-NTSTATUS
-CImageHardwareSimulation::
-SetPhotoFrameRate(
- _In_ ULONGLONG TimePerFrame
-)
-{
- PAGED_CODE();
-
- // Prevent state-changes during this call.
- KScopedMutex Lock(m_ListLock);
-
- m_TimePerFrame = TimePerFrame;
-
- //
- // Reschedule the timer if the hardware isn't being stopped.
- //
- if( m_PinState == PinRunning ) // && !m_StopHardware )
- {
- // First restart our start time. We can't use the old time.
- KeQuerySystemTime( &m_StartTime );
-
- //
- // Reschedule the timer for the next interrupt time.
- //
- m_StartTime.QuadPart += m_TimePerFrame;
- m_InterruptTime = 0;
-
- m_IsrTimer.Set( m_StartTime );
- }
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-Stop()
-
-/*++
-
-Routine Description:
-
- Stop the hardware simulation...
-
- Wait until the timer has stopped, flush the queue, dereference the clock
- and reset our state before returning.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- // If the hardware is told to stop while it's running, we need to
- // halt the interrupts first. If we're already paused, this has
- // already been done.
- //
-
- DBG_ENTER("(): m_PinID=%d", m_PinID);
-
- //
- // Protect the S/G list
- //
- KScopedMutex Lock( m_ListLock );
-
- CHardwareSimulation::Stop();
-
- //
- // Free S/G buffer
- //
- FreeSGList( &m_ScatterGatherMappings, L"StreamPointer Stop Burst List" );
-
- if (m_Clock)
- {
- m_Clock -> Release ();
- m_Clock = NULL;
- }
-
- m_bTriggered = FALSE;
- m_bEndOfSequence = FALSE;
- m_pClone = NULL;
- m_bPastBufferTrigger = FALSE;
- m_PinMode = PinNormalMode;
- m_TriggerTime = 0;
-
- DBG_TRACE("m_bTriggered=FALSE, m_bPastBufferTrigger=FALSE");
-
- DBG_LEAVE("(): m_PinID=%d", m_PinID);
-
- return STATUS_SUCCESS;
-}
-
-
-/*************************************************/
-
-
-//
-// Helper function that collects current settings into our metadata structure.
-//
-METADATA_IMAGEAGGREGATION
-CImageHardwareSimulation::
-GetMetadata()
-{
- PAGED_CODE();
-
- METADATA_IMAGEAGGREGATION Metadata;
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
-
- // Wipe the metadata so all settings will default to "Not Set".
- RtlZeroMemory( &Metadata, sizeof(Metadata) );
-
- // Identify the current PFS frame number.
- // If PFS not active, then this item is not present.
- Metadata.FrameId.Set = IsPfsActive();
- Metadata.FrameId.Value = (ULONG) m_PfsFrameNumber;
- DBG_TRACE("Metadata.FrameId.Set=%s, Metadata.FrameId.Value=%d",
- (Metadata.FrameId.Set?"Yes":"No"), Metadata.FrameId.Value);
-
- // Just reflect the exposure time from the setting.
- //Metadata.ExposureTime.Set = TRUE;
- //Metadata.ExposureTime.Value = GetCurrentExposureTime();
-
- // Just reflect the ISO Speed from the setting.
- Metadata.ISOSpeed = CMetadataLong(GetCurrentISOSpeed());
- DBG_TRACE("ISO=%d, ISO Flags=0x%016llX", Metadata.ISOSpeed.Value, pSettings->ISOMode);
-
- // TODO: Do we need to bracket this by whether or not a flash has been taken?
- // Report the current flash mode.
- Metadata.FlashOn = CMetadataLong((ULONG) pSettings->FlashMode);
-
- // Report the current flash power.
- Metadata.FlashPower = CMetadataLong(pSettings->FlashValue);
-
- // Set the White Balance lock state.
- Metadata.WhiteBalanceLocked = CMetadataLong(
- ( (pSettings->WhiteBalanceMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK)
- == KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK) );
-
- // Set the Exposure lock state.
- Metadata.ExposureLocked = CMetadataLong(
- ( (pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK)
- == KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_LOCK) );
-
- Metadata.ExposureTime =
- //CMetadataRational(GetCurrentExposureTime(), 10000000);
- CMetadataLongLong( GetCurrentExposureTime() );
-
- Metadata.LensPosition = CMetadataLong( pSettings->FocusSetting.VideoProc.Value.ul );
-
- Metadata.SceneMode = CMetadataULongLong(KSCAMERA_EXTENDEDPROP_SCENEMODE_AUTO); //TODO: Need to fill in real value from CCaptureFilter::m_SceneMode
-
- Metadata.WhiteBalanceMode = CMetadataLong((ULONG) pSettings->WhiteBalanceMode);
-
- CExtendedVidProcSetting Zoom;
- m_Sensor->GetZoom( &Zoom );
- Metadata.ZoomFactor = CMetadataLong(Zoom.GetLONG()); //TODO: Fill in a real value from zoom simulation.
-
- Metadata.FocusLocked = CMetadataLong(FALSE); //TODO: Fill in a real value when we complete the focus changes.
-
- // Add EVCompensation metadata...
- Metadata.EVCompensation = CMetadataEVCompensation(pSettings->EVCompensation.Mode, pSettings->EVCompensation.Value);
-
- Metadata.Orientation = CMetadataShort(Metadata_Orientation_TopBottomLeftRight); //TODO: Randomize?
-
- {
- LARGE_INTEGER SystemTime;
- LARGE_INTEGER LocalTime;
-
- KeQuerySystemTimePrecise( &SystemTime );
- ExSystemTimeToLocalTime( &SystemTime, &LocalTime );
- RtlTimeToTimeFields( &LocalTime, &Metadata.LocalTime.Time );
- Metadata.LocalTime.Set = TRUE;
- }
-
- Metadata.Make = CMetadataShortString("Make: Microsoft SOC Camera");
- Metadata.Model = CMetadataShortString( "Model: AvsCam" );
- Metadata.Software = CMetadataShortString( "Software: Microsoft Camera Sim" );
-
- Metadata.ColorSpace.Set = TRUE;
- Metadata.ColorSpace.Value = 0xFFFF; // 0xFFFF Means "uncalibrated". Use this value for all non-RGB formats.
-
- Metadata.Gamma = CMetadataRational();
-
- Metadata.MakerNote = CMetadataShortString( "Maker's Note..." );
-
- // Just reflect the exposure time from the setting.
- //Metadata.ExposureTime =
- // CMetadataRational( GetCurrentExposureTime(), 1000 ); // report exposure time as milliseconds.
-
- Metadata.FNumber = CMetadataRational(4); // Fake an FNumber of 4. // TODO: It looks like we might be able to calculate this.
-
- Metadata.ExposureProgram.Set = TRUE;
- Metadata.ExposureProgram.Value = GetExposureProgram();
-
- Metadata.ShutterSpeedValue = CMetadataSRational(); // TODO: Calculate this from the ExposureTime. ***
- Metadata.Aperture = CMetadataRational(4); // TODO: Calculate this from the F-Number. (We're currently faking the FNumber.)
- Metadata.Brightness = CMetadataSRational(0); // TODO: Find a more reasonable brightness value.
- Metadata.ExposureBias = CMetadataSRational(0); // TODO: More reasonable?
- Metadata.SubjectDistance = CMetadataRational(0xFFFFFFFF); // Distance in meters. Infinity. (Anything better?)
-
- Metadata.MeteringMode.Set = TRUE;
- Metadata.MeteringMode.Value = (USHORT) GetRandom( (ULONG) 1, (ULONG) 6); // Pick a number ... any number.
-
- Metadata.LightSource.Set = TRUE;
- Metadata.LightSource.Value = 1; // TODO: Pick a random value; but override when a flash occurs.
-
- Metadata.Flash.Set = TRUE;
- Metadata.Flash.Value = (UINT16) pSettings->FlashMode; // We assume that the flash fires when requested!
- DBG_TRACE("FlashMode=0x%016llX, FlashPower=%d", pSettings->FlashMode, pSettings->FlashValue);
-
- Metadata.FocalLength = CMetadataRational(); // TODO: Calculate?
- Metadata.FocalPlaneXResolution = CMetadataRational(); // TODO: Calculate?
- Metadata.FocalPlaneYResolution = CMetadataRational(); // TODO: Calculate?
- Metadata.ExposureIndex = CMetadataRational(); // TODO: Calculate?
-
- Metadata.ExposureMode.Set = TRUE;
- Metadata.ExposureMode.Value = 0 ; // Assume Auto exposure.
- if( pSettings->ExposureMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Metadata.ExposureMode.Value = 0 ; // Manual exposure.
- }
-
- Metadata.WhiteBalance.Set = TRUE;
- Metadata.WhiteBalance.Value = 0 ; // Assume Auto white balance.
- if( pSettings->WhiteBalanceMode & KSCAMERA_EXTENDEDPROP_VIDEOPROCFLAG_MANUAL )
- {
- Metadata.WhiteBalance.Value = 0 ; // Manual while balance.
- }
-
- Metadata.DigitalZoomRatio = CMetadataRational(1);
-
- Metadata.FocalLengthIn35mmFilm = CMetadataShort(0);
- Metadata.SceneCaptureType = CMetadataShort(0);
- Metadata.GainControl = CMetadataRational();
- Metadata.Contrast = CMetadataShort(0);
- Metadata.Saturation = CMetadataShort(0);
- Metadata.Sharpness = CMetadataShort(0);
- Metadata.SubjectDistanceRange = CMetadataShort(0);
-
- // Report (optional) focus state.
- KSCAMERA_EXTENDEDPROP_FOCUSSTATE State = KSCAMERA_EXTENDEDPROP_FOCUSSTATE_UNINITIALIZED;
- if( NT_SUCCESS(m_Sensor->GetFocusState( &State )) )
- {
- Metadata.FocusState = CMetadataLong((UINT32)State);
- }
-
- return Metadata;
-}
-
-//
-// Emit metadata here for still pin.
-//
-void
-CImageHardwareSimulation::
-EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
-)
-/*++
-
-Routine Description:
-
- Emit metadata for a photo.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-{
- PAGED_CODE();
-
- NT_ASSERT(pStreamHeader);
-
- // Add the normal frame info to the metadata
- CHardwareSimulation::EmitMetadata( pStreamHeader );
-
- if (0 != (pStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_METADATA))
- {
- PKS_FRAME_INFO pFrameInfo = (PKS_FRAME_INFO)(pStreamHeader + 1);
- PKSSTREAM_METADATA_INFO pMetadata = (PKSSTREAM_METADATA_INFO) (pFrameInfo + 1);
- PCAMERA_METADATA_IMAGEAGGREGATION pAggregation =
- (PCAMERA_METADATA_IMAGEAGGREGATION) (((PBYTE) pMetadata->SystemVa) + pMetadata->UsedSize);
- ULONG BytesLeft = pMetadata->BufferSize - pMetadata->UsedSize;
-
- if( BytesLeft >= sizeof(*pAggregation) )
- {
- pAggregation->Header.MetadataId = (ULONG) MetadataId_Custom_ImageAggregation;
- pAggregation->Header.Size = sizeof(*pAggregation);
-
- // Just copy over the current frame's ISP settings for now.
- // We still need to develop a contract between the driver and the MFT0 for these settings.
- pAggregation->Data = GetMetadata();
-
- pMetadata->UsedSize += sizeof(*pAggregation);
- BytesLeft -= sizeof(*pAggregation);
- }
-
- CExtendedVidProcSetting FaceDetect;
- m_Sensor->GetFaceDetection(&FaceDetect);
-
- if( FaceDetect.Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_PHOTO )
- {
- DBG_TRACE("IMAGE");
- EmitFaceMetadata(
- pStreamHeader,
- FaceDetect.GetULONG(),
- FaceDetect.Flags & KSCAMERA_EXTENDEDPROP_FACEDETECTION_ADVANCED_MASK,
- 1);
- }
- }
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-FillScatterGatherBuffers()
-
-/*++
-
-Routine Description:
-
- The hardware has synthesized a buffer in scratch space and we're to
- fill scatter / gather buffers.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- DBG_ENTER("() m_PinID=0x%08X, m_ImageSize=0x%08X, m_ScatterGatherMappingsQueued=%d, "
- "m_ScatterGatherBytesQueue=0x%08X",
- m_PinID, m_ImageSize, m_ScatterGatherMappingsQueued, m_ScatterGatherBytesQueued);
-
- //
- // We're using this list lock to protect our scatter / gather lists instead
- // of some hardware mechanism / KeSynchronizeExecution / whatever.
- //
- //KeAcquireSpinLockAtDpcLevel (&m_ListLock);
-
- ULONG BufferRemaining = m_ImageSize;
-
- //
- // If there aren't enough scatter / gather buffers queued, consider it starvation.
- //
- while( BufferRemaining &&
- !IsListEmpty(&m_ScatterGatherMappings) &&
- m_ScatterGatherBytesQueued >= BufferRemaining)
- {
- DBG_TRACE( "BufferRemaining=0x%08X, m_ScatterGatherBytesQueued=0x%08X, m_ScatterGatherMappingsQueued=%d",
- BufferRemaining, m_ScatterGatherBytesQueued, m_ScatterGatherMappingsQueued );
-
- LIST_ENTRY *listEntry = RemoveHeadList (&m_ScatterGatherMappings);
- m_ScatterGatherMappingsQueued--;
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- listEntry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
-
- // Deal with cancellation.
- PIRP pIrp = KsStreamPointerGetIrp(SGEntry->CloneEntry, FALSE, FALSE);
- if (pIrp)
- {
- if (pIrp->Cancel)
- {
- DBG_TRACE( "Cancelling..." );
- FreeSGEntry( listEntry, L"StreamPointer Cancel SG List" );
- continue;
- }
- }
-
- //
- // Since we're software, we'll be accessing this by virtual address...
- //
- ULONG BytesToCopy = min( BufferRemaining, SGEntry->ByteCount );
-
- // Have the synthesizer output a frame to the buffer.
- DBG_TRACE( "DataUsed before Commit() = %d", SGEntry->CloneEntry->StreamHeader->DataUsed );
- ULONG BytesCopied =
- m_Synthesizer->DoCommit( SGEntry->Virtual, BytesToCopy );
- NT_ASSERT(BytesCopied);
- DBG_TRACE( "BytesCopied = %d", BytesCopied );
-
- BufferRemaining = 0; //-= BytesCopied;
-
- // Add metadata to the sample.
- EmitMetadata( SGEntry -> CloneEntry -> StreamHeader );
-
- ULONGLONG time = ConvertQPCtoTimeStamp(NULL);
-
- if (IsPhotoConfirmationNeeded())
- {
- DBG_TRACE( "PhotoConfirmation is needed. Frame=%d, Time=0x%016llX", m_PfsFrameNumber, (LONGLONG) time );
- SGEntry->PhotoConfirmationInfo = PHOTOCONFIRMATION_INFO( m_PfsFrameNumber, (LONGLONG) time );
- }
-
- SGEntry -> CloneEntry -> StreamHeader -> PresentationTime.Time = time;
- DBG_TRACE("PresentationTime = 0x%016llX", SGEntry->CloneEntry->StreamHeader->PresentationTime.Time );
-
- SGEntry -> CloneEntry -> StreamHeader -> OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_TIMEVALID;
-
- DBG_TRACE("m_FlashStatus=0x%016llX", m_FlashStatus);
-
- if(m_FlashStatus & KSCAMERA_EXTENDEDPROP_FLASH_ON || m_FlashStatus & KSCAMERA_EXTENDEDPROP_FLASH_ON_ADJUSTABLEPOWER ||
- m_FlashStatus & KSCAMERA_EXTENDEDPROP_FLASH_AUTO || m_FlashStatus & KSCAMERA_EXTENDEDPROP_FLASH_AUTO_ADJUSTABLEPOWER)
- {
- if(m_FlashStatus & KSCAMERA_EXTENDEDPROP_FLASH_SINGLEFLASH && time >= m_TriggerTime && m_TriggerTime != 0 && !m_bFlashed)
- {
- m_bFlashed = TRUE;
- DBG_TRACE("(Single) FLASHED!!!");
- }
- }
-
- //
- // Release the scatter / gather entry back to our lookaside.
- //
- if( m_bTriggered && !IsPfsEOS() )
- {
- DBG_TRACE("m_PinMode=%d", m_PinMode);
- m_pClone = SGEntry->CloneEntry;
- m_PhotoConfirmationInfo = SGEntry->PhotoConfirmationInfo;
- m_NumMappingsCompleted++;
- m_ScatterGatherBytesQueued -= SGEntry -> ByteCount;
-
- DBG_TRACE( "m_NumMappingsCompleted=%d, m_PhotoConfirmationInfo.isRequired()=%s", m_NumMappingsCompleted, m_PhotoConfirmationInfo.isRequired()?"TRUE":"FALSE" );
-
- if(m_PinMode != PinBurstMode)
- {
- m_bTriggered = FALSE;
- DBG_TRACE("m_bTriggered=FALSE");
- }
-
- // Update the VPS frame and loop numbers here. Mark the frame as the EOS
- // if we've completed the sequence.
- //
- // Note: It's actually up to DevProxy to stop feeding us frames!
- if( AdvanceFrameCounter() )
- {
- // We've reached the end of a VPS sequence! Mark the frame as EOS.
- SGEntry->CloneEntry->StreamHeader->OptionsFlags |= KSSTREAM_HEADER_OPTIONSF_ENDOFPHOTOSEQUENCE;
- m_bEndOfSequence = TRUE;
- }
-
- ExFreeToNPagedLookasideList (
- &m_ScatterGatherLookaside,
- reinterpret_cast <PVOID> (SGEntry)
- );
- }
- else
- {
- InsertTailList( &m_ScatterGatherMappings, listEntry );
- m_ScatterGatherMappingsQueued++;
- m_pClone = NULL;
- }
- }
-
- DBG_LEAVE("()");
-
- if (BufferRemaining)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- else
- {
- return STATUS_SUCCESS;
- }
-}
-
-/*************************************************/
-
-void
-CImageHardwareSimulation::
-FakeHardware()
-
-/*++
-
-Routine Description:
-
- Simulate an interrupt and what the hardware would have done in the
- time since the previous interrupt.
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-
-{
- PAGED_CODE();
-
- // Prevent state-changes during this call.
- KScopedMutex Lock(m_ListLock);
-
- m_InterruptTime++;
-
- //
- // The hardware can be in a pause state in which case, it issues interrupts
- // but does not complete mappings. In this case, don't bother synthesizing
- // a frame and doing the work of looking through the mappings table.
- //
- if( m_PinState == PinRunning )
- {
- if(m_PinMode == PinBurstMode && m_bTriggered && m_bPastBufferTrigger)
- {
- CompletePastBuffers();
- }
-
- m_Synthesizer->DoSynthesize();
-
- //
- // Fill scatter gather buffers
- //
- if (!NT_SUCCESS (FillScatterGatherBuffers ()))
- {
- InterlockedIncrement (PLONG (&m_NumFramesSkipped));
- }
- }
-
- //
- // Issue an interrupt to our hardware sink. This is a "fake" interrupt.
- // It will occur at DISPATCH_LEVEL.
- //
- m_Sensor -> Interrupt (m_PinID);
-
- //
- // Schedule the timer for the next interrupt time, if the pin is still running.
- //
- if( m_PinState == PinRunning )
- {
- LARGE_INTEGER NextTime;
- NextTime.QuadPart = m_StartTime.QuadPart +
- (m_TimePerFrame * (m_InterruptTime + 1));
-
-#ifdef ENABLE_TRACING // To keep us from a tight spin when trying to debug this code...
- LARGE_INTEGER Now;
- KeQuerySystemTime(&Now);
-
- if( Now.QuadPart >= NextTime.QuadPart )
- {
- NextTime.QuadPart = 0LL - m_TimePerFrame ;
- }
-
-#endif
- m_IsrTimer.Set( NextTime );
- }
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-CompletePastBuffers()
-
-/*++
-
-Routine Description:
-
- Find and complete any history frames.
-
-Arguments:
-
- None
-
-Return Value:
-
- Success / Failure
-
---*/
-
-{
- PAGED_CODE();
-
- ULONG ulNumBuffers = m_PastBufferCount;
- BOOLEAN bContinue = TRUE;
- LIST_ENTRY *listEntry = NULL;
-
- DBG_ENTER("()");
- DBG_TRACE("m_PastBufferCount=%d, m_TriggerTime=0x%016llX", m_PastBufferCount, m_TriggerTime );
-
- // If we're in burst mode and have ISP settings, we can't
- // really support changing the ISP settings in the past...
- // ... so we'll just treat them all past frames.
- // Note: The upper layer will determine past frames from the
- // metadata FrameId.
- if( m_PinMode == PinBurstMode &&
- !m_pIspSettings )
- {
- // Walk through the entire list of buffers, find the most
- // recent frame presentation time and put all past buffers
- // into another list.
- while( !IsListEmpty(&m_ScatterGatherMappings) )
- {
- listEntry = RemoveTailList(&m_ScatterGatherMappings);
- m_ScatterGatherMappingsQueued--;
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- listEntry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
-
- NT_ASSERT(SGEntry);
- NT_ASSERT(SGEntry->CloneEntry);
- NT_ASSERT(SGEntry->CloneEntry->StreamHeader);
-
- // We've found one that's not stamped. We must be at the end.
- // Push it back and exit the loop.
- if(SGEntry->CloneEntry->StreamHeader->PresentationTime.Time == 0)
- {
- InsertTailList(&m_ScatterGatherMappings, listEntry);
- m_ScatterGatherMappingsQueued++;
- DBG_TRACE( "No past frames found." );
- bContinue = FALSE;
- break;
- }
-
- // Since we're walking from the most recent to least recent frame,
- // This one is a valid "future" frame.
- DBG_TRACE( "Adding 'future frame' to the list" );
- PushCloneList(SGEntry);
-
- // If the presentation time is less than the trigger time, stop here
- // and use this as the first triggered frame.
- if((ULONGLONG)(SGEntry->CloneEntry->StreamHeader->PresentationTime.Time) < m_TriggerTime)
- {
- DBG_TRACE( "First matching frame time=0x%016llX", SGEntry->CloneEntry->StreamHeader->PresentationTime.Time );
- break;
- }
-
- // Watch out! We might actually need to pick up multiple frames since
- // in theory we could have generated several since the trigger time.
- }
- }
-
- // Grab N past frames from the queue, if we have them.
- while( bContinue &&
- !IsListEmpty(&m_ScatterGatherMappings) &&
- ulNumBuffers)
- {
- listEntry = RemoveTailList(&m_ScatterGatherMappings);
- m_ScatterGatherMappingsQueued--;
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- listEntry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
-
- if(!(SGEntry -> CloneEntry -> StreamHeader -> OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEVALID) )
- {
- InsertTailList(&m_ScatterGatherMappings, listEntry);
- m_ScatterGatherMappingsQueued++;
- DBG_TRACE( "No more past frames found." );
- bContinue = FALSE;
- }
- else
- {
- PushCloneList(SGEntry);
- ulNumBuffers--;
- DBG_TRACE( "Past frame #%d found (%p)", ulNumBuffers, SGEntry->CloneEntry->StreamHeader );
- }
- }
-
- // If we got all of the past frames we needed and didn't consume the entire queue...
- if(bContinue && (m_ScatterGatherMappingsQueued > 0))
- {
- //Mark the next tail as Time = 0 so that we don't output any super old frames.
- listEntry = RemoveTailList(&m_ScatterGatherMappings);
- m_ScatterGatherMappingsQueued--;
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- listEntry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
- // Mark the PTS as invalid.
- SGEntry->CloneEntry->StreamHeader->PresentationTime.Time = 0;
- SGEntry->CloneEntry->StreamHeader->OptionsFlags &= ~KSSTREAM_HEADER_OPTIONSF_TIMEVALID;
-
- InsertTailList(&m_ScatterGatherMappings, listEntry);
- m_ScatterGatherMappingsQueued++;
- }
-
- CompleteCloneList();
-
- m_bPastBufferTrigger = FALSE;
-
- DBG_LEAVE("()");
-
- return STATUS_SUCCESS;
-
-}
-
-//
-// Put an item onto the history list.
-//
-void
-CImageHardwareSimulation::
-PushCloneList(
- _Inout_ PSCATTER_GATHER_ENTRY SGEntry
-)
-{
- PAGED_CODE();
-
- DBG_TRACE( "Frame %p, PresentationTime=0x%016llX",
- SGEntry->CloneEntry->StreamHeader,
- SGEntry->CloneEntry->StreamHeader->PresentationTime.Time );
-
- InsertHeadList( &m_BurstList, &SGEntry->ListEntry );
-}
-
-//
-// Complete the history list.
-//
-NTSTATUS
-CImageHardwareSimulation::
-CompleteCloneList()
-{
- PAGED_CODE();
-
- int i = 0;
- while(!IsListEmpty(&m_BurstList))
- {
- LIST_ENTRY *listEntry = RemoveHeadList(&m_BurstList);
-
- PSCATTER_GATHER_ENTRY SGEntry =
- reinterpret_cast <PSCATTER_GATHER_ENTRY> (
- CONTAINING_RECORD (
- listEntry,
- SCATTER_GATHER_ENTRY,
- ListEntry
- )
- );
-
- m_pClone = SGEntry->CloneEntry;
- m_PhotoConfirmationInfo = SGEntry->PhotoConfirmationInfo;
-
- m_NumMappingsCompleted++;
- m_ScatterGatherBytesQueued -= SGEntry -> ByteCount;
-
- DBG_TRACE( "m_NumMappingsCompleted=%d, m_PhotoConfirmationInfo.isRequired()=%s", m_NumMappingsCompleted, m_PhotoConfirmationInfo.isRequired( )?"TRUE":"FALSE" );
- DBG_TRACE( "Frame %p, PresentationTime=0x%016llX",
- SGEntry->CloneEntry->StreamHeader,
- SGEntry->CloneEntry->StreamHeader->PresentationTime.Time );
-
- m_Sensor -> Interrupt (m_PinID);
-
- ExFreeToNPagedLookasideList (
- &m_ScatterGatherLookaside,
- reinterpret_cast <PVOID> (SGEntry)
- );
- i++;
- }
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-SetClock(PKSPIN pin)
-{
- PAGED_CODE();
-
- if(!NT_SUCCESS(KsPinGetReferenceClockInterface(pin, &m_Clock)))
- {
- m_Clock = NULL;
- }
-
- return STATUS_SUCCESS;
-}
-
-void
-CImageHardwareSimulation::
-SetTriggerTime(
- _In_ ULONGLONG TriggerTime
-)
-/*++
-
-Routine Description:
-
- Identify exactly when the user pressed that button.
-
-Arguments:
-
- TriggerTime -
- The QPC time in 100ns when the user asked for the photo.
-
-Return Value:
-
- void
-
---*/
-{
- PAGED_CODE();
-
- m_TriggerTime = TriggerTime;
- DBG_TRACE( "Setting Trigger Time = 0x%016llX", TriggerTime );
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-Reset()
-{
- PAGED_CODE();
-
- KScopedMutex Lock( m_ListLock );
- DBG_ENTER("(): m_PinID=%d", m_PinID);
-
- // Parent class reset first...
- CHardwareSimulation::Reset();
-
- FreeSGList( &m_ScatterGatherMappings, L"StreamPointer Reset Burst List" );
-
- m_bTriggered = FALSE;
- m_bEndOfSequence = FALSE;
- m_pClone = NULL;
- m_bPastBufferTrigger = FALSE;
- m_TriggerTime = 0;
-
- DBG_LEAVE("(): m_PinID=%d", m_PinID);
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS
-CImageHardwareSimulation::
-SetFlashStatus(
- _In_ ULONGLONG ullFlashStatus
-)
-{
- PAGED_CODE();
-
- m_FlashStatus = ullFlashStatus;
-
- DBG_TRACE("FlashStatus=0x%016llX", ullFlashStatus);
-
- return STATUS_SUCCESS;
-}
-
-//
-// Program the Per Frame Settings for simulation
-// We do it before calling start so we can be ready
-// to program our simulation's hardware.
-//
-// Note: We make a local copy.
-//
-NTSTATUS
-CImageHardwareSimulation::
-SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
-)
-{
- PAGED_CODE();
-
- // Set the current ISP settings and free any prior.
- // This has to be done at simulation start or stop or we have
- // a synchronization problem.
- SAFE_DELETE_ARRAY( m_pIspSettings );
-
- if( pIspSettings )
- {
- m_pIspSettings = new (NonPagedPoolNx) ISP_FRAME_SETTINGS[FrameLimit];
- if( !m_pIspSettings )
- {
- m_PfsFrameLimit = 0;
- m_PfsLoopLimit = 0;
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- RtlCopyMemory( m_pIspSettings, pIspSettings, FrameLimit*sizeof(ISP_FRAME_SETTINGS) );
- m_PfsLoopLimit = LoopLimit;
- m_PfsFrameLimit = FrameLimit;
- }
- else
- {
- m_PfsFrameLimit = 0;
- m_PfsLoopLimit = 0;
- }
-
- return STATUS_SUCCESS;
-}
-
-// Function:
-// bool CImageHardwareSimulation::AdvanceFrameCounter(void)
-//
-// Description:
-// Advance our frame and loop pointers to the next PFS settings.
-//
-// Parameters:
-// [None]
-//
-// Returns:
-// bool - true if we've reached the end of our Per Frame Settings.
-//
-bool
-CImageHardwareSimulation::
-AdvanceFrameCounter(void)
-{
- PAGED_CODE();
-
- bool bEOS = false;
-
- DBG_ENTER( "()" );
-
- m_GlobalFrameNumber ++;
- DBG_TRACE( "m_GlobalFrameNumber=%lld", m_GlobalFrameNumber );
-
- //
- // Calculate the PFS frame & loop numbers, but only if we've
- // gotten ISP settings.
- //
- if( m_bTriggered &&
- m_PinMode == PinBurstMode &&
- m_pIspSettings )
- {
- m_PfsFrameNumber ++;
-
- if( m_PfsFrameNumber >= m_PfsFrameLimit )
- {
- m_PfsFrameNumber = 0;
- m_PfsLoopNumber ++;
- }
-
- // Only mark EOS if we're not in an infinite loop.
- if( m_PfsLoopLimit != 0 )
- {
- NT_ASSERT( !(m_PfsLoopNumber > m_PfsLoopLimit) );
- // Check to see if we've hit our limit.
- if( m_PfsLoopNumber >= m_PfsLoopLimit )
- {
- DBG_TRACE( "Marking EOS" );
- bEOS = true;
- }
- }
- }
-
- DBG_TRACE( "m_PfsFrameNumber=%d, m_PfsLoopNumber=%d", m_PfsFrameNumber, m_PfsLoopNumber );
- DBG_TRACE( "m_PfsFrameLimit=%d, m_PfsLoopLimit=%d", m_PfsFrameLimit, m_PfsLoopLimit );
- DBG_LEAVE( "() = %s", bEOS ? "true" : "false" );
- return bEOS;
-}
-
-
-// Function:
-// bool CImageHardwareSimulation::IsPfsEOS(void)
-//
-// Description:
-// Determine if we're at the EOS.
-//
-// Parameters:
-// [None]
-//
-// Returns:
-// bool - true if we've reached the end of our Per Frame Settings.
-//
-bool
-CImageHardwareSimulation::
-IsPfsEOS(void)
-{
- PAGED_CODE();
-
- DBG_ENTER( "()" );
- DBG_TRACE( "m_bTriggered=%s, m_bEndOfSequence=%s, m_PinMode=%d, m_pIspSetting=0x%p",
- ( m_bTriggered ? "true" : "false" ),
- ( m_bEndOfSequence ? "true" : "false" ),
- m_PinMode,
- m_pIspSettings );
-
- //
- // Make sure we're in a Variable Photo Sequence.
- //
- bool result =
- bool( m_bTriggered == TRUE &&
- m_bEndOfSequence &&
- m_PinMode == PinBurstMode &&
- m_pIspSettings ); // Must have ISP settings set to be PFS EOS.
-
- DBG_LEAVE( "() = %s", (result ? "true" : "false") );
- return result;
-}
-
-// Function:
-// BOOL CImageHardwareSimulation::IsPfsActive(void)
-//
-// Description:
-// Determine if we're in a Variable Photo Sequence.
-//
-// Parameters:
-// [None]
-//
-// Returns:
-// BOOL - TRUE if we are actively processing Per Frame Settings.
-//
-BOOL
-CImageHardwareSimulation::
-IsPfsActive(void)
-{
- PAGED_CODE();
-
- return
- BOOL( m_bTriggered && !m_bEndOfSequence &&
- m_PinMode == PinBurstMode &&
- m_pIspSettings ) ;
-}
-
-// Get the current frame settings.
-//
-// Note:
-// Call this function to acquire ISP settings for the current frame's
-// simulation. Initially we'll just use it to report back the ISP
-// settings originally requested in the PFS by the user.
-//
-ISP_FRAME_SETTINGS *
-CImageHardwareSimulation::
-GetIspSettings(void)
-{
- PAGED_CODE();
-
- return
- IsPfsActive()
- ? &m_pIspSettings[m_PfsFrameNumber]
- : CHardwareSimulation::GetIspSettings() ;
-}
-
-BOOLEAN
-CImageHardwareSimulation::
-IsPhotoConfirmationNeeded()
-/*++
-
-Routine Description:
-
- Check flags for photo confirmation and return
- whether driver should issue confirmation.
-
---*/
-{
- PAGED_CODE();
-
- ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
-
- return pSettings ? pSettings->bPhotoConfirmation : FALSE;
-}
diff --git a/avscamera/sys/imagehwsim.h b/avscamera/sys/imagehwsim.h
deleted file mode 100644
index 64357ad5..00000000
--- a/avscamera/sys/imagehwsim.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/**************************************************************************
-
- A/V Stream Camera Sample
-
- Copyright (c) 2001, Microsoft Corporation.
-
- File:
-
- ImageHwSim.h
-
- Abstract:
-
- This file contains the definition of the CImageHardwareSimulation class.
-
- This is a specialization of CHardwareSimulation that provides photo-
- specific metadata and implements specialized functionality for photo,
- photo sequence and variable photo sequence.
-
- History:
-
- created 3/9/2001
-
-**************************************************************************/
-
-// forward references
-struct ISP_FRAME_SETTINGS;
-
-class CImageHardwareSimulation
- : public CHardwareSimulation
-{
-private:
- LIST_ENTRY m_BurstList;
- PWSTR m_szwFramePath;
- BOOLEAN m_bTriggered;
- BOOLEAN m_bEndOfSequence;
- BOOLEAN m_bFlashed;
- BOOLEAN m_bPastBufferTrigger;
- PIN_MODE m_PinMode;
- ULONG m_PastBufferCount;
- ULONGLONG m_TriggerTime;
- PIKSREFERENCECLOCK m_Clock;
- ULONGLONG m_FlashStatus;
-
- // Settings for VPS simulation.
- ULONG m_PfsLoopLimit;
- ULONG m_PfsFrameLimit;
- ISP_FRAME_SETTINGS *m_pIspSettings; //
- ULONG m_PfsLoopNumber; // Number of loops we've done.
- ULONG m_PfsFrameNumber;
- ULONGLONG m_GlobalFrameNumber; // Informational only.
-
- // Copy a synthesized framebuffer.
- virtual
- NTSTATUS
- FillScatterGatherBuffers();
-
- // Find and complete any history frames.
- NTSTATUS
- CompletePastBuffers();
-
- // Put an item onto the history list.
- void
- PushCloneList(_Inout_ PSCATTER_GATHER_ENTRY SGEntry);
-
- // Complete the history list.
- NTSTATUS
- CompleteCloneList();
-
- // Add Photo-specific metadata.
- void
- EmitMetadata(
- _Inout_ PKSSTREAM_HEADER pStreamHeader
- );
-
- // Does the current frame need a photo confirmation?
- BOOLEAN
- IsPhotoConfirmationNeeded();
-
- // Helper function that gets a buffer full of image metadata.
- METADATA_IMAGEAGGREGATION
- GetMetadata();
-
-public:
- PKSSTREAM_POINTER m_pClone;
- PHOTOCONFIRMATION_INFO m_PhotoConfirmationInfo;
-
- // Constructor
- CImageHardwareSimulation (
- _Inout_ CSensor *Sensor,
- _In_ LONG PinID
- );
-
- // Destructor
- virtual
- ~CImageHardwareSimulation();
-
- // Periodic interrupt handling
- virtual
- void
- FakeHardware();
-
- // Start streaming.
- virtual
- NTSTATUS
- Start(
- _In_ CSynthesizer *ImageSynth,
- _In_ ULONG Width,
- _In_ ULONG Height,
- _In_ ULONG ImageSize,
- _In_ PIN_MODE pinMode
- );
-
- // Stop streaming.
- virtual
- NTSTATUS
- Stop();
-
- virtual
- NTSTATUS
- Reset();
-
- // Take a picture or start a photo sequence.
- virtual
- NTSTATUS
- Trigger(
- _In_ LONG mode
- );
-
- // Limit the rate of frames produced.
- virtual
- NTSTATUS
- SetPhotoFrameRate (
- _In_ ULONGLONG TimePerFrame
- );
-
- // Get the rate of frames produced.
- virtual
- ULONGLONG
- GetPhotoFrameRate()
- {
- return m_TimePerFrame;
- }
-
- // Set the master clock.
- NTSTATUS
- SetClock(
- _In_ PKSPIN pin
- );
-
- // Identify exactly when the user pressed that button.
- void
- SetTriggerTime(
- _In_ ULONGLONG TriggerTime
- );
-
- // Report the current trigger time.
- ULONGLONG
- GetTriggerTime()
- {
- return m_TriggerTime;
- }
-
- // Normal vs. Photo sequence + number of history frames.
- NTSTATUS
- SetMode(
- _In_ ULONGLONG Flags,
- _In_ ULONG PastBuffers
- );
-
- NTSTATUS
- SetFlashStatus(
- _In_ ULONGLONG ulFlashStatus
- );
-
- // Program the Per Frame Settings for simulation
- // We do it before calling start so we can be ready
- // to program our simulation's hardware.
- // Note: We make a local copy.
- NTSTATUS
- SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
- );
-
- // Advance our frame and loop pointers to the next PFS settings.
- bool
- AdvanceFrameCounter(void);
-
- // Determine if we're at the EOS.
- bool
- IsPfsEOS(void);
-
- // Determine if we're in a Variable Photo Sequence.
- BOOL
- IsPfsActive(void);
-
- // Get the current frame settings.
- virtual
- ISP_FRAME_SETTINGS *
- GetIspSettings(void);
-};