/*++ THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. Module Name: StreamEngine.cpp Abstract: Virtual Streaming Engine - this module controls streaming logic for the device. Environment: Kernel mode --*/ #include "private.h" #include #include "stdunk.h" #include #include #include #include "streamengine.h" #ifndef __INTELLISENSE__ #include "streamengine.tmh" #endif _Use_decl_annotations_ PAGED_CODE_SEG CStreamEngine::CStreamEngine( _In_ ACXSTREAM Stream, _In_ ACXDATAFORMAT StreamFormat ) : m_CurrentState(AcxStreamStateStop), m_Stream(Stream), m_StreamFormat(StreamFormat) { PAGED_CODE(); KeQueryPerformanceCounter(&m_PerformanceCounterFrequency); } #pragma code_seg() CStreamEngine::~CStreamEngine() { } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CStreamEngine::PrepareHardware() { PAGED_CODE(); m_CurrentState = AcxStreamStatePause; return STATUS_SUCCESS; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CStreamEngine::ReleaseHardware() { PAGED_CODE(); m_CurrentState = AcxStreamStateStop; return STATUS_SUCCESS; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CStreamEngine::Pause() { PAGED_CODE(); m_CurrentState = AcxStreamStatePause; return STATUS_SUCCESS; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CStreamEngine::Run() { PAGED_CODE(); NTSTATUS status = STATUS_SUCCESS; if (m_CurrentState != AcxStreamStatePause) { status = STATUS_INVALID_STATE_TRANSITION; return status; } m_CurrentState = AcxStreamStateRun; return status; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CStreamEngine::AssignDrmContentId( _In_ ULONG DrmContentId, _In_ PACXDRMRIGHTS DrmRights ) { PAGED_CODE(); UNREFERENCED_PARAMETER(DrmContentId); UNREFERENCED_PARAMETER(DrmRights); // // At this point the driver should enforce the new DrmRights. // // HDMI render: if DigitalOutputDisable or CopyProtect is true, enable HDCP. // // From MSDN: // // This sample doesn't forward protected content, but if your driver uses // lower layer drivers or a different stack to properly work, please see the // following info from MSDN: // // "Before allowing protected content to flow through a data path, the system // verifies that the data path is secure. To do so, the system authenticates // each module in the data path beginning at the upstream end of the data path // and moving downstream. As each module is authenticated, that module gives // the system information about the next module in the data path so that it // can also be authenticated. To be successfully authenticated, a module's // binary file must be signed as DRM-compliant. // // Two adjacent modules in the data path can communicate with each other in // one of several ways. If the upstream module calls the downstream module // through IoCallDriver, the downstream module is part of a WDM driver. In // this case, the upstream module calls the AcxDrmForwardContentToDeviceObject // function to provide the system with the device object representing the // downstream module. (If the two modules communicate through the downstream // module's content handlers, the upstream module calls AcxDrmAddContentHandlers // instead.) // // For more information, see MSDN's DRM Functions and Interfaces. // return STATUS_SUCCESS; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CStreamEngine::GetHWLatency( _Out_ ULONG * FifoSize, _Out_ ULONG * Delay ) { PAGED_CODE(); *FifoSize = 128; *Delay = 0; return STATUS_SUCCESS; } _Use_decl_annotations_ PAGED_CODE_SEG CRenderStreamEngine::CRenderStreamEngine( _In_ ACXSTREAM Stream, _In_ ACXDATAFORMAT StreamFormat ) : CStreamEngine(Stream, StreamFormat) { PAGED_CODE(); } _Use_decl_annotations_ PAGED_CODE_SEG CRenderStreamEngine::~CRenderStreamEngine() { PAGED_CODE(); } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CRenderStreamEngine::PrepareHardware() { NTSTATUS status = STATUS_SUCCESS; PAGED_CODE(); status = CStreamEngine::PrepareHardware(); // Add other init here. return status; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CRenderStreamEngine::ReleaseHardware() { PAGED_CODE(); return CStreamEngine::ReleaseHardware(); } _Use_decl_annotations_ PAGED_CODE_SEG CCaptureStreamEngine::CCaptureStreamEngine( _In_ ACXSTREAM Stream, _In_ ACXDATAFORMAT StreamFormat ) : CStreamEngine(Stream, StreamFormat) { PAGED_CODE(); } _Use_decl_annotations_ PAGED_CODE_SEG CCaptureStreamEngine::~CCaptureStreamEngine() { PAGED_CODE(); } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CCaptureStreamEngine::PrepareHardware() { PAGED_CODE(); NTSTATUS status = STATUS_SUCCESS; RETURN_NTSTATUS_IF_FAILED(CStreamEngine::PrepareHardware()); RETURN_NTSTATUS_IF_FAILED(ReadRegistrySettings()); return status; } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CCaptureStreamEngine::ReleaseHardware() { PAGED_CODE(); return CStreamEngine::ReleaseHardware(); } _Use_decl_annotations_ PAGED_CODE_SEG NTSTATUS CCaptureStreamEngine::ReadRegistrySettings() { PAGED_CODE(); return STATUS_SUCCESS; }