//==========================================================================; // // 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. // // Copyright (c) 1992 - 1999 Microsoft Corporation. All Rights Reserved. // //==========================================================================; #ifndef __CAPMAIN_H__ #define __CAPMAIN_H__ #ifdef __cplusplus extern "C" { #endif // __cplusplus // ------------------------------------------------------------------------ // The master list of all streams supported by this driver // ------------------------------------------------------------------------ // Warning: The stream numbers below MUST be the same as its position // in the Streams[] array in the capstrm.h file. typedef enum { STREAM_Capture = 0, STREAM_Preview, STREAM_VBI, STREAM_CC, STREAM_NABTS, STREAM_AnalogVideoInput, MAX_TESTCAP_STREAMS // This entry MUST be last; it's the size }; // ------------------------------------------------------------------------ // Other misc stuff // ------------------------------------------------------------------------ #ifndef FIELDOFFSET #define FIELDOFFSET(type, field) ((LONG_PTR)(&((type *)1)->field)-1) #endif #ifndef mmioFOURCC #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) #endif #define FOURCC_YUV422 mmioFOURCC('U', 'Y', 'V', 'Y') typedef struct _STREAMX; typedef struct _STREAMX *PSTREAMX; typedef struct _COMPRESSION_SETTINGS { LONG CompressionKeyFrameRate; LONG CompressionPFramesPerKeyFrame; LONG CompressionQuality; } COMPRESSION_SETTINGS, *PCOMPRESSION_SETTINGS; // // definition of the full HW device extension structure This is the structure // that will be allocated in HW_INITIALIZATION by the stream class driver // Any information that is used in processing a device request (as opposed to // a STREAM based request) should be in this structure. A pointer to this // structure will be passed in all requests to the minidriver. (See // HW_STREAM_REQUEST_BLOCK in STRMINI.H) // typedef struct _HW_DEVICE_EXTENSION { PULONG ioBaseLocal; // board base address USHORT Irq; // IRQ level BOOLEAN IRQExpected; // IRQ expected PSTREAMX pStrmEx [MAX_TESTCAP_STREAMS]; // Pointers to each stream UINT ActualInstances [MAX_TESTCAP_STREAMS]; // Counter of instances per stream PDEVICE_OBJECT PDO; // Physical Device Object DEVICE_POWER_STATE DeviceState; // D0 ... D3 // Spinlock and Queue for the Adapter BOOL AdapterQueueInitialized; // Stays TRUE after first init KSPIN_LOCK AdapterSpinLock; // Multiprocessor safe access to AdapterSRBList LIST_ENTRY AdapterSRBList; // List of pending adapter commands BOOL ProcessingAdapterSRB; // Master flag which prevents reentry // Spinlocks and Queues for each data stream LIST_ENTRY StreamSRBList[MAX_TESTCAP_STREAMS]; // List of pending read requests KSPIN_LOCK StreamSRBSpinLock[MAX_TESTCAP_STREAMS];// Multiprocessor safe access to StreamSRBList int StreamSRBListSize[MAX_TESTCAP_STREAMS];// Number of entries in the list // Control Queues for each data stream LIST_ENTRY StreamControlSRBList[MAX_TESTCAP_STREAMS]; BOOL ProcessingControlSRB[MAX_TESTCAP_STREAMS]; // Unique identifier for the analog video input pin KSPIN_MEDIUM AnalogVideoInputMedium; UINT DriverMediumInstanceCount; // Unique Medium.Id for multiple cards // Crossbar settings LONG VideoInputConnected; // which input is the video out connected to? LONG AudioInputConnected; // which input is the audio out connected to? // TV Tuner settings ULONG TunerMode; // TV, FM, AM, ATSC ULONG Frequency; ULONG VideoStandard; ULONG TuningQuality; ULONG TunerInput; ULONG Country; ULONG Channel; ULONG Busy; // TV Audio settings ULONG TVAudioMode; // VideoProcAmp settings LONG Brightness; LONG BrightnessFlags; LONG Contrast; LONG ContrastFlags; LONG ColorEnable; LONG ColorEnableFlags; // CameraControl settings LONG Focus; LONG FocusFlags; LONG Zoom; LONG ZoomFlags; // AnalogVideoDecoder settings LONG VideoDecoderVideoStandard; LONG VideoDecoderOutputEnable; LONG VideoDecoderVCRTiming; // VideoControl settings (these are set if a pin is not opened, // otherwise, the STREAMEX values are used. LONG VideoControlMode; // Compressor settings (these are set if a pin is not opened, // otherwise, the STREAMEX values are used. COMPRESSION_SETTINGS CompressionSettings; // Channel Change information KS_TVTUNER_CHANGE_INFO TVTunerChangeInfo; // Bits indicating protection status; eg, has Macrovision been detected? ULONG ProtectionStatus; } HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION; // // this structure is our per stream extension structure. This stores // information that is relevant on a per stream basis. Whenever a new stream // is opened, the stream class driver will allocate whatever extension size // is specified in the HwInitData.PerStreamExtensionSize. // typedef struct _STREAMEX { PHW_DEVICE_EXTENSION pHwDevExt; // For timer use PHW_STREAM_OBJECT pStreamObject; // For timer use KS_VIDEOINFOHEADER *pVideoInfoHeader; // format (variable size!) KSPIN_LOCK lockVideoInfoHeader;// lock the access to pVideoInfoHeader DWORD biSizeImage; // a copy from InfoHdr to avoid lock KS_DATARANGE_VIDEO_VBI *pVBIStreamFormat; KS_FRAME_INFO FrameInfo; // PictureNumber, etc. KS_VBI_FRAME_INFO VBIFrameInfo; // PictureNumber, etc. ULONG fDiscontinuity; // Discontinuity since last valid KSSTATE KSState; // Run, Stop, Pause UCHAR LineBuffer[720 * 3];// working buffer (RGB24) // Clock HANDLE hMasterClock; // Master clock to use REFERENCE_TIME QST_Now; // KeQuerySystemTime currently REFERENCE_TIME QST_NextFrame; // When to capture the next frame REFERENCE_TIME QST_StreamTime; // Stream time reported by master clock REFERENCE_TIME AvgTimePerFrame; // Extracted from pVideoInfoHeader // Compressor settings (note these are duplicated in the // HW_DEVICE_EXTENSION to allow setting these before a pin is created) COMPRESSION_SETTINGS CompressionSettings; // VideoControl settings (note these are duplicated in the // HW_DEVICE_EXTENSION to allow setting these before a pin is created) LONG VideoControlMode; // Kernel DDraw interface BOOL KernelDirectDrawRegistered; HANDLE UserDirectDrawHandle; // DD itself HANDLE KernelDirectDrawHandle; BOOL PreEventOccurred; BOOL PostEventOccurred; BOOL SentVBIInfoHeader; } STREAMEX, *PSTREAMEX; // // this structure defines the per request extension. It defines any storage // space that the mini driver may need in each request packet. // typedef struct _SRB_EXTENSION { LIST_ENTRY ListEntry; PHW_STREAM_REQUEST_BLOCK pSrb; HANDLE UserSurfaceHandle; // DDraw HANDLE KernelSurfaceHandle; // DDraw } SRB_EXTENSION, * PSRB_EXTENSION; // ------------------------------------------------------------------- // // Adapter level prototypes // // These functions affect the device as a whole, as opposed to // affecting individual streams. // // ------------------------------------------------------------------- // // DriverEntry: // // This routine is called when the mini driver is first loaded. The driver // should then call the StreamClassRegisterAdapter function to register with // the stream class driver // ULONG DriverEntry (PVOID Context1, PVOID Context2); // // This routine is called by the stream class driver with configuration // information for an adapter that the mini driver should load on. The mini // driver should still perform a small verification to determine that the // adapter is present at the specified addresses, but should not attempt to // find an adapter as it would have with previous NT miniports. // // All initialization of the adapter should also be performed at this time. // BOOLEAN STREAMAPI HwInitialize (IN OUT PHW_STREAM_REQUEST_BLOCK pSrb); // // This routine is called when the system is going to remove or disable the // device. // // The mini-driver should free any system resources that it allocated at this // time. Note that system resources allocated for the mini-driver by the // stream class driver will be free'd by the stream driver, and should not be // free'd in this routine. (Such as the HW_DEVICE_EXTENSION) // BOOLEAN STREAMAPI HwUnInitialize ( PHW_STREAM_REQUEST_BLOCK pSrb); // // This is the prototype for the Hardware Interrupt Handler. This routine // will be called whenever the minidriver receives an interrupt // BOOLEAN HwInterrupt ( IN PHW_DEVICE_EXTENSION pDeviceExtension ); // // This is the prototype for the stream enumeration function. This routine // provides the stream class driver with the information on data stream types // supported // VOID STREAMAPI AdapterStreamInfo(PHW_STREAM_REQUEST_BLOCK pSrb); // // This is the prototype for the stream open function // VOID STREAMAPI AdapterOpenStream(PHW_STREAM_REQUEST_BLOCK pSrb); // // This is the prototype for the stream close function // VOID STREAMAPI AdapterCloseStream(PHW_STREAM_REQUEST_BLOCK pSrb); // // This is the prototype for the AdapterReceivePacket routine. This is the // entry point for command packets that are sent to the adapter (not to a // specific open stream) // VOID STREAMAPI AdapterReceivePacket(IN PHW_STREAM_REQUEST_BLOCK Srb); // // This is the protoype for the cancel packet routine. This routine enables // the stream class driver to cancel an outstanding packet. // VOID STREAMAPI AdapterCancelPacket(IN PHW_STREAM_REQUEST_BLOCK Srb); // // This is the packet timeout function. The adapter may choose to ignore a // packet timeout, or rest the adapter and cancel the requests, as required. // VOID STREAMAPI AdapterTimeoutPacket(IN PHW_STREAM_REQUEST_BLOCK Srb); // // Adapter level property set handling // VOID STREAMAPI AdapterGetCrossbarProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetCrossbarProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetTunerProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetTunerProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetVideoProcAmpProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetVideoProcAmpProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetCameraControlProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetCameraControlProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetTVAudioProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetTVAudioProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetAnalogVideoDecoderProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetAnalogVideoDecoderProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetVideoControlProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetVideoControlProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetVideoCompressionProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetVideoCompressionProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterSetProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AdapterGetProperty(IN PHW_STREAM_REQUEST_BLOCK pSrb); BOOL STREAMAPI AdapterVerifyFormat( PKSDATAFORMAT pKSDataFormatToVerify, int StreamNumber); BOOL STREAMAPI AdapterFormatFromRange( IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI CompleteDeviceSRB ( IN PHW_STREAM_REQUEST_BLOCK pSrb ); VOID STREAMAPI AdapterSetInstance ( PHW_STREAM_REQUEST_BLOCK pSrb ); // // prototypes for general queue management using a busy flag // BOOL STREAMAPI AddToListIfBusy ( IN PHW_STREAM_REQUEST_BLOCK pSrb, IN KSPIN_LOCK *SpinLock, IN OUT BOOL *BusyFlag, IN LIST_ENTRY *ListHead ); BOOL STREAMAPI RemoveFromListIfAvailable ( IN OUT PHW_STREAM_REQUEST_BLOCK *pSrb, IN KSPIN_LOCK *SpinLock, IN OUT BOOL *BusyFlag, IN LIST_ENTRY *ListHead ); // ------------------------------------------------------------------- // // Stream level prototypes // // These functions affect individual streams, as opposed to // affecting the device as a whole. // // ------------------------------------------------------------------- // // Routines to manage the SRB queue on a per stream basis // VOID STREAMAPI VideoQueueAddSRB ( IN PHW_STREAM_REQUEST_BLOCK pSrb ); PHW_STREAM_REQUEST_BLOCK STREAMAPI VideoQueueRemoveSRB ( PHW_DEVICE_EXTENSION pHwDevExt, int StreamNumber ); VOID STREAMAPI VideoQueueCancelAllSRBs ( PSTREAMEX pStrmEx ); BOOL STREAMAPI VideoQueueCancelOneSRB ( PSTREAMEX pStrmEx, PHW_STREAM_REQUEST_BLOCK pSrbToCancel ); // // StreamFormat declarations // extern KS_DATARANGE_VIDEO_VBI StreamFormatVBI; extern KSDATARANGE StreamFormatNABTS; extern KSDATARANGE StreamFormatCC; // // Data packet handlers // // // prototypes for data handling routines // VOID STREAMAPI CompleteStreamSRB (IN PHW_STREAM_REQUEST_BLOCK pSrb); BOOL STREAMAPI VideoSetFormat(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AnalogVideoReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI AnalogVideoReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VBIReceiveDataPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VBIReceiveCtrlPacket(IN PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI EnableIRQ(PHW_STREAM_OBJECT pstrm); VOID STREAMAPI DisableIRQ(PHW_STREAM_OBJECT pstrm); // // prototypes for properties and states // VOID STREAMAPI VideoSetState(PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoGetState(PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoSetProperty(PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoGetProperty(PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoStreamGetConnectionProperty (PHW_STREAM_REQUEST_BLOCK pSrb); VOID STREAMAPI VideoStreamGetDroppedFramesProperty(PHW_STREAM_REQUEST_BLOCK pSrb); // // stream clock functions // VOID STREAMAPI VideoIndicateMasterClock (PHW_STREAM_REQUEST_BLOCK pSrb); // // The point of it all // VOID STREAMAPI VideoCaptureRoutine( IN PSTREAMEX pStrmEx ); #ifdef __cplusplus } #endif // __cplusplus #endif //__CAPMAIN_H__