windows-nt/Source/XPSP1/NT/drivers/wdm/capture/mini/msdv/msdvdef.h
2020-09-26 16:20:57 +08:00

698 lines
18 KiB
C

/*++
Copyright (C) Microsoft Corporation, 1999 - 2000
Module Name:
msdvdef.h
Abstract:
Header file for all of msdv (digital camcorder)
Last changed by:
$Author:: $
Environment:
Kernel mode only
Revision History:
$Revision:: $
$Date:: $
--*/
#ifndef _DVCRDEF_INC
#define _DVCRDEF_INC
//
// Allocate memory with 'Msdv' tag
//
#ifdef ExAllocatePool
#undef ExAllocatePool
#endif
#undef ExAllocatePool
#define ExAllocatePool(type, size) ExAllocatePoolWithTag (type, size, 'vdsM')
//
// 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;
#if DBG
//
// Collect statistic for real time data transmission
//
#define MAX_STAT_DURATION 60 // Seconds
#define MAX_XMT_FRAMES_TRACED 30 * MAX_STAT_DURATION // Max number of entries
typedef struct _XMT_FRAME_STAT {
KSSTATE StreamState;
LONG cntSRBReceived; // Accumulative SRVB received.
LONG cntSRBPending; // Number of SRB not yet completed.
LONG cntSRBQueued; // SRB Queued
LONG cntDataAttached; // Data attached
LONGLONG FrameSlot; // Real time
ULONGLONG tmStreamTime; // Stream time of the "FrameSlot"
DWORD DropCount; // Accumulative drop count
DWORD FrameNumber; // Actual frame number transmitted; (==FrameSlot: ontime); (<FrameSlot: late)
DWORD OptionsFlags;
ULONGLONG tmPresentation; // Actual frame's presentation time
CYCLE_TIME tsTransmitted; // Frame actually transmitted (1394 CycleTime)
} XMT_FRAME_STAT, *PXMT_FRAME_STAT;
#endif
//
// 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 {
//
// 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 current stream state
//
KSSTATE StreamState;
//
// Holds previous stream state; use to determine the state transition.
//
KSSTATE StreamStatePrevious;
//
// 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;
//
// 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;
//
// Count and list for the detach list
//
LONG cntDataDetached;
LIST_ENTRY DataDetachedListHead;
#if DBG
//
// Count number of SRB awaiting completion
//
LONG cntSRBPending;
#endif
//
// Count and list for the SRB list
//
LONG cntSRBQueued; // Used only with SRB_WRITE_DATA
LIST_ENTRY SRBQueuedListHead; // Used only with SRB_WRITE_DATA
//
// Count and list for the attach list
//
LONG cntDataAttached;
LIST_ENTRY DataAttachedListHead;
//
// Lock to serialize attach and detach of list
//
KSPIN_LOCK * DataListLock;
#if DBG
KSPIN_LOCK * DataListLockSave;
#endif
//
// The stream time (master clock or not) is "almost" or near 0
// when setting to RUN state and start increment.
//
ULONGLONG CurrentStreamTime;
//
// Keep track of the last system time when the stream time was updated.
// This is used to calibrate the current stream time when it is queries.
//
ULONGLONG LastSystemTime;
//
// For isoch talk only:
// Signal arrival of a SRB so it can be processed in the case we are repeating frame.
//
KEVENT hSrbArriveEvent;
#ifdef SUPPORT_PREROLL_AT_RUN_STATE
//
// Support wait in RUN state to "simulate" preroll
//
KEVENT hPreRollEvent;
#endif
//
// 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.
//
// Since GetSystemTime() can be called at DISPATCH level so make sure the variable that it used is in nonpaged pool
//
HW_TIME_CONTEXT TimeContext;
//
// 2nd CIP Quadlet: 01:Fmt, 50/60:STYPE:RSv, SYT
//
BYTE cipQuad2[4];
#ifdef MSDV_SUPPORT_EXTRACT_SUBCODE_DATA
//
// 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
#endif
//
// This mutex is used to sychronize attaching a frame and cancellation of a frame
//
KMUTEX * hStreamMutex;
//
// Counter used to indicate starting of an work item to cancel; this is a token and it is either 0 or 1.
//
LONG lStartIsochToken;
//
// Data ready dispatch thread's object: used to wait for thread to terminate.
//
PVOID pAttachFrameThreadObject;
//
// Set when the system is to be terminated.
//
BOOL bTerminateThread;
//
// Used to signal the termination of a system thread.
//
KEVENT hThreadEndEvent;
//
// Increment this if there is a critical operation so the
// attaching frame thread will stop on the hRunThreadEvent.
//
LONG lNeedService; // > 0 to indicate needing service (stop thread)
//
// Signal to run the attach frame thread
//
KEVENT hRunThreadEvent; // Signal when thread is running
//
// Sign to hal the attach frame thread for critical operation such as
// power off and surprise removal.
//
KEVENT hStopThreadEvent; // Signal when thread has stopped.
#ifdef SUPPORT_NEW_AVC
//
// Used to indicate a device to device connection
//
BOOL bDV2DVConnect;
#endif
//
// The input and output plug of this stream (point-to-point connection).
//
HANDLE hOutputPcr; // DV or PC's oPCR[0]
HANDLE hInputPcr; // DV or PC's iPCR[0]
//
// The connection handle from 61883.sys.
//
HANDLE hConnect; // Connect handle
#ifdef NT51_61883 // This is needed starting with 61883.sys in Whistler
//
// Cyclic cycle count of last DV frame
//
ULONG CycleCount16bits;
#endif // NT51_61883
#if DBG
LONG lPrevCycleCount;
LONG lTotalCycleCount;
ULONG lFramesAccumulatedRun;
ULONG lFramesAccumulatedPaused;
LONG lDiscontinuityCount;
#endif
//
// Discontinuity is introduced when traistioning from RUN->PAUSE->RUN.
// The stream time will not increment in PAUSE state but system time (1394 CycleTime) does.
//
BOOL b1stNewFrameFromPauseState;
//
// Use to mark the tick count when the stream start running.
// It is later used to calculate current stream time and dropped frames.
//
ULONGLONG tmStreamStart;
#if DBG
ULONGLONG tmStreamPause; // When it is set to PAUSE state
#endif
//
// Counter used to indicate starting of an work item to cancel; this is a token and it is either 0 or 1.
//
LONG lCancelStateWorkItem;
//
// Use to indicate aborting a stream.
//
BOOL bAbortPending;
//
// 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;
//
// A timer and Dpc objects to periodically check for expired clock events.
//
KDPC * DPCTimer;
KTIMER * Timer;
BOOL bTimerEnabled;
#if DBG
//
// Used to keep track of transmission statistics
//
PXMT_FRAME_STAT paXmtStat;
ULONG ulStatEntries;
#endif
#ifdef SUPPORT_QUALITY_CONTROL
//
// Use for keeping track of quality control
//
KSQUALITY KSQuality;
#endif
} STREAMEX, *PSTREAMEX;
//
// Device Extension for our Desktop Camera Driver
//
typedef struct _DVCR_EXTENSION {
LONG cndStrmOpen;
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]; // We support three pins
//
// Holds the video format index; it's either PAL or NTSC. Default is NTSC.
//
FMT_INDEX VideoFormatIndex;
//
// Current Device Power State
//
DEVICE_POWER_STATE PowerState;
//
// Contain a table for the support formats
//
ULONG ulNumOfStreamSupported;
HW_STREAM_INFORMATION * paCurrentStrmInfo;
//
// 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]
//
// The device type (and its capabilities) cannot be determined until a tape is in
//
ULONG ulDevType; // 0: undetermined, ED_DEVTYPE_CAMERA or ED_DEVTYPE_VCR
BOOL bHasTape;
BOOL bWriteProtected;
BOOL bDVCPro;
//
// Save Unit capabilities:
// Speed
// Vendor and Model IDs
//
ULONG NumOutputPlugs;
ULONG NumInputPlugs;
ULONG HardwareFlags; // detect PAE: AV_HOST_DMA_DOUBLE_BUFFERING_ENABLED
ULONG MaxDataRate;
ULONG ulVendorID;
ULONG ulModelID;
LARGE_INTEGER UniqueID;
//
// The DV's plug handles/PCRs (assume [0])
//
HANDLE hOPcrDV;
HANDLE hIPcrDV;
#ifdef NT51_61883
//
// PC local oPCR
//
HANDLE hOPcrPC; // PC's local oPCR
#if 0 // Not used since DV does not intiate DV to PC connection.
HANDLE hIPcrPC; // PC's local iPCR
#endif
//
// Isochronous parameters obtained from 61883;
// They are used for making isoch connection.
//
UNIT_ISOCH_PARAMS UnitIoschParams;
#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;
//
// Serialize in the event of getting two consecutive SRB_OPEN_STREAMs
//
KMUTEX hMutex;
#ifdef READ_CUTOMIZE_REG_VALUES
#if 0 // Not used in millennium; needed to do frame accurated recording.
//
// Registry values used to achieve frame accurate recording
//
BOOL bATNSearch; // Support ATN search (or Timecode search)
BOOL bSyncRecording; // Sychronize stream state with record/pause transport state
DWORD tmMaxDataSync; // Time it take to sync to DV camcorder
DWORD fmPlayPs2RecPs; // Switch from PLAY_PAUSE to RECORD_PAUSE (unit=frames)
DWORD fmStop2RecPs; // Switch from STOP to RECORD_PAUSE (unit=frames)
DWORD tmRecPs2Rec; // Time to switch from RECORD_PAUSE to RECORD
#endif
ULONG XprtStateChangeWait;
#endif
//
// Since the signal format can dynamically changing, we will query
// the device for the currect format whevever we are asked for doing
// data intersection (note doing it in open is not enough!).
// Instead of doing it always (since there could be a lot of data
// intersection), we only query current format in a regular interval.
//
ULONGLONG tmLastFormatUpdate;
//
// Flow control for AVC command
//
KMUTEX hMutexIssueAVCCmd;
#ifdef SUPPORT_OPTIMIZE_AVCCMD_RETRIES
//
// AVC Command retry count (default is 9 (avc.sys))
//
ULONG AVCCmdRetries; // This is retry count not the total count
//
// Collect statistis of AVC command response time during driver load time.
//
BOOL DrvLoadCompleted; // Collect statistic until loading of driver is completed.
DWORD AVCCmdRespTimeMax; // msec unit
DWORD AVCCmdRespTimeMin; // msec unit
DWORD AVCCmdRespTimeSum; // msec unit
DWORD AVCCmdCount;
#endif
} 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 indication; a frame could be repeatedly transmitted and its mute flag should be set only once.
//
BOOL bAudioMute;
#if DBG
ULONG SrbNum;
#endif
} SRB_ENTRY, *PSRB_ENTRY;
//
// Valid data entry states for a data request and they
// can be Or'ed to show their data path.
//
// Examples of different possible code path:
//
// (A) Prepared->Attached->Callback->Completed_SRB
// (B) Prepared->Callback->Attached->Completed_SRB
// (C) Prepared->Attached->Cancelled->Completed_SRB
//
enum DATA_ENTRY_STATE {
DE_PREPARED = 0x01,
DE_IRP_ATTACHED_COMPLETED = 0x02,
DE_IRP_CALLBACK_COMPLETED = 0x04,
DE_IRP_SRB_COMPLETED = 0x08,
DE_IRP_ERROR = 0x10,
DE_IRP_CANCELLED = 0x20,
};
#define IsStateSet(state, bitmask) ((state & (bitmask)) == bitmask)
//
// This is the context used to attach a frame
//
typedef struct _SRB_DATA_PACKET {
// Build list
LIST_ENTRY ListEntry;
//
// Keep track of data entry state
//
enum DATA_ENTRY_STATE State;
PHW_STREAM_REQUEST_BLOCK pSrb;
KSSTATE StreamState; // StreamState when it was attached
PSTREAMEX pStrmExt; // Can get this from pSrb, here for convenience only!
// 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;
#define MASK_AUX_50_60_BIT 0x00200000 // bit 5 of PC3 of both AAuxSrc and VAAuxSrc is the NTSC/PAL bit
//
// 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
#define FORMAT_UPDATE_INTERVAL 100000000 // 10 seconds
//
// Default AVC Command settings
//
#define MAX_RESPONSE_TIME_FOR_ALERT 100 // msec
//
// The timeout value is set to give device sufficient time to response
// to an AVC command following a transport state change. It is based
// on trials of many camcorder (Sharp, Sony, Panasonic, Samsung..etc.)
// to come to this value. The biggest delay (timeout) is from issuing
// of PLAY command follow by REWIND command. Some test value:
//
// Hitachi
// JVC DVL9600: Stop->PLAY: delay is less than 300msec (Known issue: no image if play graph before play tape!)
// Panasonic MX2000: Stop->PLAY:2339; ->Rewind:3767 msec
// Samsung VP-D55: Does not support XPrt State status command and will always
// timeout its suqsequent command following XPrtState change
// Sharp VL-WDW450U: Stop->PLAY:3514; ->Rewind:6120 msec
// VL-PD3F: Stop->PLAY:3293; ->Rewind:6404 msec
// Sony DCR-TRV10: Stop->PLAY:3617; ->Rewind:5323 msec
// DA1: Non-compliant (Retry is 0!)
// DA2: No transport state change.
//
#define MAX_AVC_CMD_RETRIES ((DEFAULT_AVC_RETRIES + 1) * 7 - 1) // Retries counts
#endif