|
|
//==========================================================================;
//
// 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 - 1996 Microsoft Corporation. All Rights Reserved.
//
//==========================================================================;
#ifndef __CAPMAIN_H__
#define __CAPMAIN_H__
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
#ifdef TOSHIBA
//#define _FPS_COUNT_ // For FPS confirm
#endif//TOSHIBA
#ifndef FIELDOFFSET
#define FIELDOFFSET(type, field) (int)((INT_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
#ifdef TOSHIBA
#define FOURCC_YVU9 mmioFOURCC('Y', 'V', 'U', '9')
#define FOURCC_YUV12 mmioFOURCC('I', '4', '2', '0')
#else //TOSHIBA
#define FOURCC_YUV422 mmioFOURCC('U', 'Y', 'V', 'Y')
#endif//TOSHIBA
typedef struct _STREAMX; typedef struct _STREAMX *PSTREAMX;
#ifdef TOSHIBA
#define MAX_TSBVCAP_STREAMS 2
#else //TOSHIBA
#define MAX_TSBVCAP_STREAMS 4
#endif//TOSHIBA
#ifdef TOSHIBA
/* possible capture formats */ typedef enum _CAPTUREFORMAT { FmtInvalid = 0, // default fmt is 'not set yet'
FmtYUV12, // yuv12 planar
FmtYUV9, // yuv9 planar
MaxCaptureFormat } CAPTUREFORMAT; #endif//TOSHIBA
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_TSBVCAP_STREAMS]; // Pointers to each stream
UINT ActualInstances [MAX_TSBVCAP_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_TSBVCAP_STREAMS]; // List of pending read requests
KSPIN_LOCK StreamSRBSpinLock[MAX_TSBVCAP_STREAMS];// Multiprocessor safe access to StreamSRBList
int StreamSRBListSize[MAX_TSBVCAP_STREAMS];// Number of entries in the list
// Control Queues for each data stream
LIST_ENTRY StreamControlSRBList[MAX_TSBVCAP_STREAMS]; BOOL ProcessingControlSRB[MAX_TSBVCAP_STREAMS];
#ifdef TOSHIBA
// VideoProcAmp settings
LONG Brightness; LONG BrightnessFlags; LONG Contrast; LONG ContrastFlags; LONG Hue; LONG HueFlags; LONG Saturation; LONG SaturationFlags; LONG ColorEnable; LONG ColorEnableFlags;
// 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;
#ifdef TOSHIBA // '98-12-09 Added, for Bug-Report 253529
KSPROPERTY_BOUNDS_LONG BrightnessRange; KSPROPERTY_BOUNDS_LONG ContrastRange; KSPROPERTY_BOUNDS_LONG HueRange; KSPROPERTY_BOUNDS_LONG SaturationRange; #endif//TOSHIBA
// Misc
volatile BOOL bVideoIn; // are we actually doing video in ?
CAPTUREFORMAT Format; // format of destination DIB
DWORD dwAsicRev; // source rectangle data
RECT SrcRect; RECT MaxRect; // driver DMA structures for direct io
PVOID pRpsDMABuf; // pointer to the RPS DMA buffer
STREAM_PHYSICAL_ADDRESS pPhysRpsDMABuf;// physical address of RPS DMA buffer
// driver capture buffer information
PVOID pCaptureBufferY; PVOID pCaptureBufferU; PVOID pCaptureBufferV; STREAM_PHYSICAL_ADDRESS pPhysCaptureBufferY; STREAM_PHYSICAL_ADDRESS pPhysCaptureBufferU; STREAM_PHYSICAL_ADDRESS pPhysCaptureBufferV; PVOID pCapBuf2Y; PVOID pCapBuf2U; PVOID pCapBuf2V; STREAM_PHYSICAL_ADDRESS pPhysCapBuf2Y; STREAM_PHYSICAL_ADDRESS pPhysCapBuf2U; STREAM_PHYSICAL_ADDRESS pPhysCapBuf2V; BOOL dblBufflag; // configuration parameters for the video source and the format
ULONG ulWidth; ULONG ulHeight; ULONG BufferSize; // RequestDpc flag for CaptureService
BOOL bRequestDpc; volatile BOOLEAN DpcRequested;
unsigned uiFramePerSecond; volatile DWORD s_physDmaActiveFlag;
DWORD YoffsetOdd; DWORD UoffsetOdd; DWORD VoffsetOdd;
DWORD YoffsetEven; DWORD UoffsetEven; DWORD VoffsetEven;
DWORD Ystride; DWORD Ustride; DWORD Vstride;
BOOL NeedCameraON; BOOL NeedCameraOFF; BOOL NeedHWInit; BOOL IsRPSReady; #else //TOSHIBA
// Unique identifier for the analog video input pin
KSPIN_MEDIUM AnalogVideoInputMedium;
// 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 Frequency; ULONG VideoStandard; ULONG TuningQuality; ULONG TunerInput; 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; #endif//TOSHIBA
} 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_FRAME_INFO FrameInfo; // 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
// 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; } 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);
#ifdef TOSHIBA
VOID GetPCIConfigSpace(PHW_STREAM_REQUEST_BLOCK pSrb); #endif//TOSHIBA
//
// 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.
//
BOOL 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)
//
BOOL 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 );
//
// 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 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);
ULONGLONG STREAMAPI VideoGetSystemTime();
//
// The point of it all
//
VOID STREAMAPI VideoCaptureRoutine( IN PSTREAMEX pStrmEx );
#ifdef TOSHIBA
VOID DeferredRoutine( PKDPC pDpc, PDEVICE_OBJECT pDeviceObject, PIRP pIrpNotUsed, PVOID Context );
ULONG get_AblFilter ( PHW_DEVICE_EXTENSION pHwDevExt );
ULONG get_filtering ( PHW_DEVICE_EXTENSION pHwDevExt );
VOID set_filtering ( PHW_DEVICE_EXTENSION pHwDevExt, BOOL bFlag );
NTKERNELAPI PHYSICAL_ADDRESS MmGetPhysicalAddress ( IN PVOID BaseAddress );
NTKERNELAPI PVOID MmAllocateContiguousMemory ( IN ULONG NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress );
NTKERNELAPI VOID MmFreeContiguousMemory ( IN PVOID BaseAddress ); #endif//TOSHIBA
#ifdef __cplusplus
} #endif // __cplusplus
#endif //__CAPMAIN_H__
|