|
|
/*++
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
|