/****************************************************************************** *_Copyright (c) 2009 Digital Stream Technology Inc. All Rights Reserved. * * Module: dsthalcap.c * * Description * This file includes platform/vendor specific APIs. * * Notes * * @author Junku Park (hwatk@dstreamtech.com) * @version $Revision: 1.1 $ * ******************************************************************************/ #include "dsthalcommon.h" #include "dstddcap.h" #include "dstdddtv.h" #include "dstdddisp.h" #include "dstddpic.h" #include "dstddsys.h" #ifdef DMALLOC #include #endif /****************************************************************************** * Global variable declaration ******************************************************************************/ DS_U32 gdhlCapDbgLvl = 1; DHL_CAP_CONFIG g_dhlcap; DS_U32 g_SourceChangeTime; int g_SyncLockDelay = 64; /****************************************************************************** * Imported variable declaration ******************************************************************************/ extern DHL_DTV_CONFIG g_dhldtv; extern int Popup_StartDelay; extern int Popup_EndDelay; extern DS_U32 lastAudioTime; extern P_DHL_CARD_CALLBACK g_CardCallback; /****************************************************************************** * Imported function declaration ******************************************************************************/ /****************************************************************************** * Local definitions and typedefs ******************************************************************************/ /****************************************************************************** * Local variables declaration ******************************************************************************/ static DHL_CAP_CBFUNC_t g_CAP_CBFunc; static DHL_CAP_CBFUNC2_t g_CAP_CBFunc2; static int g_VideoFreeze = 0; static int g_VideoFreezePIP = 0; static int g_HPDEnable = 0; static P_DHL_PRG_INFO pPrgInfo = &g_dhldtv.PrgInfo; static int g_SourceChangeDelay = 0; static int g_VGAPhase; static int g_VGAClock; /****************************************************************************** * Local function prototypes ******************************************************************************/ static DHL_RESULT Init_VI_Thread(void); static DHL_RESULT Start_VI_Thread(DS_BOOL bFocus); static DHL_RESULT Stop_VI_Thread(DS_BOOL bFocus); /****************************************************************************** * Function declaration ******************************************************************************/ void DumpVideoInput(void); void DumpAudioInput(void); DS_BOOL DHL_CAP_IsStartedVideo(void); DS_BOOL DHL_CAP_IsStartedVideoPIP(void); #define LOCK_CAP_MUTEX() do { \ if ( OS_TakeMutex(g_dhlcap.uMutex) != OS_OK ) { \ DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"MUTEX ERROR, LINE=%d\n", __LINE__); \ goto done; \ } \ } while (0) #define UNLOCK_CAP_MUTEX() do { \ if ( OS_GiveMutex(g_dhlcap.uMutex) != OS_OK ) { \ DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"MUTEX ERROR, LINE=%d\n", __LINE__); \ } \ } while (0) #if 0 ___Common_APIs___() #endif /******************************************************************************** FUNCTION: DHL_CAP_Init Purpose: video/audio capture components initialize(open->init->connect) Arguments: Returns: DHL_RESULT success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_Init(void) { DHL_RESULT dhlResult = DHL_OK; static int CapInitFlag = 0; if ( CapInitFlag == 1 ) return dhlResult; CapInitFlag = 1; dhlResult = DD_CAP_Init(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); g_dhlcap.uMutex = OS_CreateMutex( "CAP_Mutex" ); if ( g_dhlcap.uMutex == (OS_MUTEX_ID)0 ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP," |error|%d(0x%x)\r\n",__LINE__,dhlResult); dhlResult = DHL_FAIL_CORE_DRIVER; goto done; } #if 0 dhlResult = DHL_CAP_StartAudio(); // DTV¿¡¼­ BOOTING ½Ã CAP Audio°¡ ½ÃÀÛµÇÁö ¾Ê¾Æ¼­ audio°¡ ³ª¿ÀÁö ¾Ê´Â¹®Á¦·Î Ãß°¡µÊ. if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); #endif dhlResult = Init_VI_Thread(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); done: if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_PresetVideoFormat Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_PresetVideoFormat(DHL_VIDEO_FORMAT vf, DS_BOOL Focus) { DHL_RESULT dhlResult = DHL_OK; if ( Focus == DHL_FOCUS_MAIN ) g_dhlcap.CapInMainFmt = vf; else g_dhlcap.CapInSubFmt = vf; return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_PresetVideoInput Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_PresetVideoInput(DHL_CAP_VIDEO_INPUT vi) { DHL_RESULT dhlResult = DHL_OK; g_dhlcap.CapInMainVideoSrc = vi; return dhlResult; } DHL_RESULT DHL_CAP_PresetVideoInputPIP(DHL_CAP_VIDEO_INPUT vi) { DHL_RESULT dhlResult = DHL_OK; g_dhlcap.CapInSubVideoSrc = vi; return dhlResult; } DHL_RESULT DHL_CAP_PresetVideoSource(DHL_CAP_VIDEO_INPUT vi) { return DHL_CAP_PresetVideoInput(vi); } DHL_RESULT DHL_CAP_PresetVideoSourcePIP(DHL_CAP_VIDEO_INPUT vi) { return DHL_CAP_PresetVideoInputPIP(vi); } DHL_RESULT DHL_CAP_PresetCallback(DHL_CAP_CBFUNC_t cbFunc) { DHL_RESULT dhlResult = DHL_OK; g_CAP_CBFunc = cbFunc; return dhlResult; } DHL_RESULT DHL_CAP_PresetCallback2(DHL_CAP_CBFUNC2_t cbFunc) { DHL_RESULT dhlResult = DHL_OK; g_CAP_CBFunc2 = cbFunc; return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_PresetAudioInput Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_PresetAudioInput(DHL_CAP_AUDIO_INPUT ai) { DHL_RESULT dhlResult = DHL_OK; g_dhlcap.CapInAudioSrc = ai; return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_Start Purpose: Arguments: [in] bMain / bSub - specify window to be started or stopped. Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_Start(DS_BOOL bMain, DS_BOOL bSub) { DHL_RESULT dhlResult = DHL_OK; if (bMain) { dhlResult = DHL_CAP_StartVideo(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } if (bSub) { dhlResult = DHL_CAP_StartVideoPIP(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } dhlResult = DHL_CAP_StartAudio(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_Stop Purpose: Arguments: [in] bMain / bSub - specify window to be started or stopped. Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_Stop(DS_BOOL bMain, DS_BOOL bSub) { DHL_RESULT dhlResult = DHL_OK; if (bMain) { dhlResult = DHL_CAP_StopVideo(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } if (bSub) { dhlResult = DHL_CAP_StopVideoPIP(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } dhlResult = DHL_CAP_StopAudio(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_Close Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_Close(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_CAP_Close(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_Pause Purpose: Arguments: [in] Focus - 0 for Main / 1 for Sub Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_Pause(DS_BOOL Focus) { DHL_RESULT dhlResult = DHL_OK; if (Focus == 0/*Main*/ && g_VideoFreeze == 1 ) { printf("|%s:%d| WARNING: This API is called twice.\n", __FUNCTION__, __LINE__); return dhlResult; } if (Focus == 1/*Sub*/ && g_VideoFreezePIP == 1 ) { printf("|%s:%d| WARNING: This API is called twice.\n", __FUNCTION__, __LINE__); return dhlResult; } dhlResult = DD_CAP_VideoPause(Focus); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if (Focus == 0) g_VideoFreeze = 1; else g_VideoFreezePIP = 1; if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_Resume Purpose: Arguments: [in] Focus - 0 for Main / 1 for Sub Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_Resume(DS_BOOL Focus) { DHL_RESULT dhlResult = DHL_OK; if (Focus == 0/*Main*/ && g_VideoFreeze == 0 ) { printf("|%s:%d| WARNING: This API is called twice.\n", __FUNCTION__, __LINE__); return dhlResult; } if (Focus == 1/*Sub*/ && g_VideoFreezePIP == 0 ) { printf("|%s:%d| WARNING: This API is called twice.\n", __FUNCTION__, __LINE__); return dhlResult; } dhlResult = DD_CAP_VideoResume(Focus); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if (Focus == 0) g_VideoFreeze = 0; else g_VideoFreezePIP = 0; if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } #if 0 ___Video_Capture_APIs___() #endif /******************************************************************************** FUNCTION: DHL_CAP_VideoStartEx Purpose: Main, Sub Source¸¦ ÇÔ²² ½ÃÀÛ½ÃŰ´Â ÇÔ¼ö. Arguments: [in] bMain / bSub - specify window to be started or stopped. Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ static DS_U8 PIPTable[11*11] = { // RF CVBS0 SV0 CV1 SV1 YPbPr0 YPbPr1 PC HDMI1 HDMI2 HDMI3 /*RF*/ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, /*CV0*/ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*SV0*/ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*CV1*/ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*SV1*/ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*YPbPr0*/ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*YPbPr1*/ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*PC*/ 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, /*HDMI1*/ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, /*HDMI2*/ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, /*HDMI3*/ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }; static int CheckPIPCombination(DHL_CAP_VIDEO_INPUT MainSrc, DHL_CAP_VIDEO_INPUT SubSrc) { int mainIdx, subIdx; int ret; switch(MainSrc) { case DHL_CAP_DTV0_VIDEO: mainIdx = 0; break; case DHL_CAP_DTV1_VIDEO: return 0; case DHL_CAP_ATV0_VIDEO: mainIdx = 0; break; case DHL_CAP_ATV1_VIDEO: return 0; case DHL_CAP_CVBS0_VIDEO: mainIdx = 1; break; case DHL_CAP_CVBS1_VIDEO: mainIdx = 3; break; case DHL_CAP_CVBS2_VIDEO: return 0; case DHL_CAP_CVBS3_VIDEO: return 0; case DHL_CAP_SVIDEO0_VIDEO: mainIdx = 2; break; case DHL_CAP_SVIDEO1_VIDEO: mainIdx = 4; break; case DHL_CAP_SVIDEO2_VIDEO: return 0; case DHL_CAP_SVIDEO3_VIDEO: return 0; case DHL_CAP_YPBPR0_VIDEO: mainIdx = 5; break; case DHL_CAP_YPBPR1_VIDEO: mainIdx = 6; break; case DHL_CAP_YPBPR2_VIDEO: return 0; case DHL_CAP_YPBPR3_VIDEO: return 0; case DHL_CAP_HDMI0_VIDEO: mainIdx = 8; break; case DHL_CAP_HDMI1_VIDEO: mainIdx = 9; break; case DHL_CAP_HDMI2_VIDEO: mainIdx = 10; break; case DHL_CAP_HDMI3_VIDEO: return 0; case DHL_CAP_VGA0_VIDEO: mainIdx = 7; break; case DHL_CAP_VGA1_VIDEO: return 0; default: return 0; } switch(SubSrc) { case DHL_CAP_DTV0_VIDEO: subIdx = 0; break; case DHL_CAP_DTV1_VIDEO: return 0; case DHL_CAP_ATV0_VIDEO: subIdx = 0; break; case DHL_CAP_ATV1_VIDEO: return 0; case DHL_CAP_CVBS0_VIDEO: subIdx = 1; break; case DHL_CAP_CVBS1_VIDEO: subIdx = 3; break; case DHL_CAP_CVBS2_VIDEO: return 0; case DHL_CAP_CVBS3_VIDEO: return 0; case DHL_CAP_SVIDEO0_VIDEO: subIdx = 2; break; case DHL_CAP_SVIDEO1_VIDEO: subIdx = 4; break; case DHL_CAP_SVIDEO2_VIDEO: return 0; case DHL_CAP_SVIDEO3_VIDEO: return 0; case DHL_CAP_YPBPR0_VIDEO: subIdx = 5; break; case DHL_CAP_YPBPR1_VIDEO: subIdx = 6; break; case DHL_CAP_YPBPR2_VIDEO: return 0; case DHL_CAP_YPBPR3_VIDEO: return 0; case DHL_CAP_HDMI0_VIDEO: subIdx = 8; break; case DHL_CAP_HDMI1_VIDEO: subIdx = 9; break; case DHL_CAP_HDMI2_VIDEO: subIdx = 10; break; case DHL_CAP_HDMI3_VIDEO: return 0; case DHL_CAP_VGA0_VIDEO: subIdx = 7; break; case DHL_CAP_VGA1_VIDEO: return 0; default: return 0; } ret = PIPTable[mainIdx*11 + subIdx]; return ret; } DHL_RESULT DHL_CAP_StartVideoEx(DHL_CAP_VIDEO_INPUT MainSrc, DHL_CAP_VIDEO_INPUT SubSrc, DHL_PIPMode_t PIPMode, DHL_PIP_t pipPos ) { DHL_RESULT dhlResult = DHL_OK; int bAVStart = 0, bMainStart = 0, bSubStart = 0, bMainAspect = 0, bMainMuted = 0; DS_U16 vPid=0, aPid=0, pcrPid=0; int aType=0; DHL_CAP_Init(); // // Argument Check // if ( DHL_PIPMODE_NONE != PIPMode ) { if ( MainSrc > DHL_CAP_VIDEO_NONE || MainSrc < DHL_CAP_DTV_VIDEO_START || SubSrc > DHL_CAP_VIDEO_NONE || SubSrc < DHL_CAP_DTV_VIDEO_START ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( (MainSrc >= DHL_CAP_ATV_VIDEO_START && MainSrc <= DHL_CAP_ATV_VIDEO_STOP) && (SubSrc >= DHL_CAP_ATV_VIDEO_START && SubSrc <= DHL_CAP_ATV_VIDEO_STOP) ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( (MainSrc >= DHL_CAP_CVBS_VIDEO_START && MainSrc <= DHL_CAP_CVBS_VIDEO_STOP) && (SubSrc >= DHL_CAP_CVBS_VIDEO_START && SubSrc <= DHL_CAP_CVBS_VIDEO_STOP) ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( (MainSrc >= DHL_CAP_SVIDEO_VIDEO_START && MainSrc <= DHL_CAP_SVIDEO_VIDEO_STOP) && (SubSrc >= DHL_CAP_SVIDEO_VIDEO_START && SubSrc <= DHL_CAP_SVIDEO_VIDEO_STOP) ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( (MainSrc >= DHL_CAP_YPBPR_VIDEO_START && MainSrc <= DHL_CAP_YPBPR_VIDEO_STOP) && (SubSrc >= DHL_CAP_YPBPR_VIDEO_START && SubSrc <= DHL_CAP_YPBPR_VIDEO_START) ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( (MainSrc >= DHL_CAP_HDMI_VIDEO_START && MainSrc <= DHL_CAP_HDMI_VIDEO_STOP) && (SubSrc >= DHL_CAP_HDMI_VIDEO_START && SubSrc <= DHL_CAP_HDMI_VIDEO_STOP) ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( (MainSrc >= DHL_CAP_VGA_VIDEO_START && MainSrc <= DHL_CAP_VGA_VIDEO_STOP) && (SubSrc >= DHL_CAP_VGA_VIDEO_START && SubSrc <= DHL_CAP_VGA_VIDEO_STOP) ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } if ( SubSrc != DHL_CAP_VIDEO_NONE && PIPMode != DHL_PIPMODE_NONE ) { if ( CheckPIPCombination(MainSrc, SubSrc) == 0 ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Invalid Source MainSrc=%d, SubSrc=%d\n", MainSrc, SubSrc); return DHL_FAIL; } } if ( MainSrc == SubSrc && MainSrc != DHL_CAP_VIDEO_NONE ) { /* Main & SubSrc is same, need to check other arguments. */ DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } } #if 0 // // Workaround: Áö¿øÇÏÁö ¾Ê´Â SubSource Á¦¿Ü. // if ( SubSrc == DHL_CAP_VGA0_VIDEO/* || SubSrc == DHL_CAP_DTV0_VIDEO*/ ) { DHL_DbgPrintf(0,DHLDBG_CAP,"ERROR: Currently SubSrc %d is not supported.\n", SubSrc); if (SubSrc == DHL_CAP_DTV0_VIDEO) { DHL_DbgPrintf(0,DHLDBG_CAP,"INFO: Force Sub mode to NTSC.\n"); SubSrc = DHL_CAP_ATV0_VIDEO; } else return DHL_FAIL_NO_HARDWARE_SUPPORT; } #endif DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|%s| MainSrc=%d, SubSrc=%d, PIPMode=%d, pipPos=%d\n", __FUNCTION__, MainSrc, SubSrc, PIPMode, pipPos ); // // Update next display parameters. // DHL_PIC_UpdateNextParam(); DHL_DbgPrintf(0,DHLDBG_CAP,"|%s| Line=%d\n", __FUNCTION__, __LINE__); { // // Stop main/sub source. // if ( DHL_CAP_GetVideoSrc(0) != MainSrc ) { /* * ÀÌÀü ¼Ò½º ȤÀº ´ÙÀ½ ¼Ò½º°¡ HDMIÀÎ °æ¿ì, g_SourceChangeDelay ÀÌÈÄ¿¡ ¼Ò½º Àüȯ. * => Toshiba / SA-STB / Motorola-STB¿¡¼­ÀÇ HDCP Error ¹®Á¦. */ if ( (DHL_CAP_GetVideoSrc(0) >= DHL_CAP_HDMI0_VIDEO && DHL_CAP_GetVideoSrc(0) <= DHL_CAP_HDMI3_VIDEO) || (MainSrc >= DHL_CAP_HDMI0_VIDEO && MainSrc <= DHL_CAP_HDMI3_VIDEO) ) { if ( g_SourceChangeDelay ) { do { OS_mDelay(10); } while ( (OS_GetTickCount()-g_SourceChangeTime) < g_SourceChangeDelay ); } } // // AV ¸ÕÀú Á¤ÁöµÇ¾î¾ß ÇÔ. // if ( DHL_DTV_IsVideoStarted() ) { vPid = pPrgInfo->VidPID; aPid = pPrgInfo->AudPID; pcrPid = pPrgInfo->PCRPID; aType = pPrgInfo->AudStreamType; DHL_DTV_StopAV(); if ( MainSrc == DHL_CAP_DTV0_VIDEO || SubSrc == DHL_CAP_DTV0_VIDEO ) bAVStart = 1; } dhlResult = DHL_CAP_StopVideo(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); DHL_DbgPrintf(0,DHLDBG_CAP,"|%s| Line=%d\n", __FUNCTION__, __LINE__); // // Main º¯°æ ½Ã, ³ëÀÌÁî°¡ ³²Áö ¾Êµµ·Ï ¹Ì¸® NRÀ» ²¨³õÀÚ. // dhlResult = DD_PIC_SetNR(0); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); bMainStart = 1; DHL_DbgPrintf(0,DHLDBG_CAP,"|%s| Line=%d\n", __FUNCTION__, __LINE__); // // ATV°¡ ¾Æ´Ï¸é ²ôÀÚ. // if ( MainSrc != DHL_CAP_ATV0_VIDEO && MainSrc != DHL_CAP_DTV0_VIDEO ) { dhlResult = DHL_FE_Start( TUNER_FAT, 63000, DEMOD_OFF, FREQ ); } if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); g_SourceChangeTime = OS_GetTickCount(); } DHL_DbgPrintf(0,DHLDBG_CAP,"|%s| Line=%d\n", __FUNCTION__, __LINE__); if ( DHL_CAP_GetVideoSrc(1) != SubSrc || PIPMode == DHL_PIPMODE_NONE ) { if ( PIPMode == DHL_PIPMODE_DW_NORMAL || PIPMode == DHL_PIPMODE_DW_FULL || PIPMode == DHL_PIPMODE_DW_NORMAL_NO_CROP || PIPMode == DHL_PIPMODE_DW_FULL_NO_CROP || g_dhlcap.pipMode == DHL_PIPMODE_DW_NORMAL || g_dhlcap.pipMode == DHL_PIPMODE_DW_FULL || g_dhlcap.pipMode == DHL_PIPMODE_DW_NORMAL_NO_CROP || g_dhlcap.pipMode == DHL_PIPMODE_DW_FULL_NO_CROP ) { if ( !DHL_DISP_IsVideoMuted() ) { DD_DISP_VideoMute(1); bMainMuted = 1; } } dhlResult = DHL_CAP_StopVideoPIP(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); bSubStart = 1; } if (bMainStart) { // // Change Video Source. // dhlResult = DHL_CAP_ChangeVideoSource(MainSrc); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } if (bSubStart) { // // PIPMode°¡ NONEÀÎ °æ¿ì, PIP Source ÀüȯÀÌ ÇÊ¿ä¾øÀ½. // if ( PIPMode != DHL_PIPMODE_NONE ) { dhlResult = DHL_CAP_ChangeVideoSourcePIP(SubSrc); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } } } // // DW°¡ EnableµÈ °æ¿ì, Àû¿ë. // if ( PIPMode == DHL_PIPMODE_DW_NORMAL || PIPMode == DHL_PIPMODE_DW_FULL || PIPMode == DHL_PIPMODE_DW_NORMAL_NO_CROP || PIPMode == DHL_PIPMODE_DW_FULL_NO_CROP || g_dhlcap.pipMode == DHL_PIPMODE_DW_NORMAL || g_dhlcap.pipMode == DHL_PIPMODE_DW_FULL || g_dhlcap.pipMode == DHL_PIPMODE_DW_NORMAL_NO_CROP || g_dhlcap.pipMode == DHL_PIPMODE_DW_FULL_NO_CROP ) { if ( g_dhlcap.pipMode != PIPMode ) bMainAspect = 1; } // // Change Video Parameters. // g_dhlcap.pipPosition = pipPos; g_dhlcap.pipMode = PIPMode; DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|%s| PIP Mode: %s (%d)\n", __FUNCTION__, PIPMode == DHL_PIPMODE_NONE ? "None" : PIPMode == DHL_PIPMODE_PIPSMALL ? "PIP-Small" : PIPMode == DHL_PIPMODE_PIPSMALL_NO_CROP ? "PIP-Small NO CROP" : PIPMode == DHL_PIPMODE_PIPLARGE ? "PIP-Large" : PIPMode == DHL_PIPMODE_PIPLARGE_NO_CROP ? "PIP-Large NO CROP" : PIPMode == DHL_PIPMODE_DW_NORMAL ? "DW-Normal" : PIPMode == DHL_PIPMODE_DW_NORMAL_NO_CROP ? "DW-Normal No Crop" : PIPMode == DHL_PIPMODE_DW_FULL ? "DW-Full" : PIPMode == DHL_PIPMODE_DW_FULL_NO_CROP ? "DW-Full No Crop" : "Unknown", PIPMode); DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|%s| PIP Position: %s (%d)\n", __FUNCTION__, pipPos == DHL_PIP_TOP_LEFT ? "Upper-Left" : pipPos == DHL_PIP_TOP_RIGHT ? "Upper-Right" : pipPos == DHL_PIP_BTM_LEFT ? "Upper-Right" : pipPos == DHL_PIP_BTM_RIGHT ? "Upper-Right" : "Unknown", pipPos ); if ( PIPMode != DHL_PIPMODE_NONE || bSubStart ) { dhlResult = DD_DISP_SetPIPStyle( PIPMode, pipPos ); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } // // Start main/sub source. // { if ( bMainAspect ) dhlResult = DD_DISP_SetAspectRatio( DHL_DISP_GetDispAspect() ); if ( bMainStart ) { dhlResult = DHL_CAP_StartVideo(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); dhlResult = DHL_PIC_SetParams(bMainStart); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } // // Handle noise reduction & deinterlace function here. (hwatk 070724) // switch( MainSrc ) { case DHL_CAP_DTV0_VIDEO: if ( PIPMode != DHL_PIPMODE_NONE ) DHL_PIC_SetNR(0/*OFF*/); break; case DHL_CAP_HDMI0_VIDEO: case DHL_CAP_HDMI1_VIDEO: case DHL_CAP_HDMI2_VIDEO: if ( PIPMode == DHL_PIPMODE_DW_NORMAL || PIPMode == DHL_PIPMODE_DW_FULL || PIPMode == DHL_PIPMODE_DW_NORMAL_NO_CROP || PIPMode == DHL_PIPMODE_DW_FULL_NO_CROP ) DHL_PIC_SetNR(0/*OFF*/); break; case DHL_CAP_YPBPR0_VIDEO: case DHL_CAP_YPBPR1_VIDEO: if ( PIPMode == DHL_PIPMODE_DW_NORMAL || PIPMode == DHL_PIPMODE_DW_FULL || PIPMode == DHL_PIPMODE_DW_NORMAL_NO_CROP || PIPMode == DHL_PIPMODE_DW_FULL_NO_CROP ) DHL_PIC_SetNR(0/*OFF*/); break; case DHL_CAP_VGA0_VIDEO: DHL_PIC_SetNR(1/*ON*/); break; default: break; } if ( bSubStart ) { if ( PIPMode != DHL_PIPMODE_NONE && DHL_CAP_GetVideoSrc(1) != DHL_CAP_VIDEO_NONE ) { dhlResult = DHL_CAP_StartVideoPIP(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); } } DumpVideoInput(); } if ( bAVStart ) { DHL_DbgPrintf(0,DHLDBG_CAP,"|%s| Line=%d\n", __FUNCTION__, __LINE__); dhlResult=DHL_DTV_StartAV(vPid, aPid, pcrPid, aType ); if (dhlResult != DHL_OK) printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); DHL_DbgPrintf(0,DHLDBG_CAP,"|%s| Line=%d\n", __FUNCTION__, __LINE__); } if (bMainMuted) { if ( !DHL_DISP_IsVideoMuted() ) { DD_DISP_VideoMute(0); } } if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_StartVideo DHL_CAP_StopVideo Purpose: Arguments: [in] bMain / bSub - specify window to be started or stopped. Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_StartVideo(void) { DHL_RESULT dhlResult = DHL_OK; DHL_CAP_Init(); if (g_dhlcap.isCapMainVideoStarted == 1) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } if (DHL_CAP_GetVideoSrc(0) < DHL_CAP_DTV_VIDEO_START || DHL_CAP_GetVideoSrc(0) >= DHL_CAP_VIDEO_END) { printf("|%s| Invalid input source: %d\n", __FUNCTION__, DHL_CAP_GetVideoSrc(0)); return DHL_FAIL; } if ( g_dhlcap.isCapSubVideoStarted == 1 ) { if ( CheckPIPCombination( DHL_CAP_GetVideoSrc(0), DHL_CAP_GetVideoSrc(1) ) == 0 ) { printf("|%s| ERROR: Invalid PIP combination, mainSrc=%d, subSrc=%d\n", __FUNCTION__, DHL_CAP_GetVideoSrc(0), DHL_CAP_GetVideoSrc(1)); return DHL_FAIL; } } g_dhlcap.isCapMainVideoStarted = 1; DumpVideoInput(); if ( DHL_DTV_IsAVStarted() ) { DHL_DTV_StopAV(); } dhlResult = DD_CAP_StartVideo(); SysASSERT( dhlResult == DHL_OK ); //dhlResult = DHL_DISP_SetDispParams(); SysASSERT( dhlResult == DHL_OK ); dhlResult = Start_VI_Thread(0); SysASSERT( dhlResult == DHL_OK ); if ( (DHL_CAP_GetVideoSrc(0) >= DHL_CAP_ATV_VIDEO_START) && (DHL_CAP_GetVideoSrc(0) < DHL_CAP_HDMI_VIDEO_START)) { dhlResult = DHL_CAP_CC_Start(); SysASSERT( dhlResult == DHL_OK ); } SysENSURE( dhlResult == DHL_OK ); return dhlResult; } DHL_RESULT DHL_CAP_StopVideo(void) { DHL_RESULT dhlResult = DHL_OK; DHL_CAP_Init(); if (g_dhlcap.isCapMainVideoStarted == 0) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } g_dhlcap.isCapMainVideoStarted = 0; g_dhlcap.CapInMainVideoSrc = DHL_CAP_VIDEO_NONE; dhlResult = DHL_CAP_CC_Stop(); SysASSERT( dhlResult == DHL_OK ); dhlResult = DD_CAP_StopVideo(); SysASSERT( dhlResult == DHL_OK ); dhlResult = Stop_VI_Thread(0); SysASSERT( dhlResult == DHL_OK ); SysENSURE( dhlResult == DHL_OK ); return dhlResult; } DHL_RESULT DHL_CAP_StopVideoEx(void) { DHL_RESULT dhlResult = DHL_OK; DHL_CAP_Init(); dhlResult = DHL_CAP_StopVideo(); SysASSERT( dhlResult == DHL_OK ); dhlResult = DHL_CAP_StopVideoPIP(); SysASSERT( dhlResult == DHL_OK ); SysENSURE( dhlResult == DHL_OK ); return dhlResult; } DHL_RESULT DHL_CAP_StartVideoPIP(void) { DHL_RESULT dhlResult = DHL_OK; DHL_CAP_Init(); if (g_dhlcap.isCapSubVideoStarted == 1) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } if (DHL_CAP_GetVideoSrc(1) < DHL_CAP_DTV_VIDEO_START || DHL_CAP_GetVideoSrc(1) >= DHL_CAP_VIDEO_END) { printf("|%s| Invalid input source: %d\n", __FUNCTION__, DHL_CAP_GetVideoSrc(1)); return DHL_FAIL; } if ( g_dhlcap.isCapMainVideoStarted == 1 ) { if ( CheckPIPCombination( DHL_CAP_GetVideoSrc(0), DHL_CAP_GetVideoSrc(1) ) == 0 ) { printf("|%s| ERROR: Invalid PIP combination, mainSrc=%d, subSrc=%d\n", __FUNCTION__, DHL_CAP_GetVideoSrc(0), DHL_CAP_GetVideoSrc(1)); return DHL_FAIL; } } g_dhlcap.isCapSubVideoStarted = 1; DHL_PIC_UpdateNextParam(); DumpVideoInput(); DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|%s| AspectRatio = %s (%d)\n", __FUNCTION__, DHL_DISP_GetDispAspect() == DHL_DISP_ASPECT_1_1 ? "1:1" : DHL_DISP_GetDispAspect() == DHL_DISP_ASPECT_4_3 ? "4:3 Normal" : DHL_DISP_GetDispAspect() == DHL_DISP_ASPECT_16_9 ? "16:9 Normal" : DHL_DISP_GetDispAspect() == DHL_DISP_ASPECT_ZOOM1 ? "ZOOM1" : DHL_DISP_GetDispAspect() == DHL_DISP_ASPECT_ZOOM2 ? "ZOOM2" : DHL_DISP_GetDispAspect() == DHL_DISP_ASPECT_PANO ? "Panorama" : DHL_DISP_GetDispAspect() == DHL_DISP_EPG ? "EPG" : "Unknown", DHL_DISP_GetDispAspect()); dhlResult = DD_CAP_StartVideoPIP(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); dhlResult = Start_VI_Thread(1); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } DHL_RESULT DHL_CAP_StopVideoPIP(void) { DHL_RESULT dhlResult = DHL_OK; DHL_CAP_Init(); if ( g_dhlcap.isCapSubVideoStarted == 0 ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } g_dhlcap.isCapSubVideoStarted = 0; g_dhlcap.CapInSubVideoSrc = DHL_CAP_VIDEO_NONE; dhlResult = DD_CAP_StopVideoPIP(); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); dhlResult = Stop_VI_Thread(1); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_ChangeVideoFormat Purpose: change input video format (480i,480p,720p,1080i) Arguments: [in] Focus - 0 for Main / 1 for Sub Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_ChangeVideoFormat(DHL_VIDEO_FORMAT UserVideoFormat, DS_BOOL Update, DS_BOOL Focus) { DHL_RESULT dhlResult = DHL_OK; return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_ChangeVideoSource Purpose: change input video source Arguments: [in] Focus - 0 for Main / 1 for Sub Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_ChangeVideoSource(DHL_CAP_VIDEO_INPUT VideoInputSrc) { DHL_RESULT dhlResult = DHL_OK; //dhlResult = DD_CAP_SetInputVidSource(VideoInputSrc,_FALSE_); if ( g_dhlcap.CapInMainVideoSrc == VideoInputSrc ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } if ( g_dhlcap.isCapSubVideoStarted == 1 ) { if ( CheckPIPCombination( VideoInputSrc, DHL_CAP_GetVideoSrc(1) ) == 0 ) { printf("|%s| ERROR: Invalid PIP combination, mainSrc=%d, subSrc=%d\n", __FUNCTION__, VideoInputSrc, DHL_CAP_GetVideoSrc(1)); return DHL_FAIL; } } if ( DHL_CAP_IsStartedVideo() ) { dhlResult = DHL_CAP_StopVideo(); if ( dhlResult != DHL_OK ) return dhlResult; g_dhlcap.CapInMainVideoSrc = VideoInputSrc; dhlResult = DHL_CAP_StartVideo(); if ( dhlResult != DHL_OK ) return dhlResult; } else g_dhlcap.CapInMainVideoSrc = VideoInputSrc; DumpVideoInput(); return dhlResult; } DHL_RESULT DHL_CAP_ChangeVideoSourcePIP(DHL_CAP_VIDEO_INPUT VideoInputSrc) { DHL_RESULT dhlResult = DHL_OK; //dhlResult = DD_CAP_SetInputVidSource(VideoInputSrc,_FALSE_); if ( g_dhlcap.CapInSubVideoSrc == VideoInputSrc ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } if ( g_dhlcap.isCapMainVideoStarted == 1 ) { if ( CheckPIPCombination( DHL_CAP_GetVideoSrc(0), VideoInputSrc ) == 0 ) { printf("|%s| ERROR: Invalid PIP combination, mainSrc=%d, subSrc=%d\n", __FUNCTION__, DHL_CAP_GetVideoSrc(0), VideoInputSrc); return DHL_FAIL; } } if ( DHL_CAP_IsStartedVideoPIP() ) { dhlResult = DHL_CAP_StopVideoPIP(); if ( dhlResult != DHL_OK ) return dhlResult; g_dhlcap.CapInSubVideoSrc = VideoInputSrc; dhlResult = DHL_CAP_StartVideoPIP(); if ( dhlResult != DHL_OK ) return dhlResult; } else g_dhlcap.CapInSubVideoSrc = VideoInputSrc; DumpVideoInput(); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_SetBackgroundColour Purpose: Arguments: [in] Focus - 0 for Main / 1 for Sub Returns: DHL_RESULT Notes: *********************************************************************************/ DHL_RESULT DHL_CAP_SetBackgroundColour( P_DHL_RGB_TRIPLET pRgb, P_DHL_RECT pRect, DS_BOOL Focus ) { DHL_RESULT dhlResult = DHL_OK; //dhlResult = DD_CAP_SetBackgroundColour(pRgb,pRect); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_VideoMute Purpose: Video overlay start/stop Arguments: [in] uMute - video mute on(_TRUE_)/off(_FALSE_) [in] Focus - 0 for Main / 1 for Sub Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_MuteVideo(DS_BOOL bMute, DS_BOOL Focus) { DHL_RESULT dhlResult = DHL_OK; if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|success|\r\n"); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_GetVideoInputFmt Purpose: Arguments: Returns: DHL_VIDEO_FORMAT *********************************************************************************/ DHL_VIDEO_FORMAT DHL_CAP_GetVideoInputFmt(DS_BOOL Focus) { if (Focus == DHL_FOCUS_MAIN) return g_dhlcap.CapInMainFmt; else return g_dhlcap.CapInSubFmt; } DHL_CAP_VIDEO_INPUT DHL_CAP_GetVideoSrc(DS_BOOL Focus) { if (Focus == DHL_FOCUS_MAIN) return g_dhlcap.CapInMainVideoSrc; else return g_dhlcap.CapInSubVideoSrc; } DS_BOOL DHL_CAP_IsStartedVideo(void) { return g_dhlcap.isCapMainVideoStarted; } DS_BOOL DHL_CAP_IsStartedVideoPIP(void) { return g_dhlcap.isCapSubVideoStarted; } /******************************************************************************** FUNCTION: DHL_CAP_IsVideoSrcSD Purpose: Arguments: Returns: *********************************************************************************/ DS_BOOL DHL_CAP_IsVideoSrcSD(void) { DHL_VIDEO_FORMAT CurVidFmt = (DHL_VIDEO_FORMAT)0; //CurVidFmt = DD_CAP_GetCurrentVidFmt(); CurVidFmt = CurVidFmt; if(CurVidFmt == DHL_VIDEO_720p || CurVidFmt == DHL_VIDEO_1080i) return _FALSE_; else return _TRUE_; } DS_BOOL DHL_CAP_IsCVBSInput(DHL_CAP_VIDEO_INPUT vi) { #if 0 switch(vi) { case DHL_CAP_CVBS0_VIDEO: case DHL_CAP_SVIDEO0_VIDEO: return DHL_SYS_GetGPIO( GPIO_AV1_DET ) == 1; case DHL_CAP_CVBS1_VIDEO: case DHL_CAP_SVIDEO1_VIDEO: return DHL_SYS_GetGPIO( GPIO_AV2_DET ) == 1; default: return 1; } #endif /* In default, CVBS */ return 1; } DHL_RESULT DHL_CAP_IsHDMIInput(DS_BOOL *bHDMI) { return DD_CAP_IsHDMIMode(bHDMI); } DHL_RESULT DHL_CAP_GetVideoTiming(DS_BOOL bFocus, DS_U16 *phRes, DS_U16 *pvRes, DS_U16 *pRefreshRate, DS_BOOL *pbInterlaced) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_CAP_GetVideoTiming(bFocus, phRes, pvRes, pRefreshRate, pbInterlaced); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_SetPIPMode Purpose: Arguments: [in] bPIPMode [in] bPOPMode Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_SetPIPMode( DHL_PIPMode_t PipMode , DHL_PIP_t pipPos ) { DHL_RESULT dhlResult = DHL_OK; g_dhlcap.pipMode = PipMode; g_dhlcap.pipPosition = pipPos; // // Lower driver function shall be called here. // dhlResult = DD_DISP_SetPIPStyle( PipMode, pipPos ); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); return dhlResult; } /******************************************************************************** FUNCTION: DHL_DTV_SetPIPPosition Purpose: Arguments: [in] popPos [in] pipPos Returns: DHL_RESULT if success - DHL_OK fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_SetPIPPosition( DHL_PIP_t pipPos ) { DHL_RESULT dhlResult = DHL_OK; g_dhlcap.pipPosition = pipPos; // // Lower driver function shall be called here. // dhlResult = DD_DISP_SetPIPLocation( pipPos ); if(DHL_ERROR(dhlResult)) DHL_DbgPrintf(0,DHLDBG_CAP,"|error|%d(0x%x)\r\n",__LINE__,dhlResult); return dhlResult; } void DHL_CAP_SetSyncLock(int En) { DD_CAP_SetSyncLock(En); } void DHL_CAP_SetSyncLockEnable(int En) { g_dhlcap.SyncLockEnable = En; DD_CAP_SetSyncLockEnable(En); } int DHL_CAP_GetSyncLockEnable(void) { return g_dhlcap.SyncLockEnable; } void DHL_CAP_ClearSyncLockOnMute(int En) { g_dhlcap.SyncLockOnMute = En; DD_CAP_ClearSyncLockOnMute(En); } DS_U16 DHL_CAP_GetSignalNoise(void) { return DD_CAP_GetSignalNoise(); } void DHL_CAP_SetAdaptiveNR(void) { DD_CAP_SetAdaptiveNR(); } void DHL_CAP_GetHDMIFmt(DS_U32 *phActive, DS_U32 *phTotal, DS_U32 *pvActive, DS_U32 *pvTotal) { DD_CAP_GetHDMIFmt(phActive, phTotal, pvActive, pvTotal); } void DHL_CAP_GetRGBFmt(DS_U16 *pwHR, DS_U16 *pwVR, DS_U16 *pwHW, DS_U16 *pwVW, DS_U16 *pwPol) { DD_CAP_GetRGBFmt(pwHR, pwVR, pwHW, pwVW, pwPol); } // // DHL_CAP_SetHPDEnable() // HPD¸¦ »ç¿ëÇÒ Áö ¿©ºÎ¸¦ ¼±ÅÃÇÏ´Â ÇÔ¼ö. // HDMI-TX°¡ ¿¬°áµÇÁö ¾Ê¾ÒÀ¸¸é, HDMI-RXµµ ¿¬°áµÇÁö ¾Êµµ·Ï Çϱâ À§ÇÔ. // void DHL_CAP_SetHPDEnable(int En) { g_HPDEnable = En; DD_SYS_SetGPIODefault( GPIO_HDMI_HPD ); } int DHL_CAP_GetHPDEnable(void) { return g_HPDEnable; } DHL_RESULT DHL_CAP_GetSrcVideoInfo(P_DHL_DTV_SRCVID_INFO pSrcInfo) { DHL_RESULT dhlResult = DHL_OK; return dhlResult; } #if 0 ___Audio_Capture_APIs___() #endif DHL_RESULT DHL_CAP_StartAudio(void) { DHL_RESULT dhlResult = DHL_OK; if ( DHL_CAP_IsStartedAudio() == 1 ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } if ( DHL_DTV_IsAVStarted() == _TRUE_ ) DHL_DTV_StopAudio(); dhlResult = DHL_AUD_VolumeFadeInOut_I2S(0); SysASSERT( dhlResult == DHL_OK ); dhlResult = DD_CAP_StartAudio(); SysASSERT( dhlResult == DHL_OK ); OS_mDelay( Popup_StartDelay ); dhlResult = DHL_AUD_VolumeFadeInOut_I2S(1); SysASSERT( dhlResult == DHL_OK ); DumpAudioInput(); g_dhlcap.isCapAudioStarted = 1; SysENSURE( dhlResult == DHL_OK ); return dhlResult; } DHL_RESULT DHL_CAP_StopAudio(void) { DHL_RESULT dhlResult = DHL_OK; if ( DHL_CAP_IsStartedAudio() == 0 ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"skipped.\n"); return dhlResult; } dhlResult = DHL_AUD_VolumeFadeInOut_I2S(0); SysASSERT( dhlResult == DHL_OK ); OS_mDelay(Popup_EndDelay); dhlResult = DD_CAP_StopAudio(); SysASSERT( dhlResult == DHL_OK ); g_dhlcap.isCapAudioStarted = 0; SysENSURE( dhlResult == DHL_OK ); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_ChangeAudioFs Purpose: change input audio sampling frequency (22.05, 24.00, 44.10, 48.00, 96.00 KHz) Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_ChangeAudioFs(DHL_SAMPLING_RATE UserFs, DS_BOOL Update) { DHL_RESULT dhlResult = DHL_OK; g_dhlcap.CapFs = UserFs; return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_ChangeAudioSource Purpose: change input audio source (UOC3 or External) Arguments: Returns: DHL_RESULT success - DHL_OK , fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_ChangeAudioInput(DHL_CAP_AUDIO_INPUT AudioInputSrc) { DHL_RESULT dhlResult = DHL_OK; if ( DHL_CAP_IsStartedAudio() ) { dhlResult = DHL_CAP_StopAudio(); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"ERROR, LINE=%d\n", __LINE__); goto done; } g_dhlcap.CapInAudioSrc = AudioInputSrc; dhlResult = DHL_CAP_StartAudio(); if ( dhlResult != DHL_OK ) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"ERROR, LINE=%d\n", __LINE__); goto done; } } else { g_dhlcap.CapInAudioSrc = AudioInputSrc; // dhlResult = DHL_CAP_StartAudio(); // if ( dhlResult != DHL_OK ) { // DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"ERROR, LINE=%d\n", __LINE__); // goto done; // } } DumpAudioInput(); done: return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_GetAudioSrc Purpose: capture audio source's source location - HDMI,YPbPR,UOC..? Arguments: Returns: DHL_CAP_AUDIO_INPUT *********************************************************************************/ DHL_CAP_AUDIO_INPUT DHL_CAP_GetAudioSrc(void) { return g_dhlcap.CapInAudioSrc; } /******************************************************************************** FUNCTION: DHL_CAP_IsStartedAudio Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DS_BOOL DHL_CAP_IsStartedAudio(void) { return (g_dhlcap.isCapAudioStarted == 1); } /******************************************************************************** FUNCTION: DHL_CAP_SetAudioDelay Purpose: Arguments: [IN] offset - delay time (ms) Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL *********************************************************************************/ DHL_RESULT DHL_CAP_SetAudioDelay(DS_U32 offset) { DHL_RESULT dhlResult = DHL_OK; // JFET20040812 // To Do - calculate delay time for audio si buffer offset // tempopary value offset = offset * 128; g_dhlcap.iAudDelay = offset; if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP," |success| set audio delay offset (%d) \r\n",offset/128); return dhlResult; } /******************************************************************************** FUNCTION: DHL_CAP_AudioRestart Purpose: Arguments: Returns: DHL_RESULT success - DHL_OK, fail - DHL_FAIL Note: JFET_20050312 | ADD Log - FADO using the separated mute control between I2S0 and SPDIF - This function not used ATI API(ATI not support yet this feature) - So I used the 'I2So_Stop' substitute for ths 'I2SO_Mute' for mute I2So. - But it has some problems. - This API is just workaround for solve the capture audio problem *********************************************************************************/ DHL_RESULT DHL_CAP_RestartAudio(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult |= DHL_CAP_StopAudio(); //capture audio stop dhlResult |= DHL_CAP_StartAudio(); //capture audio start dhlResult |= DHL_CAP_SetAudioDelay(46); //audio delay 10ms if(!DHL_ERROR(dhlResult)) DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP," |success| capture audio components restarted\r\n"); return dhlResult; } DHL_RESULT DHL_CAP_SetAudioInFrequency(int audInFreq) { return DD_CAP_SetAudioInFrequency(audInFreq); } int DHL_CAP_GetAudioInFrequency(void) { return 0; } #if 0 ___Video_Input_Thread___ () #endif #define VI_THREAD_DELAY 50 #define VI_THREAD_PRIORITY 150 #define VI_THREAD_STACKSIZE 32768 static DS_BOOL bThreadActive = _FALSE_; static DS_BOOL bThreadActiveReq = _FALSE_; static DS_U32 viThreadId = (DS_U32)0; DHL_CAP_VideoTiming_t PrevVideoTiming, PrevVideoTimingPIP; static void DHL_CAP_MonitorThread(DS_U32 arg) { DHL_CAP_VIDEO_INPUT vi; DS_BOOL bInterlaced; DS_U16 hRes, vRes, RefreshRate; DHL_RESULT dhlResult = DHL_OK; DHL_DTV_SRCVID_INFO info; DHL_CAP_SRCASPECTRATIO Aspect = 0; static DHL_DEV_CARD_STATUS l_status = 0; DHL_DEV_CARD_STATUS c_status = 0; extern void AudioLipSync(void); extern char tdHDMISourceAspect(void); extern unsigned char HDMI_RX_Get_Aspect(void); while(1) { if (bThreadActiveReq == _FALSE_) { DHL_DEV_GetCARDStatus(&c_status); if(c_status != l_status) { if(g_CardCallback) { g_CardCallback(c_status); l_status = c_status; } } OS_mDelay(VI_THREAD_DELAY); bThreadActive = _FALSE_; continue; } bThreadActive = _TRUE_; DHL_DEV_GetCARDStatus(&c_status); if(c_status != l_status) { if(g_CardCallback) { g_CardCallback(c_status); l_status = c_status; } } if ( DHL_CAP_IsStartedVideo() && DD_CAP_IsInputSrcValid(0) ) { vi = DHL_CAP_GetVideoSrc(0); dhlResult = DHL_CAP_GetVideoTiming( 0/*Main*/, &hRes, &vRes, &RefreshRate, &bInterlaced ); if (dhlResult != DHL_OK) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); continue; } /* * Retrieve source aspect ratio. * DTV is from sequence header, HDMI is from AVI frame. */ Aspect = 0; if ( DHL_IsVideoSourceDTV(vi) ) { DHL_DTV_GetSrcVideoInfo(&info); Aspect = (DHL_CAP_SRCASPECTRATIO)info.AspectRatio; } else if ( DHL_IsVideoSourceHDMI(vi) ) { DHL_CAP_GetSrcVideoInfo(&info); Aspect = (DHL_CAP_SRCASPECTRATIO)info.AspectRatio; } if ( vi != PrevVideoTiming.vi || PrevVideoTiming.hRes != hRes || PrevVideoTiming.vRes != vRes || PrevVideoTiming.bInterlaced != bInterlaced || PrevVideoTiming.RefreshRate != RefreshRate || PrevVideoTiming.Aspect != Aspect) { // // Workaround: Source Àüȯ Á÷ÈÄ 3ÃÊ µ¿¾È È­¸éÀ» º¸ÀÌÁö ¸»ÀÚ. // if ( (hRes && hRes != (DS_U16)-1) && (vRes && vRes != (DS_U16)-1) && (vi == DHL_CAP_YPBPR0_VIDEO || vi == DHL_CAP_YPBPR1_VIDEO) ) { if ( (OS_GetTickCount() - g_SourceChangeTime) < 300 ) { continue; } } if ( vi == DHL_CAP_DTV0_VIDEO && DHL_DTV_IsVideoStarted() ) { if ( (hRes && hRes != (DS_U16)-1) && (vRes && vRes != (DS_U16)-1) ) { if (DHL_CAP_IsStartedVideoPIP()) DHL_PIC_SetNR(0/*OFF*/); else DHL_PIC_SetNR(DHL_PIC_GetNR()); if ( !DHL_DMX_IsScrambleCheckStarted() ) { SysCHECK( DHL_DTV_DoCallback( DHL_CB_NOTIFY_VSTARTING, 0 ) == DHL_OK ); } } else { // // 720p -> 1080i µîÀ¸·Î ÇØ»óµµ º¯°æ ½Ã, ÀÌÀü ÇØ»óµµÀÇ È­¸éÀÌ ³²¾ÆÀÖ´Â ¹®Á¦. // DHL_PIC_SetNR(0/*OFF*/); } } switch(vi) { case DHL_CAP_ATV0_VIDEO: if (!DHL_DISP_IsVideoMuted()) DD_DISP_VideoMute(0); break; case DHL_CAP_DTV0_VIDEO: case DHL_CAP_YPBPR0_VIDEO: case DHL_CAP_YPBPR1_VIDEO: case DHL_CAP_HDMI0_VIDEO: case DHL_CAP_HDMI1_VIDEO: case DHL_CAP_HDMI2_VIDEO: DHL_PIC_SetAutoMovieMode(DHL_PIC_GetAutoMovieMode()); if ( vRes != (DS_U16)-1 && vRes >= 720 ) { /* 720p or higher */ if (DHL_CAP_IsStartedVideoPIP()) DHL_PIC_SetNR(0/*OFF*/); } else { DHL_PIC_SetNR(DHL_PIC_GetNR()/*OFF*/); } break; default: break; } DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|tCapMonitor| %s, VideoInput:%s(%d), (%d x %d %c @ %d Hz)\n", "Main", vi == DHL_CAP_DTV0_VIDEO ? "DTV0" : vi == DHL_CAP_DTV1_VIDEO ? "DTV1" : vi == DHL_CAP_ATV0_VIDEO ? "ATV0" : vi == DHL_CAP_ATV1_VIDEO ? "ATV1" : vi == DHL_CAP_CVBS0_VIDEO ? "CVBS0" : vi == DHL_CAP_CVBS1_VIDEO ? "CVBS1" : vi == DHL_CAP_CVBS2_VIDEO ? "CVBS2" : vi == DHL_CAP_CVBS3_VIDEO ? "CVBS3" : vi == DHL_CAP_SVIDEO0_VIDEO ? "SVIDEO0" : vi == DHL_CAP_SVIDEO1_VIDEO ? "SVIDEO1" : vi == DHL_CAP_SVIDEO2_VIDEO ? "SVIDEO2" : vi == DHL_CAP_SVIDEO3_VIDEO ? "SVIDEO3" : vi == DHL_CAP_VGA0_VIDEO ? "VGA0" : vi == DHL_CAP_VGA1_VIDEO ? "VGA1" : vi == DHL_CAP_YPBPR0_VIDEO ? "YPBPR0" : vi == DHL_CAP_YPBPR1_VIDEO ? "YPBPR1" : vi == DHL_CAP_YPBPR2_VIDEO ? "YPBPR2" : vi == DHL_CAP_YPBPR3_VIDEO ? "YPBPR3" : vi == DHL_CAP_HDMI0_VIDEO ? "HDMI0" : vi == DHL_CAP_HDMI2_VIDEO ? "HDMI2" : vi == DHL_CAP_HDMI3_VIDEO ? "HDMI3" : "Unknown", vi, hRes, vRes, bInterlaced ? 'i' : 'p', RefreshRate); if ( DHL_CAP_VGA0_VIDEO == vi ) { if ( vRes == 0 || vRes == (DS_U16)-1 ) { DD_CAP_InvalidateVGACapData(); } } // Call cbFunc. if (g_CAP_CBFunc && DD_CAP_IsInputSrcValid(0)) { g_CAP_CBFunc( 0, vi, hRes, vRes, RefreshRate, bInterlaced ); } if (g_CAP_CBFunc2 && DD_CAP_IsInputSrcValid(0)) { g_CAP_CBFunc2( 0, vi, hRes, vRes, RefreshRate, bInterlaced ,Aspect); } switch(vi) { case DHL_CAP_ATV0_VIDEO: case DHL_CAP_CVBS0_VIDEO: case DHL_CAP_CVBS1_VIDEO: case DHL_CAP_SVIDEO0_VIDEO: case DHL_CAP_SVIDEO1_VIDEO: case DHL_CAP_YPBPR0_VIDEO: DD_CAP_ResetVBI(0); //fieldMotion = DD_CAP_GetFieldMotion(); //frameMotion = DD_CAP_GetFrameMotion(); //printf("fieldMotion=%d, frameMotion=%d\n", fieldMotion, frameMotion); break; default: break; } } PrevVideoTiming.vi = vi; PrevVideoTiming.hRes = hRes; PrevVideoTiming.vRes = vRes; PrevVideoTiming.RefreshRate = RefreshRate; PrevVideoTiming.bInterlaced = bInterlaced; PrevVideoTiming.Aspect = Aspect; } /* if ( DHL_CAP_IsStartedVideo() && DD_CAP_IsInputSrcValid(0) ) */ if ( DHL_CAP_IsStartedVideoPIP() && DD_CAP_IsInputSrcValid(1) ) { vi = DHL_CAP_GetVideoSrc(1); dhlResult = DHL_CAP_GetVideoTiming( 1/*Sub*/, &hRes, &vRes, &RefreshRate, &bInterlaced ); if (dhlResult != DHL_OK) { printf("|%s| ERROR, LINE=%d\n", __FUNCTION__, __LINE__); continue; } /* * Retrieve source aspect ratio. * DTV is from sequence header, HDMI is from AVI frame. */ Aspect = 0; if ( DHL_IsVideoSourceDTV(vi) ) { DHL_DTV_GetSrcVideoInfo(&info); Aspect = (DHL_CAP_SRCASPECTRATIO)info.AspectRatio; } else if ( DHL_IsVideoSourceHDMI(vi) ) { DHL_CAP_GetSrcVideoInfo(&info); Aspect = (DHL_CAP_SRCASPECTRATIO)info.AspectRatio; } if ( vi != PrevVideoTimingPIP.vi || PrevVideoTimingPIP.hRes != hRes || PrevVideoTimingPIP.vRes != vRes || PrevVideoTimingPIP.bInterlaced != bInterlaced || PrevVideoTimingPIP.RefreshRate != RefreshRate || PrevVideoTimingPIP.Aspect != Aspect) { if ( vi == DHL_CAP_DTV0_VIDEO && DHL_DTV_IsVideoStarted() ) { if ( (hRes && hRes != (DS_U16)-1) && (vRes && vRes != (DS_U16)-1) ) { if ( !DHL_DMX_IsScrambleCheckStarted() ) { SysCHECK( DHL_DTV_DoCallback( DHL_CB_NOTIFY_VSTARTING, 0 ) == DHL_OK ); } } } if ( vi == DHL_CAP_ATV0_VIDEO ) { if (!DHL_DISP_IsVideoMutedPIP()) DD_DISP_VideoMutePIP(0); } // Call cbFunc. if (g_CAP_CBFunc && DD_CAP_IsInputSrcValid(1)) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"|tCapMonitor| %s, VideoInput:%s(%d), (%d x %d %c @ %d Hz)\n", "Sub", vi == DHL_CAP_DTV0_VIDEO ? "DTV0" : vi == DHL_CAP_DTV1_VIDEO ? "DTV1" : vi == DHL_CAP_ATV0_VIDEO ? "ATV0" : vi == DHL_CAP_ATV1_VIDEO ? "ATV1" : vi == DHL_CAP_CVBS0_VIDEO ? "CVBS0" : vi == DHL_CAP_CVBS1_VIDEO ? "CVBS1" : vi == DHL_CAP_CVBS2_VIDEO ? "CVBS2" : vi == DHL_CAP_CVBS3_VIDEO ? "CVBS3" : vi == DHL_CAP_SVIDEO0_VIDEO ? "SVIDEO0" : vi == DHL_CAP_SVIDEO1_VIDEO ? "SVIDEO1" : vi == DHL_CAP_SVIDEO2_VIDEO ? "SVIDEO2" : vi == DHL_CAP_SVIDEO3_VIDEO ? "SVIDEO3" : vi == DHL_CAP_VGA0_VIDEO ? "VGA0" : vi == DHL_CAP_VGA1_VIDEO ? "VGA1" : vi == DHL_CAP_YPBPR0_VIDEO ? "YPBPR0" : vi == DHL_CAP_YPBPR1_VIDEO ? "YPBPR1" : vi == DHL_CAP_YPBPR2_VIDEO ? "YPBPR2" : vi == DHL_CAP_YPBPR3_VIDEO ? "YPBPR3" : vi == DHL_CAP_HDMI0_VIDEO ? "HDMI0" : vi == DHL_CAP_HDMI1_VIDEO ? "HDMI1" : vi == DHL_CAP_HDMI2_VIDEO ? "HDMI2" : vi == DHL_CAP_HDMI3_VIDEO ? "HDMI3" : "Unknown", vi, hRes, vRes, bInterlaced ? 'i' : 'p', RefreshRate); // Call cbFunc. if (g_CAP_CBFunc && DD_CAP_IsInputSrcValid(1)) g_CAP_CBFunc( 1, vi, hRes, vRes, RefreshRate, bInterlaced ); if (g_CAP_CBFunc2 && DD_CAP_IsInputSrcValid(1)) g_CAP_CBFunc2( 1, vi, hRes, vRes, RefreshRate, bInterlaced ,Aspect); } if ( DHL_CAP_VGA0_VIDEO == vi ) { if ( vRes == 0 || vRes == (DS_U16)-1 ) { DD_CAP_InvalidateVGACapData(); } } if ( DHL_CAP_GetVideoSrc(1) == DHL_CAP_VGA0_VIDEO ) DHL_CAP_SetVGADefault(); switch(vi) { case DHL_CAP_ATV0_VIDEO: case DHL_CAP_CVBS0_VIDEO: case DHL_CAP_CVBS1_VIDEO: case DHL_CAP_SVIDEO0_VIDEO: case DHL_CAP_SVIDEO1_VIDEO: DD_CAP_ResetVBI(1); //fieldMotion = DD_CAP_GetFieldMotion(); //frameMotion = DD_CAP_GetFrameMotion(); //printf("fieldMotion=%d, frameMotion=%d\n", fieldMotion, frameMotion); break; default: break; } } /* ( vi != PrevVideoTimingPIP.vi || PrevVideoTimingPIP.hRes != hRes || PrevVideoTimingPIP.vRes != vRes || ... */ PrevVideoTimingPIP.vi = vi; PrevVideoTimingPIP.hRes = hRes; PrevVideoTimingPIP.vRes = vRes; PrevVideoTimingPIP.RefreshRate = RefreshRate; PrevVideoTimingPIP.bInterlaced = bInterlaced; PrevVideoTimingPIP.Aspect = Aspect; } /* ( DHL_CAP_IsStartedVideoPIP() && DD_CAP_IsInputSrcValid(1) ) */ OS_mDelay(VI_THREAD_DELAY); } } static DHL_RESULT Init_VI_Thread(void) { DHL_RESULT dhlResult = DHL_OK; LOCK_CAP_MUTEX(); bThreadActive = _FALSE_; bThreadActiveReq = _FALSE_; viThreadId = OS_SpawnTask( DHL_CAP_MonitorThread, "tVIMonitor", 0, 4096, (DS_U32)0); if ( !viThreadId ) { printf("ERROR: Cannot create function tvVIMonitor.\n"); dhlResult = DHL_FAIL_OUT_OF_RESOURCE; } UNLOCK_CAP_MUTEX(); done: return dhlResult; } static DHL_RESULT Start_VI_Thread(DS_BOOL bFocus) { DHL_RESULT dhlResult = DHL_OK; volatile DS_U32 timeout; LOCK_CAP_MUTEX(); if ( bThreadActiveReq && bThreadActive ) { UNLOCK_CAP_MUTEX(); goto done; } bThreadActiveReq = _TRUE_; UNLOCK_CAP_MUTEX(); timeout = OS_GetTickCount()+50; do { if ( bThreadActive == _TRUE_ ) break; OS_mDelay(VI_THREAD_DELAY); } while(timeout>OS_GetTickCount()); if ( bThreadActive != _TRUE_ && timeout>OS_GetTickCount() ) dhlResult = DHL_FAIL; done: return dhlResult; } static DHL_RESULT Stop_VI_Thread(DS_BOOL bFocus) { DHL_RESULT dhlResult = DHL_OK; volatile DS_U32 timeout; LOCK_CAP_MUTEX(); if ( !bThreadActiveReq && !bThreadActive ) { UNLOCK_CAP_MUTEX(); goto done; } // // MAIN/PIP Áß Çϳª¶óµµ ½ÃÀ۵Ǿî ÀÖÀ¸¸é, Á¤ÁöÇÏÁö ¾Ê´Â´Ù. // if ( DHL_CAP_IsStartedVideo() || DHL_CAP_IsStartedVideoPIP() ) { UNLOCK_CAP_MUTEX(); goto done; } bThreadActiveReq = _FALSE_; UNLOCK_CAP_MUTEX(); timeout = OS_GetTickCount()+50; do { if ( bThreadActive == _FALSE_ ) break; OS_mDelay(VI_THREAD_DELAY); } while(timeout>OS_GetTickCount()); if ( bThreadActive != _FALSE_ && timeout>OS_GetTickCount() ) dhlResult = DHL_FAIL; done: if ( !bFocus ) memset( &PrevVideoTiming, 0, sizeof(DHL_CAP_VideoTiming_t) ); else memset( &PrevVideoTimingPIP, 0, sizeof(DHL_CAP_VideoTiming_t) ); return dhlResult; } #if 0 ___VGA_Functions___() #endif ////////////////////////////////////////////////////////////////////////////////////// // VGA Functions // // Default: ÇöÀç ModeÀÇ ±âº» Á¤ÀǰªÀ¸·Î ¼³Á¤ÇÔ. Ãʱ⠼¼ÆÃ ½Ã¿¡ È£ÃâµÇ¾î¾ß ÇÔ. // Phase: 0 - 100 (Default:50) // Clock: 0 - 100 (Default:50) // HSize: 0 - 100 (Default:50) // HPosition: 0 - 100 (Default:50) // VSize: 0 - 100 (Default:50) // VPosition: 0 - 100 (Default:50) // // AutoAdjustment: TBD. Cancel °¡´ÉÇÑ API¸¦ ÀÛ¼ºÇؾßÇÔ. ÇöÀç Blocking ÇÔ¼öÀÓ. // ////////////////////////////////////////////////////////////////////////////////////// DHL_RESULT DHL_CAP_SetVGADefault(void) { DHL_RESULT dhlResult = DHL_OK; dhlResult = DD_CAP_SetVGADefault(); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAPhase(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; if (Param<0 || Param>100) { printf("|%s| ERROR: Invalid range: %d\n", __FUNCTION__, Param); return DHL_FAIL_INVALID_PARAM; } // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); g_VGAPhase = Param; dhlResult = DD_CAP_SetVGAPhase(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAClock(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; if (Param<0 || Param>0x3FF) { printf("|%s| ERROR: Invalid range: %d\n", __FUNCTION__, Param); return DHL_FAIL_INVALID_PARAM; } // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); g_VGAClock = Param; dhlResult = DD_CAP_SetVGAClock(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAHSize(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; if (Param<0 || Param>100) { printf("|%s| ERROR: Invalid range: %d\n", __FUNCTION__, Param); return DHL_FAIL_INVALID_PARAM; } // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); dhlResult = DD_CAP_SetVGAHSize(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAHPosition(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; if (Param<0 || Param>100) { printf("|%s| ERROR: Invalid range: %d\n", __FUNCTION__, Param); return DHL_FAIL_INVALID_PARAM; } // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); dhlResult = DD_CAP_SetVGAHPosition(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAVSize(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; if (Param<0 || Param>100) { printf("|%s| ERROR: Invalid range: %d\n", __FUNCTION__, Param); return DHL_FAIL_INVALID_PARAM; } // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); dhlResult = DD_CAP_SetVGAVSize(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAVPosition(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; if (Param<0 || Param>100) { printf("|%s| ERROR: Invalid range: %d\n", __FUNCTION__, Param); return DHL_FAIL_INVALID_PARAM; } // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); dhlResult = DD_CAP_SetVGAVPosition(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGAAutoAdjustment(int Param) { DHL_RESULT dhlResult = DHL_OK; #if 0 static DS_U32 lastChangeTick = 0; extern void tvSetAutoAdjustmentCompleted(void); DHL_CAP_VIDEO_INPUT vi; static int bMuted = 0; // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); vi = DHL_CAP_GetVideoSrc(0); if ( vi == DHL_CAP_VGA0_VIDEO && DHL_DISP_IsVideoMuted() ) { DD_DISP_VideoMute(0); bMuted = 1; } tvSetAutoAdjustmentCompleted(); dhlResult = DD_CAP_SetVGAAutoAdjustment(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); vi = DHL_CAP_GetVideoSrc(0); if ( bMuted && DHL_DISP_IsVideoMuted() ) DD_DISP_VideoMute(1); #endif return dhlResult; } DHL_RESULT DHL_CAP_SetVGAAutoPhase(int Param) { DHL_RESULT dhlResult = DHL_OK; static DS_U32 lastChangeTick = 0; // // 50 mSec À̳»¿¡ Á¶Á¤Çϸé, ±â´Ù¸². // while ( (OS_GetTickCount() - lastChangeTick) < 5 ) OS_mDelay(10); lastChangeTick = OS_GetTickCount(); dhlResult = DD_CAP_SetVGAAutoPhase(Param); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_GetVGAPhase(int *pParam) { DHL_RESULT dhlResult = DHL_OK; if ( pParam == (int *)0 ) { printf("|%s| ERROR: NULL Parameter.\n", __FUNCTION__); return DHL_FAIL_NULL_POINTER; } dhlResult = DD_CAP_GetVGAPhase(&g_VGAPhase); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); *pParam = g_VGAPhase; return dhlResult; } DHL_RESULT DHL_CAP_GetVGAClock(int *pParam) { DHL_RESULT dhlResult = DHL_OK; if ( pParam == (int *)0 ) { printf("|%s| ERROR: NULL Parameter.\n", __FUNCTION__); return DHL_FAIL_NULL_POINTER; } dhlResult = DD_CAP_GetVGAClock(&g_VGAClock); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); *pParam = g_VGAClock; return dhlResult; } DHL_RESULT DHL_CAP_GetVGAHSize(int *pParam) { DHL_RESULT dhlResult = DHL_OK; if ( pParam == (int *)0 ) { printf("|%s| ERROR: NULL Parameter.\n", __FUNCTION__); return DHL_FAIL_NULL_POINTER; } dhlResult = DD_CAP_GetVGAHSize(pParam); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_GetVGAHPosition(int *pParam) { DHL_RESULT dhlResult = DHL_OK; if ( pParam == (int *)0 ) { printf("|%s| ERROR: NULL Parameter.\n", __FUNCTION__); return DHL_FAIL_NULL_POINTER; } dhlResult = DD_CAP_GetVGAHPosition(pParam); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_GetVGAVSize(int *pParam) { DHL_RESULT dhlResult = DHL_OK; if ( pParam == (int *)0 ) { printf("|%s| ERROR: NULL Parameter.\n", __FUNCTION__); return DHL_FAIL_NULL_POINTER; } dhlResult = DD_CAP_GetVGAVSize(pParam); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_GetVGAVPosition(int *pParam) { DHL_RESULT dhlResult = DHL_OK; if ( pParam == (int *)0 ) { printf("|%s| ERROR: NULL Parameter.\n", __FUNCTION__); return DHL_FAIL_NULL_POINTER; } dhlResult = DD_CAP_GetVGAVPosition(pParam); if ( dhlResult != DHL_OK ) printf("|%s| failure. (ERR=%d)\n", __FUNCTION__, dhlResult); return dhlResult; } DHL_RESULT DHL_CAP_SetVGACapture(VGA_CAPTURE_t *vc) { return DD_CAP_SetVGACapture(vc); } DHL_RESULT DHL_CAP_GetVGACapture(VGA_CAPTURE_t *vc) { return DD_CAP_GetVGACapture(vc); } DHL_RESULT DHL_CAP_DoVGAAutoColor(VGA_ADC_t *va) { return DD_CAP_DoVGAAutoColor(va); } DHL_RESULT DHL_CAP_SetVGAAutoColor(VGA_ADC_t *va) { return DD_CAP_SetVGAAutoColor(va); } // // Backward Compatability APIs // #if 0 ___Backward_Compatabilities___ () #endif DHL_RESULT DHL_CAP_ChangeAudioSource(DHL_CAP_AUDIO_INPUT AudioInputSrc) { return DHL_CAP_ChangeAudioInput(AudioInputSrc); } DHL_RESULT DHL_CAP_PresetVC(DHL_VIDEO_FORMAT vf, DS_BOOL Focus) { return DHL_CAP_PresetVideoFormat(vf, Focus); } // // Test Routines // #if 0 ___Test_Routines_____________________________ () #endif #define DHL_CAP_ASSERT(x) do { if (!(x)) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"ERROR, LINE=%d\n", __LINE__); } } while(0) void TestAudioCapture(int audIn) { static int cap_init = 0; DHL_RESULT dhlResult = DHL_OK; DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"audIn = %d\n", audIn); if ( cap_init == 0 ) { dhlResult = DHL_CAP_PresetAudioInput( DHL_CAP_ATV0_AUDIO ); DHL_CAP_ASSERT( dhlResult == DHL_OK ); DHL_CAP_Init(); cap_init=1; } dhlResult = DHL_CAP_Stop(1, 1); DHL_CAP_ASSERT( dhlResult == DHL_OK ); dhlResult = DHL_CAP_ChangeAudioInput( (DHL_CAP_AUDIO_INPUT)audIn ); DHL_CAP_ASSERT( dhlResult == DHL_OK ); DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP," Audio Input: %s\n", audIn == DHL_CAP_DTV0_AUDIO ? "DTV0" : audIn == DHL_CAP_DTV1_AUDIO ? "DTV1" : audIn == DHL_CAP_ATV0_AUDIO ? "ATV0" : audIn == DHL_CAP_ATV1_AUDIO ? "ATV1" : audIn == DHL_CAP_CVBS0_AUDIO ? "CVBS0" : audIn == DHL_CAP_CVBS1_AUDIO ? "CVBS1" : audIn == DHL_CAP_CVBS2_AUDIO ? "CVBS2" : audIn == DHL_CAP_CVBS3_AUDIO ? "CVBS3" : audIn == DHL_CAP_SVIDEO0_AUDIO ? "SVIDEO0" : audIn == DHL_CAP_SVIDEO1_AUDIO ? "SVIDEO1" : audIn == DHL_CAP_SVIDEO2_AUDIO ? "SVIDEO2" : audIn == DHL_CAP_SVIDEO3_AUDIO ? "SVIDEO3" : audIn == DHL_CAP_YPBPR0_AUDIO ? "YPBPR0" : audIn == DHL_CAP_YPBPR1_AUDIO ? "YPBPR1" : audIn == DHL_CAP_YPBPR2_AUDIO ? "YPBPR2" : audIn == DHL_CAP_YPBPR3_AUDIO ? "YPBPR3" : audIn == DHL_CAP_HDMI0_AUDIO ? "HDMI0" : audIn == DHL_CAP_HDMI1_AUDIO ? "HDMI1" : audIn == DHL_CAP_HDMI2_AUDIO ? "HDMI2" : audIn == DHL_CAP_HDMI3_AUDIO ? "HDMI3" : "Unknown" ); dhlResult = DHL_CAP_Start(1, 1); DHL_CAP_ASSERT( dhlResult == DHL_OK ); } void test_popup(int i1, int i2, int n) { int i; if (n<=0) { DHL_DbgPrintf(gdhlCapDbgLvl,DHLDBG_CAP,"usage: test_popup [i1] [i2] [n]\n"); return; } for (i=0; i %d\n", g_SyncLockDelay, delay); g_SyncLockDelay = delay; } void set_source_change_delay(int delay) { printf("Source Change Delay: %d -> %d\n", g_SourceChangeDelay, delay); g_SourceChangeDelay = delay; } void TestVGAParam(int arg) { int dwValue; int i; for (i=0; i<=100; i++) { switch(arg) { case 1: printf("Test PHASE\n"); DHL_CAP_SetVGAPhase( i ); DHL_CAP_GetVGAPhase( &dwValue ); break; case 2: printf("TEST Clock\n"); DHL_CAP_SetVGAClock( i ); DHL_CAP_GetVGAClock( &dwValue ); break; case 3: printf("TEST HSize\n"); DHL_CAP_SetVGAHSize( i ); DHL_CAP_GetVGAHSize( &dwValue ); break; case 4: printf("TEST HPosition\n"); DHL_CAP_SetVGAHPosition( i ); DHL_CAP_GetVGAHPosition( &dwValue ); break; case 5: printf("TEST VSIZE\n"); DHL_CAP_SetVGAVSize( i ); DHL_CAP_GetVGAVSize( &dwValue ); break; case 6: printf("TEST VPOSITION\n"); DHL_CAP_SetVGAVPosition( i ); DHL_CAP_GetVGAVPosition( &dwValue ); break; } if ( i != dwValue ) { printf("|%s| Value is different; expected=%d, read=%d\n", __FUNCTION__, i, dwValue); break; } } if ( i==101 ) printf("Passed.\n"); } void PrintVGAParam(void) { int phase, clock, hsize, hpos, vsize, vpos; phase = clock = hsize = hpos = vsize = vpos = -1; DHL_CAP_GetVGAPhase( &phase ); DHL_CAP_GetVGAClock( &clock ); DHL_CAP_GetVGAHSize( &hsize ); DHL_CAP_GetVGAHPosition( &hpos ); DHL_CAP_GetVGAVSize( &vsize ); DHL_CAP_GetVGAVPosition( &vpos ); printf(" *** VGA Parameters ***\n"); printf("Phase: %d\n", phase); printf("Clock: %d\n", clock); printf("H-Size: %d\n", hsize); printf("H-Position: %d\n", hpos); printf("V-Size: %d\n", vsize); printf("V-Position: %d\n", vpos); } void testVGAparam(int test, int from, int to, int delay) { int i; if (!from && !to) { usage: printf("Usage: %s [Test#] [From] [To] [Delay]\n", __FUNCTION__); printf(" 0: Phase\n"); printf(" 1: Clock\n"); printf(" 2: HSize\n"); printf(" 3: HPos \n"); printf(" 4: VSize\n"); printf(" 5: VPos \n"); return; } switch( test ) { case 0: printf("Phase Test from %d to %d\n", from, to); for(i=from; i<=to; i++) { DHL_CAP_SetVGAPhase( i ); if ( delay ) OS_mDelay(delay); } break; case 1: printf("Clock Test from %d to %d\n", from, to); for(i=from; i<=to; i++) { DHL_CAP_SetVGAClock( i ); if ( delay ) OS_mDelay(delay); } break; case 2: printf("HSize Test from %d to %d\n", from, to); for(i=from; i<=to; i++) { DHL_CAP_SetVGAHSize( i ); if ( delay ) OS_mDelay(delay); } break; case 3: printf("H-Position Test from %d to %d\n", from, to); for(i=from; i<=to; i++) { DHL_CAP_SetVGAHPosition( i ); if ( delay ) OS_mDelay(delay); } break; case 4: printf("VSize Test from %d to %d\n", from, to); for(i=from; i<=to; i++) { DHL_CAP_SetVGAVSize( i ); if ( delay ) OS_mDelay(delay); } break; case 5: printf("V-Position Test from %d to %d\n", from, to); for(i=from; i<=to; i++) { DHL_CAP_SetVGAVPosition( i ); if ( delay ) OS_mDelay(delay); } break; default: goto usage; } } void get_vga_capture(void) { VGA_CAPTURE_t vc; DHL_CAP_GetVGACapture(&vc); printf("CAP > x=%d y=%d w=%d h=%d\n", vc.wX, vc.wY, vc.wWidth, vc.wHeight); printf("DISP> x=%d y=%d w=%d h=%d\n", vc.wDispX, vc.wDispY, vc.wDispWidth, vc.wDispHeight); printf("KEY > x=%d y=%d w=%d h=%d\n", vc.wDispKX, vc.wDispKY, vc.wDispKWidth, vc.wDispKHeight); } void set_vga_capture(int x, int y, int w, int h, int dx, int dy, int dw, int dh, int kx, int ky, int kw, int kh) { VGA_CAPTURE_t vc; if ( !x || !y || !w || !h ) { printf("usage: %s x y w h\n", __FUNCTION__); return; } vc.wX = x; vc.wY = y; vc.wWidth = w; vc.wHeight = h; vc.wDispX = dx; vc.wDispY = dy; vc.wDispWidth = dw; vc.wDispHeight = dh; vc.wDispKX = kx; vc.wDispKY = ky; vc.wDispKWidth = kw; vc.wDispKHeight = kh; printf("CAP > x=%d y=%d w=%d h=%d\n", vc.wX, vc.wY, vc.wWidth, vc.wHeight); printf("DISP> x=%d y=%d w=%d h=%d\n", vc.wDispX, vc.wDispY, vc.wDispWidth, vc.wDispHeight); printf("KEY > x=%d y=%d w=%d h=%d\n", vc.wDispKX, vc.wDispKY, vc.wDispKWidth, vc.wDispKHeight); DHL_CAP_SetVGACapture(&vc); } void do_adc(void) { VGA_ADC_t va; DHL_CAP_DoVGAAutoColor(&va); printf("Offset> R:0x%02X G:0x%02X B:0x%02X\n", va.Off_R, va.Off_G, va.Off_B); printf("Gain > R:0x%02X G:0x%02X B:0x%02X\n", va.Gain_R, va.Gain_G, va.Gain_B); } void set_adc(int oR, int oG, int oB, int gR, int gG, int gB) { VGA_ADC_t va; va.Off_R = oR; va.Off_G = oG; va.Off_B = oB; va.Gain_R = gR; va.Gain_G = gG; va.Gain_B = gB; printf("Offset> R:0x%02X G:0x%02X B:0x%02X\n", va.Off_R, va.Off_G, va.Off_B); printf("Gain > R:0x%02X G:0x%02X B:0x%02X\n", va.Gain_R, va.Gain_G, va.Gain_B); DHL_CAP_SetVGAAutoColor(&va); }