389 lines
12 KiB
C
389 lines
12 KiB
C
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1999 - 2000
|
|
|
|
Module Name:
|
|
|
|
msdvfmt.h
|
|
|
|
Abstract:
|
|
|
|
Header file for DV format data.
|
|
|
|
Last changed by:
|
|
|
|
$Author:: $
|
|
|
|
Environment:
|
|
|
|
Kernel mode only
|
|
|
|
Revision History:
|
|
|
|
$Revision:: $
|
|
$Date:: $
|
|
|
|
--*/
|
|
|
|
|
|
|
|
|
|
#ifndef _DVFORMAT_INC
|
|
#define _DVFORMAT_INC
|
|
|
|
|
|
// ****************
|
|
// Support switches
|
|
// ****************
|
|
|
|
//
|
|
// Differnt level of WDM supports may use different API
|
|
//
|
|
// e.g. MmGetSystemAddressForMdl (win9x)
|
|
// Return NULL for Win9x; bugcheck for Win2000 if NULL would have returned.
|
|
//
|
|
// MmGetSystemAddressForMdlSafe (win2000)
|
|
// Not supported in Win9x or Millen
|
|
//
|
|
// #define USE_WDM110 // Define this if WDM1.10 is used; e.g. Win2000 code base // Define in SOURCES if needed
|
|
|
|
|
|
//
|
|
// Turn this on to support HD DVCR
|
|
//#define MSDV_SUPPORT_HD_DVCR
|
|
|
|
//
|
|
// Turn this on to support SDL DVCR
|
|
//
|
|
#define MSDV_SUPPORT_SDL_DVCR
|
|
|
|
|
|
//
|
|
// Turn on this switch to support bus reset KS event
|
|
// #define MSDVDV_SUPPORT_BUSRESET_EVENT
|
|
|
|
|
|
//
|
|
// Turn this define to extract timecode from a video frame
|
|
// Advantage: faster turn around compare to an AVC status command
|
|
// #define MSDV_SUPPORT_EXTRACT_SUBCODE_DATA
|
|
|
|
|
|
//
|
|
// To get recorded date and time
|
|
// #define MSDV_SUPPORT_EXTRACT_DV_DATE_TIME
|
|
|
|
//
|
|
// Mute audio when in pause state while transmitting to DV
|
|
#define MSDV_SUPPORT_MUTE_AUDIO
|
|
|
|
//
|
|
// Support getting regitry value for this device
|
|
// WORKITEM: enable this for Whistler
|
|
// #define READ_CUTOMIZE_REG_VALUES
|
|
|
|
//
|
|
// Support wait a little until transport state control command is stabled before return
|
|
//
|
|
// #define SUPPORT_XPRT_STATE_WAIT_FOR_STABLE
|
|
|
|
|
|
//
|
|
// Support IQulityControl for the in pin
|
|
//
|
|
#define SUPPORT_QUALITY_CONTROL
|
|
|
|
//
|
|
// Suppoprt wait to preroll data at the RUN state
|
|
//
|
|
#define SUPPORT_PREROLL_AT_RUN_STATE
|
|
|
|
//
|
|
// Support a change in KsProxy to return "not ready" while transmitioning into the PAUSE state
|
|
//
|
|
#define SUPPORT_KSPROXY_PREROLL_CHANGE
|
|
|
|
//
|
|
// Support using AVC connect info for device to device connection
|
|
//
|
|
// #define SUPPORT_NEW_AVC
|
|
|
|
//
|
|
// Support Optimizing number of AVC Command retries for non-compliant devices
|
|
//
|
|
#define SUPPORT_OPTIMIZE_AVCCMD_RETRIES
|
|
|
|
typedef struct _DV_FORMAT_INFO {
|
|
|
|
// 2nd quadlet of the CIP header
|
|
// cipQuad[0] = 10:[FMT]
|
|
// cipQuad[1] = 50/60:STYPE:00
|
|
// cipQuad[2]+cipQuad[3] = SYT
|
|
UCHAR cipQuad[4];
|
|
//
|
|
// Holds the number of DIF sequences per vid format
|
|
//
|
|
ULONG ulNumOfDIFSequences;
|
|
|
|
//
|
|
// Number of receiving buffers
|
|
//
|
|
ULONG ulNumOfRcvBuffers;
|
|
|
|
//
|
|
// Number of transmitting buffers
|
|
//
|
|
ULONG ulNumOfXmtBuffers;
|
|
|
|
//
|
|
// Holds DV (audio and video) frame size
|
|
//
|
|
ULONG ulFrameSize;
|
|
|
|
//
|
|
// Approximate time per frame
|
|
//
|
|
ULONG ulAvgTimePerFrame;
|
|
|
|
//
|
|
// Number of source packet per frame
|
|
//
|
|
ULONG ulSrcPackets;
|
|
|
|
//
|
|
// Maximun number of source packets per frame
|
|
//
|
|
ULONG ulMaxSrcPackets;
|
|
|
|
//
|
|
// Holds the number of quadlets in each data block
|
|
//
|
|
ULONG DataBlockSize; // 00(256),01(01)...,ff(255) quadlets
|
|
|
|
//
|
|
// Holds the number of data blocks into which a source packet is divided.
|
|
//
|
|
ULONG FractionNumber; // 00(not divided), 01 (2 DataBlks), 10 (4), 11 (8)
|
|
|
|
//
|
|
// Quadlet padding count (0..7)
|
|
//
|
|
ULONG QuadPadCount;
|
|
|
|
//
|
|
// SourcePacketHeader: 0 (FALSE); else (TRUE)
|
|
//
|
|
ULONG SrcPktHeader;
|
|
|
|
} DV_FORMAT_INFO, *PDV_FORMAT_INFO;
|
|
|
|
|
|
//
|
|
// DV format tables
|
|
//
|
|
|
|
|
|
typedef struct _ALL_STREAM_INFO {
|
|
HW_STREAM_INFORMATION hwStreamInfo;
|
|
HW_STREAM_OBJECT hwStreamObject;
|
|
} ALL_STREAM_INFO, *PALL_STREAM_INFO;
|
|
|
|
|
|
|
|
// All CIP sizes are in quads. The upper third byte is the size.
|
|
#define CIP_HDR_FMT_DV 0x00
|
|
#define CIP_HDR_FMT_DVCPRO 0x1e
|
|
|
|
|
|
//
|
|
// 1394 stuff
|
|
//
|
|
#define SPEED_100_INDEX 0
|
|
#define SPEED_200_INDEX 1
|
|
#define SPEED_400_INDEX 2
|
|
|
|
|
|
#define CIP_DBS_SD_DVCR 120 // quadlets in a data block of the SD DVCR; BlueBook Part 2
|
|
#define CIP_DBS_HD_DVCR 240 // quadlets in a data block of the HD DVCR; BlueBook Part 3
|
|
#define CIP_DBS_SDL_DVCR 60 // quadlets in a data block of the SDL DVCR; BlueBook Part 5
|
|
|
|
#define CIP_FN_SD_DVCR 0 // Data blocks in a source pacaket of SD DVCR; BlueBook Part 2
|
|
#define CIP_FN_HD_DVCR 0 // Data blocks in a source pacaket of HD DVCR; BlueBook Part 3
|
|
#define CIP_FN_SDL_DVCR 0 // Data blocks in a source pacaket of SDL DVCR; BlueBook Part 5
|
|
|
|
|
|
#define MAX_FCP_PAYLOAD_SIZE 512
|
|
|
|
|
|
// CIP header definition:
|
|
|
|
// FMT: "Blue book" Part 1, page 25, Table 3; DVCR:000000
|
|
#define FMT_DVCR 0x80 // 10:FMT(00:0000)
|
|
#define FMT_DVCR_CANON 0x20 // 10:FMT(00:0000); but Canon return 00:FMT(10:0000)
|
|
#define FMT_MPEG 0xa0 // 10:FMT(10:0000)
|
|
|
|
// FDF
|
|
#define FDF0_50_60_MASK 0x80
|
|
#define FDF0_50_60_PAL 0x80
|
|
#define FDF0_50_60_NTSC 0x00
|
|
|
|
#define FDF0_STYPE_MASK 0x7c
|
|
#define FDF0_STYPE_SD_DVCR 0x00 // STYPE: 000:00
|
|
#define FDF0_STYPE_SDL_DVCR 0x04 // STYPE: 000:01
|
|
#define FDF0_STYPE_HD_DVCR 0x08 // STYPE: 000:10
|
|
#define FDF0_STYPE_SD_DVCPRO 0x78 // STYPE: 111:10
|
|
|
|
|
|
//
|
|
// FCP and AVCC stuff. Used in conjunction with defs in 1394.h
|
|
//
|
|
|
|
// DVCR:
|
|
#define SUBUNIT_TYPE_CAMCORDER 4
|
|
#define SUBUNIT_ID_CAMCORDER 0
|
|
|
|
#define DIF_SEQS_PER_NTSC_FRAME 10 // SDDV
|
|
#define DIF_SEQS_PER_PAL_FRAME 12 // SDDV
|
|
|
|
#define DIF_SEQS_PER_NTSC_FRAME_SDL 5 // SDLDV
|
|
#define DIF_SEQS_PER_PAL_FRAME_SDL 6 // SDLDV
|
|
|
|
#define DIF_SEQS_PER_NTSC_FRAME_HD 10 // HDDV: same as SDDV but source packet is twice as big
|
|
#define DIF_SEQS_PER_PAL_FRAME_HD 12 // HDDV: same as SDDV but source packet is twice as big
|
|
|
|
#define SRC_PACKETS_PER_NTSC_FRAME 250
|
|
#define SRC_PACKETS_PER_PAL_FRAME 300
|
|
|
|
#define MAX_SRC_PACKETS_PER_NTSC_FRAME 267 // packets for a NTSC DV frame; "about" 29.97 FPS
|
|
#define MAX_SRC_PACKETS_PER_PAL_FRAME 320 // packets for a PAL DV frame; exactly 25FPS
|
|
|
|
#define MAX_SRC_PACKETS_PER_NTSC_FRAME_PAE 100 // SRC_PACKETS_PER_NTSC_FRAME/5
|
|
#define MAX_SRC_PACKETS_PER_PAL_FRAME_PAE 120 // SRC_PACKETS_PER_PAL_FRAME/5
|
|
|
|
#define FRAME_SIZE_SD_DVCR_NTSC 120000
|
|
#define FRAME_SIZE_SD_DVCR_PAL 144000
|
|
|
|
#define FRAME_SIZE_HD_DVCR_NTSC 240000
|
|
#define FRAME_SIZE_HD_DVCR_PAL 288000
|
|
|
|
#define FRAME_SIZE_SDL_DVCR_NTSC 60000
|
|
#define FRAME_SIZE_SDL_DVCR_PAL 72000
|
|
|
|
#define FRAME_TIME_NTSC 333667 // "about" 29.97
|
|
#define FRAME_TIME_PAL 400000 // exactly 25
|
|
|
|
#define PCR_OVERHEAD_ID_SDDV 0xf // 480; delays caused by IEEE 1394 bus parmeters
|
|
#define PCR_PAYLOAD_SDDV (CIP_DBS_SD_DVCR + 2) // 120 * 4 + 2 * 4 = 480 + 8 = 488; 488/4 = 122 quadlet
|
|
#define PCR_PAYLOAD_HDDV (CIP_DBS_HD_DVCR + 2) // 240 * 4 + 2 * 4 = 960 + 8 = 968; 968/4 = 242 quadlets
|
|
#define PCR_PAYLOAD_SDLDV (CIP_DBS_SDL_DVCR + 2) // 60 * 4 + 2 * 4 = 240 + 8 = 248; 248/4 = 62 quadlets
|
|
|
|
|
|
//
|
|
// These definition and macros are used to calculate the picture numbers.
|
|
// With OHCI spec, the data is returned with the 16bit Cycle time, which includes
|
|
// 3 bits of SecondCount and 13 bits of the CycleCount. This "timer" will wrap in 8 seconds.
|
|
//
|
|
#define TIME_PER_CYCLE 1250 // One 1394 cycle; unit = 100 nsec
|
|
#define CYCLES_PER_SECOND 8000
|
|
#define MAX_SECOND_COUNTS 7 // The returned CycleTime contains 3 bits of SecondCount; that is 0..7
|
|
#define MAX_CYCLES (MAX_SECOND_COUNTS + 1) * CYCLES_PER_SECOND // 0..MAX_CYCLES-1
|
|
#define MAX_CYCLES_TIME (MAX_CYCLES * TIME_PER_CYCLE) // unit = 100nsec
|
|
|
|
#define VALIDATE_CYCLE_COUNTS(CT) ASSERT(CT.CL_SecondCount <= 7 && CT.CL_CycleCount < CYCLES_PER_SECOND && CT.CL_CycleOffset == 0);
|
|
|
|
#define CALCULATE_CYCLE_COUNTS(CT) (CT.CL_SecondCount * CYCLES_PER_SECOND + CT.CL_CycleCount);
|
|
|
|
#define CALCULATE_DELTA_CYCLE_COUNT(prev, now) ((now > prev) ? now - prev : now + MAX_CYCLES - prev)
|
|
|
|
//
|
|
// Return avg time per frame in the unit of 100 nsec;
|
|
// for calculation accuracy using only integer calculation,
|
|
// we should do do multimplcation before division.
|
|
// That is why the application can request to get numerator and denominator separately.
|
|
//
|
|
#define GET_AVG_TIME_PER_FRAME(format) ((format == FMT_IDX_SD_DVCR_NTSC || format == FMT_IDX_SDL_DVCR_NTSC) ? (1001000/3) : FRAME_TIME_PAL)
|
|
#define GET_AVG_TIME_PER_FRAME_NUM(format) ((format == FMT_IDX_SD_DVCR_NTSC || format == FMT_IDX_SDL_DVCR_NTSC) ? 1001000 : 400000)
|
|
#define GET_AVG_TIME_PER_FRAME_DENOM(format) ((format == FMT_IDX_SD_DVCR_NTSC || format == FMT_IDX_SDL_DVCR_NTSC) ? 3 : 1)
|
|
|
|
|
|
#define GET_NUM_PACKETS_PER_FRAME(format) ((format == FMT_IDX_SD_DVCR_NTSC || format == FMT_IDX_SDL_DVCR_NTSC) ? 4004/15 /* 100100/375 */ : MAX_SRC_PACKETS_PER_PAL_FRAME)
|
|
#define GET_NUM_PACKETS_PER_FRAME_NUM(format) ((format == FMT_IDX_SD_DVCR_NTSC || format == FMT_IDX_SDL_DVCR_NTSC) ? 4004 : MAX_SRC_PACKETS_PER_PAL_FRAME)
|
|
#define GET_NUM_PACKETS_PER_FRAME_DENOM(format) ((format == FMT_IDX_SD_DVCR_NTSC || format == FMT_IDX_SDL_DVCR_NTSC) ? 15 : 1)
|
|
|
|
|
|
//
|
|
// Data buffers
|
|
//
|
|
#define DV_NUM_OF_RCV_BUFFERS 16 // Same as number of transmit buffer
|
|
|
|
#define NUM_BUF_ATTACHED_THEN_ISOCH 4 // number of buffers attached before streaming and also as the water mark.
|
|
#define NUM_BUFFER_BEFORE_TRANSMIT_BEGIN (NUM_BUF_ATTACHED_THEN_ISOCH + 1) // One extra to avoid repeat frame
|
|
#define DV_NUM_EXTRA_USER_XMT_BUFFERS 12 // Extra user buffers that the data source can send to us as a read ahead.
|
|
#define DV_NUM_OF_XMT_BUFFERS (NUM_BUF_ATTACHED_THEN_ISOCH + DV_NUM_EXTRA_USER_XMT_BUFFERS)
|
|
|
|
|
|
|
|
|
|
//
|
|
// The "signature" of the header section of Seq0 of incoming source packets:
|
|
//
|
|
// "Blue" book, Part2, 11.4 (page 50); Figure 66, table 36 (page 111)
|
|
//
|
|
// ID0 = {SCT2,SCT1,SCT0,RSV,Seq3,Seq2,Seq1,Seq0}
|
|
//
|
|
// SCT2-0 = {0,0,0} = Header Section Type
|
|
// RSV = {1}
|
|
// Seq3-0 = {1,1,1,1} for NoInfo or {0,0,0,} for Sequence 0
|
|
//
|
|
// ID1 = {DSeq3-0, 0, RSV, RSV, RSV}
|
|
// DSeq3-0 = {0, 0, 0, 0} = Beginning of a DV frame
|
|
//
|
|
// ID2 = {DBN7,DBN6,DBN5,DBN4,DBN3,DBN2,DBN1,DBN0}
|
|
// DBB7-0 = {0,0,0,0,0,0,0,0,0} = Beginning of a DV frame
|
|
//
|
|
|
|
#define DIF_BLK_ID0_SCT_MASK 0xe0 // 11100000b; Section Type (SCT)2-0 are all 0's for the Header section
|
|
#define DIF_BLK_ID1_DSEQ_MASK 0xf0 // 11110000b; DIF Sequence Number(DSEQ)3-0 are all 0's
|
|
#define DIF_BLK_ID2_DBN_MASK 0xff // 11111111b; Data Block Number (DBN)7-0 are all 0's
|
|
|
|
#define DIF_HEADER_DSF 0x80 // 10000000b; DSF=0; 10 DIF Sequences (525-60)
|
|
// DSF=1; 12 DIF Sequences (625-50)
|
|
|
|
#define DIF_HEADER_TFn 0x80 // 10000000b; TFn=0; DIF bloick of area N are transmitted in the current DIF sequence.
|
|
// TFn=1; DIF bloick of area N are NOT transmitted in the current DIF sequence.
|
|
|
|
//
|
|
// AV/C command response data definition
|
|
//
|
|
#define AVC_DEVICE_TAPE_REC 0x20 // 00100:000
|
|
#define AVC_DEVICE_CAMERA 0x38 // 00111:000
|
|
#define AVC_DEVICE_TUNER 0x28 // 00101:000
|
|
|
|
|
|
//
|
|
// GUID definitions for pins and DV format types.
|
|
//
|
|
|
|
// DV vid only output pin
|
|
#define STATIC_PINNAME_DV_VID_OUTPUT \
|
|
0x5b21c540L, 0x7aee, 0x11d1, 0x88, 0x3b, 0x00, 0x60, 0x97, 0xf0, 0x5c, 0x70
|
|
DEFINE_GUIDSTRUCT("5b21c540-7aee-11d1-883b-006097f05c70", PINNAME_DV_VID_OUTPUT);
|
|
#define PINNAME_DV_VID_OUTPUT DEFINE_GUIDNAMED(PINNAME_DV_VID_OUTPUT)
|
|
#define PINNAME_VID_OUT PINNAME_DV_VID_OUTPUT
|
|
|
|
// DV A/V output pin
|
|
#define STATIC_PINNAME_DV_AV_OUTPUT \
|
|
0x5b21c541L, 0x7aee, 0x11d1, 0x88, 0x3b, 0x00, 0x60, 0x97, 0xf0, 0x5c, 0x70
|
|
DEFINE_GUIDSTRUCT("5b21c540-7aee-11d1-883b-006097f05c70", PINNAME_DV_AV_OUTPUT);
|
|
#define PINNAME_DV_AV_OUTPUT DEFINE_GUIDNAMED(PINNAME_DV_AV_OUTPUT)
|
|
#define PINNAME_AV_OUTPUT PINNAME_DV_AV_OUTPUT
|
|
|
|
|
|
// DV A/V input pin
|
|
#define STATIC_PINNAME_DV_AV_INPUT \
|
|
0x5b21c543L, 0x7aee, 0x11d1, 0x88, 0x3b, 0x00, 0x60, 0x97, 0xf0, 0x5c, 0x70
|
|
DEFINE_GUIDSTRUCT("5b21c543-7aee-11d1-883b-006097f05c70", PINNAME_DV_AV_INPUT);
|
|
#define PINNAME_DV_AV_INPUT DEFINE_GUIDNAMED(PINNAME_DV_AV_INPUT)
|
|
#define PINNAME_AV_INPUT PINNAME_DV_AV_INPUT
|
|
|
|
#endif |