summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWei Mao <[email protected]>2017-03-20 18:25:57 -0700
committerWei Mao <[email protected]>2017-03-20 18:27:00 -0700
commite044ea456aad4c444fbce00a2d9b56b304d59884 (patch)
tree4326af385f0666a3af0b7dfae534db68e3e25785
parentbc6e698503f46afbd8fcf62f6d3939147dc49999 (diff)
parente4581d8cd1bcc5108786b082a1ec24007a508847 (diff)
Merge pull request #118 from saredd/master
-rw-r--r--avstream/avscamera/common/MetadataInternal.h92
-rw-r--r--avstream/avscamera/mft0/MFT0Impl.cpp17
-rw-r--r--avstream/avscamera/mft0/MFT0Impl.h4
-rw-r--r--avstream/avscamera/mft0/dllmain.cpp3
-rw-r--r--avstream/avscamera/mft0/sources.dep21
-rw-r--r--avstream/avscamera/sys/AvsCamera.cpp115
-rw-r--r--avstream/avscamera/sys/Capture.cpp19
-rw-r--r--avstream/avscamera/sys/Capture.h8
-rw-r--r--avstream/avscamera/sys/Common.h156
-rw-r--r--avstream/avscamera/sys/Device.cpp6
-rw-r--r--avstream/avscamera/sys/PreviewHwSim.cpp165
-rw-r--r--avstream/avscamera/sys/PreviewHwSim.h8
-rw-r--r--avstream/avscamera/sys/RGB24Synthesizer.cpp7
-rw-r--r--avstream/avscamera/sys/Sensor.cpp24
-rw-r--r--avstream/avscamera/sys/Sensor.h11
-rw-r--r--avstream/avscamera/sys/Sources.dep1
-rw-r--r--avstream/avscamera/sys/Synthesizer.cpp35
-rw-r--r--avstream/avscamera/sys/Synthesizer.h46
-rw-r--r--avstream/avscamera/sys/WorkItem.cpp13
-rw-r--r--avstream/avscamera/sys/hwsim.cpp54
-rw-r--r--avstream/avscamera/sys/hwsim.h6
-rw-r--r--avstream/avscamera/sys/imagehwsim.cpp8
-rw-r--r--avstream/avscamera/sys/imagehwsim.h6
23 files changed, 529 insertions, 296 deletions
diff --git a/avstream/avscamera/common/MetadataInternal.h b/avstream/avscamera/common/MetadataInternal.h
index 41f49469..28572efc 100644
--- a/avstream/avscamera/common/MetadataInternal.h
+++ b/avstream/avscamera/common/MetadataInternal.h
@@ -116,8 +116,7 @@ typedef struct
typedef struct _METADATA_PREVIEWAGGREGATION
{
// Mandatory fields
- UINT32 FocusState;
- UINT32 Reserved;
+ METADATA_UINT32 FocusState;
METADATA_INT64 ExposureTime;
METADATA_EVCOMP EVCompensation;
METADATA_UINT32 ISOSpeed;
@@ -265,3 +264,92 @@ typedef struct _CAMERA_METADATA_HISTOGRAM
METADATA_HISTOGRAM Data;
} CAMERA_METADATA_HISTOGRAM, *PCAMERA_METADATA_HISTOGRAM;
+typedef struct _CAMERA_METADATA_UVC_HEADER
+{
+ KSCAMERA_METADATA_ITEMHEADER Header;
+ KSSTREAM_UVC_METADATA Data;
+} CAMERA_METADATA_UVC_HEADER, *PCAMERA_METADATA_UVC_HEADER;
+
+////////////////////////////////////////////////////////////////////////////////
+// Camera Extrinsics
+////////////////////////////////////////////////////////////////////////////////
+
+typedef struct _KS_FLOAT2
+{
+ FLOAT x;
+ FLOAT y;
+} KS_FLOAT2;
+
+typedef struct _KS_FLOAT3
+{
+ FLOAT x;
+ FLOAT y;
+ FLOAT z;
+} KS_FLOAT3;
+
+typedef struct _KS_QUATERNION
+{
+ FLOAT x;
+ FLOAT y;
+ FLOAT z;
+ FLOAT w;
+} KS_QUATERNION;
+
+typedef struct _KS_CAMERA_EXTRINSICS_CALIBRATEDTRANSFORM
+{
+ GUID CalibrationId;
+ KS_FLOAT3 Position;
+ KS_QUATERNION Orientation;
+} KS_CAMERA_EXTRINSICS_CALIBRATEDTRANSFORM, *PKS_CAMERA_EXTRINSICS_CALIBRATEDTRANSFORM;
+
+typedef struct _KS_CAMERA_EXTRINSICS
+{
+ UINT32 TransformCount;
+ KS_CAMERA_EXTRINSICS_CALIBRATEDTRANSFORM CalibratedTransforms[1];
+} KS_CAMERA_EXTRINSICS, *PKS_CAMERA_EXTRINSICS;
+
+////////////////////////////////////////////////////////////////////////////////
+// Camera Intrinsics
+////////////////////////////////////////////////////////////////////////////////
+
+typedef struct _KS_CAMERAINTRINSIC_PINHOLECAMERAMODEL
+{
+ KS_FLOAT2 FocalLength;
+ KS_FLOAT2 PrincipalPoint;
+} KS_CAMERAINTRINSIC_PINHOLECAMERAMODEL, *PKS_CAMERAINTRINSIC_PINHOLECAMERAMODEL;
+
+typedef struct _KS_CAMERAINTRINSIC_DISTORTIONMODEL
+{
+ FLOAT Radial_k1;
+ FLOAT Radial_k2;
+ FLOAT Radial_k3;
+ FLOAT Tangential_p1;
+ FLOAT Tangential_p2;
+} KS_CAMERAINTRINSIC_DISTORTIONMODEL, *PKS_CAMERAINTRINSIC_DISTORTIONMODEL;
+
+typedef struct _KS_PINHOLECAMERAINTRINSIC_INTRINSICMODEL
+{
+ UINT32 Width;
+ UINT32 Height;
+ KS_CAMERAINTRINSIC_PINHOLECAMERAMODEL CameraModel;
+ KS_CAMERAINTRINSIC_DISTORTIONMODEL DistortionModel;
+} KS_PINHOLECAMERAINTRINSIC_INTRINSICMODEL, *PKS_PINHOLECAMERAINTRINSIC_INTRINSICMODEL;
+
+typedef struct _KS_CAMERA_INTRINSICS
+{
+ UINT32 IntrinsicModelCount;
+ KS_PINHOLECAMERAINTRINSIC_INTRINSICMODEL IntrinsicModels[1];
+} KS_CAMERA_INTRINSICS, *PKS_CAMERA_INTRINSICS;
+
+typedef struct _CAMERA_METADATA_EXTRINSICS
+{
+ KSCAMERA_METADATA_ITEMHEADER Header;
+ KS_CAMERA_EXTRINSICS Data;
+} CAMERA_METADATA_EXTRINSICS, *PCAMERA_METADATA_EXTRINSICS;
+
+typedef struct _CAMERA_METADATA_INTRINSICS
+{
+ KSCAMERA_METADATA_ITEMHEADER Header;
+ KS_CAMERA_INTRINSICS Data;
+} CAMERA_METADATA_INTRINSICS, *PCAMERA_METADATA_INTRINSICS;
+
diff --git a/avstream/avscamera/mft0/MFT0Impl.cpp b/avstream/avscamera/mft0/MFT0Impl.cpp
index 90caedd6..e2c07ce3 100644
--- a/avstream/avscamera/mft0/MFT0Impl.cpp
+++ b/avstream/avscamera/mft0/MFT0Impl.cpp
@@ -1184,8 +1184,8 @@ STDMETHODIMP CSocMft0::GetMediaType(
//
STDMETHODIMP CSocMft0::IsMediaTypeSupported(
_In_ UINT uiStreamId,
- _In_ IMFMediaType *pIMFMediaType,
- _Outptr_result_maybenull_ IMFMediaType **ppIMFMediaTypeFull
+ _In_opt_ IMFMediaType *pIMFMediaType,
+ _Outptr_opt_result_maybenull_ IMFMediaType **ppIMFMediaTypeFull
)
{
HRESULT hr = S_OK;
@@ -1549,12 +1549,15 @@ HRESULT CSocMft0::ParseMetadata_PreviewAggregation(
PCAMERA_METADATA_PREVIEWAGGREGATION pFixedStruct =
(PCAMERA_METADATA_PREVIEWAGGREGATION)pItem;
- hr = pMetaDataAttributes->SetUINT32(
- MF_CAPTURE_METADATA_FOCUSSTATE,
- pFixedStruct->Data.FocusState);
- if(FAILED(hr))
+ if (pFixedStruct->Data.FocusState.Set)
{
- return hr;
+ hr = pMetaDataAttributes->SetUINT32(
+ MF_CAPTURE_METADATA_FOCUSSTATE,
+ pFixedStruct->Data.FocusState.Value);
+ if (FAILED(hr))
+ {
+ return hr;
+ }
}
if(pFixedStruct->Data.ExposureTime.Set)
diff --git a/avstream/avscamera/mft0/MFT0Impl.h b/avstream/avscamera/mft0/MFT0Impl.h
index 8644cf84..9112a345 100644
--- a/avstream/avscamera/mft0/MFT0Impl.h
+++ b/avstream/avscamera/mft0/MFT0Impl.h
@@ -220,8 +220,8 @@ protected:
STDMETHOD(IsMediaTypeSupported)(
_In_ UINT uiStreamId,
- _In_ IMFMediaType *pIMFMediaType,
- _Outptr_result_maybenull_ IMFMediaType **ppIMFMediaTypeFull = NULL
+ _In_opt_ IMFMediaType *pIMFMediaType,
+ _Outptr_opt_result_maybenull_ IMFMediaType **ppIMFMediaTypeFull = NULL
);
STDMETHOD(GenerateMFMediaTypeListFromDevice)();
diff --git a/avstream/avscamera/mft0/dllmain.cpp b/avstream/avscamera/mft0/dllmain.cpp
index 5eda92dc..b5746417 100644
--- a/avstream/avscamera/mft0/dllmain.cpp
+++ b/avstream/avscamera/mft0/dllmain.cpp
@@ -156,7 +156,7 @@ private:
-STDAPI_(BOOL) DllMain(_In_opt_ HINSTANCE hinst, DWORD reason, _In_opt_ void *)
+STDAPI_(BOOL) DllMain(_In_ HINSTANCE hinst, DWORD reason, _In_opt_ void *)
{
if (reason == DLL_PROCESS_ATTACH)
{
@@ -170,6 +170,7 @@ STDAPI_(BOOL) DllMain(_In_opt_ HINSTANCE hinst, DWORD reason, _In_opt_ void *)
// DllCanUnloadNow
//
/////////////////////////////////////////////////////////////////////////
+__control_entrypoint(DllExport)
STDAPI DllCanUnloadNow()
{
return (g_cRefModule == 0) ? S_OK : S_FALSE;
diff --git a/avstream/avscamera/mft0/sources.dep b/avstream/avscamera/mft0/sources.dep
deleted file mode 100644
index ad8b9029..00000000
--- a/avstream/avscamera/mft0/sources.dep
+++ /dev/null
@@ -1,21 +0,0 @@
-PUBLIC_PASS0_CONSUMES= \
- avcore\published\idl|PASS0 \
- avcore\published\media|PASS0 \
- avcore\published\mf\publish|PASS0 \
- base\appmodel\search\search\search\structuredquery\interfaces\publish|PASS0 \
- base\published2|PASS0 \
- com\published\idlole\publish|PASS0 \
- enduser\sql\xml\msxml3\publish|PASS0 \
- inetcore\published\sdk\inc|PASS0 \
- minkernel\published\base|PASS0 \
- onecore\avcore\published\media|PASS0 \
- onecore\base\published2|PASS0 \
- onecore\com\published\idlole\publish|PASS0 \
- onecore\enduser\sql\xml\msxml3\publish|PASS0 \
- onecore\inetcore\published\sdk\inc|PASS0 \
- onecore\shell\propsys\inc0|PASS0 \
- onecore\shell\published\inc\inc0|PASS0 \
- onecoreuap\base\appmodel\search\search\search\structuredquery\interfaces\publish|PASS0 \
- shell\propsys\inc0|PASS0 \
- shell\published\inc\inc0|PASS0 \
-
diff --git a/avstream/avscamera/sys/AvsCamera.cpp b/avstream/avscamera/sys/AvsCamera.cpp
index 155ea689..3563b3dd 100644
--- a/avstream/avscamera/sys/AvsCamera.cpp
+++ b/avstream/avscamera/sys/AvsCamera.cpp
@@ -1,20 +1,20 @@
/**************************************************************************
-A/V Stream Camera Sample
+ A/V Stream Camera Sample
-Copyright (c) 2014, Microsoft Corporation.
+ Copyright (c) 2014, Microsoft Corporation.
-File:
+ File:
-AvsCamera.cpp
+ AvsCamera.cpp
-Abstract:
+ Abstract:
-Sample Camera driver initialization.
+ Sample Camera driver initialization.
-History:
+ History:
-created 5/15/2014
+ created 5/15/2014
**************************************************************************/
@@ -24,15 +24,15 @@ PVOID operator new
(
size_t iSize,
_When_((poolType & NonPagedPoolMustSucceed) != 0,
- __drv_reportError("Must succeed pool allocations are forbidden. "
- "Allocation failures cause a system crash"))
+ __drv_reportError("Must succeed pool allocations are forbidden. "
+ "Allocation failures cause a system crash"))
POOL_TYPE poolType
- )
+)
{
- PVOID result = ExAllocatePoolWithTag(poolType, iSize, 'wNCK');
+ PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNCK');
if (result) {
- RtlZeroMemory(result, iSize);
+ RtlZeroMemory(result,iSize);
}
return result;
@@ -42,22 +42,22 @@ PVOID operator new
(
size_t iSize,
_When_((poolType & NonPagedPoolMustSucceed) != 0,
- __drv_reportError("Must succeed pool allocations are forbidden. "
- "Allocation failures cause a system crash"))
+ __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);
+ PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag);
if (result) {
- RtlZeroMemory(result, iSize);
+ RtlZeroMemory(result,iSize);
}
return result;
}
-PVOID
+PVOID
operator new[](
size_t iSize,
_When_((poolType & NonPagedPoolMustSucceed) != 0,
@@ -65,7 +65,7 @@ operator new[](
"Allocation failures cause a system crash"))
POOL_TYPE poolType,
ULONG tag
- )
+)
{
PVOID result = ExAllocatePoolWithTag(poolType, iSize, tag);
@@ -81,23 +81,23 @@ operator new[](
Routine Description:
-Array delete() operator.
+ Array delete() operator.
Arguments:
-pVoid -
-The memory to free.
+ pVoid -
+ The memory to free.
Return Value:
-None
+ None
--*/
-void
-__cdecl
+void
+__cdecl
operator delete[](
PVOID pVoid
- )
+)
{
if (pVoid)
{
@@ -109,26 +109,26 @@ operator delete[](
Routine Description:
-Sized delete() operator.
+ Sized delete() operator.
Arguments:
-pVoid -
-The memory to free.
+ pVoid -
+ The memory to free.
-size -
-The size of the memory to free.
+ size -
+ The size of the memory to free.
Return Value:
-None
+ None
--*/
void __cdecl operator delete
(
void *pVoid,
size_t /*size*/
- )
+)
{
if (pVoid)
{
@@ -140,26 +140,26 @@ void __cdecl operator delete
Routine Description:
-Sized delete[]() operator.
+ Sized delete[]() operator.
Arguments:
-pVoid -
-The memory to free.
+ pVoid -
+ The memory to free.
-size -
-The size of the memory to free.
+ size -
+ The size of the memory to free.
Return Value:
-None
+ None
--*/
void __cdecl operator delete[]
(
void *pVoid,
size_t /*size*/
- )
+)
{
if (pVoid)
{
@@ -167,10 +167,19 @@ void __cdecl operator delete[]
}
}
+void __cdecl operator delete
+(
+ PVOID pVoid
+ )
+{
+ if (pVoid) {
+ ExFreePool(pVoid);
+ }
+}
/**************************************************************************
-DESCRIPTOR AND DISPATCH LAYOUT
+ DESCRIPTOR AND DISPATCH LAYOUT
**************************************************************************/
@@ -181,7 +190,7 @@ DESCRIPTOR AND DISPATCH LAYOUT
// notifications as well as power management notifications are dispatched
// through this table.
//
-DEFINE_CAMERA_KSDEVICE_DISPATCH(AvsCameraDispatch, CAvsCameraDevice);
+DEFINE_CAMERA_KSDEVICE_DISPATCH( AvsCameraDispatch, CAvsCameraDevice );
//
// CaptureDeviceDescriptor:
@@ -203,7 +212,7 @@ AvsCameraDeviceDescriptor =
/**************************************************************************
-INITIALIZATION CODE
+ INITIALIZATION CODE
**************************************************************************/
@@ -212,7 +221,7 @@ extern "C" DRIVER_INITIALIZE DriverEntry;
extern "C"
NTSTATUS
-DriverEntry(
+DriverEntry (
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
@@ -221,20 +230,20 @@ DriverEntry(
Routine Description:
-Driver entry point. Pass off control to the AVStream initialization
-function (KsInitializeDriver) and return the status code from it.
+ 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
+ DriverObject -
+ The WDM driver object for our driver
-RegistryPath -
-The registry path for our registry info
+ RegistryPath -
+ The registry path for our registry info
Return Value:
-As from KsInitializeDriver
+ As from KsInitializeDriver
--*/
@@ -246,7 +255,7 @@ As from KsInitializeDriver
// here.
//
return
- KsInitializeDriver(
+ KsInitializeDriver (
DriverObject,
RegistryPath,
&AvsCameraDeviceDescriptor
diff --git a/avstream/avscamera/sys/Capture.cpp b/avstream/avscamera/sys/Capture.cpp
index 764052b3..cd62bae1 100644
--- a/avstream/avscamera/sys/Capture.cpp
+++ b/avstream/avscamera/sys/Capture.cpp
@@ -355,6 +355,11 @@ Return Value:
//
*m_pBitmapInfoHeader = m_VideoInfoHeader->bmiHeader;
}
+ else
+ {
+ DBG_TRACE("Connection Format was invalid");
+ return STATUS_INVALID_DEVICE_STATE;
+ }
DBG_TRACE( "+++ AvgTimePerFrame = %lld +++", m_VideoInfoHeader->AvgTimePerFrame );
@@ -808,7 +813,7 @@ EmitMetadata(
NTSTATUS
CCapturePin::
CompleteMapping(
- _In_ PKSSTREAM_POINTER Clone
+ _In_opt_ PKSSTREAM_POINTER Clone
)
/*++
@@ -1173,8 +1178,8 @@ Return Value:
// For debugging...
UNICODE_STRING NewFormat;
UNICODE_STRING RefFormat;
- RtlStringFromGUID( Pin->ConnectionFormat->SubFormat, &NewFormat );
- RtlStringFromGUID( DataRange->SubFormat, &RefFormat );
+ (void)RtlStringFromGUID( Pin->ConnectionFormat->SubFormat, &NewFormat );
+ (void)RtlStringFromGUID( DataRange->SubFormat, &RefFormat );
if( IsEqualGUID( Pin->ConnectionFormat->Specifier, ImageInfoSpecifier ) &&
Pin->ConnectionFormat->FormatSize >= sizeof (KS_DATAFORMAT_IMAGEINFO) )
@@ -1569,6 +1574,14 @@ Return Value:
}
//
+ // May only be null for size queries
+ //
+ if (Data == nullptr)
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ //
// Copy over the KSDATAFORMAT, followed by the actual VideoInfoHeader
//
*DataSize = DataFormatSize;
diff --git a/avstream/avscamera/sys/Capture.h b/avstream/avscamera/sys/Capture.h
index 0fd87101..1e0c62b9 100644
--- a/avstream/avscamera/sys/Capture.h
+++ b/avstream/avscamera/sys/Capture.h
@@ -34,10 +34,10 @@
#define D_X 320
#define D_Y 240
-#define DMAX_X_OS 728
+#define DMAX_X_OS 768
#define DMAX_Y_OS 576
-#define D_X_OS 384
-#define D_Y_OS 240
+#define D_X_OS 384
+#define D_Y_OS 288
///////////////////////////////////////////////////////////////////////////////
// GUID for primary and FFC cameras
@@ -217,7 +217,7 @@ public:
virtual
NTSTATUS
CompleteMapping(
- _In_ PKSSTREAM_POINTER Clone=nullptr
+ _In_opt_ PKSSTREAM_POINTER Clone=nullptr
);
void
diff --git a/avstream/avscamera/sys/Common.h b/avstream/avscamera/sys/Common.h
index 6870faea..d54ba2f3 100644
--- a/avstream/avscamera/sys/Common.h
+++ b/avstream/avscamera/sys/Common.h
@@ -1,21 +1,21 @@
/**************************************************************************
-A/V Stream Camera Sample
+ A/V Stream Camera Sample
-Copyright (c) 2015, Microsoft Corporation.
+ Copyright (c) 2015, Microsoft Corporation.
-File:
+ File:
-Common.h
+ Common.h
-Abstract:
+ Abstract:
-Common project header.
+ Common project header.
-History:
+ History:
-created 02/18/2015
+ created 02/18/2015
**************************************************************************/
@@ -46,7 +46,7 @@ created 02/18/2015
/*************************************************
-Add definitions that are missing for C++14.
+ Add definitions that are missing for C++14.
*************************************************/
@@ -54,44 +54,44 @@ PVOID operator new
(
size_t iSize,
_When_((poolType & NonPagedPoolMustSucceed) != 0,
- __drv_reportError("Must succeed pool allocations are forbidden. "
- "Allocation failures cause a system crash"))
+ __drv_reportError("Must succeed pool allocations are forbidden. "
+ "Allocation failures cause a system crash"))
POOL_TYPE poolType
- );
+);
PVOID operator new
(
size_t iSize,
_When_((poolType & NonPagedPoolMustSucceed) != 0,
- __drv_reportError("Must succeed pool allocations are forbidden. "
- "Allocation failures cause a system crash"))
+ __drv_reportError("Must succeed pool allocations are forbidden. "
+ "Allocation failures cause a system crash"))
POOL_TYPE poolType,
ULONG tag
- );
+);
/*++
Routine Description:
-Array new() operator for creating objects with a specified allocation tag.
+ Array new() operator for creating objects with a specified allocation tag.
Arguments:
-iSize -
-The size of the entire allocation.
+ iSize -
+ The size of the entire allocation.
-poolType -
-The type of allocation. Ex: PagedPool or NonPagedPoolNx
+ poolType -
+ The type of allocation. Ex: PagedPool or NonPagedPoolNx
-tag -
-A 4-byte allocation identifier.
+ tag -
+ A 4-byte allocation identifier.
Return Value:
-None
+ None
--*/
-PVOID
+PVOID
operator new[](
size_t iSize,
_When_((poolType & NonPagedPoolMustSucceed) != 0,
@@ -99,86 +99,86 @@ operator new[](
"Allocation failures cause a system crash"))
POOL_TYPE poolType,
ULONG tag
- );
+);
/*++
Routine Description:
-Array delete() operator.
+ Array delete() operator.
Arguments:
-pVoid -
-The memory to free.
+ pVoid -
+ The memory to free.
Return Value:
-None
+ None
--*/
-void
-__cdecl
+void
+__cdecl
operator delete[](
PVOID pVoid
- );
+);
/*++
Routine Description:
-Sized delete() operator.
+ Sized delete() operator.
Arguments:
-pVoid -
-The memory to free.
+ pVoid -
+ The memory to free.
-size -
-The size of the memory to free.
+ size -
+ The size of the memory to free.
Return Value:
-None
+ None
--*/
void __cdecl operator delete
(
void *pVoid,
size_t /*size*/
- );
+);
/*++
Routine Description:
-Sized delete[]() operator.
+ Sized delete[]() operator.
Arguments:
-pVoid -
-The memory to free.
+ pVoid -
+ The memory to free.
-size -
-The size of the memory to free.
+ size -
+ The size of the memory to free.
Return Value:
-None
+ None
--*/
void __cdecl operator delete[]
(
void *pVoid,
size_t /*size*/
- );
+);
#endif // _NEW_DELETE_OPERATORS_
/*************************************************
-Misc Definitions
+ Misc Definitions
*************************************************/
#pragma warning (disable : 4100 4127 4131 4189 4701 4706)
@@ -342,7 +342,7 @@ DEFINE_GUIDSTRUCT("32595559-0000-0010-8000-00AA00389B71", KSDATAFORMAT_SUBTYPE_Y
/*************************************************
-Externed information
+ Externed information
*************************************************/
//
@@ -366,7 +366,7 @@ AvsCameraFilterDescriptorFFC;
extern
const
GUID
-AvsCameraFilterCategories[CAPTURE_FILTER_CATEGORIES_COUNT];
+AvsCameraFilterCategories [CAPTURE_FILTER_CATEGORIES_COUNT];
//
// capture.cpp externs:
@@ -393,7 +393,7 @@ ImageCapturePinDispatch;
/*************************************************
-Enums / Typedefs
+ Enums / Typedefs
*************************************************/
@@ -414,23 +414,9 @@ typedef enum _PIN_MODE
} PIN_MODE, *PPIN_MODE;
-//Panel surface bits 115:118
-enum AcpiPldRotation
-{
- AcpiPldRotation0 = 0,
- AcpiPldRotation45 = 1,
- AcpiPldRotation90 = 2,
- AcpiPldRotation135 = 3,
- AcpiPldRotation180 = 4,
- AcpiPldRotation225 = 5,
- AcpiPldRotation270 = 6,
- AcpiPldRotation315 = 7,
-};
-
-
/*************************************************
-Class Definitions
+ Class Definitions
*************************************************/
@@ -449,19 +435,19 @@ struct ISP_FRAME_SETTINGS
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:
@@ -476,10 +462,10 @@ class ICapturePin
public:
virtual
- NTSTATUS
- CompleteMapping(
- _In_ PKSSTREAM_POINTER Clone = nullptr
- ) = 0;
+ NTSTATUS
+ CompleteMapping(
+ _In_opt_ PKSSTREAM_POINTER Clone=nullptr
+ ) = 0;
};
@@ -527,9 +513,9 @@ template <class T, class U>
class CMetaRational : public U
{
public:
- CMetaRational(T Num = 1, T Denom = 1)
+ CMetaRational( T Num=1, T Denom=1 )
{
- Set = TRUE;
+ Set=TRUE;
Numerator = Num;
Denominator = Denom;
}
@@ -542,7 +528,7 @@ template <class T, class U>
class CMetaPrimative : public U
{
public:
- CMetaPrimative(T n)
+ CMetaPrimative( T n )
{
Set = TRUE;
Value = n;
@@ -551,7 +537,7 @@ public:
typedef CMetaPrimative<UINT16, METADATA_UINT16> CMetadataShort;
typedef CMetaPrimative<UINT32, METADATA_UINT32> CMetadataLong;
-typedef CMetaPrimative<INT64, METADATA_INT64> CMetadataLongLong;
+typedef CMetaPrimative<INT64, METADATA_INT64> CMetadataLongLong;
typedef CMetaPrimative<UINT64, METADATA_UINT64> CMetadataULongLong;
class CMetadataShortString : public METADATA_SHORTSTRING
@@ -561,8 +547,8 @@ public:
_In_z_ const CHAR *str
)
{
- Length = (UINT32)min(strlen(str), sizeof(String));
- strncpy_s(String, str, Length);
+ Length = (UINT32) min(strlen(str), sizeof(String));
+ strncpy_s( String, str, Length );
}
};
@@ -608,7 +594,7 @@ public:
_In_ ULONG FrameIndex,
_In_ LONGLONG Time
)
- : m_Index(FrameIndex)
+ : m_Index( FrameIndex )
, m_Time(Time)
, m_bRequired(TRUE)
{}
@@ -616,23 +602,23 @@ public:
PHOTOCONFIRMATION_INFO()
: m_Index(0)
, m_Time(0)
- , m_bRequired(FALSE)
+ , m_bRequired( FALSE )
{}
BOOL
- isRequired()
+ isRequired()
{
return m_bRequired;
}
ULONG
- getIndex()
+ getIndex()
{
return m_Index;
}
LONGLONG
- getTime()
+ getTime()
{
return m_Time;
}
@@ -645,13 +631,13 @@ private:
/*************************************************
-Global Functions
+ Global Functions
*************************************************/
/*************************************************
-Internal Includes
+ Internal Includes
*************************************************/
diff --git a/avstream/avscamera/sys/Device.cpp b/avstream/avscamera/sys/Device.cpp
index 107cdafc..1b5f8090 100644
--- a/avstream/avscamera/sys/Device.cpp
+++ b/avstream/avscamera/sys/Device.cpp
@@ -700,7 +700,7 @@ Return Value:
// Publish our profile here.
uiProfileCount = InitializeDeviceProfiles(fFrontCamera, &pDeviceProfiles);
- if( uiProfileCount > 0 )
+ if( uiProfileCount > 0 && pDeviceProfiles != nullptr)
{
if( NT_SUCCESS(KsInitializeDeviceProfile(FilterFactory)) )
{
@@ -721,6 +721,10 @@ Return Value:
ExFreePool(pDeviceProfiles);
pDeviceProfiles = NULL;
}
+ else
+ {
+ IFFAILED_EXIT(STATUS_INSUFFICIENT_RESOURCES);
+ }
}
// On a real device this object would be constructed whenever the sensor hardware is ready...
diff --git a/avstream/avscamera/sys/PreviewHwSim.cpp b/avstream/avscamera/sys/PreviewHwSim.cpp
index dfe2dc1a..775c6b8d 100644
--- a/avstream/avscamera/sys/PreviewHwSim.cpp
+++ b/avstream/avscamera/sys/PreviewHwSim.cpp
@@ -93,52 +93,85 @@ GetMetadata()
ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
// Wipe the metadata so all settings will default to "Not Set".
- RtlZeroMemory( &Metadata, sizeof(Metadata) );
+ RtlZeroMemory(&Metadata, sizeof(Metadata));
- // FocusState;
- m_Sensor->GetFocusState( (KSCAMERA_EXTENDEDPROP_FOCUSSTATE *) &Metadata.FocusState );
+ // 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.
+
+ // 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;
+}
+
+
+VOID
+CPreviewHardwareSimulation::
+GetCaptureStats(
+ _In_ PKSCAMERA_METADATA_CAPTURESTATS pCaptureStats
+ )
+{
+ PAGED_CODE();
+
+ KSCAMERA_METADATA_CAPTURESTATS CaptureStats = {0};
+ ISP_FRAME_SETTINGS *pSettings = GetIspSettings();
+ CaptureStats.Flags =
+ (KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURETIME |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURECOMPENSATION |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_ISOSPEED |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_FOCUSSTATE |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_LENSPOSITION |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_WHITEBALANCE |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASH |
+ KSCAMERA_METADATA_CAPTURESTATS_FLAG_SENSORFRAMERATE);
+
// ExposureTime;
- Metadata.ExposureTime =
- CMetadataLongLong( GetCurrentExposureTime() );
+ CaptureStats.ExposureTime = GetCurrentExposureTime();
// EVCompensation;
- Metadata.EVCompensation = CMetadataEVCompensation(pSettings->EVCompensation.Mode, pSettings->EVCompensation.Value);
+ CaptureStats.ExposureCompensationFlags = pSettings->EVCompensation.Mode;
+ CaptureStats.ExposureCompensationValue = pSettings->EVCompensation.Value;
// ISOSpeed;
- Metadata.ISOSpeed = CMetadataLong(GetCurrentISOSpeed());
- DBG_TRACE("ISO=%d, ISO Flags=0x%016llX", Metadata.ISOSpeed.Value, pSettings->ISOMode);
+ CaptureStats.IsoSpeed = GetCurrentISOSpeed();
+ DBG_TRACE("ISO=%d, ISO Flags=0x%016llX", CaptureStats.IsoSpeed, pSettings->ISOMode);
- // LensPosition;
- Metadata.LensPosition = CMetadataLong( pSettings->FocusSetting.VideoProc.Value.ul );
+ // FocusState;
+ m_Sensor->GetFocusState((KSCAMERA_EXTENDEDPROP_FOCUSSTATE *)&CaptureStats.FocusState);
- // FlashOn;
- Metadata.FlashOn = CMetadataLong((ULONG) pSettings->FlashMode);
+ // LensPosition;
+ CaptureStats.LensPosition = pSettings->FocusSetting.VideoProc.Value.ul;
// WhiteBalanceMode;
- Metadata.WhiteBalanceMode = CMetadataLong((ULONG) pSettings->WhiteBalanceMode);
+ CaptureStats.WhiteBalance = (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.
+ // FlashOn;
+ CaptureStats.Flash = (ULONG) pSettings->FlashMode;
// 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 );
+ ULARGE_INTEGER FrameRate = {0};
+ if (m_TimePerFrame)
+ {
+ FrameRate.LowPart = 60 * 60 * 24;
+ FrameRate.HighPart = (ULONG)((ONESECOND * FrameRate.LowPart) / m_TimePerFrame);
+ }
+ CaptureStats.SensorFramerate = 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.
+ if (pCaptureStats)
+ {
+ *pCaptureStats = CaptureStats;
+ }
- return Metadata;
+ return;
}
//
@@ -204,17 +237,83 @@ Return Value:
DBG_TRACE("Normal frame; no photo confirmation metadata.");
}
- if( BytesLeft >= sizeof(CAMERA_METADATA_PREVIEWAGGREGATION) )
+ 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;
+ (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);
}
+ if( BytesLeft >= sizeof(KSCAMERA_METADATA_CAPTURESTATS) )
+ {
+ PKSCAMERA_METADATA_CAPTURESTATS pPreviewCaptureStats =
+ (PKSCAMERA_METADATA_CAPTURESTATS) (((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
+ GetCaptureStats(pPreviewCaptureStats);
+ pPreviewCaptureStats->Header.MetadataId = (ULONG)MetadataId_CaptureStats;
+ pPreviewCaptureStats->Header.Size = sizeof(*pPreviewCaptureStats);
+ pMetadata->UsedSize += sizeof(*pPreviewCaptureStats);
+ BytesLeft -= sizeof(*pPreviewCaptureStats);
+ }
+
+ if (BytesLeft >= sizeof(CAMERA_METADATA_UVC_HEADER))
+ {
+ PCAMERA_METADATA_UVC_HEADER pPreviewUvcHeader =
+ (PCAMERA_METADATA_UVC_HEADER)(((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
+ pPreviewUvcHeader->Header.MetadataId = (ULONG)MetadataId_UsbVideoHeader;
+ pPreviewUvcHeader->Header.Size = sizeof(CAMERA_METADATA_UVC_HEADER);
+
+ pPreviewUvcHeader->Data.StartOfFrameTimestamp.PresentationTimeStamp = 1;
+ pPreviewUvcHeader->Data.EndOfFrameTimestamp.SourceClockReference = 100;
+
+ pMetadata->UsedSize += sizeof(CAMERA_METADATA_UVC_HEADER);
+ BytesLeft -= sizeof(CAMERA_METADATA_UVC_HEADER);
+ }
+
+ if (BytesLeft >= sizeof(CAMERA_METADATA_EXTRINSICS))
+ {
+ PCAMERA_METADATA_EXTRINSICS pPreviewExtrinsics =
+ (PCAMERA_METADATA_EXTRINSICS)(((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
+ RtlZeroMemory(pPreviewExtrinsics, sizeof(CAMERA_METADATA_EXTRINSICS));
+
+ pPreviewExtrinsics->Header.MetadataId = (ULONG)MetadataId_CameraExtrinsics;
+ pPreviewExtrinsics->Header.Size = sizeof(CAMERA_METADATA_EXTRINSICS);
+
+ pMetadata->UsedSize += sizeof(CAMERA_METADATA_EXTRINSICS);
+ BytesLeft -= sizeof(CAMERA_METADATA_EXTRINSICS);
+ }
+
+ if (BytesLeft >= sizeof(CAMERA_METADATA_INTRINSICS))
+ {
+ PCAMERA_METADATA_INTRINSICS pPreviewIntrinsics =
+ (PCAMERA_METADATA_INTRINSICS)(((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
+ RtlZeroMemory(pPreviewIntrinsics, sizeof(CAMERA_METADATA_INTRINSICS));
+
+ pPreviewIntrinsics->Header.MetadataId = (ULONG)MetadataId_CameraIntrinsics;
+ pPreviewIntrinsics->Header.Size = sizeof(CAMERA_METADATA_INTRINSICS);
+
+ pMetadata->UsedSize += sizeof(CAMERA_METADATA_INTRINSICS);
+ BytesLeft -= sizeof(CAMERA_METADATA_INTRINSICS);
+ }
+
+ if (BytesLeft >= sizeof(KSCAMERA_METADATA_FRAMEILLUMINATION))
+ {
+ PKSCAMERA_METADATA_FRAMEILLUMINATION pPreviewIllumination =
+ (PKSCAMERA_METADATA_FRAMEILLUMINATION)(((PBYTE)pMetadata->SystemVa) + pMetadata->UsedSize);
+ RtlZeroMemory(pPreviewIllumination, sizeof(KSCAMERA_METADATA_FRAMEILLUMINATION));
+
+ pPreviewIllumination->Header.MetadataId = (ULONG)MetadataId_FrameIllumination;
+ pPreviewIllumination->Header.Size = sizeof(KSCAMERA_METADATA_FRAMEILLUMINATION);
+
+ pPreviewIllumination->Flags = KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON;
+
+ pMetadata->UsedSize += sizeof(KSCAMERA_METADATA_FRAMEILLUMINATION);
+ BytesLeft -= sizeof(KSCAMERA_METADATA_FRAMEILLUMINATION);
+ }
+
// MF_CAPTURE_METADATA_HISTOGRAM
//
// Generate the entire Histogram metadata blob here.
diff --git a/avstream/avscamera/sys/PreviewHwSim.h b/avstream/avscamera/sys/PreviewHwSim.h
index 92d3eae7..e5a4f536 100644
--- a/avstream/avscamera/sys/PreviewHwSim.h
+++ b/avstream/avscamera/sys/PreviewHwSim.h
@@ -43,8 +43,12 @@ public:
protected:
METADATA_PREVIEWAGGREGATION
- CPreviewHardwareSimulation::
- GetMetadata();
+ CPreviewHardwareSimulation::
+ GetMetadata();
+
+ VOID GetCaptureStats(
+ _In_ PKSCAMERA_METADATA_CAPTURESTATS pCaptureStats
+ );
// Inject preview pin-specific metadata.
virtual
diff --git a/avstream/avscamera/sys/RGB24Synthesizer.cpp b/avstream/avscamera/sys/RGB24Synthesizer.cpp
index 21c6e054..89c648bd 100644
--- a/avstream/avscamera/sys/RGB24Synthesizer.cpp
+++ b/avstream/avscamera/sys/RGB24Synthesizer.cpp
@@ -35,10 +35,6 @@
#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::
@@ -110,6 +106,7 @@ Return Value:
DWORD P2 = pSrc[2];
DWORD P3 = pSrc[3];
((PDWORD) pDst)[0] = ((P0 ) & 0x00FFFFFF) | (P1 << 24);
+#pragma warning(suppress: 6386) // TODO: Add OACR bug number once known
((PDWORD) pDst)[1] = ((P1 >> 8) & 0x0000FFFF) | (P2 << 16);
((PDWORD) pDst)[2] = ((P2 >> 16) & 0x000000FF) | (P3 << 8);
pDst += 4 * 3;
@@ -129,5 +126,3 @@ Return Value:
return limit * Stride;
}
-// suppressed due to Esp:773
-#pragma warning (pop)
diff --git a/avstream/avscamera/sys/Sensor.cpp b/avstream/avscamera/sys/Sensor.cpp
index cb310dcc..19988073 100644
--- a/avstream/avscamera/sys/Sensor.cpp
+++ b/avstream/avscamera/sys/Sensor.cpp
@@ -160,7 +160,7 @@ Initialize()
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_InterruptTime = new (NonPagedPoolNx, 'sneS') LONGLONG[m_PinCount];
m_LastMappingsCompleted = new (NonPagedPoolNx, 'sneS') ULONG[m_PinCount];
if( !m_HardwareSimulation ||
@@ -1021,9 +1021,9 @@ SetQPC(
NTSTATUS
CSensor::
SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
+ _In_opt_ ISP_FRAME_SETTINGS *pIspSettings,
+ _In_ ULONG FrameLimit,
+ _In_ ULONG LoopLimit
)
/*++
@@ -1083,6 +1083,22 @@ Return Value:
return STATUS_SUCCESS;
}
+void
+CSensor::
+SetSynthesizerAttribute(
+ CSynthesizer::Attribute Attrib,
+ LONGLONG Info
+)
+{
+ for( ULONG Pin=0; IsValidIndex(Pin); Pin++ )
+ {
+ if( m_Synthesizer[Pin] )
+ {
+ m_Synthesizer[Pin]->Set( Attrib, Info );
+ }
+ }
+}
+
/*************************************************/
diff --git a/avstream/avscamera/sys/Sensor.h b/avstream/avscamera/sys/Sensor.h
index 061e6ed5..a40b9d0c 100644
--- a/avstream/avscamera/sys/Sensor.h
+++ b/avstream/avscamera/sys/Sensor.h
@@ -172,7 +172,7 @@ protected:
//
// The number of ISR's that have occurred since capture started.
//
- ULONG *m_InterruptTime;
+ LONGLONG *m_InterruptTime;
//
// The last reading of mappings completed.
@@ -499,9 +499,9 @@ public:
virtual
NTSTATUS
SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
+ _In_opt_ ISP_FRAME_SETTINGS *pIspSettings,
+ _In_ ULONG FrameLimit,
+ _In_ ULONG LoopLimit
);
virtual
@@ -516,6 +516,9 @@ public:
m_MountingOrientation = Orientation;
}
+ void
+ SetSynthesizerAttribute( CSynthesizer::Attribute Attrib, LONGLONG Info );
+
protected:
LONG
IncrementFilterCount()
diff --git a/avstream/avscamera/sys/Sources.dep b/avstream/avscamera/sys/Sources.dep
deleted file mode 100644
index 8b137891..00000000
--- a/avstream/avscamera/sys/Sources.dep
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/avstream/avscamera/sys/Synthesizer.cpp b/avstream/avscamera/sys/Synthesizer.cpp
index 4f591424..2598f469 100644
--- a/avstream/avscamera/sys/Synthesizer.cpp
+++ b/avstream/avscamera/sys/Synthesizer.cpp
@@ -68,13 +68,6 @@ 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.
//
@@ -624,6 +617,8 @@ Return Value:
{
PAGED_CODE();
+ m_StartTime = KeQueryPerformanceCounter(&m_Frequency).QuadPart;
+
// Capture the working palette.
// Recast it to a point to an array of primaries.
if( !(m_Colors = GetPalette()) )
@@ -633,9 +628,10 @@ Return Value:
// 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;
+ for( ULONG i=0; i<MAX_Attribute; i++ )
+ {
+ m_Attrib[i]=0;
+ }
//
// Allocate a scratch buffer for the synthesizer.
@@ -706,13 +702,18 @@ Return Value:
SAFE_DELETE_ARRAY( m_Buffer );
SAFE_DELETE_ARRAY( m_GradientBmp );
+ LONGLONG EndTime = KeQueryPerformanceCounter(NULL).QuadPart;
+ LONGLONG FPS = ((LONGLONG)m_SynthesisCount * NANOSECONDS) / ( ConvertPerfTime( m_Frequency.QuadPart, (EndTime - m_StartTime) ) + (NANOSECONDS/2) );
+
// Report rendering times.
+ DBG_TRACE( "%s(%d,%d)", m_FormatName, m_Width, m_Height );
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 ) );
+ DBG_TRACE( " FPS = %lld", FPS );
}
NTSTATUS
@@ -1274,11 +1275,11 @@ Return Value:
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);
+ EncodeNumber((5*m_Height)/16, (UINT32)m_Attrib[FrameNumber], BLACK, WHITE);
+ EncodeNumber((6*m_Height)/16, (UINT32)m_Attrib[QpcTime], BLACK, WHITE);
CHAR Text [256];
- RtlStringCbPrintfA(Text, sizeof(Text), "Frame: %ld", m_Frame);
+ (void)RtlStringCbPrintfA(Text, sizeof(Text), "Frame: %lld", m_Attrib[FrameNumber]);
//
// Overlay the frame # onto the scratch space image.
@@ -1295,7 +1296,7 @@ Return Value:
//
// Add a description of the frame type/width/height.
//
- RtlStringCbPrintfA(Text, sizeof(Text), "%s (%dx%d)", m_FormatName, m_Width, m_Height);
+ (void)RtlStringCbPrintfA(Text, sizeof(Text), "%s (%dx%d)", m_FormatName, m_Width, m_Height);
OverlayText (
0,
(m_Height - 28),
@@ -1308,9 +1309,9 @@ Return Value:
//
// Add a description of the mounting.
//
- RtlStringCbPrintfA(Text, sizeof(Text), "%d\370 Mounting", DbgRotation2Degrees(m_Rotation));
- size_t len = 0;
- RtlStringCchLengthA(Text, sizeof(Text), &len);
+ (void)RtlStringCbPrintfA(Text, sizeof(Text), "%d\370 Mounting", DbgRotation2Degrees(m_Rotation));
+ size_t len = 0;
+ (void)RtlStringCchLengthA(Text, sizeof(Text), &len);
OverlayText (
(m_Width - (((ULONG)len*8))), // right-adjust text.
(m_Height - 28),
diff --git a/avstream/avscamera/sys/Synthesizer.h b/avstream/avscamera/sys/Synthesizer.h
index 8bf730ac..175fa348 100644
--- a/avstream/avscamera/sys/Synthesizer.h
+++ b/avstream/avscamera/sys/Synthesizer.h
@@ -112,6 +112,15 @@ UCHAR UCHAR4[4];
class CSynthesizer :
public CNonCopyable
{
+public:
+ enum Attribute
+ {
+ RelativePts,
+ QpcTime,
+ FrameNumber,
+ MAX_Attribute
+ };
+
protected:
static
@@ -119,18 +128,8 @@ protected:
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;
+ // These values are used by Synthesize() for display purposes.
+ LONGLONG m_Attrib[MAX_Attribute];
// This value is used to fudge a rotated image.
enum
@@ -206,6 +205,7 @@ protected:
ULONG m_SynthesisCount;
LONGLONG m_CommitTime;
ULONG m_CommitCount;
+ ULONGLONG m_StartTime;
public:
@@ -234,7 +234,11 @@ public:
, m_Rotation(AcpiPldRotation0)
{
m_Length = Height * m_SynthesisStride;
- KeQueryPerformanceCounter(&m_Frequency);
+ KeQueryPerformanceCounter(&m_Frequency).QuadPart;
+ for( ULONG i=0; i<MAX_Attribute; i++ )
+ {
+ m_Attrib[i]=0;
+ }
}
//
@@ -450,21 +454,9 @@ public:
);
void
- SetRelativePts( LONGLONG Pts )
- {
- m_RelPts = Pts;
- }
-
- void
- SetQpcTime( LONGLONG Pts )
- {
- m_QpcTime = Pts;
- }
-
- void
- SetFrameNumber( ULONG Frame )
+ Set( Attribute Attrib, LONGLONG Info )
{
- m_Frame = Frame;
+ m_Attrib[Attrib] = Info;
}
void
diff --git a/avstream/avscamera/sys/WorkItem.cpp b/avstream/avscamera/sys/WorkItem.cpp
index 9bb0d795..64f6238b 100644
--- a/avstream/avscamera/sys/WorkItem.cpp
+++ b/avstream/avscamera/sys/WorkItem.cpp
@@ -157,11 +157,14 @@ Return Value:
KWorkItem *Me = (KWorkItem *) Context;
// Invoke the callback if one exists.
- if( Me->m_Callback )
+ if (Me)
{
- Me->m_Callback( IoObject, Me->m_Context );
- }
+ if (Me->m_Callback)
+ {
+ Me->m_Callback(IoObject, Me->m_Context);
+ }
- // Unlock the work item; allow for destruction or re-enqueing.
- Me->Release();
+ // Unlock the work item; allow for destruction or re-enqueing.
+ Me->Release();
+ }
}
diff --git a/avstream/avscamera/sys/hwsim.cpp b/avstream/avscamera/sys/hwsim.cpp
index f00a4684..df8240b4 100644
--- a/avstream/avscamera/sys/hwsim.cpp
+++ b/avstream/avscamera/sys/hwsim.cpp
@@ -353,7 +353,7 @@ Return Value:
LARGE_INTEGER UnpauseTime;
KeQuerySystemTime (&UnpauseTime);
- m_InterruptTime = (ULONG) (
+ m_InterruptTime = (LONGLONG) (
(UnpauseTime.QuadPart - m_StartTime.QuadPart) /
m_TimePerFrame
);
@@ -1187,16 +1187,25 @@ Return Value:
//
if (m_PinState == PinRunning)
{
+ LONGLONG Qpc = (LONGLONG) ConvertQPCtoTimeStamp(nullptr);
+ LARGE_INTEGER Now;
+
+ KeQuerySystemTimePrecise( &Now );
//
// 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);
+ // Only set these values if it's a preview simulation.
+ // Note: This was simpler than overloading CHardwareSimulation...
+ if( m_Sensor->IsPreviewIndex(m_PinID) )
+ {
+ DBG_TRACE("QPC=0x%016llX", Qpc);
- m_Synthesizer->SetFrameNumber( m_InterruptTime );
- m_Synthesizer->SetRelativePts( (m_InterruptTime + 1) * m_TimePerFrame );
- m_Synthesizer->SetQpcTime( time );
+ // Broadcast the preview pin's info to all pin simulations.
+ m_Sensor->SetSynthesizerAttribute(CSynthesizer::FrameNumber, m_InterruptTime);
+ m_Sensor->SetSynthesizerAttribute(CSynthesizer::RelativePts, (m_InterruptTime + 1) * m_TimePerFrame );
+ m_Sensor->SetSynthesizerAttribute(CSynthesizer::QpcTime, Qpc );
+ }
m_Synthesizer->DoSynthesize();
@@ -1212,13 +1221,42 @@ Return Value:
m_Synthesizer->OverlayText( 0, m_Height-48, 1, Text, TRANSPARENT, TEXT_COLOR );
//
+ // Add the Missed frame count
+ RtlStringCbPrintfA(Text, sizeof(Text), "%lld Missed", m_NumFramesSkipped);
+ size_t len = 0;
+ RtlStringCchLengthA(Text, sizeof(Text), &len);
+ m_Synthesizer->OverlayText(
+ (m_Width - (((ULONG)len*8))), // right-adjust text.
+ (m_Height - 48),
+ 1,
+ Text,
+ TRANSPARENT,
+ TEXT_COLOR
+ );
+
+ //
+ // Add the estimated FPS
+ LONGLONG Target = NANOSECONDS / m_TimePerFrame;
+ LONGLONG FPS = ((LONGLONG)m_InterruptTime * NANOSECONDS) / ( (Now.QuadPart - m_StartTime.QuadPart) + (NANOSECONDS/2) );
+ RtlStringCbPrintfA(Text, sizeof(Text), "%lld/%lld FPS", FPS, Target);
+ len = 0;
+ RtlStringCchLengthA(Text, sizeof(Text), &len);
+ m_Synthesizer->OverlayText (
+ (m_Width - (((ULONG)len*8))), // right-adjust text.
+ (m_Height - 38),
+ 1,
+ Text,
+ TRANSPARENT,
+ TEXT_COLOR
+ );
+
+ //
// Fill scatter gather buffers
//
if (!NT_SUCCESS (FillScatterGatherBuffers ()))
{
- InterlockedIncrement (PLONG (&m_NumFramesSkipped));
+ m_NumFramesSkipped++;
}
-
}
//
diff --git a/avstream/avscamera/sys/hwsim.h b/avstream/avscamera/sys/hwsim.h
index 247de1f0..0a866eea 100644
--- a/avstream/avscamera/sys/hwsim.h
+++ b/avstream/avscamera/sys/hwsim.h
@@ -116,8 +116,8 @@ protected:
ULONG m_NumMappingsCompleted;
ULONG m_ScatterGatherMappingsQueued;
ULONG m_ScatterGatherBytesQueued;
- ULONG m_NumFramesSkipped;
- ULONG m_InterruptTime;
+ LONGLONG m_NumFramesSkipped;
+ LONGLONG m_InterruptTime;
LARGE_INTEGER m_StartTime;
CSensor *m_Sensor;
@@ -174,7 +174,7 @@ protected:
public:
// Debug helper
- LONG GetSkippedFrameCount()
+ LONGLONG GetSkippedFrameCount()
{
return m_NumFramesSkipped;
}
diff --git a/avstream/avscamera/sys/imagehwsim.cpp b/avstream/avscamera/sys/imagehwsim.cpp
index e6256d45..1f4d7a1a 100644
--- a/avstream/avscamera/sys/imagehwsim.cpp
+++ b/avstream/avscamera/sys/imagehwsim.cpp
@@ -1222,7 +1222,7 @@ CompleteCloneList()
NTSTATUS
CImageHardwareSimulation::
-SetClock(PKSPIN pin)
+SetClock(_In_ PKSPIN pin)
{
PAGED_CODE();
@@ -1312,9 +1312,9 @@ SetFlashStatus(
NTSTATUS
CImageHardwareSimulation::
SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
+ _In_opt_ ISP_FRAME_SETTINGS *pIspSettings,
+ _In_ ULONG FrameLimit,
+ _In_ ULONG LoopLimit
)
{
PAGED_CODE();
diff --git a/avstream/avscamera/sys/imagehwsim.h b/avstream/avscamera/sys/imagehwsim.h
index 1355a527..4eaa407d 100644
--- a/avstream/avscamera/sys/imagehwsim.h
+++ b/avstream/avscamera/sys/imagehwsim.h
@@ -181,9 +181,9 @@ public:
// Note: We make a local copy.
NTSTATUS
SetPFS(
- _In_ ISP_FRAME_SETTINGS *pIspSettings,
- _In_ ULONG FrameLimit,
- _In_ ULONG LoopLimit
+ _In_opt_ ISP_FRAME_SETTINGS *pIspSettings,
+ _In_ ULONG FrameLimit,
+ _In_ ULONG LoopLimit
);
// Advance our frame and loop pointers to the next PFS settings.