diff options
| author | Wei Mao <[email protected]> | 2017-03-20 18:25:57 -0700 |
|---|---|---|
| committer | Wei Mao <[email protected]> | 2017-03-20 18:27:00 -0700 |
| commit | e044ea456aad4c444fbce00a2d9b56b304d59884 (patch) | |
| tree | 4326af385f0666a3af0b7dfae534db68e3e25785 | |
| parent | bc6e698503f46afbd8fcf62f6d3939147dc49999 (diff) | |
| parent | e4581d8cd1bcc5108786b082a1ec24007a508847 (diff) | |
Merge pull request #118 from saredd/master
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. |
