/**************************************************************************** *_Copyright (c) 2009 Digital Stream Technology Inc. All Rights Reserved. * * Module: dsthaldtv.c * * Description: This file includes DTV Audio and Video and Userdata. * And anything related with DTV shall be included in this file. * ***************************************************************************/ #include #include #include "dsthalcommon.h" #include "dsthallocal.h" #include "dstdddtv.h" #include "dstddaud.h" #include "dstddsys.h" #ifdef DMALLOC #include #endif /****************************************************************************** * Global variable declaration ******************************************************************************/ DS_U32 gDTVDbgLvl = 1; //DHL_AV debug level DHL_DTV_CONFIG g_dhldtv={0}; DHL_DTV_SRCVID_INFO g_dhlmpeginfo = {0}; DS_BOOL g_DTVCCEnable = DS_FALSE; /* * Delay for popup noise. */ int Popup_StartDelay = 150; int Popup_EndDelay = 40; DHL_PESFILTER g_PESFilter[MAX_PES_FILTER_CNT]; /****************************************************************************** * Imported variable declaration ******************************************************************************/ extern DHL_DISP_CONFIG g_DispConfig; extern DHL_AUDIO_CONFIG g_AudConfig; /****************************************************************************** * Imported function declaration ******************************************************************************/ /****************************************************************************** * Local definitions / typedefs ******************************************************************************/ #define LOCK_DTV_MUTEX() do { \ if ( OS_TakeMutex(g_dhldtv.AVMutex) != OS_OK ) { \ DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"MUTEX ERROR, LINE=%d\n", __LINE__); \ goto done; \ } \ } while (0) #define UNLOCK_DTV_MUTEX() do { \ if ( OS_GiveMutex(g_dhldtv.AVMutex) != OS_OK ) { \ DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"MUTEX ERROR, LINE=%d\n", __LINE__); \ } \ } while (0) #define bVidReq g_dhldtv.bVideoPlayReq #define bAudReq g_dhldtv.bAudioPlayReq #define bVidInPlay g_dhldtv.bVideoInPlay #define bAudInPlay g_dhldtv.bAudioInPlay /****************************************************************************** * Local variables declaration ******************************************************************************/ static P_DHL_PRG_INFO pPrgInfo = &g_dhldtv.PrgInfo; static DS_U32 UserdataThreadId; // MpegUserData Thread ID static int bUserDataThread_Run = 0; // MpegUserData Thread Run Flag static DS_U8 ccBuf[1024]; // UserData Buffer /****************************************************************************** * Local function prototypes ******************************************************************************/ static DHL_RESULT DHL_DTV_MpegUserdataThreadInit(void); static DHL_RESULT DHL_DTV_MpegUserdataThreadStart(void); static DHL_RESULT DHL_DTV_MpegUserdataThreadStop(void); #if 0 ___COMMON_APIs___() #endif /******************************************************************************** * FUNCTION: * DHL_DTV_INIT * * Purpose: * video/audio components initialize(open->init->connect) * Arguments: * * Returns: * DHL_RESULT success - DHL_OK * fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_Init(void) { DHL_RESULT dhlResult = DHL_OK; g_dhldtv.bVideoPlayReq = _FALSE_; g_dhldtv.bAudioPlayReq = _FALSE_; g_dhldtv.bVideoInPlay = _FALSE_; g_dhldtv.bAudioInPlay = _FALSE_; g_dhldtv.AVMutex = OS_CreateMutex( "DTV_Mutex" ); if ( g_dhldtv.AVMutex == (OS_MUTEX_ID)0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," |error|%d(0x%x)\r\n",__LINE__,dhlResult); dhlResult = DHL_FAIL_CORE_DRIVER; goto done; } dhlResult = DD_DTV_Init(); SysASSERT( dhlResult == DHL_OK ); dhlResult = DHL_DTV_InitCC(); SysASSERT( dhlResult == DHL_OK ); done: SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** * FUNCTION: * DHL_DTV_START * * Purpose: * Video components start * Audio Components start * Arguments: * [in]uVidPID - Video PID * [in]uAudPID - PCR PID * [in]uPcrPID - Video PID * [in]AudStreamType - Audio stream type (MPEG-2,AC-3) * Returns: * DHL_RESULT if success - DHL_OK fail - DHL_FAIL ********************************************************************************/ DHL_RESULT DHL_DTV_StartAV(DS_U16 uVidPID, DS_U16 uAudPID, DS_U16 uPcrPID, DHL_AUD_STREAMTYPE AudStreamType) { DHL_RESULT dhlResult = DHL_OK; int isVideo = 1; int isAudio = 1; if ( uVidPID == 0 ) isVideo = 0; if ( uAudPID == 0 ) isAudio = 0; if ( (!isVideo && !isAudio) || uPcrPID == 0 ) { dhlResult = DHL_FAIL_INVALID_PARAM; goto done; } dhlResult = DHL_DTV_StopVideo(); SysASSERT( dhlResult == DHL_OK ); dhlResult = DHL_DTV_StopAudio(); SysASSERT( dhlResult == DHL_OK ); if ( isAudio ) { dhlResult = DHL_DTV_StartAudio( uAudPID, uPcrPID, AudStreamType, 0 ); SysASSERT( dhlResult == DHL_OK ); } if ( isVideo ) { dhlResult = DHL_DTV_StartVideo( uVidPID, uPcrPID ); SysASSERT( dhlResult == DHL_OK ); } done: SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** *FUNCTION: * DHL_DTV_STOP * *Purpose: * Video components stop * Audio Components stop *Arguments: * *Returns: * DHL_RESULT if success - DHL_OK fail - DHL_FAIL ********************************************************************************/ DHL_RESULT DHL_DTV_StopAV(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DHL_DTV_StopVideo(); SysASSERT( dhlResult == DHL_OK ); dhlResult = DHL_DTV_StopAudio(); SysASSERT( dhlResult == DHL_OK ); SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** * FUNCTION: * DHL_DTV_CLOSE * * Purpose: * video/audio components close (stop->disconncet->close) * * Arguments: * * Returns: * DHL_RESULT if success - DHL_OK fail - DHL_FAIL ********************************************************************************/ DHL_RESULT DHL_DTV_Close(void) { DHL_RESULT dhlResult = DHL_OK; if ( bVidReq == _TRUE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Digital video component is already started.\n"); DHL_DTV_StopVideo(); } if ( bAudReq == _TRUE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Digital audio component is already started.\n"); DHL_DTV_StopAudio(); } dhlResult = DD_DTV_Close(); SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_Pause Purpose: video pause Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_Pause(void) { DHL_RESULT dhlResult = DHL_OK; if ( g_dhldtv.bVideoPlayReq == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," SKIP: Video is not started.\n"); return dhlResult; } if ( g_dhldtv.isAVPaused == 1 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," already paused. SKIP\n"); return dhlResult; } dhlResult = DD_DTV_Pause(); SysASSERT( dhlResult == DHL_OK ); g_dhldtv.isAVPaused = 1; SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_Pause Purpose: video resume Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_Resume(void) { DHL_RESULT dhlResult = DHL_OK; if ( g_dhldtv.bVideoPlayReq == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," SKIP: Video is not started.\n"); return dhlResult; } if ( g_dhldtv.isAVPaused == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," already resumed. SKIP\n"); return dhlResult; } dhlResult = DD_DTV_Resume(); SysASSERT( dhlResult == DHL_OK ); g_dhldtv.isAVPaused = 0; SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_PRESET_CALLBACK Purpose: set callback functions Arguments: [in] pCallBack - callback function's pointer [in] CBType - callback function type (ex) sequence header callback .. [in] ClientCntx - Client Argument 1 Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_PresetCallback( void *pCallBack, DHL_DTV_CBTYPE CBType, DS_U32 ClientCntx) { DHL_RESULT dhlResult = DHL_OK; switch (CBType) { case DHL_CB_VDC_SQH: // Sequence Header Information case DHL_CB_VDC_CCUDP: // CC User Data Parser case DHL_CB_NOTIFY_VSTARTING: case DHL_CB_NOTIFY_VSTOPPING: case DHL_CB_NOTIFY_DISPINITIALIZE: case DHL_CB_VDC_FATAL_ERROR: // Notify VDC FATAL ERROR: case DHL_CB_VDC_DECODE_ERR: // Decode Error Report g_dhldtv.VideoCbFunc[CBType] = pCallBack; g_dhldtv.VideoCbParam[CBType] = ClientCntx; break; default: dhlResult = DHL_FAIL_INVALID_PARAM; break; } SysENSURE( dhlResult == DHL_OK ); return dhlResult; } DHL_RESULT DHL_DTV_DoCallback(DHL_DTV_CBTYPE CBType, void *Arg) { DHL_RESULT dhlResult = DHL_OK; P_DHL_VDC_CALLBACK pCallBack = (P_DHL_VDC_CALLBACK)NULL; DS_U32 ClientCntx = 0; switch (CBType) { case DHL_CB_VDC_SQH: // Sequence Header Information case DHL_CB_VDC_CCUDP: // CC User Data Parser case DHL_CB_NOTIFY_VSTARTING: case DHL_CB_NOTIFY_VSTOPPING: case DHL_CB_NOTIFY_DISPINITIALIZE: case DHL_CB_VDC_FATAL_ERROR: // Notify VDC FATAL ERROR: case DHL_CB_VDC_DECODE_ERR: // Decode Error Report pCallBack = g_dhldtv.VideoCbFunc[CBType]; ClientCntx = g_dhldtv.VideoCbParam[CBType]; break; default: dhlResult = DHL_FAIL_INVALID_PARAM; break; } if ( pCallBack ) { (*pCallBack)(ClientCntx, Arg); } return dhlResult; } /******************************************************************************** FUNCTION: DHL_AUD_IsAvAlive Purpose: Get current Av status Arguments: Returns: *********************************************************************************/ DHL_RESULT DHL_DTV_IsAvAlive(DS_BOOL *bVideo, DS_BOOL *bAudio) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DTV_IsVideoAlive( bVideo, 0 ); SysASSERT( dhlResult == DHL_OK ); dhlResult = DD_DTV_IsAudioAlive( bAudio, 0 ); SysASSERT( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** FUNCTION: DHL_AUD_IsAvAliveExt Purpose: Get current AV stream status Arguments: bVideo - video alive flag bAudio - audio alive flag uUserWaitingTick - waiting tick for Sequence Header Returns: Notes: jfet_2005/01/15 After the check the video buffer, if there is no video data in buffer then check Sequence Header Time Stamp JFET_20050428 CHECK the ADUIO DECODER after check the audio si buffer. *********************************************************************************/ DHL_RESULT DHL_DTV_IsAvAliveExt(DS_BOOL *bVideo, DS_BOOL *bAudio, DS_U32 uVidWaitingTick, DS_U32 uAudWaitingTick) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DTV_IsVideoAlive( bVideo, uVidWaitingTick ); SysASSERT( dhlResult == DHL_OK ); dhlResult = DD_DTV_IsAudioAlive( bAudio, uAudWaitingTick ); SysASSERT( dhlResult == DHL_OK ); return dhlResult; } DS_BOOL DHL_DTV_IsAVStarted(void) { return ( DHL_DTV_IsVideoStarted() || DHL_DTV_IsAudioStarted() ); } void DHL_DTV_SetStillPicture( DS_BOOL bStill ) { } DS_BOOL DHL_DTV_GetStillPicture(void) { return DS_FALSE; } #if 0 ___VIDEO_APIs___() #endif /******************************************************************************** FUNCTION: DHL_DTV_StartVideo Purpose: Only video components start Arguments: [in]uVidPID - Video PID [in]uPcrPID - Video PID Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_StartVideo(DS_U16 uVidPID, DS_U16 uPcrPID) { DHL_RESULT dhlResult = DHL_OK; DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," uVidPID=%d uPcrPID=%d\r\n", uVidPID, uPcrPID); if ( bVidReq == _TRUE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Digital video component is already started.\n"); DHL_DTV_StopVideo(); } if ( uVidPID == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Video PID is 0, stop digital video.\n"); return dhlResult; } LOCK_DTV_MUTEX(); bVidReq = _TRUE_; pPrgInfo->VidPID = uVidPID; pPrgInfo->PCRPID = uPcrPID; // // Play both audio and video. // dhlResult = DD_DTV_VideoStart(pPrgInfo->VidPID, pPrgInfo->PCRPID); if (DHL_ERROR(dhlResult)) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); UNLOCK_DTV_MUTEX(); goto done; } dhlResult = DHL_DTV_MpegUserdataThreadStart(); if(DHL_ERROR(dhlResult)) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); UNLOCK_DTV_MUTEX(); goto done; } UNLOCK_DTV_MUTEX(); SysENSURE( dhlResult == DHL_OK ); return dhlResult; done: UNLOCK_DTV_MUTEX(); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_StartVideo2 Purpose: Only video components start Arguments: [in]uVidPID - Video PID [in]uPcrPID - Video PID [in]uAudPID - Video PID Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_StartVideoEx(DS_U16 uVidPID, DS_U16 uPcrPID,DS_U16 uAudPID) { return DHL_DTV_StartVideo(uVidPID, uPcrPID); } DHL_RESULT DHL_DTV_StartVideoEx2(DS_U16 uVidPID, DS_U16 uPcrPID,DS_U8 Stream_Type) { DHL_RESULT dhlResult = DHL_OK; DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," uVidPID=%d uPcrPID=%d\r\n", uVidPID, uPcrPID); if ( bVidReq == _TRUE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Digital video component is already started.\n"); DHL_DTV_StopVideo(); } if ( uVidPID == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Video PID is 0, stop digital video.\n"); return dhlResult; } LOCK_DTV_MUTEX(); bVidReq = _TRUE_; pPrgInfo->VidPID = uVidPID; pPrgInfo->PCRPID = uPcrPID; // // Play both audio and video. // dhlResult = DD_DTV_VideoStartEx2(pPrgInfo->VidPID, pPrgInfo->PCRPID,Stream_Type); if (DHL_ERROR(dhlResult)) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); UNLOCK_DTV_MUTEX(); goto done; } dhlResult = DHL_DTV_MpegUserdataThreadStart(); if(DHL_ERROR(dhlResult)) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); UNLOCK_DTV_MUTEX(); goto done; } UNLOCK_DTV_MUTEX(); SysENSURE( dhlResult == DHL_OK ); return dhlResult; done: UNLOCK_DTV_MUTEX(); return dhlResult; } DHL_RESULT DHL_DTV_StartVideo2(DS_U16 uVidPID, DS_U16 uPcrPID,DS_U16 uAudPID) { return DHL_DTV_StartVideoEx(uVidPID,uPcrPID,uAudPID); } /******************************************************************************** FUNCTION: DHL_DTV_StopVideo Purpose: Video components stop Audio Components stop Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_StopVideo(void) { DHL_RESULT dhlResult = DHL_OK; if ( bVidReq == _FALSE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," is already stopped.\r\n"); return dhlResult; } LOCK_DTV_MUTEX(); dhlResult = DD_DTV_VideoStop(); SysASSERT( dhlResult == DHL_OK ); bVidReq = _FALSE_; pPrgInfo->VidPID = (DS_U16)-1; dhlResult = DHL_DTV_MpegUserdataThreadStop(); SysASSERT( dhlResult == DHL_OK ); UNLOCK_DTV_MUTEX(); SysENSURE( dhlResult == DHL_OK ); return dhlResult; done: UNLOCK_DTV_MUTEX(); return dhlResult; } DS_BOOL DHL_DTV_IsVideoStarted(void) { return g_dhldtv.bVideoPlayReq; } /******************************************************************************** FUNCTION: DHL_DTV_GetSrcVideoInfo Purpose: Get source video information from sequence header Arguments: Returns: DHL_RESULT Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_GetSrcVideoInfo(P_DHL_DTV_SRCVID_INFO pSrcInfo) { DHL_RESULT dhlResult = DHL_OK; memcpy(pSrcInfo,&g_dhlmpeginfo,sizeof(DHL_DTV_SRCVID_INFO)); return dhlResult; } #if 0 ___AUDIO_APIs___() #endif /******************************************************************************** FUNCTION: DHL_DTV_StartAudio Purpose: Audio Components start Arguments: [in]uAudPID - audio PID [in]AudStreamType - Audio stream type (MPEG-2,AC-3) Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_StartAudio(DS_U16 uAudPID, DS_U16 uPcrPID, DHL_AUD_STREAMTYPE AudStreamType, DS_BOOL bAudOnlyCh) { DHL_RESULT dhlResult = DHL_OK; DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," uAudPID=0x%x uPcrPID=0x%x AudStreamType=0x%x\r\n", uAudPID, uPcrPID, AudStreamType); if ( bAudReq == _TRUE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Digital audio component is already started.\n"); dhlResult = DHL_DTV_StopAudio(); SysASSERT(dhlResult==DHL_OK); } if ( uAudPID == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," INFO: Audio PID is 0, stop digital video.\n"); dhlResult = DHL_DTV_StopAudio(); return dhlResult; } if ( DHL_CAP_GetVideoSrc(0) != DHL_CAP_DTV0_VIDEO && DHL_CAP_GetVideoSrc(1) != DHL_CAP_DTV0_VIDEO ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"ERROR: Both MAIN/SUB is not DTV Mode.\n"); return DHL_FAIL_CONNECTION_FAILS; } LOCK_DTV_MUTEX(); bAudReq = _TRUE_; pPrgInfo->AudPID = uAudPID; pPrgInfo->PCRPID = uPcrPID; pPrgInfo->AudStreamType = AudStreamType; dhlResult = DD_AUD_VolumeFadeInOut_I2S(0); SysASSERT( dhlResult == DHL_OK ); dhlResult = DD_DTV_AudioStart(pPrgInfo->AudPID, pPrgInfo->PCRPID, pPrgInfo->AudStreamType, 0/*bAudOnlyCh*/ ); SysASSERT( dhlResult == DHL_OK ); if (Popup_StartDelay) OS_mDelay( Popup_StartDelay ); dhlResult = DD_AUD_VolumeFadeInOut_I2S(1); SysASSERT( dhlResult == DHL_OK ); UNLOCK_DTV_MUTEX(); SysENSURE( dhlResult == DHL_OK ); return dhlResult; done: UNLOCK_DTV_MUTEX(); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_StopAudio Purpose: Audio Components stop Arguments: Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_DTV_StopAudio(void) { DHL_RESULT dhlResult = DHL_OK; if ( bAudReq == _FALSE_ ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," is already stopped.\r\n"); return dhlResult; } LOCK_DTV_MUTEX(); dhlResult = DD_AUD_VolumeFadeInOut_I2S(0); SysASSERT( dhlResult == DHL_OK ); // // Delay for popup noise before stop. // if (Popup_EndDelay) OS_mDelay(Popup_EndDelay); dhlResult = DD_DTV_AudioStop(); SysASSERT( dhlResult == DHL_OK ); bAudReq = _FALSE_; pPrgInfo->AudPID = 0; // pPrgInfo->PCRPID = uPcrPID; <-- PCRPID´Â Video¿¡¼­µµ »ç¿ëÇϹǷΠInvalidate½ÃŰÁö ¾ÊÀ½. pPrgInfo->AudStreamType = 0; UNLOCK_DTV_MUTEX(); SysENSURE( dhlResult == DHL_OK ); done: //UNLOCK_DTV_MUTEX(); return dhlResult; } DS_BOOL DHL_DTV_IsAudioStarted(void) { return g_dhldtv.bAudioPlayReq; } /******************************************************************************** FUNCTION: DHL_DTV_SetAudioDynamicRange @param dynrngOn=1 to enable Dyanmic Range Control. @return *********************************************************************************/ DHL_RESULT DHL_DTV_SetAudioDynamicRange( DS_BOOL dynrngOn ) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DTV_SetAudioDynamicRange(dynrngOn); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," |success| %s\r\n",dynrngOn == _TRUE_ ? "On":"Off"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_GetAudioDynamicRange Purpose: Arguments: [out] pRangeHi - the scale factor of high signal [out] pRangeLow - the scale factor of low signal. Returns: DHL_RESULT Notes: range 0~255 *********************************************************************************/ DHL_RESULT DHL_DTV_GetAudioDynamicRange( DS_U32* pRangeHi, DS_U32* pRangeLow ) { DHL_RESULT dhlResult = DHL_OK; return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_GetAudioInfoAc3 Purpose: Arguments: [OUT] pAc3Info - ac3 information Returns: Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_GetAudioInfoAc3( P_DHL_DTV_AC3_STATUS pAc3Info ) { DHL_RESULT dhlResult = DHL_OK; if ( DD_DTV_IsAudioStarted() == 0 ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"ERROR, Digital Audio is not started. line=%d\n", __LINE__ ); dhlResult = DHL_FAIL; goto done; } dhlResult = DD_DTV_GetAC3Info( pAc3Info ); done: return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_GetAudioInfoMpeg Purpose: Arguments: [OUT] pMpegInfo - mpeg information Returns: Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_GetAudioInfoMpeg( P_DHL_DTV_MPEG_STATUS pMpegInfo ) { DHL_RESULT dhlResult = DHL_OK; return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_DumpAudioInfoAc3 Purpose: Arguments: Returns: Notes: *********************************************************************************/ void DHL_DTV_DumpAudioInfoAc3( void ) { DHL_RESULT dhlResult = DHL_OK; DHL_DTV_AC3_STATUS Ac3Status; dhlResult = DHL_DTV_GetAudioInfoAc3(&Ac3Status); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"\n\t<< AC3 INFOMATION >> \r\n"); /*...display configuration ______________________________________________________________*/ DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," ____________________________________________________\r\n\n"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Fscod (Sample Rate Code) | %s \r\n",(Ac3Status.Fscod == 0) ? "48kHz": (Ac3Status.Fscod == 1) ? "44.1kHz": (Ac3Status.Fscod == 2) ? "32kHz":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Frmsizecod (FrameSizeCode) | %s \r\n",(Ac3Status.Frmsizecod == 0) ? "Low frequency effects channel is off": (Ac3Status.Frmsizecod == 1) ? "Low frequency effects channel is on":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Acmod (Audio coding mode) | %s \r\n",(Ac3Status.Acmod == 0) ? "Ch1,Ch2": (Ac3Status.Acmod == 1) ? "C": (Ac3Status.Acmod == 2) ? "L,R": (Ac3Status.Acmod == 3) ? "L,C,R": (Ac3Status.Acmod == 4) ? "L,R,S": (Ac3Status.Acmod == 5) ? "L,C,R,S": (Ac3Status.Acmod == 6) ? "L,R,SL,SR": (Ac3Status.Acmod == 7) ? "L,C,R,SL,SR":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Bsid(BitStreamIdentification) | 0x%x \r\n",(int)Ac3Status.Bsid); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Bsmod(Bit Stream Mode) | %s \r\n",(Ac3Status.Bsmod == 0) ? "Main Audio Service:Complete main(CM)": (Ac3Status.Bsmod == 1) ? "Main Audio Service:Music and Effect(ME)": (Ac3Status.Bsmod == 2) ? "Associated Service:Visually impaired(VI)": (Ac3Status.Bsmod == 3) ? "Associated Service:Hearing impaired(HI)": (Ac3Status.Bsmod == 4) ? "Associated Service:Dialoge(D)": (Ac3Status.Bsmod == 5) ? "Associated Service:Commentary(c)": (Ac3Status.Bsmod == 6) ? "Associated Service:Emergency(E)": (Ac3Status.Bsmod == 7) ? "Associated Service:Voice over(VO)":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Cmixlev(Center Mix Lvl) | %s \r\n",(Ac3Status.Cmixlev == 0) ? "0.707(-3.0 dB)": (Ac3Status.Cmixlev == 1) ? "0.595(-4.5 dB)": (Ac3Status.Cmixlev == 2) ? "0.500(-6.0 dB)": (Ac3Status.Cmixlev == 3) ? "reserved":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Surmixlev(SurroundMix Lvl) | %s \r\n",(Ac3Status.Surmixlev == 0) ? "0.707(-3 dB)": (Ac3Status.Surmixlev == 1) ? "0.500(-6 dB)": (Ac3Status.Surmixlev == 2) ? "0.000(0)": (Ac3Status.Surmixlev == 3) ? "reserved":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Dsurmod(DolbySurroundMode) | %s \r\n",(Ac3Status.Dsurmod == 0) ? "not indicated": (Ac3Status.Dsurmod == 1) ? "Not Dolby Surround encoded": (Ac3Status.Dsurmod == 2) ? "Dolby Surround encoded": (Ac3Status.Dsurmod == 3) ? "reserved":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Copyright | %d \r\n",(int)(Ac3Status.Copyright)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Original | %d \r\n",(int)(Ac3Status.Original)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Dialnorm1(Dialogue Normalization) | - %d dB \r\n",(int)(Ac3Status.Dialnorm1)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Dialnorm2(Dialogue Normalization) | - %d dB \r\n",(int)(Ac3Status.Dialnorm2)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Langcod1(Language Code1) | %d \r\n",(int)(Ac3Status.Langcod1)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Langcod2(Language Code2) | %d \r\n",(int)(Ac3Status.Langcod2)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Roomtype1 | %s \r\n",(Ac3Status.Roomtype1 == 0) ? "not indicated": (Ac3Status.Roomtype1 == 1) ? "large room, X curve monitor": (Ac3Status.Roomtype1 == 2) ? "small room, flat monitor": (Ac3Status.Roomtype1 == 3) ? "reserved":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Roomtype2 | %s \r\n",(Ac3Status.Roomtype2 == 0) ? "not indicated": (Ac3Status.Roomtype2 == 1) ? "large room, X curve monitor": (Ac3Status.Roomtype2 == 2) ? "small room, flat monitor": (Ac3Status.Roomtype2 == 3) ? "reserved":"UnKnown"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Mixlevel1 | %d \r\n",(int)(Ac3Status.Mixlevel1)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," - Mixlevel2 | %d \r\n",(int)(Ac3Status.Mixlevel2)); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV," ____________________________________________________\r\n"); } #if 0 ___Subtitle_APIs___() #endif DHL_RESULT DHL_DTV_PresetPESCallback( DHL_DTV_PES_CALLBACK cbFunc ) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_DTV_PresetPESCallback(cbFunc); return dhlResult; } DHL_RESULT DHL_DTV_StartPESFilter(DS_U16 uPESPid) { DHL_RESULT dhlResult = DHL_OK; DS_U32 i = 0; if (uPESPid < 0x10 && uPESPid > 0xFFF0) { dhlResult = DHL_FAIL_INVALID_PARAM; goto done; } for( i = 0 ; i < MAX_PES_FILTER_CNT ; i++ ) { if( g_PESFilter[i].isValid == DS_FALSE ) { dhlResult = DD_DTV_StartPESFilter(uPESPid,&g_PESFilter[i]); if(dhlResult == DHL_OK) { g_PESFilter[i].uPesPid = uPESPid; g_PESFilter[i].isValid = DS_TRUE; } return dhlResult; } } if( i >= MAX_PES_FILTER_CNT ) dhlResult = DHL_FAIL; done: return dhlResult; } DHL_RESULT DHL_DTV_StopPESFilter(DS_U16 uPESPid, DS_BOOL bAll) { DHL_RESULT dhlResult = DHL_OK; DS_U32 i; // ballÀÎ °æ¿ì if(bAll) { for( i = 0 ; i < MAX_PES_FILTER_CNT ; i++ ) { if( g_PESFilter[i].isValid == DS_TRUE ) { dhlResult = DD_DTV_StopPESFilter(g_PESFilter[i].uPesPid); g_PESFilter[i].isValid = DS_FALSE; g_PESFilter[i].uPesPid = 0; g_PESFilter[i].Param = 0; } } } else { for( i = 0 ; i < MAX_PES_FILTER_CNT ; i++ ) { if( ( g_PESFilter[i].uPesPid == uPESPid ) && ( g_PESFilter[i].isValid == DS_TRUE ) ) { dhlResult = DD_DTV_StopPESFilter(uPESPid); g_PESFilter[i].isValid = DS_FALSE; g_PESFilter[i].uPesPid = 0; g_PESFilter[i].Param = 0; break; } } } return dhlResult; } #if 0 ___DTVCC_APIs___() #endif /******************************************************************************** FUNCTION: DHL_DTV_CCInit Purpose: Arguments: Returns: DHL_RESULT Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_InitCC(void) { DHL_RESULT dhlResult = DHL_OK; static int initialized = 0; if ( initialized ) return dhlResult; dhlResult = DHL_DTV_MpegUserdataThreadInit(); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_CCEnable Purpose: Arguments: Returns: DHL_RESULT Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_EnableCC(void) { DHL_RESULT dhlResult = DHL_OK; g_DTVCCEnable = DS_TRUE; //dhlResult = DD_CC_Enable(); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_CCDisable Purpose: Arguments: Returns: DHL_RESULT Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_DisableCC(void) { DHL_RESULT dhlResult = DHL_OK; g_DTVCCEnable = DS_FALSE; //dhlResult = DD_CC_Disable(); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_CCClose Purpose: Arguments: Returns: DHL_RESULT Notes: *********************************************************************************/ DHL_RESULT DHL_DTV_CloseCC(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DHL_DTV_MpegUserdataThreadStop(); return dhlResult; } #if 0 ___Internal_Functions___() #endif static void DHL_DTV_MpegUserDataThread(DS_U32 arg) { while(1) { OS_mDelay(100); if (bUserDataThread_Run==0) continue; /* * MpegUserData Retrieval routines are here. */ ccBuf[0] = '\0'; /* This is just to avoid Warning message. */ } } static DHL_RESULT DHL_DTV_MpegUserdataThreadInit(void) { DHL_RESULT dhlResult = DHL_OK; UserdataThreadId = OS_SpawnTask( DHL_DTV_MpegUserDataThread, "tUserData", 60, 4096, (DS_U32)0); if ( UserdataThreadId == 0 ) { DHL_DbgPrintf( 0, DHLDBG_DTV, "ERROR: Cannot create tUserData!\n"); return DHL_FAIL_OUT_OF_RESOURCE; } bUserDataThread_Run = 0; return dhlResult; } static DHL_RESULT DHL_DTV_MpegUserdataThreadStart(void) { DHL_RESULT dhlResult = DHL_OK; bUserDataThread_Run = 1; return dhlResult; } static DHL_RESULT DHL_DTV_MpegUserdataThreadStop(void) { DHL_RESULT dhlResult = DHL_OK; bUserDataThread_Run = 0; return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_DumpVideoMemMap Purpose: dump video memory map under the running app Arguments: Returns: DHL_RESULT Notes: *********************************************************************************/ void DHL_DTV_DumpVideoMemMap(void) { //DD_VIDEO_DumpVideoMemMap(); } #if 0 ___DEBUG_APIs___() #endif void hav_alive(void) { DS_BOOL bAudio, bVideo; DHL_RESULT dhlResult = DHL_OK; int i; for (i=0; i<10; i++) { bAudio = 0; bVideo = 0; dhlResult = DHL_DTV_IsAvAlive(&bVideo,&bAudio); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf(0,DHLDBG_DTV,"ERROR, LINE=%d\n", __LINE__); return ; } DHL_DbgPrintf(0,DHLDBG_DTV," Audio = %s, Video = %s\n", bAudio ? "Alive" : "Dead", bVideo ? "Alive" : "Dead" ); OS_mDelay(100); } } void hav_scheck(DS_U16 vPid, DS_U16 aPid, int timeOut) { // volatile DS_U32 curTick; DHL_RESULT dhlResult; DS_U32 startTick; if ( timeOut == 0 ) timeOut = 50; DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"Scramble Check\n"); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"vPid = %d(0x%x) aPid = %d(0x%x)\n", vPid, vPid, aPid, aPid); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"timeOut = %d tick\n", timeOut); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|%d| tick=%d\n", __LINE__, (int)(OS_GetTickCount())); startTick = OS_GetTickCount(); dhlResult = DHL_DMX_SetPID4DetectScramble( vPid, aPid ); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"ERROR: DHL_DTV_SetPID4DetectScramble() return 0x%x\n", dhlResult); return; } DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|%d| tick=%d\n", __LINE__, (int)(OS_GetTickCount())); if ( DHL_DMX_IsScrambled() ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"Scrambled!\n"); return; } DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|%d| tick=%d\n", __LINE__, (int)(OS_GetTickCount())); dhlResult = DHL_DMX_ResetPID4DetectScramble(); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"ERROR: DHL_DTV_ResetPID4DetectScramble() return 0x%x\n", dhlResult); return; } DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"|%d| tick=%d\n", __LINE__, (int)(OS_GetTickCount())); DHL_DbgPrintf(gDTVDbgLvl,DHLDBG_DTV,"Not Scrambled!\n"); } void hac3_info(void) { DHL_DTV_AC3_STATUS Ac3; DHL_RESULT dhlResult = DHL_OK; dhlResult = DHL_DTV_GetAudioInfoAc3( &Ac3 ); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf(0,DHLDBG_DTV,"Cannot retrieve AC3 information.\n"); return; } DHL_DbgPrintf(0,DHLDBG_DTV,"*** AC3 Information ***\n"); DHL_DbgPrintf(0,DHLDBG_DTV,"Fscod = %s (%d)\n", Ac3.Fscod == 0 ? "48 kHz" : Ac3.Fscod == 1 ? "44.1 kHz" : Ac3.Fscod == 2 ? "32 kHz" : Ac3.Fscod == 3 ? "Reserved" : "Unknown", (int)Ac3.Fscod); DHL_DbgPrintf(0,DHLDBG_DTV,"Lfeon = %s (%d)\n", Ac3.Lfeon == 0 ? "Off" : Ac3.Lfeon == 1 ? "On" : "Unknown", (int)Ac3.Lfeon ); DHL_DbgPrintf(0,DHLDBG_DTV,"Acmod = %s (%d)\n", Ac3.Acmod == 0 ? "N=2, CH1/CH2" : Ac3.Acmod == 1 ? "N=1, C" : Ac3.Acmod == 2 ? "N=2, L,R" : Ac3.Acmod == 3 ? "N=3, L,C,R" : Ac3.Acmod == 4 ? "N=3, L,R,S" : Ac3.Acmod == 5 ? "N=4, L,C,R,S" : Ac3.Acmod == 6 ? "N=4, L,R,SL,SR" : Ac3.Acmod == 7 ? "N=5, L,C,R,SL,SR" : "Unknown", (int)Ac3.Acmod ); } void hset_edelay(int d) { Popup_EndDelay = d; } void hset_sdelay(int d) { Popup_StartDelay = d; }