/**************************************************************************** *_Copyright (c) 2004 DST Technologies Inc. All Rights Reserved. * * Module: dsthaldmx.c * * Description: DST DEMULTIPLEX INTERFACE IMPLEMENTATION * * * notes: jfet20040603 * ***************************************************************************/ #include "dsthalcommon.h" #include "dsthaldmx.h" //#include "dstdddemux.h" #include "dsthallocal.h" #include "dstdddmx.h" #ifdef DMALLOC #include #endif /****************************************************************************** * Global variable declaration ******************************************************************************/ DS_U32 g_dhlDmxDbgLvl = 1; DS_U32 g_CurrentTSInput = DHL_DMX_TS_INPUT0; /****************************************************************************** * Imported variable declaration ******************************************************************************/ /****************************************************************************** * Imported function declaration ******************************************************************************/ /****************************************************************************** * Local definitions ******************************************************************************/ /****************************************************************************** * Local variable declaration ******************************************************************************/ static DS_BOOL s_bScrambleCheckStarted = _FALSE_; static int s_iScrambleCheckTimeout = 170; /****************************************************************************** * Local typedefs ******************************************************************************/ /****************************************************************************** * Local function prototypes ******************************************************************************/ /******************************************************************************** FUNCTION: DHL_DMX_INIT Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DMX_Init(void) { DHL_RESULT dhlResult = DHL_OK; static int dmxInit = 0; if ( dmxInit == 1 ) return dhlResult; dmxInit = 1; dhlResult = DD_DMX_Init(); SysENSURE(dhlResult == DHL_OK); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DMX_START Purpose: demultiplex component start Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DMX_Start(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DMX_Start(); SysENSURE(dhlResult == DHL_OK); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DMX_STOP Purpose: demultiplex components stop (pipe) Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DMX_Stop(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DMX_Stop(); SysENSURE(dhlResult == DHL_OK); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DMX_CLOSE Purpose: demultiplex components close (stop->disconncet->close) Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DMX_Close(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DMX_Close(); SysENSURE(dhlResult == DHL_OK); return dhlResult; } DHL_RESULT DHL_DMX_PresetInput( DHL_DMX_INPUT tsInput ) { DHL_RESULT dhlResult = DHL_OK; g_CurrentTSInput = tsInput; return dhlResult; } DHL_RESULT DHL_DMX_ChangeInput( DHL_DMX_INPUT tsInput ) { DHL_RESULT dhlResult = DHL_OK; SysREQUIRE( tsInput >= DHL_DMX_TS_INPUT_START && tsInput <= DHL_DMX_TS_INPUT_END ); g_CurrentTSInput = tsInput; return dhlResult; } DS_BOOL DHL_DMX_IsScrambled(void) { DS_BOOL bScrambled = _FALSE_; volatile DS_U32 curTick; curTick = OS_GetTickCount(); do { OS_mDelay( 10 ); if ( DD_DMX_IsScrambled() ) { bScrambled = _TRUE_; break; } } while ( (OS_GetTickCount()) < (curTick+s_iScrambleCheckTimeout) ); return bScrambled; } DS_BOOL DHL_DMX_IsScrambleCheckStarted(void) { return s_bScrambleCheckStarted; } /******************************************************************************** FUNCTION: DHL_DMX_SetPID4DetectScramble Purpose: Set video/audio PID for detect scrambled channel Arguments: [in]uVidPID - Video PID [in]uPcrPID - Video PID Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DMX_SetPID4DetectScramble(DS_U16 uVidPID, DS_U16 uAudPID) { DHL_RESULT dhlResult = DHL_OK; if ( s_bScrambleCheckStarted == _TRUE_ ) { DD_DMX_ResetPID4DetectScramble(); s_bScrambleCheckStarted = _FALSE_; } dhlResult = DD_DMX_SetPID4DetectScramble(uVidPID, uAudPID); SysASSERT( dhlResult == DHL_OK ); s_bScrambleCheckStarted = _TRUE_; return dhlResult; } DHL_RESULT DHL_DMX_ResetPID4DetectScramble(void) { DHL_RESULT dhlResult = DHL_OK; if ( s_bScrambleCheckStarted == _FALSE_ ) { DHL_DbgPrintf(g_dhlDmxDbgLvl,DHLDBG_DMX,"skipped.\n" ); return dhlResult; } dhlResult = DD_DMX_ResetPID4DetectScramble(); SysASSERT( dhlResult == DHL_OK ); s_bScrambleCheckStarted = _FALSE_; return dhlResult; } DHL_RESULT DHL_DMX_SetPID4DetectScrambleEx(DS_U16 uVidPID) { DHL_RESULT dhlResult = DHL_OK; if ( s_bScrambleCheckStarted == _TRUE_ ) { DD_DMX_ResetPID4DetectScramble(); s_bScrambleCheckStarted = _FALSE_; } dhlResult = DD_DMX_SetPID4DetectScrambleEx(uVidPID); SysASSERT( dhlResult == DHL_OK ); s_bScrambleCheckStarted = _TRUE_; return dhlResult; } DHL_RESULT DHL_DMX_SetPID4DetectScrambleExAudio(DS_U16 uAudPID) { return DHL_DMX_SetPID4DetectScrambleEx(uAudPID); } DHL_RESULT DHL_DMX_ResetPID4DetectScrambleEx(void) { DHL_RESULT dhlResult = DHL_OK; if ( s_bScrambleCheckStarted == _FALSE_ ) { DHL_DbgPrintf(g_dhlDmxDbgLvl,DHLDBG_DMX,"skipped.\n" ); return dhlResult; } dhlResult = DD_DMX_ResetPID4DetectScrambleEx(); SysASSERT( dhlResult == DHL_OK ); s_bScrambleCheckStarted = _FALSE_; return dhlResult; } DHL_RESULT DHL_DMX_ResetPID4DetectScrambleAudio(void) { return DHL_DMX_ResetPID4DetectScrambleEx(); } DHL_RESULT DHL_DMX_CheckScramble(DS_BOOL *pScrambled, int timeOut, DS_BOOL (*ckfn)(void)) { DS_BOOL bScrambled = DS_FALSE; volatile DS_U32 curTick; curTick = OS_GetTickCount(); do { OS_mDelay( 10 ); if ( DD_DMX_IsScrambled() ) { //DHL_DbgPrintf(gdhlDmxDbgLvl,DHLDBG_DMX,"Scrambled!\n"); fprintf(stderr,"Scrambled!\n"); bScrambled = DS_TRUE; break; } if (ckfn && (*ckfn)()) return DHL_FAIL_CANCELLED; } while ( (OS_GetTickCount()) < (curTick+timeOut) ); if (pScrambled) *pScrambled = bScrambled; return DHL_OK; } void hset_scheck_timeout(int i) { printf("s_iScrambleCheckTimeout: %d -> %d\n", s_iScrambleCheckTimeout, i); s_iScrambleCheckTimeout = i; }