576 lines
12 KiB
C
576 lines
12 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (C) Microsoft Corporation, 2000 - 2001
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
MsTpDef.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Header file for all of AV/C tape subunit
|
||
|
|
||
|
Last changed by:
|
||
|
|
||
|
$Author:: $
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode only
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
$Revision:: $
|
||
|
$Date:: $
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _DVCRDEF_INC
|
||
|
#define _DVCRDEF_INC
|
||
|
|
||
|
|
||
|
#include "AVCStrm.h"
|
||
|
|
||
|
#define DRIVER_TAG (ULONG)'USpT' // Tape SubUnit
|
||
|
|
||
|
#undef ExAllocatePool
|
||
|
#define ExAllocatePool(type, size) \
|
||
|
ExAllocatePoolWithTag (type, size, DRIVER_TAG)
|
||
|
|
||
|
|
||
|
//
|
||
|
// In order to send a request to lower driver, we need an irp and the request block.
|
||
|
//
|
||
|
typedef struct _DRIVER_REQUEST {
|
||
|
|
||
|
//
|
||
|
// Link with other request (in attach or detach list)
|
||
|
//
|
||
|
LIST_ENTRY ListEntry;
|
||
|
|
||
|
//
|
||
|
// Some context and reserved
|
||
|
//
|
||
|
PVOID Context1;
|
||
|
PVOID Context2;
|
||
|
|
||
|
#if DBG
|
||
|
//
|
||
|
// Unique id of this data request
|
||
|
//
|
||
|
LONGLONG cntDataRequestReceived;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Irp used to send down a reqest
|
||
|
//
|
||
|
PIRP pIrp;
|
||
|
|
||
|
//
|
||
|
// Request block
|
||
|
//
|
||
|
AVC_STREAM_REQUEST_BLOCK AVCStrmReq;
|
||
|
|
||
|
} DRIVER_REQUEST, *PDRIVER_REQUEST;
|
||
|
|
||
|
//
|
||
|
// Need to reference this in PSTRMEX
|
||
|
//
|
||
|
typedef struct _DVCR_EXTENSION;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// The index MUST match
|
||
|
//
|
||
|
typedef enum {
|
||
|
|
||
|
FMT_IDX_SD_DVCR_NTSC = 0,
|
||
|
FMT_IDX_SD_DVCR_PAL,
|
||
|
|
||
|
#ifdef MSDV_SUPPORT_HD_DVCR
|
||
|
FMT_IDX_HD_DVCR_NTSC,
|
||
|
FMT_IDX_HD_DVCR_PAL,
|
||
|
#endif
|
||
|
|
||
|
#ifdef MSDV_SUPPORT_SDL_DVCR
|
||
|
FMT_IDX_SDL_DVCR_NTSC,
|
||
|
FMT_IDX_SDL_DVCR_PAL,
|
||
|
#endif
|
||
|
|
||
|
} FMT_INDEX, *PFMT_INDEX;
|
||
|
|
||
|
|
||
|
#define MAX_DATA_BUFFERS 32 // Max data buffer (allocator framing)
|
||
|
#define MAX_DATA_REQUESTS (MAX_DATA_BUFFERS+2) // 2 extra for optional flags "data request", such as EndOfStream.
|
||
|
|
||
|
//
|
||
|
// 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 {
|
||
|
|
||
|
// return stream exension (a context) if a stream is open successfully
|
||
|
// This context is used for subsequent call after a stream is opened.
|
||
|
PVOID AVCStreamContext;
|
||
|
|
||
|
//
|
||
|
// Point to pSrb->HwDeviceExtension
|
||
|
//
|
||
|
struct _DVCR_EXTENSION * pDevExt;
|
||
|
|
||
|
//
|
||
|
// Cache pSrb->StreamObject:
|
||
|
// ->HwStreamExtension (pStrmExt)
|
||
|
// ->StreamNumber
|
||
|
// ->HwDeviceExtension (pDevExt)
|
||
|
//
|
||
|
PHW_STREAM_OBJECT pStrmObject;
|
||
|
|
||
|
|
||
|
//
|
||
|
// ->NumberOfPossibleInstances;
|
||
|
// ->DataFlow;
|
||
|
//
|
||
|
PHW_STREAM_INFORMATION pStrmInfo;
|
||
|
|
||
|
//
|
||
|
// Holds state
|
||
|
//
|
||
|
KSSTATE StreamState;
|
||
|
|
||
|
//
|
||
|
// Holds whether or not the dvcr is listening or receiving
|
||
|
//
|
||
|
// TRUE: successful REQUEST_ISOCH_LISTEN and REQUEST_ISOCH_TALK
|
||
|
// FALSE: successful INIT and REQUEST_ISOCH_STOP
|
||
|
//
|
||
|
BOOLEAN bIsochIsActive; // Close associated with StreamState
|
||
|
|
||
|
//
|
||
|
// Set to TRUE when receiving KSSTREAM_HEADER_OPTIONSF_ENDOFSTREAM for SRB_WRITE_DATA
|
||
|
// For SRB_WRITE_DATA only since then this driver servers as a renderer.
|
||
|
//
|
||
|
BOOL bEOStream;
|
||
|
|
||
|
//
|
||
|
// Count number of SRB_READ/WRITE_DATA received since last transiting to PAUSE state from STOP
|
||
|
//
|
||
|
LONGLONG cntSRBReceived;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Count number of Data buffer has submitted for receiving or transmitting.
|
||
|
//
|
||
|
LONGLONG cntDataSubmitted;
|
||
|
|
||
|
//
|
||
|
// Statistic of the frame information since last start stream
|
||
|
// PictureNumber = FramesProcessed + FramesDropped + cndSRBCancelled.
|
||
|
//
|
||
|
LONGLONG FramesProcessed; // Frame sent (including repeated)
|
||
|
LONGLONG FramesDropped; // SRB not sent
|
||
|
LONGLONG PictureNumber; // Number of SRB_XXX_DATA made it to or from 1394 bus
|
||
|
|
||
|
//
|
||
|
// Count number of SRB_READ/WRITE_DATA that was incompleted and cancelled
|
||
|
//
|
||
|
LONGLONG cntSRBCancelled;
|
||
|
|
||
|
|
||
|
//
|
||
|
// The stream time (master clock or not) is "almost" or near 0
|
||
|
// when setting to RUN state and start increment.
|
||
|
//
|
||
|
LONGLONG CurrentStreamTime;
|
||
|
|
||
|
//
|
||
|
// Holds the master clock
|
||
|
//
|
||
|
HANDLE hMyClock; // If set, we can be a clock provider.
|
||
|
HANDLE hMasterClock; // If set, we are the master clock.
|
||
|
HANDLE hClock; // If set, other device on the same graph is the master clock.
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// 2nd CIP Quadlet: 01:Fmt, 50/60:STYPE:RSv, SYT
|
||
|
//
|
||
|
BYTE cipQuad2[4];
|
||
|
|
||
|
//
|
||
|
// Timecode, RecDate and RecTime are all in pack format (4 bytes)
|
||
|
//
|
||
|
BOOL bATNUpdated;
|
||
|
DWORD AbsTrackNumber; // LSB:BlankField
|
||
|
|
||
|
BOOL bTimecodeUpdated;
|
||
|
BYTE Timecode[4]; // hh:mm:ss,ff
|
||
|
|
||
|
//
|
||
|
// Regulate flow between between setting to STOP state and SRB_XXX_DATA
|
||
|
//
|
||
|
KMUTEX * hMutexFlow;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Counter used to indicate starting of an work item to cancel
|
||
|
//
|
||
|
LONG lCancelStateWorkItem;
|
||
|
BOOL AbortInProgress;
|
||
|
|
||
|
//
|
||
|
// Hold the work item
|
||
|
//
|
||
|
#ifdef USE_WDM110 // Win2000 code base
|
||
|
PIO_WORKITEM pIoWorkItem;
|
||
|
#else
|
||
|
WORK_QUEUE_ITEM IoWorkItem;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// TO singal that an work item is completed.
|
||
|
//
|
||
|
KEVENT hCancelDoneEvent;
|
||
|
|
||
|
//
|
||
|
// Stream open format
|
||
|
//
|
||
|
AVCSTRM_FORMAT_INFO AVCFormatInfo;
|
||
|
|
||
|
//
|
||
|
// AVCStrm request for issuing synchronous request
|
||
|
|
||
|
KMUTEX * hMutexReq;
|
||
|
|
||
|
PIRP pIrpReq;
|
||
|
AVC_STREAM_REQUEST_BLOCK AVCStrmReq;
|
||
|
|
||
|
//
|
||
|
// free list
|
||
|
//
|
||
|
LONG cntDataDetached;
|
||
|
LIST_ENTRY DataDetachedListHead;
|
||
|
|
||
|
//
|
||
|
// busy list
|
||
|
//
|
||
|
LONG cntDataAttached;
|
||
|
LIST_ENTRY DataAttachedListHead;
|
||
|
|
||
|
//
|
||
|
// AVCStrem request for asynchronous request, such as read and write data
|
||
|
//
|
||
|
DRIVER_REQUEST AsyncReq[MAX_DATA_REQUESTS];
|
||
|
|
||
|
//
|
||
|
// AVCStrm request for issuing synchronous request to abort at DISPATCH_LEVEL
|
||
|
//
|
||
|
PIRP pIrpAbort;
|
||
|
AVC_STREAM_REQUEST_BLOCK AVCStrmReqAbort;
|
||
|
|
||
|
//
|
||
|
// Data list lock
|
||
|
//
|
||
|
KSPIN_LOCK * DataListLock;
|
||
|
|
||
|
//
|
||
|
// DPC and TIMER objects; this is used for the signal clock events.
|
||
|
//
|
||
|
KDPC DPCTimer;
|
||
|
|
||
|
KTIMER Timer;
|
||
|
|
||
|
|
||
|
} STREAMEX, *PSTREAMEX;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Max number of input and output PCR an AVC can support
|
||
|
//
|
||
|
#define MAX_NUM_PCR 31
|
||
|
|
||
|
#define MAX_PAYLOAD 1024
|
||
|
|
||
|
//
|
||
|
// Structure for a plug control register
|
||
|
//
|
||
|
typedef struct _AVC_DEV_PLUG {
|
||
|
//
|
||
|
// Plug handle of a PCR returned from 61883.sys
|
||
|
//
|
||
|
HANDLE hPlug;
|
||
|
|
||
|
//
|
||
|
// PCR's state; this is dynamic and is consider as a snap shot.
|
||
|
//
|
||
|
CMP_GET_PLUG_STATE PlugState;
|
||
|
|
||
|
} AVC_DEV_PLUG, *PAVC_DEV_PLUG;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Structure for a max (31) plug control registers
|
||
|
//
|
||
|
typedef struct _AVC_DEV_PLUGS {
|
||
|
|
||
|
//
|
||
|
// data rate of the device
|
||
|
//
|
||
|
ULONG MaxDataRate;
|
||
|
|
||
|
//
|
||
|
// Number of input or output plugs (as in i/oMPR)
|
||
|
//
|
||
|
ULONG NumPlugs;
|
||
|
|
||
|
//
|
||
|
// Array of plug handles and states;
|
||
|
//
|
||
|
AVC_DEV_PLUG DevPlug[MAX_NUM_PCR];
|
||
|
|
||
|
} AVC_DEV_PLUGS, *PAVC_DEV_PLUGS;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Device Extension for our Desktop Camera Driver
|
||
|
//
|
||
|
typedef struct _DVCR_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Holds video format supported by this device (presentaly allow only one format per device)
|
||
|
//
|
||
|
AVCSTRM_FORMAT VideoFormatIndex;
|
||
|
|
||
|
//
|
||
|
// Number of pin supported by this device; this usually equal to number of data range supported.
|
||
|
//
|
||
|
ULONG NumOfPins;
|
||
|
|
||
|
//
|
||
|
// Contain a table for the support formats (HW_STREAM_INFORMATION && HW_STREAM_OBJECT)
|
||
|
//
|
||
|
STREAM_INFO_AND_OBJ * pStreamInfoObject;
|
||
|
|
||
|
//
|
||
|
// Keep track of number of stream that is openned; in this driver, only one stream can be open at any time.
|
||
|
//
|
||
|
LONG cndStrmOpen; // [0..1]
|
||
|
|
||
|
//
|
||
|
// Count the stream index (pin index) that has been opened.
|
||
|
//
|
||
|
ULONG idxStreamNumber; // Index of current stream
|
||
|
|
||
|
//
|
||
|
// Can have only 1 Stream active at any time.
|
||
|
// (Stream Class will allocate the stream extension at SRB_OPENSTREAM)
|
||
|
//
|
||
|
PSTREAMEX paStrmExt[3];
|
||
|
|
||
|
//
|
||
|
// Current Device Power State
|
||
|
//
|
||
|
DEVICE_POWER_STATE PowerState;
|
||
|
|
||
|
//
|
||
|
// TRUE only after SRB_SURPRISE_REMOVAL;
|
||
|
//
|
||
|
BOOL bDevRemoved;
|
||
|
|
||
|
// The list of AVC commands that have been issued
|
||
|
LIST_ENTRY AVCCmdList;
|
||
|
|
||
|
// Number of completed commands waiting to be removed from the list
|
||
|
// This includes:
|
||
|
// Command response has returned and processed in the completion routine
|
||
|
// Interim response awaiting final response
|
||
|
LONG cntCommandQueued;
|
||
|
|
||
|
// Protection for command processing
|
||
|
KSPIN_LOCK AVCCmdLock;
|
||
|
|
||
|
// The counted list of possible opcode values on response from Transport State status or notify
|
||
|
UCHAR TransportModes[5]; // 0x4, [0xC1, 0xC2, 0xC3, 0xC4]
|
||
|
UCHAR Reserved0[3];
|
||
|
|
||
|
// Subunit type
|
||
|
UCHAR Subunit_Type[4]; // There are only two subunits
|
||
|
|
||
|
//
|
||
|
// The device type (and its capabilities) cannot be determined until a tape is in
|
||
|
//
|
||
|
ULONG MediaType; // DVCR standard, small, medium; VHS; VHS-C; unknown
|
||
|
ULONG ulDevType; // 0: undetermined, ED_DEVTYPE_CAMERA or ED_DEVTYPE_VCR
|
||
|
BOOL bHasTape;
|
||
|
BOOL bWriteProtected;
|
||
|
BOOL bDVCPro;
|
||
|
|
||
|
//
|
||
|
// Save Unit capabilities:
|
||
|
// Vendor and Model IDs
|
||
|
//
|
||
|
|
||
|
ULONG ulVendorID;
|
||
|
ULONG ulModelID;
|
||
|
|
||
|
LARGE_INTEGER UniqueID;
|
||
|
|
||
|
|
||
|
//
|
||
|
// AVC Device's output plugs
|
||
|
//
|
||
|
PAVC_DEV_PLUGS pDevOutPlugs;
|
||
|
|
||
|
//
|
||
|
// AVC Device's input plugs
|
||
|
//
|
||
|
PAVC_DEV_PLUGS pDevInPlugs;
|
||
|
|
||
|
|
||
|
#ifdef SUPPORT_LOCAL_PLUGS
|
||
|
//
|
||
|
// Support local oPCR
|
||
|
//
|
||
|
AV_PCR OPCR;
|
||
|
ULONG OutputPCRLocalNum;
|
||
|
HANDLE hOutputPCRLocal;
|
||
|
|
||
|
//
|
||
|
// Support local iPCR
|
||
|
//
|
||
|
AV_PCR IPCR;
|
||
|
ULONG InputPCRLocalNum;
|
||
|
HANDLE hInputPCRLocal;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// Holds the Device Object of our parent (1394 bus driver)
|
||
|
//
|
||
|
PDEVICE_OBJECT pBusDeviceObject; // IoCallDriver()
|
||
|
|
||
|
//
|
||
|
// Holds my Physical Device Object
|
||
|
// pass it in PnP API, such as IoOpenDeviceRegistryKey()
|
||
|
//
|
||
|
PDEVICE_OBJECT pPhysicalDeviceObject;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Cache device's Unit capa
|
||
|
//
|
||
|
GET_UNIT_IDS UnitIDs;
|
||
|
|
||
|
#ifndef NT51_61883
|
||
|
//
|
||
|
// Add support for unit model text that 61883 does not support for its 1st version
|
||
|
//
|
||
|
//
|
||
|
// 1394 generation count; used in 1394 asych operation.
|
||
|
//
|
||
|
ULONG GenerationCount;
|
||
|
|
||
|
//
|
||
|
// RootModelString
|
||
|
//
|
||
|
UNICODE_STRING UniRootModelString;
|
||
|
|
||
|
//
|
||
|
// UnitModelString
|
||
|
//
|
||
|
UNICODE_STRING UniUnitModelString;
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// Serialize in the event of getting two consecutive SRB_OPEN_STREAMs
|
||
|
//
|
||
|
KMUTEX hMutex;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Irp for sychnonize call
|
||
|
//
|
||
|
PIRP pIrpSyncCall;
|
||
|
|
||
|
#ifdef SUPPORT_NEW_AVC
|
||
|
//
|
||
|
// 61883 request
|
||
|
//
|
||
|
HANDLE hPlugLocalIn; // Generic i/oPLUG handle
|
||
|
HANDLE hPlugLocalOut; // Generic i/oPLUG handle
|
||
|
#endif
|
||
|
|
||
|
AV_61883_REQUEST AVReq;
|
||
|
|
||
|
// Pin and connection
|
||
|
ULONG PinCount;
|
||
|
AVC_MULTIFUNC_IRB AvcMultIrb;
|
||
|
|
||
|
} DVCR_EXTENSION, *PDVCR_EXTENSION;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Used to queue a SRB
|
||
|
//
|
||
|
|
||
|
typedef struct _SRB_ENTRY {
|
||
|
LIST_ENTRY ListEntry;
|
||
|
PHW_STREAM_REQUEST_BLOCK pSrb;
|
||
|
BOOL bStale; // TRUE if it is marked stale but is the only Srb in the SrbQ
|
||
|
// Audio Mute ?
|
||
|
BOOL bAudioMute;
|
||
|
#if DBG
|
||
|
ULONG SrbNum;
|
||
|
#endif
|
||
|
} SRB_ENTRY, *PSRB_ENTRY;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// This is the context used to attach a frame
|
||
|
//
|
||
|
|
||
|
typedef struct _SRB_DATA_PACKET {
|
||
|
// Build list
|
||
|
LIST_ENTRY ListEntry;
|
||
|
|
||
|
PHW_STREAM_REQUEST_BLOCK pSrb;
|
||
|
PSTREAMEX pStrmExt; // Can get this from pSrb, here for convenience only!
|
||
|
|
||
|
#if DBG
|
||
|
BOOL bAttached; // TRUE if attached to 61883.
|
||
|
#endif
|
||
|
|
||
|
// Used to send 61883 request
|
||
|
PIRP pIrp; // Use to attach and release.
|
||
|
|
||
|
PCIP_FRAME Frame;
|
||
|
PVOID FrameBuffer;
|
||
|
|
||
|
//
|
||
|
// Add debug related info here
|
||
|
//
|
||
|
LONGLONG FrameNumber;
|
||
|
|
||
|
// Use to send 61883 AV data request
|
||
|
AV_61883_REQUEST AVReq;
|
||
|
|
||
|
} SRB_DATA_PACKET, *PSRB_DATA_PACKET;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Wait time constants
|
||
|
//
|
||
|
#define DV_AVC_CMD_DELAY_STARTUP 500 // MSec
|
||
|
#define DV_AVC_CMD_DELAY_INTER_CMD 20 // MSec
|
||
|
#define DV_AVC_CMD_DELAY_DVCPRO 500 // MSec
|
||
|
|
||
|
#endif
|
||
|
|