// $Header: G:/SwDev/WDM/Video/bt848/rcs/Pisces.h 1.8 1998/05/06 18:25:31 tomz Exp $ #ifndef __PISCES_H #define __PISCES_H #include "preg.h" #ifndef __FIELD_H #include "field.h" #endif #ifndef __DECODER_H #include "decoder.h" #endif #ifndef __RISCENG_H #include "risceng.h" #endif typedef void (*EVENTHANDLER)( DWORD dwCB, PVOID pTag ); const PiscesStreams = 4; #define BIT(x) ((DWORD)1 << (x)) const VSYNC_I = BIT(1); // 0x00000001 const I2CDONE_I = BIT(8); // 0x00000100 const GPINT_I = BIT(9); // 0x00000200 const RISC_I = BIT(11); // 0x00000800 const FBUS_I = BIT(12); // 0x00001000 const FTRGT_I = BIT(13); // 0x00002000 const FDSR_I = BIT(14); // 0x00004000 const PPERR_I = BIT(15); // 0x00008000 const RIPERR_I = BIT(16); // 0x00010000 const PABORT_I = BIT(17); // 0x00020000 const OCERR_I = BIT(18); // 0x00040000 const SCERR_I = BIT(19); // 0x00080000 const DMAERR_I = BIT(20); // 0x00100000 const PARITY_I = (BIT(15)|BIT(16)); // 0x00018000 const EN_TRITON1_BUG_FIX = BIT(23); // 0x00800000 /* Class: IntrIdxAss * Purpose: Used to assiciate a number program will generate with IRQ and * an index in the array */ class IntrIdxAss { public: int IntNo; int Idx; IntrIdxAss() : IntNo( 0 ), Idx( 0 ) {} IntrIdxAss( int key, int value ) : IntNo( key ), Idx( value ) {} int operator ==( const IntrIdxAss &rhs ) { return IntNo == rhs.IntNo; } }; /* Type: IntrToIdxDict * Purpose: Holds values of interrupt number and array index associated * Note Use TArrayAsVector instead of TIArrayAsVector ( it contains pointers, * after all ) because compiler insists on calling vector_new which is * non-existent in the VxD libs */ typedef IntrIdxAss *IntrToIdxDict [12]; /* Type: ProgramsArray * Purpose: Defines an array that holds created programs * Note: Elements in the array alternate, i.e. even program, odd, even... */ typedef RiscPrgHandle ProgramsArray [12]; // class CProgArray // // assumptions: // 1. Array size is 12. // 2. The prog array has fixed locations for specific purposes: // 0 VBIO // 1 ODD // 2 ODD Sync // 3 VBIE // 4 EVEN // 5 EVEN Sync // -------------------- // 6 VBIO // 7 ODD // 8 ODD Sync // 9 VBIE // 10 EVEN // 11 EVEN Sync #define MAX_PROGS 12 class CProgArray { private: DWORD dwCurrNdx_ ; RiscPrgHandle rpArray[MAX_PROGS] ; public: CProgArray () { Clear() ;} virtual ~CProgArray () { } // Clear sets all array elements handles to NULL void Clear() { dwCurrNdx_ = 0 ; memset( &rpArray[0], '\0', sizeof( rpArray ) ) ; } // overload for accessing the array inline RiscPrgHandle & operator [] (DWORD n) { n %= MAX_PROGS ; // prevent invalid accesses return rpArray[n] ; } // Return the index of the given handle. Assumes that the handle // was given by this class and is valid and current. DWORD GetIndex(RiscPrgHandle hRp) { for (int i = 0 ; i < MAX_PROGS ; i++) if (rpArray[i] == hRp) return i ; return (DWORD) -1 ; } // // Count Methods // // Returns the number of elements. Static for now. inline DWORD NumElements() { return MAX_PROGS ; } // Returns the number of non-null programs DWORD Count() { DWORD n = 0 ; for (int i = 0 ; i < MAX_PROGS ; i++) if (rpArray[i]) n++ ; return n ; } // Returns the number of video programs inline DWORD CountVideoProgs() { DWORD n = 0 ; if (rpArray[1]) n++ ; if (rpArray[4]) n++ ; if (rpArray[7]) n++ ; if (rpArray[10]) n++ ; return n ; } // Returns the number of vbi programs inline DWORD CountVbiProgs() { DWORD n = 0 ; if (rpArray[0]) n++ ; if (rpArray[3]) n++ ; if (rpArray[6]) n++ ; if (rpArray[9]) n++ ; return n ; } // Returns number of programs which actually transfer data inline DWORD CountDMAProgs() { return CountVideoProgs() + CountVbiProgs() ; } // // Find Methods // // Returns the first non-null riscprogram. Returns Null if array is empty. RiscPrgHandle First() { RiscPrgHandle hRp = NULL ; for (dwCurrNdx_ = 0 ; dwCurrNdx_ < MAX_PROGS ; dwCurrNdx_++) { if (rpArray[dwCurrNdx_]) { hRp = rpArray[dwCurrNdx_++] ; break ; } } return hRp ; } // Returns the next non-null riscprogram. Returns null if there are none left. RiscPrgHandle Next() { RiscPrgHandle hRp = NULL ; for ( ; dwCurrNdx_ < MAX_PROGS ; dwCurrNdx_++) { if (rpArray[dwCurrNdx_]) { hRp = rpArray[dwCurrNdx_++] ; break ; } } return hRp ; } } ; const VBIOStartLocation = 0; const OddStartLocation = 1; const OddSyncStartLoc = 2; const VBIEStartLocation = 3; const EvenStartLocation = 4; const EvenSyncStartLoc = 5; const DistBetweenProgs = 6; const ProgsWithinField = 3; /* Class: BtPisces * Purpose: Controls the BtPisces video capture chip * Attributes: * Operations: * Note: Every time any of the Set functions is called, operation must stop. * After all changes are done execution can resume. This means that all RISC * programs are destroyed ( if they exist ), changes made, new RISC programs * are created ( if needed ) */ class BtPisces { DECLARE_COLORCONTROL; DECLARE_INTERRUPTSTATUS; DECLARE_INTERRUPTMASK; DECLARE_CONTROL; DECLARE_CAPTURECONTROL; DECLARE_COLORFORMAT; DECLARE_GPIODATAIO; DECLARE_GPIOOUTPUTENABLECONTROL; public: Decoder PsDecoder_; private: // all possible data streams FieldWithScaler Even_; FieldWithScaler Odd_; VBIField VBIE_; VBIField VBIO_; RISCEng Engine_; RISCProgram Starter_; RISCProgram *Skippers_ [PiscesStreams * MaxProgsForField]; RISCProgram SyncEvenEnd1_; RISCProgram SyncEvenEnd2_; RISCProgram SyncOddEnd1_; RISCProgram SyncOddEnd2_; CProgArray CreatedProgs_; CProgArray ActiveProgs_; IntrToIdxDict InterruptToIdx_; int nSkipped_; int OldIdx_; // this is the indirection array that maps an index from the CreatedProgs_ // array into the Skippers_ array. It is needed because it is much simpler // to assign a strict relationships between a created program and a skipper // for it than trying to figure out what skipper program is available // when a created program needs to be skipped int SkipperIdxArr_ [ProgsWithinField * 2 * MaxProgsForField]; bool Paused_; bool Update_; bool Inited_; DWORD dwPlanarAdjust_; void Init(); bool CreateSyncCodes(); void ProcessRISCIntr(); protected: // type-unsafe method of getting field associated with a stream // Field & GetField( StreamInfo &str ) { return *(Field*)str.tag; } int GetIdxFromStream( Field &aField ); RiscPrgHandle AddProgram( Field &aStream, int NumberToAdd ); void ProcessPresentPrograms(); void AssignIntNumbers(); void ProcessSyncPrograms(); void LinkThePrograms(); void Skip( int idx ); void Restart(); void GetStarted( bool &EvenWasStarted, bool &OddWasStarted, bool &VBIEWasStarted, bool &VBIOWasStarted ); void RestartStreams( bool EvenWasStarted, bool OddWasStarted, bool VBIEWasStarted, bool VBIOWasStarted ); void CreateStarter( bool EvenWasStarted ); int GetPassed(); // void AdjustTime( LARGE_INTEGER &t, int passed ); RiscPrgHandle GetProgram( int pos, int &idx ); public: void PairedPause( int idx ); void DumpRiscPrograms(); // decoder 'set' group virtual void SetBrightness( DWORD value ); virtual void SetSaturation( DWORD value ); virtual void SetConnector ( DWORD value ); virtual void SetContrast ( DWORD value ); virtual void SetHue ( DWORD value ); virtual void SetSVideo ( DWORD value ); virtual void SetFormat ( DWORD value ); virtual LONG GetSaturation(); virtual LONG GetHue (); virtual LONG GetBrightness(); virtual LONG GetSVideo (); virtual LONG GetContrast (); virtual LONG GetFormat (); virtual LONG GetConnector (); virtual LONG GetSupportedStandards(); void SetPlanarAdjust( DWORD val ) { dwPlanarAdjust_ = val; } void TurnVFilter( State s ); // scaler group virtual ErrorCode SetAnalogWindow( MRect &r, Field &aField ); virtual ErrorCode SetDigitalWindow( MRect &r, Field &aField ); // color space converter group virtual void SetPixelFormat( ColFmt, Field &aField ); ColFmt GetPixelFormat( Field &aField ); // streaming operation functions virtual ErrorCode Create( Field &aField ); virtual void Start( Field &aField ); virtual void Stop( Field &aField ); void Pause( Field &aField ); void Continue(); State Interrupt(); // void ProcessAddBuffer( StreamInfo aStream ); void ProcessBufferAtInterrupt( PVOID pTag ); void SetBufPitch( DWORD dwP, Field &aField ) { aField.SetBufPitch( dwP ); } void SetBufQuePtr( Field &aField, VidBufQueue *pQ ) { aField.SetBufQuePtr( pQ ); } VidBufQueue &GetCurrentQue( Field &aField ) { return aField.GetCurrentQue(); } virtual ErrorCode AllocateStream( Field *&Field, VideoStream st ); DWORD GetDataBuffer( int idx ) { return CreatedProgs_ [idx]->GetDataBuffer(); } bool InitOK(); BtPisces( DWORD *xtals ); ~BtPisces(); }; inline bool BtPisces::InitOK() { return Inited_; } #endif