windows-nt/Source/XPSP1/NT/drivers/wdm/capture/mini/testcap/capmain.h

465 lines
16 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//==========================================================================;
//
// 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!)
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__