374 lines
9 KiB
C
374 lines
9 KiB
C
|
/*++
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
MsTpAvc.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Header file for MsTpAvc.c.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Yee J. Wu 27-July-99
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Kernel mode only
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _MSTPAVC_INC
|
||
|
#define _MSTPAVC_INC
|
||
|
|
||
|
#include "XPrtDefs.h" // WdmCap directory; derived from DShow's edevdefs.h
|
||
|
#include "EDevCtrl.h" // External Device COM interface structures
|
||
|
|
||
|
|
||
|
#ifdef SUPPORT_NEW_AVC_CMD
|
||
|
//
|
||
|
// Define an AVC command constant and strcutures
|
||
|
//
|
||
|
|
||
|
typedef enum {
|
||
|
OPC_UNIT_CONNECT_AV_20 = 0x20,
|
||
|
OPC_UNIT_UNIT_INFO_30 = 0x30,
|
||
|
OPC_UNIT_SUBUNIT_INFO_31 = 0x31,
|
||
|
|
||
|
OPC_TAPE_PLAY_C3 = 0xC3,
|
||
|
OPC_TAPE_TRANSPORT_STATE_D0 = 0xD0,
|
||
|
|
||
|
// More...
|
||
|
} AVC_COMMAND_OP_CODE;
|
||
|
|
||
|
|
||
|
#define MAX_FCP_DATA_LEN 512
|
||
|
#define AVC_CMD_HEADER_LEN 3
|
||
|
#define MAX_OPERAND_LEN (MAX_FCP_DATA_LEN - AVC_CMD_HEADER_LEN)
|
||
|
|
||
|
typedef struct _SUBUNIT_TYPE_ID {
|
||
|
UCHAR SubunitID:3; // 1-4 instance number; 7: unit/ignoerd
|
||
|
UCHAR SubunitType:5; // 4:Tape; 5:Tuner; 7:VideoCamera;
|
||
|
} SUBUNIT_TYPE_ID, *PSUBUNIT_TYPE_ID;
|
||
|
|
||
|
typedef struct _AVC_CMD_FRAME_HEADER {
|
||
|
union {
|
||
|
UCHAR CmdType:4; // 0:Control;1:Status;2:SpecInq;3:Notify;4:Geninq;other:reserved.
|
||
|
UCHAR RespCode:4; // 8:Not_IMPL;9:Accept;A:Rejected;B:InTransition;C:Imple/Stable;D:Changed;E:Reserved;F:Interim
|
||
|
};
|
||
|
UCHAR CTS:4; // 0000 for AVC
|
||
|
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID;
|
||
|
|
||
|
UCHAR Opcode;
|
||
|
} AVC_CMD_FRAME_HEADER, *PAVC_CMD_FRAME_HEADER;
|
||
|
|
||
|
typedef struct _AVC_CMD_FRAME {
|
||
|
AVC_CMD_FRAME_HEADER CmdHeader;
|
||
|
UCHAR Operand[MAX_OPERAND_LEN];
|
||
|
} AVC_CMD_FRAME, *PAVC_CMD_FRAME;
|
||
|
|
||
|
typedef struct _UNIT_CONNECT_AV_20 {
|
||
|
AVC_CMD_FRAME_HEADER CmdHeader;
|
||
|
UCHAR AudDstType:2;
|
||
|
UCHAR VidDstType:2;
|
||
|
UCHAR AudSrcType:2;
|
||
|
UCHAR VidSrvType:2;
|
||
|
UCHAR VideoSource;
|
||
|
UCHAR AudSrc;
|
||
|
UCHAR VidSrc;
|
||
|
UCHAR AudDst;
|
||
|
UCHAR VidDst;
|
||
|
} UNIT_CONNECT_AV_20, *PUNIT_CONNECT_AV_20;
|
||
|
|
||
|
typedef struct _UNIT_UNIT_INFO_30 {
|
||
|
AVC_CMD_FRAME_HEADER CmdHeader;
|
||
|
UCHAR Opcode; // 0x30
|
||
|
UCHAR Operand; // 0x07
|
||
|
ULONG Unit:3;
|
||
|
ULONG UnitType:5;
|
||
|
ULONG CompanyID:24;
|
||
|
} UNIT_UNIT_INFO_30, *PUNIT_UNIT_INFO_30;
|
||
|
|
||
|
|
||
|
|
||
|
typedef struct _UNIT_SUBUNIT_INFO_31 {
|
||
|
AVC_CMD_FRAME_HEADER CmdHeader;
|
||
|
|
||
|
UCHAR ExtCode:3;
|
||
|
UCHAR Rsv0:1;
|
||
|
UCHAR Page:3; // 0..7
|
||
|
UCHAR Rsv1:1;
|
||
|
|
||
|
UCHAR Operand; // 0x07
|
||
|
// Exclude extension_code, there are max of 8 pages.
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID0[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID1[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID2[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID3[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID4[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID5[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID6[4];
|
||
|
SUBUNIT_TYPE_ID SubunitTypeID7[4];
|
||
|
|
||
|
} UNIT_SUBUNIT_INFO_31, *PUNIT_SUBUNIT_INFO_31;
|
||
|
|
||
|
typedef enum {
|
||
|
NEXT_FRAME = 0x30, // R
|
||
|
SLOWEST_FORWARD, // R
|
||
|
SLOW_FORWARD_6,
|
||
|
SLOW_FORWARD_5,
|
||
|
SLOW_FORWARD_4,
|
||
|
SLOW_FORWARD_3,
|
||
|
SLOW_FORWARD_2,
|
||
|
SLOW_FORWARD_1,
|
||
|
X1,
|
||
|
FAST_FORWARD_1,
|
||
|
FAST_FORWARD_2,
|
||
|
FAST_FORWARD_3,
|
||
|
FAST_FORWARD_4,
|
||
|
FAST_FORWARD_5,
|
||
|
FAST_FORWARD_6,
|
||
|
FASTEST_FORWARD, // M
|
||
|
//.... more...
|
||
|
} PlaybackMode;
|
||
|
|
||
|
typedef struct _TAPE_PLAY_C3 {
|
||
|
AVC_CMD_FRAME_HEADER CmdHeader;
|
||
|
PlaybackMode PlaybackMode;
|
||
|
} TAPE_PLAY_C3, *PTAPE_PLAY_C3;
|
||
|
|
||
|
typedef struct _TAPE_TRANSPORT_STATE_D0 {
|
||
|
AVC_CMD_FRAME_HEADER CmdHeader;
|
||
|
UCHAR Operand; // 7F
|
||
|
UCHAR TransportMode;
|
||
|
UCHAR TransportState;
|
||
|
} TAPE_TRANSPORT_STATE_D0, *PTAPE_TRANSPORT_STATE_D0;
|
||
|
|
||
|
|
||
|
//
|
||
|
// "Super" AVC command frame structure
|
||
|
//
|
||
|
typedef struct _AVC_CMD {
|
||
|
ULONG DataLen; // 4..512; at least 4 (header+opcode+operand) to be valid.
|
||
|
union {
|
||
|
// Generic
|
||
|
UCHAR FCP_DATA[MAX_FCP_DATA_LEN];
|
||
|
AVC_CMD_FRAME CmdFrame;
|
||
|
|
||
|
// Unit commands
|
||
|
UNIT_CONNECT_AV_20 ConnectAV;
|
||
|
UNIT_UNIT_INFO_30 UnitInfo;
|
||
|
UNIT_SUBUNIT_INFO_31 SubunitInfo;
|
||
|
|
||
|
// Tape subunit commands
|
||
|
TAPE_TRANSPORT_STATE_D0 TapeTransportState;
|
||
|
TAPE_PLAY_C3 TapePlay;
|
||
|
};
|
||
|
} AVC_CMD, *PAVC_CMD;
|
||
|
|
||
|
#endif // SUPPORT_NEW_AVC_CMD
|
||
|
|
||
|
//
|
||
|
// The index MUST match DVcrAVCCmdTable[]
|
||
|
//
|
||
|
typedef enum {
|
||
|
|
||
|
DV_UNIT_INFO = 0
|
||
|
,DV_SUBUNIT_INFO
|
||
|
,DV_CONNECT_AV_MODE
|
||
|
|
||
|
,DV_VEN_DEP_CANON_MODE // Vendor denpendent mode of operation for Canon DV that does not support ConnectDV
|
||
|
,DV_VEN_DEP_DVCPRO // Vendor depend cmd to detect DVC PRO tape format
|
||
|
|
||
|
,DV_IN_PLUG_SIGNAL_FMT
|
||
|
,DV_OUT_PLUG_SIGNAL_FMT // to determine if it is a PAL or NTSC
|
||
|
|
||
|
,DV_GET_POWER_STATE // Get current power state
|
||
|
,DV_SET_POWER_STATE_ON // Get power state to ON
|
||
|
,DV_SET_POWER_STATE_OFF // Get power state to OFF
|
||
|
|
||
|
,VCR_TIMECODE_SEARCH
|
||
|
,VCR_TIMECODE_READ
|
||
|
|
||
|
,VCR_ATN_SEARCH
|
||
|
,VCR_ATN_READ
|
||
|
|
||
|
,VCR_RTC_SEARCH
|
||
|
,VCR_RTC_READ
|
||
|
|
||
|
,VCR_OPEN_MIC_CLOSE
|
||
|
,VCR_OPEN_MIC_READ
|
||
|
,VCR_OPEN_MIC_WRITE
|
||
|
,VCR_OPEN_MIC_STATUS
|
||
|
|
||
|
,VCR_READ_MIC
|
||
|
|
||
|
,VCR_WRITE_MIC
|
||
|
|
||
|
,VCR_OUTPUT_SIGNAL_MODE
|
||
|
,VCR_INPUT_SIGNAL_MODE
|
||
|
|
||
|
,VCR_LOAD_MEDIUM_EJECT
|
||
|
|
||
|
,VCR_RECORD
|
||
|
,VCR_RECORD_PAUSE
|
||
|
|
||
|
,VCR_PLAY_FORWARD_STEP
|
||
|
,VCR_PLAY_FORWARD_SLOWEST
|
||
|
,VCR_PLAY_FORWARD_SLOWEST2
|
||
|
,VCR_PLAY_FORWARD_FASTEST
|
||
|
|
||
|
,VCR_PLAY_REVERSE_STEP
|
||
|
,VCR_PLAY_REVERSE_SLOWEST
|
||
|
,VCR_PLAY_REVERSE_SLOWEST2
|
||
|
,VCR_PLAY_REVERSE_FASTEST
|
||
|
|
||
|
,VCR_PLAY_FORWARD
|
||
|
,VCR_PLAY_FORWARD_PAUSE
|
||
|
|
||
|
,VCR_WIND_STOP
|
||
|
,VCR_WIND_REWIND
|
||
|
,VCR_WIND_FAST_FORWARD
|
||
|
|
||
|
,VCR_TRANSPORT_STATE
|
||
|
,VCR_TRANSPORT_STATE_NOTIFY
|
||
|
|
||
|
,VCR_MEDIUM_INFO
|
||
|
|
||
|
,VCR_RAW_AVC
|
||
|
|
||
|
} DVCR_AVC_COMMAND, *PDVCR_AVC_COMMAND;
|
||
|
|
||
|
|
||
|
|
||
|
#define MAX_FCP_PAYLOAD_SIZE 512
|
||
|
|
||
|
//
|
||
|
// CTYPE definitions (in bit-map form... should correlate with AvcCommandType from avc.h)
|
||
|
//
|
||
|
typedef enum {
|
||
|
CMD_CONTROL = 0x01
|
||
|
,CMD_STATUS = 0x02
|
||
|
,CMD_SPEC_INQ = 0x04
|
||
|
,CMD_NOTIFY = 0x08
|
||
|
,CMD_GEN_INQ = 0x10
|
||
|
} BITMAP_CTYPE;
|
||
|
|
||
|
typedef enum {
|
||
|
CMD_STATE_UNDEFINED
|
||
|
,CMD_STATE_ISSUED
|
||
|
,CMD_STATE_RESP_ACCEPTED
|
||
|
,CMD_STATE_RESP_REJECTED
|
||
|
,CMD_STATE_RESP_NOT_IMPL
|
||
|
,CMD_STATE_RESP_INTERIM
|
||
|
,CMD_STATE_ABORTED
|
||
|
} AVC_CMD_STATE, *PAVC_CMD_STATE;
|
||
|
|
||
|
|
||
|
// An AVC command entry
|
||
|
typedef struct _AVC_CMD_ENTRY {
|
||
|
LIST_ENTRY ListEntry;
|
||
|
PDVCR_EXTENSION pDevExt;
|
||
|
PIRP pIrp; // The Irp associated with this command
|
||
|
PAVC_COMMAND_IRB pAvcIrb; // points to the AVC command information
|
||
|
PVOID pProperty; // Data from/to COM interface
|
||
|
DVCR_AVC_COMMAND idxDVCRCmd; // Used to check for RAW AVC command, which requires special processing
|
||
|
AVC_CMD_STATE cmdState; // Issuing, interim, completed
|
||
|
NTSTATUS Status; // To save the results of response parsing
|
||
|
AvcCommandType cmdType; // Type of command: Control, Status. Notify, Gen or Spec Inquery
|
||
|
BYTE OpCode; // Since the opcode in response frame of TRANSITION and STABLE can be different from the COMMAND frame
|
||
|
BYTE Reserved[3]; // Pack to DWORD
|
||
|
} AVCCmdEntry, *PAVCCmdEntry;
|
||
|
|
||
|
|
||
|
|
||
|
#define CMD_IMPLEMENTED 1
|
||
|
#define CMD_NOT_IMPLEMENTED 0
|
||
|
#define CMD_UNDETERMINED 0xffffffff // -1
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
DVCR_AVC_COMMAND command; // VCR_PLAY_FORWARD
|
||
|
LONG lCmdImplemented; // 1:Implemented, 0:NotImpelemnted; -1:UnDetermined
|
||
|
|
||
|
ULONG ulRespFlags; // DVCR_AVC_SEND
|
||
|
|
||
|
ULONG ulCmdSupported; // one or more of constants defined in BITMAP_CTYPE
|
||
|
|
||
|
LONG OperandLength; // -1 = variable length
|
||
|
|
||
|
BYTE CType;
|
||
|
BYTE SubunitAddr;
|
||
|
BYTE Opcode;
|
||
|
|
||
|
BYTE Operands[MAX_AVC_OPERAND_BYTES];
|
||
|
|
||
|
} KSFCP_PACKET, *PKSFCP_PACKET;
|
||
|
|
||
|
|
||
|
|
||
|
#define OPC_TIMECODE 0x51
|
||
|
#define OPC_OPEN_MIC 0x60
|
||
|
#define OPC_READ_MIC 0x61
|
||
|
#define OPC_WRITE_MIC 0x62
|
||
|
#define OPC_INPUT_SIGNAL_MODE 0x79
|
||
|
#define OPC_LOAD_MEDIUM 0xc1
|
||
|
#define OPC_RECORD 0xc2
|
||
|
#define OPC_PLAY 0xc3
|
||
|
#define OPC_WIND 0xc4
|
||
|
#define OPC_TRANSPORT_STATE 0xd0
|
||
|
#define OPC_MEDIUM_INFO 0xda
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#define UNIT_TYPE_ID_VCR 0x20 // VCR 00100:000; 00100 == 4 == VCR, 000 == instancve number
|
||
|
#define UNIT_TYPE_ID_CAMERA 0x38 // Camera 00111:000; 00111 == 7 == Camera, 000 == instancve number
|
||
|
#define UNIT_TYPE_ID_DV 0xff // DV UNIT as a whole
|
||
|
|
||
|
|
||
|
// Vendor IDs that require special treatments
|
||
|
#define VENDOR_ID_MASK 0x00ffffff
|
||
|
#define VENDORID_CANON 0x85 // VEN_85 : Vendor Dependent command for ModeOfOperation
|
||
|
#define VENDORID_PANASONIC 0x8045 // VEN_8045 : DVCPRO?
|
||
|
|
||
|
|
||
|
#define AVC_POWER_STATE_ON 0x70
|
||
|
#define AVC_POWER_STATE_OFF 0x60
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
DVIssueAVCCommand (
|
||
|
IN PDVCR_EXTENSION pDevExt,
|
||
|
IN AvcCommandType cType,
|
||
|
IN DVCR_AVC_COMMAND idxAVCCmd,
|
||
|
IN PVOID pProperty
|
||
|
);
|
||
|
|
||
|
|
||
|
void
|
||
|
DVAVCCmdResetAfterBusReset(
|
||
|
PDVCR_EXTENSION pDevExt
|
||
|
);
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
AVCTapeGetDeviceProperty(
|
||
|
IN PDVCR_EXTENSION pDevExt,
|
||
|
IN PSTREAM_PROPERTY_DESCRIPTOR pSPDesc,
|
||
|
OUT PULONG pulActualBytetransferred
|
||
|
);
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
AVCTapeSetDeviceProperty(
|
||
|
IN PDVCR_EXTENSION pDevExt,
|
||
|
IN PSTREAM_PROPERTY_DESCRIPTOR pSPD,
|
||
|
IN PULONG pulActualBytetransferred
|
||
|
);
|