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

293 lines
8.6 KiB
C++

// $Header: G:/SwDev/WDM/Video/bt848/rcs/Xbar.h 1.8 1998/04/29 22:43:42 tomz Exp $
#ifndef __XBAR_H
#define __XBAR_H
//
// This file defines interconnections between components via Mediums
//
#ifdef __cplusplus
extern "C" {
#endif
#ifdef BT848_MEDIUMS
#define MEDIUM_DECL
#else
#define MEDIUM_DECL extern
#endif
/* -----------------------------------------------------------
Topology of all devices:
PinDir FilterPin# M_GUID#
TVTuner
TVTunerVideo out 0 0
TVTunerAudio out 1 1
TVAudio
TVTunerAudio in 0 1
TVAudio out 1 3
Crossbar
TVTunerVideo in 0 0
TVAudio in 3 3
AnalogVideoOut out 4 4
AnalogAudioOut out 5 NULL
Capture
AnalogVideoIn in 0 4
All other pins are marked as promiscuous connections via GUID_NULL
------------------------------------------------------------------ */
// Define the GUIDs which will be used to create the Mediums
#define M_GUID0 0xa19dc0e0, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID1 0xa19dc0e1, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID2 0xa19dc0e2, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID3 0xa19dc0e3, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID4 0xa19dc0e4, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID5 0xa19dc0e5, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID6 0xa19dc0e6, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID7 0xa19dc0e7, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID8 0xa19dc0e8, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
#define M_GUID9 0xa19dc0e9, 0x3b39, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
// Note: To allow multiple instances of the same piece of hardware,
// set the first ULONG after the GUID in the Medium to a unique value.
// ---------------------------------------------------------------
MEDIUM_DECL KSPIN_MEDIUM TVTunerMediums[2]
#ifdef BT848_MEDIUMS
= {
{M_GUID0, 0, 0}, // Pin 0
{M_GUID1, 0, 0}, // Pin 1
}
#endif
;
MEDIUM_DECL BOOL TVTunerPinDirection [2]
#ifdef BT848_MEDIUMS
= {
TRUE, // Output Pin 0
TRUE, // Output Pin 1
}
#endif
;
// -----------------------------------------------
MEDIUM_DECL KSPIN_MEDIUM TVAudioMediums[2]
#ifdef BT848_MEDIUMS
= {
{M_GUID1, 0, 0}, // Pin 0
{M_GUID3, 0, 0}, // Pin 1
}
#endif
;
MEDIUM_DECL BOOL TVAudioPinDirection [2]
#ifdef BT848_MEDIUMS
= {
FALSE, // Input Pin 0
TRUE, // Output Pin 1
}
#endif
;
// ---------------------------------------------------------------
MEDIUM_DECL KSPIN_MEDIUM CrossbarMediums[6]
#ifdef BT848_MEDIUMS
= {
{STATIC_GUID_NULL, 0, 0}, // Input Pin 0 - SVideoIn
{M_GUID0, 0, 0}, // Input Pin 2, KS_PhysConn_Video_Tuner,
{STATIC_GUID_NULL, 0, 0}, // Input Pin 1 - VideoCompositeIn
{M_GUID3, 0, 0}, // Input Pin 3 KS_PhysConn_Audio_Tuner,
{M_GUID4, 0, 0}, // Output Pin 4 - VideoDecoderOut
{STATIC_GUID_NULL, 0, 0}, // Output Pin 5 KS_PhysConn_Audio_AudioDecoder,
}
#endif
;
MEDIUM_DECL BOOL CrossbarPinDirection [6]
#ifdef BT848_MEDIUMS
= {
FALSE, // Input Pin 0
FALSE, // Input Pin 1
FALSE, // Input Pin 2
FALSE, // Input Pin 3
TRUE, // Output Pin 4
TRUE, // Output Pin 5
}
#endif
;
// ---------------------------------------------------------------
MEDIUM_DECL KSPIN_MEDIUM CaptureMediums[4]
#ifdef BT848_MEDIUMS
= {
// should change STATIC_KSMEDIUMSETID_Standard to
// STATIC_GUID_NULL when it works
{STATIC_KSMEDIUMSETID_Standard, 0, 0}, // Pin 0 Capture
{STATIC_KSMEDIUMSETID_Standard, 0, 0}, // Pin 1 Preview
{STATIC_KSMEDIUMSETID_Standard, 0, 0}, // Pin 2 VBI
{M_GUID4, 0, 0}, // Pin 3 Analog Video In
}
#endif
;
MEDIUM_DECL BOOL CapturePinDirection [4]
#ifdef BT848_MEDIUMS
= {
TRUE, // Output Pin 0
TRUE, // Output Pin 1
TRUE, // Output Pin 2
FALSE, // Input Pin 3
}
#endif
;
MEDIUM_DECL GUID CaptureCategories [4]
#ifdef BT848_MEDIUMS
= {
STATIC_PINNAME_VIDEO_CAPTURE, // Pin 0
STATIC_PINNAME_VIDEO_PREVIEW, // Pin 1
STATIC_PINNAME_VIDEO_VBI, // Pin 2
STATIC_PINNAME_VIDEO_ANALOGVIDEOIN, // Pin 3
}
#endif
;
#ifdef __cplusplus
}
#endif
// ---------------------------------------------------------------
struct _XBAR_PIN_DESCRIPTION {
ULONG PinType;
ULONG RelatedPinIndex;
ULONG IsRoutedTo; // Index of input pin in use
ULONG PinNo; // pin number as hard-wired; i.e. mux input 1; to be used in calls
// into the decoder to select a mux input
const KSPIN_MEDIUM *Medium;
_XBAR_PIN_DESCRIPTION( ULONG type, ULONG no, ULONG rel, const KSPIN_MEDIUM *);
_XBAR_PIN_DESCRIPTION(){}
};
inline _XBAR_PIN_DESCRIPTION::_XBAR_PIN_DESCRIPTION( ULONG type, ULONG no,
ULONG rel, const KSPIN_MEDIUM *Medium ) : PinType( type ),
RelatedPinIndex( rel ), IsRoutedTo( 0 ), PinNo( no ), Medium (Medium)
{
}
const int MaxOutPins = 2;
const int MaxInpPins = 4;
class CrossBar
{
// it is possible to make these into the pointers and allocate dynamically
// based on info from registry; but this seems like a lot of work - just allocate
// the maximum possible number and construct each based on the registry settings
_XBAR_PIN_DESCRIPTION OutputPins [MaxOutPins];
_XBAR_PIN_DESCRIPTION InputPins [MaxInpPins];
int InPinsNo_;
public:
int GetNoInputs();
int GetNoOutputs();
bool TestRoute( int InPin, int OutPin );
ULONG GetPinInfo( int dir, int idx, ULONG &related,
KSPIN_MEDIUM * Medium);
ULONG GetPinNo( int no );
void Route( int OutPin, int InPin );
bool GoodPins( int InPin, int OutPin );
int GetRoute( int OutPin );
CrossBar() : InPinsNo_( 0 ) {};
CrossBar( LONG *types );
};
inline CrossBar::CrossBar( LONG *types ) : InPinsNo_( 0 )
{
OutputPins [0] = _XBAR_PIN_DESCRIPTION( KS_PhysConn_Video_VideoDecoder,
0, 1, &CrossbarMediums[4]);
// [!!!] The following should be moved into the _XBAR_PIN_DESCRIPTION
// constructor as another parameter
Route( 0 /*Video OutPin*/, 1 /*Video InPin*/ );
OutputPins [1] = _XBAR_PIN_DESCRIPTION( KS_PhysConn_Audio_AudioDecoder,
0, 1, &CrossbarMediums[5]);
// [!!!] The following should be moved into the _XBAR_PIN_DESCRIPTION
// constructor as another parameter
Route( 1 /*Audio OutPin*/, 3 /*Audio InPin*/ );
for ( int i = 0; i < MaxInpPins; i++ ) {
if ( types [i] != -1 ) {
InputPins [InPinsNo_] = _XBAR_PIN_DESCRIPTION( types [i], i, (DWORD) -1, &CrossbarMediums[i] );
InPinsNo_++;
}
}
}
inline int CrossBar::GetNoInputs()
{
return InPinsNo_;
}
inline int CrossBar::GetNoOutputs()
{
return MaxOutPins;
}
inline bool CrossBar::GoodPins( int InPin, int OutPin )
{
return InPinsNo_ &&
bool( InPin >= -1 && InPin < InPinsNo_ && OutPin >= 0 && OutPin < MaxOutPins ); // JBC 4/1/98 Don't allow negative pin numbers
}
inline void CrossBar::Route( int OutPin, int InPin )
{
OutputPins [OutPin].IsRoutedTo = InPin;
}
inline int CrossBar::GetRoute( int OutPin )
{
return OutputPins [OutPin].IsRoutedTo;
}
// should be called for input pins only !
inline ULONG CrossBar::GetPinNo( int no )
{
return InputPins [no].PinNo;
}
inline ULONG CrossBar::GetPinInfo( int dir, int idx, ULONG &related,
KSPIN_MEDIUM * Medium )
{
_XBAR_PIN_DESCRIPTION *pPinDesc;
if ( dir == KSPIN_DATAFLOW_IN ) {
pPinDesc = InputPins;
ASSERT( idx < InPinsNo_ );
} else {
pPinDesc = OutputPins;
ASSERT( idx < MaxOutPins );
}
related = pPinDesc [idx].RelatedPinIndex;
*Medium = *pPinDesc[idx].Medium;
return pPinDesc [idx].PinType;
}
#endif