/******************************************************************** * * Dmw_ChannelTask.c * * Channel decoding task, video and channel command * * Copyright 2002-2004 Digital STREAM Technology, Inc. * All Rights Reserved * * Dmw_ChannelTask.c, v 1.0 2003/11/27 cafrii * *******************************************************************/ #include "DMW_Platform.h" #include "DHL_SYS.h" #include "DHL_AVCAP.h" #include "DHL_DBG.h" //#include "DHL_DEV.h" //#include #define SETRECT(rect, xx, yy, ww, hh) { \ (rect)->x = (xx); \ (rect)->y = (yy); \ (rect)->w = (ww); \ (rect)->h = (hh); \ } #define outOfOSResourcesError DHL_FAIL_OUT_OF_RESOURCE #include "DMW_Config.h" #include "DMW_DebugUtil.h" #include "DMW_Status.h" #define __DEFINE_DMC_STRING_FN__ // ÀÌ ¼Ò½º ÆÄÀÏ¿¡¼­¸¸ DMW_Channel.h¸¦ Æ÷ÇÔÇϱâ Àü¿¡ ÀÌ macro¸¦ ¼±¾ðÇÏ¸é µÈ´Ù. // Middleware #include "DMW_Channel.h" #include "dmw_channel_priv.h" #include "DMW_ChannelDemux.h" #include "DMW_ChannelUtil.h" //#include "dmw_nvram_priv.h" // nvram init ÀÛ¾÷ ¶§¹®¿¡ Æ÷ÇÔ. DHL_MODULE("$dmc", 1); #if COMMENT ________Config________(){} #endif //=========================================================================== // // Configuration parameters // // °¢Á¾ ¿É¼Ç ±â´ÉÀÇ On/Off ¼³Á¤, ÄÄÆÄÀÏ·¯ ¿É¼Ç ¼³Á¤, // µå¶óÀ̹ö °ü·Ã ȯ°æ ¼³Á¤ µî.. // // // cafrii 070830 add // // Freeze, Hide ¿Í °°ÀÌ Tuning°ú Á÷Á¢ÀûÀÎ °ü·ÃÀÌ ¾ø´Â ETC ÇÔ¼öµéÀ» // DMC task·Î defer ½ÃÄѼ­ µ¿ÀÛ½Ãų °ÍÀÎÁö ¼³Á¤. // // 1ÀÌ¸é ¸ðµç ÀÛ¾÷À» DMC task·Î À̰üÇØ¼­ µ¿ÀÛÀ» Çϸç (ÀÌÀü ¹æ½Ä) // 0ÀÌ¸é ±×³É ÀÓÀÇ task¿¡¼­ ¹Ù·Î HAL ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. // // ¾ÕÀ¸·Î´Â DMC task¿¡ synchronize ½ÃŰÁö ¾Ê°í ¹Ù·Î HAL ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ÇÑ´Ù. // // #define SUPPORT_ETC_API_SYNC 0 // // Config Param: [0 ~ ] ´ÜÀ§: millisecond // // °¢Á¾ Timeout limit °ª. ´ÜÀ§´Â ms. // int g_Timeout_SignalLock = 1900; // µðÁöÅÐ ½ÅÈ£ Lock timeout. int g_Timeout_AnalogSignalLock = 200; // ¾Æ³¯·Î±× Lock timeout. cafrii 041208, 500 -> 200 int g_Timeout_VctLoading = 6000; int g_Timeout_PatLoading = 6000; int g_Timeout_PmtLoading = 6000; // // Config MACRO: priority´Â ±ÇÀå°ª ±×´ë·Î. stack size´Â ÃæºÐÇϰÔ. // // DMC task¸¦ »ý¼ºÇÒ¶§ »ç¿ëµÇ´Â °ª // // Priority´Â Cougar classic exampleÀÇ VideoControlTaskÀÇ °ª°ú // µ¿ÀÏÇÏ°Ô »ç¿ëÇÏ´Â°Ô ÁÁ´Ù. stack size´Â °¡²û¾¿ task info¸¦ °Ë»çÇØ¼­ // marginÀÌ ºÎÁ·ÇÏ¸é ´Ã·ÁÁÖµµ·Ï ÇÏÀÚ. // // @todo zooyouny 100629 DHL¿¡ DMC_TASK °ª°ú µ¿ÀÏÇÏ°Ô ÇÏ¿´À½ // ¼ýÀÚ °ª ´ë½Å signiture »ó¼ö »ç¿ëÇÒ °Í.. #define DMC_TASK_PRIORITY TASK_PRI_DMC_TASK #define DMC_TASK_STACKSIZE 32768 // // Config MACRO: // // DMC Event Queue Å©±â // // Event QueÅ©±â °ªÀ¸·Î ºÎÁ·ÇÏÁö ¾Ê°Ô ÃæºÐÈ÷ Àâµµ·Ï ÇÏÀÚ.. // #define MAX_DECODE_MESSAGES 50 #if COMMENT ________State________(){} #endif //=========================================================================== // // DMC State Variables // //----------------------------------------------------------- // DMC Task ¹× communication °ü·Ã // // task, event, sema4 // DHL_OS_TASK_ID dmc_TaskID; // ÀÌ DMC ŽºÅ©¿¡¼­ ½ÇÁ¦ÀûÀÎ video start/stop µî ¸ðµç°ÍÀ» ó¸®ÇÑ´Ù. //----------------------------------------------------------- tDHL_TSD *dmc_tsd; // ÀÌ ¸ðµâ ³»¿¡¼­ globalÇÏ°Ô »ç¿ëÇϰí ÀÖ´Â TSD. // //----------------------------------------------------------- static BOOLEAN dmc_bInitCM; // TRUEÀÌ¸é ºñµð¿À ŽºÅ© °ü·Ã ¸®¼Ò½º°¡ ÃʱâÈ­µÇ¾úÀ½. UINT32 dmc_tickStarted; // cafrii 060720 add BOOL dmc_bTestNoAux; // cafrii 060728 add for test //----------------------------------------------------------- #define ErrorString DMW_CDB_ErrString // TLÀÇ DHL_RESULT¸¦ Æ÷ÇÔÇÏ¿© DMWÀÇ STATUS±îÁö ¿¡·¯¸¦ ¹®ÀÚ¿­·Î º¯È¯ÇÏ´Â ÇÔ¼ö ġȯ. // DMW_CDB_ErrStringÀº TLÀÇ error »ó¼ö°ª±îÁö ¸ðµÎ string 󸮸¦ ÇÒ ¼ö ÀÖ´Ù. #if COMMENT ________Config________(){} #endif // AudioChange ÇÒ¶§ »ç¿ëµÇ´Â command parameter block typedef struct { UINT32 audioPID; UINT32 pcrPID; UINT32 audioType; } CmdParam_ChangeAudio; // ChangeDislay¿¡¼­ »ç¿ëµÇ´Â command parameter block typedef struct { VOUT_COLOR color; VOUT_FORMAT format; VOUT_RATIO ratio; tDHL_DispARC adj; AuxVideoSetting aux; } CmdParam_ChangeDisplay; // cafrii 060519 add // VideoResize¿¡¼­ »ç¿ëµÇ´Â command parameter block typedef struct { UINT16 x; UINT16 y; UINT16 w; UINT16 h; } CmdParam_VideoResize; // cafrii 060928 add // typedef struct { tDHL_DispARC adj; UINT16 x, y, w, h; } CmdParam_AdjustScreen; typedef struct { DMC_FN_DPC dpcfn; UINT32 param1; UINT32 param2; UINT32 param3; UINT32 param4; // cafrii 070412, add 3 more params. total 4. } CmdParam_DPC; //--------------------------------------------------------------- // // Forward Declarations here.. // #if COMMENT ________Comm________(){} #endif //----------------------------------------------------------- // Dmc_SendCommandEx // ºñµð¿À ŽºÅ© (DmcTask)·Î command¸¦ º¸³½´Ù. // ÇÊ¿äÇϸé response waitµµ ÇÑ´Ù. (bWaitForComplete°¡ TRUEÀ϶§) // bCancelPrevCommand°¡ TRUEÀ̸é ÀÌÀü¿¡ º¸³½ ¸ðµç command¸¦ cancel½Ã۵µ·Ï // cancel msg¸¦ ¸ÕÀú º¸³½´Ù. // STATUS Dmc_SendCommandEx(DmcMsgType cmd, UINT32 param, DMC_FN_CANCELFREE pfnFree, BOOL bWaitForComplete, DMC_FN_COMPLETED pfnCompleted, UINT32 userparam, BOOL bCancelPrevCommand) { DmcMessage msg; BOOL bUrgent = FALSE; UINT32 cancelId1=0, cancelId2; // cafrii 040910 add STATUS status = statusOK; DHL_OS_SEMA_ID waitSem = 0; if (Dmc_IsDmcTask()) { dprint(0, "!! Send dmc command from dmc task!\n"); if (pfnFree && param) (*pfnFree)(param); return statusInvalidState; } memset(&msg, 0, sizeof(msg)); if (bCancelPrevCommand) { // ÀÌ Àü¿¡ º¸³½ ¸ðµç command¸¦ Ãë¼ÒÇϱâ À§Çؼ­ ¸ÕÀú cancel msg¸¦ º¸³½´Ù. // cancelId1 = doDmc_GetNewMultipleCancelIds(2); // 2°³ÀÇ ¿¬¼ÓµÈ cancel ID¸¦ ¾ò¾î¿Â´Ù. // cancelId1ÀÌ Ã¹¹øÂ° cancel IDÀÌ´Ù. Dmc_SendCancelCommand(cancelId1); cancelId2 = doDmc_GetNextCancelId(cancelId1, 1); // ±× ´ÙÀ½ cancel ID¸¦ »ç¿ëÇÑ´Ù. } else { cancelId2 = doDmc_GetNewCancelId(); } if (!Dmc_IsCommand(cmd)) { #if DEVELOPMENT_BUILD DHL_ASSERT(bWaitForComplete == FALSE, "event msg cannot be synchronous"); #else // event À̸鼭 synchronous ¹æ½ÄÀ¸·Î È£ÃâÀÌ µÈ °æ¿ìÀÌ´Ù. // À߸ø »ç¿ëµÈ ¿¹Àε¥, ±×³É ¿¡·¯ ¸®ÅÏÀ» ÇÒ ¼öµµ Àִµ¥, // ±×³É wait_for_complete¸¦ ¹«½ÃÇϰí async 󸮸¦ Çϵµ·Ï ÇÏÀÚ. // // cafrii 080910 fix. if (bWaitForComplete) { dprint(0, "!! event sent in synchronous mode! act in async mode\n"); bWaitForComplete = FALSE; } #endif } if (bWaitForComplete) { #if 0 // zooyouny 100629 : resuable semaphore »ç¿ë ¾ÈÇϵµ·Ï DHL¿¡¼­ Áö¿ø ¾ÈÇÔ // cafrii 070416 use reusable semaphore waitSem = OS_CreateReuseSemaphore("", OS_SEM_FIFO, FALSE); #else waitSem = DHL_OS_CreateBinarySemaphore("", OS_SEM_FIFO, FALSE); #endif if (waitSem == 0) { dprint(0, "!! wait sema4 create err\n"); if (pfnFree && param) (*pfnFree)(param); return statusOutOfResource; } } msg.type = cmd; msg.param = param; // command parameter msg.pfnResourceFree = pfnFree; msg.pfnCompleted = pfnCompleted; msg.userParam = userparam; msg.bWaitForComplete = bWaitForComplete; msg.cancelId = cancelId2; if (bWaitForComplete) { msg.pStatus = (UINT32 *)&status; msg.waitSem = waitSem; } if (bCancelPrevCommand) dprint(3, " send cancel cmd cid %d, send cmd '%d' cid %d\n", cancelId1, cmd, cancelId2); else dprint(3, " send cmd '%d' cid %d\n", cmd, cancelId2); // todo // urgent event/command¸¦ º¸³»´Â ¹æ¹ýÀ» Á¦°øÇÒ Çʿ䰡 Àִ°¡? // -> cancel ±â´ÉÀ» Á¦°øÇϱ⠶§¹®¿¡ ±×·² ÇÊ¿ä´Â ¾øÀ½. status = doDmc_AddUserMsg(&msg); if (status) { dprint(0, "!! Send%sMessage error %d\n", bUrgent ? "Urgent" : "", status); if (pfnFree && param) (*pfnFree)(param); return statusQueueFull; } // queue¿¡ Á¦´ë·Î add µÇ¾ú´Ù¸é ÀÌÁ¦ param ÈÄ󸮴 ´õÀÌ»ó À̰÷¿¡¼­ Ã¥ÀÓÁöÁö ¾Ê´Â´Ù. // if (bWaitForComplete) { DHL_OS_TakeSemaphore(waitSem, DHL_TIMEOUT_FOREVER); dprint(2, ".. send_cmd end. result %d\n", status); #if 0 // zooyouny 100629: reusable semaphore DHL¿¡¼­ Áö¿ø ¾ÈÇÔ // cafrii 070416 use reusable semaphore OS_DeleteReuseSemaphore(waitSem); #else DHL_OS_DeleteSemaphore(waitSem); #endif } return status; } /* Dmc_SendCommandExÀÇ °£¼ÒÈ­ ¹öÀü. */ STATUS Dmc_SendCommand(DmcMsgType cmd, UINT32 param, BOOL bCancelPrevCommand) { return Dmc_SendCommandEx(cmd, param, NULL, TRUE, // wait mode NULL, 0, // no user callback bCancelPrevCommand); } /* ÁÖ·Î Driver callback, ISR µî¿¡¼­ DMC task·Î À̺¥Æ®¸¦ Àü´ÞÇÒ ¶§ »ç¿ëÇÏ´Â API. */ STATUS Dmc_DeferEvent(DmcMsgType event, UINT32 param, DMC_FN_CANCELFREE pfnFree, DMC_FN_COMPLETED pfnDpc, UINT32 userParam) { if (Dmc_IsCommand(event)) return statusInvalidArgument; return Dmc_SendCommandEx(event, param, pfnFree, FALSE, // no wait mode.. event should not be synchronous!! pfnDpc, userParam, FALSE); // do not cancel prev event.. } // cafrii 060831 add // cafrii 090120, this function is called with int disabled. so removing printf encouraged. void Dmc_DeleteDmcMessage(DmcMessage *pmsg, STATUS result) { if (Dmc_IsCommand(pmsg->type) && pmsg->pfnCompleted) { (pmsg->pfnCompleted)(result, pmsg->userParam, NULL); // Äݹé ÀÎÀÚ¸¦ ÅëÇÑ ¿¡·¯ ¸®ÅÏ.. } if (pmsg->pfnResourceFree) { //dprint(3, " free parameter 0x%x\n", pmsg->param); pmsg->pfnResourceFree(pmsg->param); } } //----------------------------------------------------------- // Dmc_CheckCancel // // ÀÌ ÇÔ¼ö´Â ¹Ýµå½Ã Dmc task¿¡¼­¸¸ ºÒ·Á¾ß ÇÑ´Ù. // ±×·¯³ª staticÀÎ doDmc_CheckCancel°ú ´Þ¸® ¿ÜºÎ¿¡¼­ ºÎ¸¦ ¼ö ÀÖµµ·Ï extern µÇ´Â public APIÀÌ´Ù. // ÀÌ ÇÔ¼öÀÇ ¿ëµµ´Â DMC Task¿¡¼­ °¢Á¾ applicationÀ¸·ÎÀÇ callback ·çƾ¿¡¼­ »ç¿ëÇÑ´Ù. // BOOL Dmc_CheckCancel() { // This function should be called in DMC task. // Application can use this function to check whether current msg is cancelled or not. // DMC routines can use doDmc_CheckCancel() directly. // if (dmc_TaskID != Dmc_GetCurrentTaskID()) { dprint(0, "!! Dmc_CheckCancel() should be called only in DmcTask.\n"); return FALSE; // return NOT_CANCELLED; } return doDmc_CheckCancel(); } tDHL_TSD *Dmc_GetCurrentTsd() { return dmc_tsd; } // Dmc_GetCurrentTaskID // ÇöÀç Task ID¸¦ ¸®ÅÏÇÑ´Ù. // DHL_OS_TASK_ID Dmc_GetCurrentTaskID() { return DHL_OS_GetTaskID(); } // Dmc_IsDmcTask // ÇöÀç task °¡ DMC task À̸é TRUE¸¦ ¸®ÅÏÇÑ´Ù. // BOOL Dmc_IsDmcTask() { return (Dmc_GetCurrentTaskID() == dmc_TaskID) ? TRUE : FALSE; } #if !SUPPORT_ETC_API_SYNC /* Dmc_SendCommand ¿Í ´Þ¸® DMC task·Î defer ½ÃŰÁö ¾Ê°í Á÷Á¢ È£ÃâÇÒ ¶§ »ç¿ëÇÏ´Â API. ÀϹÝÀûÀ¸·Î ±âÁ¸¿¡ SendCommand¸¦ wait mode·Î cancel ¾øÀÌ µ¿ÀÛÇÏ´Â °æ¿ì¿´´Ù¸é ÇöÀçÀÇ task¿¡¼­ Á÷Á¢ ½ÇÇàÀÌ °¡´ÉÇÏ´Ù. */ STATUS Dmc_ExecuteCommand(DmcMsgType cmd, UINT32 param, STATUS (*fn)(DmcMessage *)) { DmcMessage msg; STATUS status = statusInvalidArgument; memset(&msg, 0, sizeof(msg)); msg.type = cmdChangeDisplay; msg.param = param; // command parameter msg.cancelId = 0; // cancelÇÒ¶§ »ç¿ëµÇ´Â ÀϷùøÈ£. msg.bWaitForComplete = TRUE; if (fn) status = (*fn)(&msg); return status; } #endif // !SUPPORT_ETC_API_SYNC #if COMMENT _______SubAPI_1_______(){} #endif static STATUS doDmc_CmdExtInputCapture(DmcMessage *pmsg) { STATUS status; CaptureParam *pCapParam; dprint(1, "cmdExtInputCapture: cid %d\n", pmsg->cancelId); pCapParam = (CaptureParam *) pmsg->param; if (!pCapParam) { dprint(0, " !! capParam NULL! stop!\n"); status = statusInvalidArgument; goto label_end_tune; } // ±âÁ¸ ºñµð¿À°¡ µ¿ÀÛÁßÀÌ¸é ´Ý´Â´Ù. doDmc_Stop(); if (doDmc_CheckCancel()) goto label_cancelled; dprint(2, "\tstart analog video..\n"); // arzhna, 100203 // CA PMT¸¦ Àü´ÞÇϱâ À§ÇÑ callback È£Ãâ doDmc_Notify(DMC_NOTIFY_CaPmt, (UINT32)NULL); status = doDmc_StartAnalog(pCapParam); if (status) { dprint(0, "!! err in start analog, err %d. stop!\n", status); } else { doDmc_UpdateProgramInfoAnalog(0, pCapParam->input_video, pCapParam->input_audio); } goto label_end_tune; label_cancelled: status = statusCancelled; goto label_end_tune; label_end_tune: //------------------------------------------------------------ if (pCapParam) DHL_OS_Free((void**)&pCapParam); // caller task¿¡¼­ AllocÇÑ ¸Þ¸ð¸®ÀÌ´Ù. "¹Ýµå½Ã" free ½ÃŰÀÚ. return status; } static STATUS doDmc_CmdStop(DmcMessage *pmsg) { dprint(1, "cmdVideoStop: cid %d\n", pmsg->cancelId); doDmc_Stop(); // analog/digital °ø¿ë ÇÔ¼ö return statusOK; } static STATUS doDmc_CmdRestartVideo(DmcMessage *pmsg) { STATUS status; ProgramAVInfo *av; if (pmsg == NULL) dprint(1, "cmdRestartVideo: called from DMC context..\n"); else dprint(1, "cmdRestartVideo: cid %d\n", pmsg->cancelId); av = Dmc_LockAVMutex(); if (dmc_TaskID != Dmc_GetCurrentTaskID()) { dprint(0, "!! doDmc_CmdRestartVideo should be called only in DmcTask.\n"); status = statusError; goto label_end_tune; } if (av->active == FALSE) { dprint(0, "!! cannot restart video. currently no program\n"); status = statusError; goto label_end_tune; } if (doDmc_CheckCancel()) goto label_cancelled; //---------------- if (av->analog) // NTSC, or DV { int prev_rf; CaptureParam capParam; // StopÀ» ½Ã۸é pav Á¤º¸°¡ ¼Ò½ÇµÉ ¼ö ÀÖÀ¸¹Ç·Î ÇÊ¿äÇÑ Á¤º¸´Â // ¹Ì¸® backupÀ» ÇØ µÎ¾î¾ß ÇÒ °ÍÀÌ´Ù. memset(&capParam, 0, sizeof(capParam)); prev_rf = av->rf; capParam.input_video = av->input_video; capParam.input_audio = av->input_audio; doDmc_Stop(); dprint(2, "\trestart analog video..\n"); status = doDmc_StartAnalog(&capParam); if (status) { status = statusAnalogError; dprint(0, "!! err in start analog, err %d. stop!\n", status); } else { doDmc_UpdateProgramInfoAnalog(prev_rf, capParam.input_video, capParam.input_audio); } goto label_end_tune; // ¾Æ³¯·Î±× ä³ÎÀº À̰ÍÀ¸·Î ¸ðµç ÀÛ¾÷ÀÌ ³¡³­´Ù. } else { ProgramAVInfo pgm_backup, *pgm = &pgm_backup; *pgm = *av; doDmc_StopDigital(FALSE, FALSE); // do not cancel monitors // PsiControlµµ »èÁ¦ÇÏÁö ¾Ê°í, dmc_pat/pmtµµ »èÁ¦ÇÏÁö ¾Ê´Â´Ù. // ±×³É VideoContext¸¸ ³»¸°´Ù. // important change/major change À̺¥Æ®°¡ ¿Ã¶§ restart video ¸í·ÉÀ» »ç¿ëÇÏ´Â // °æ¿ì°¡ ¸¹´Ù. // ±×·¯¹Ç·Î ÀÌ ½ÃÁ¡¿¡¼­ queue¿¡ ¿©·¯°³ ½×¿© ÀÖ´Â important change, major change µîÀÇ // event´Â ¾ø¾Ö¹ö¸®´Â°Ô ÁÁ´Ù. // ±×·¡¾ß restart ÈÄ¿¡ ´Ù½Ã ÀÌ·± À̺¥Æ®µé¿¡ ÀÇÇØ ´Ù½Ã restartµÉ ÀÏÀÌ ¾ø±â ¶§¹®. // ´Ü cidÀÇ º¯°æ¿¡ µû¸¥ cancel IDÀÇ º¯°æ, ÀÌ·Î ÀÎÇÑ CheckCancel ÇÔ¼öÀÇ µ¿ÀÛ¿¡ // ¿µÇâÀº ¾ø´ÂÁö Ã¼Å©ÇØ ºÁ¾ß ÇÑ´Ù. // if (1) { //dprint(2, "\t Delete some event message..\n"); doDmc_DeleteMsg(evtVideoImportantChange); doDmc_DeleteMsg(evtVideoMajorChange); } status = doDmc_StartDigital(pgm->video_pid, pgm->audio_pid, pgm->pcr_pid, (DMC_VIDEO_CACHE)0, pgm->video_type, pgm->audio_type); if (status == statusOK) { doDmc_UpdateProgramInfoDigital(pgm->rf, pgm->mod, pgm->method, pgm->major, pgm->minor, pgm->program_number, pgm->video_pid, pgm->audio_pid, pgm->pcr_pid, pgm->video_type, pgm->audio_type); goto label_digital_success; } else { doDmc_ClearProgramInfo(); } } label_digital_success: //------------------------------------------------------------ if (doDmc_CheckCancel()) goto label_cancelled; // ¾Õ¿¡¼­ MonitorµéÀ» free½ÃŰÁö ¾Ê¾Ò´Ù¸é ¿©±â¿¡¼­ ÇÒ ´Ù½Ã ÇÒ ÇÊ¿ä´Â ¾ø´Ù. // ±âÁ¸ÀÇ monitorµéÀ» °¡´ÉÇϸé Àç»ç¿ëÇÑ´Ù. // doDmc_StartFinalPsiMonitor(FALSE); goto label_end_tune; label_cancelled: status = statusCancelled; goto label_end_tune; label_end_tune: Dmc_UnlockAVMutex(); return status; } static STATUS doDmc_CmdEnqueueDPC(DmcMessage *pmsg) { UINT32 *cmdParam = (UINT32 *)pmsg->param; DMC_FN_DPC dpcfn; UINT32 arg1, arg2, arg3, arg4; dprint(1, "cmdEnqueuDPC: cid %d\n", pmsg->cancelId); dprint(2, "\t param: %x, callback fn %x\n", pmsg->param, pmsg->pfnCompleted); dpcfn = (DMC_FN_DPC) cmdParam[0]; arg1 = cmdParam[1]; arg2 = cmdParam[2]; arg3 = cmdParam[3]; arg4 = cmdParam[4]; dprint(3, "\t free paramblk %x\n", cmdParam); DHL_OS_Free((void**)&cmdParam); //Á¦´ë·Î ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ.. //if (pmsg->pfnResourceFree) // (pmsg->pfnResourceFree)((UINT32)cmdParam); dprint(2, "\t DPC function %x, arg %x %x %x %x\n", dpcfn, arg1, arg2, arg3, arg4); if (dpcfn) dpcfn(arg1, arg2, arg3, arg4); // tune callbackÀº tuning°ü·Ã command¿¡¼­¸¸ error¸¦ ¸®ÅÏÇÏ´Â °ÍÀÓ. // ÀÏ¹Ý command¿¡´Â ÇØ´çµÇÁö ¾Ê´Â´Ù. //doDmc_ReturnTuneResult(event->fn, statusOK, (UINT32)event->param, event->userParam); return statusOK; } #if COMMENT _______SubAPI_2_______(){} #endif // À̰÷ÀÇ ÇÔ¼öµéÀº ±âÁ¸¿¡´Â DMC task¿¡¼­ ½ÇÇàµÇ¾úÀ¸³ª // HAL ±¸Á¶·Î º¯°æµÇ¸é¼­ Á÷Á¢ client task¿¡¼­ ½ÇÇàµÈ´Ù. // // /* Dmc_ChangeDisplayÀÇ sub ½ÇÇà ÇÔ¼ö. */ static STATUS doDmc_CmdChangeDisplay(DmcMessage *pmsg) { DHL_RESULT dhlResult; tDHL_DispColorSpace videoOutputColor; //video output tDHL_DispFormat displayFormat; //video output format // tDHL_DispAspectRatio AspectRatio; //display aspect ration // tDHL_DispARC Adjustment; // DHL_DISP_AUXSETTING AuxSetting; CmdParam_ChangeDisplay *arg = (CmdParam_ChangeDisplay *)pmsg->param; dprint(1, "cmdChangeDisplay: cid %d\n", pmsg->cancelId); videoOutputColor = arg->color == VOUT_YPBPR ? eDHL_DISP_CS_YCBCR : eDHL_DISP_CS_RGB; displayFormat = arg->format == VOUT_480I ? eDHL_DISP_720x480i : arg->format == VOUT_480P ? eDHL_DISP_720x480p : arg->format == VOUT_720P ? eDHL_DISP_1280x720p : arg->format == VOUT_1080I ? eDHL_DISP_1920x1080i : eDHL_DISP_1920x1080i; // AspectRatio = arg->ratio == VOUT_NARROW ? eDHL_DISP_ASPECT_4_3 : eDHL_DISP_ASPECT_16_9; // Adjustment = (tDHL_DispARC) arg->adj; // AuxSetting = (DHL_DISP_AUXSETTING) arg->aux; // cafrii 060728 test if (dmc_bTestNoAux) { dprint(0, "!! no aux test mode\n"); // AuxSetting = noAuxVideo; } // todo.. check point. // ¾Æ³¯·Î±×ÀÏ °æ¿ì.. // audio only serviceÀÎ °æ¿ì.. // // video°¡ stop µÇ¾î ÀÖ´Â °æ¿ì.. --> SetSingle.. Àº ³ªÁß¿¡ ÁøÂ¥ ½ÃÀÛÇÒ¶§·Î ¹Ì·ïÁø´Ù. // // cafrii 060831 add comment // ÀϹÝÀûÀ¸·Î change display´Â wait mode·Î È£ÃâµÇ±â ¶§¹®¿¡ // pfnResourceFree¸¦ »ç¿ëÇÏÁö´Â ¾Ê´Â´Ù. // ¸¸¾à¿¡ ³ªÁß¿¡ no-wait ¸ðµå·Î »ç¿ëÇÒ °æ¿ì¸¦ ´ëºñÇØ¼­ // freeÇÏ´Â Äڵ带 È£ÃâÇØÁØ´Ù. // if (pmsg->pfnResourceFree) (pmsg->pfnResourceFree)((UINT32)arg); #if 0 // cafrii 060718 delete, ChangeVideoFormat¿¡¼­ ¸ðµÎ ó¸®. // »ç¿ëÀÚÀÇ ¿ä±¸´ë·Î display¸¦ ¼³Á¤ÇÏ´Â °ÍÀ̱⠶§¹®¿¡ // ´Ù½Ã callbackÀ¸·Î È®ÀÎÇÒ Çʿ䰡 ¾ø´Ù. // //doDmc_ProcessScreenAdjustment(); DHL_AV_SetScreenAdjustment(Adjustment, NULL); #endif #if 1 dhlResult = DHL_AV_DispSetFormat(eDHL_DISP_PORT_COMPONENT, displayFormat, videoOutputColor); #else dhlResult = DHL_AV_ChangeVideoFormat(VideoOutput, VidOutFormat, AspectRatio); // if error occurs, there is NO CHANGE in display setting since last good setting. // (last successful display setting is kept) // caller should check this err value and do some treatment. (retry or give-up) #endif return dhlResult ? statusError : statusOK; } /* Dmc_ChangeVideoAdjustment ÀÇ sub ½ÇÇà ÇÔ¼ö. */ static STATUS doDmc_CmdChangeVideoAdjustment(DmcMessage *pmsg) { DHL_RESULT dhlResult = DHL_OK; tDHL_DispARC adj_hd = (tDHL_DispARC) (pmsg->param & 0xffff); tDHL_DispARC adj_sd = (tDHL_DispARC) ((pmsg->param >> 16) & 0xffff); dprint(1, "cmdVideoAdjustment: cid %d, adj_hd %d, adj_sd %d\n", pmsg->cancelId, adj_hd, adj_sd); #if 1 DHL_AV_VideoSetARC(adj_hd, adj_sd); #else // chjeon 091222 // ARC Àû¿ëÀ» SD¿Í HD Ãâ·Â¿¡ µ¿½Ã¿¡ Àû¿ëÇÑ´Ù. dhlResult = DHL_AV_ChangeVideoAdjustment(eDHL_DISP_TYPE_HD, adj_hd, NULL); dhlResult = DHL_AV_ChangeVideoAdjustment(eDHL_DISP_TYPE_SD, adj_sd, NULL); #endif return dhlResult ? statusError : statusOK; } /* Dmc_AdjustVideoScreen ÀÇ sub ½ÇÇà ÇÔ¼ö. */ static STATUS doDmc_CmdAdjustScreen(DmcMessage *pmsg) { DHL_RESULT dhlResult = DHL_OK; CmdParam_AdjustScreen *arg = (CmdParam_AdjustScreen *) pmsg->param; DHL_Rect rect; dprint(1, "cmdAdjustScreen: cid %d\n", pmsg->cancelId); #if 0 SETRECT(&rect, arg->x, arg->y, arg->w, arg->h); dhlResult = DHL_AV_ChangeVideoAdjustment(eDHL_DISP_TYPE_HD, arg->adj, &rect); #else dhlResult = DHL_AV_VideoResize(0, arg->x, arg->y, arg->w, arg->h); #endif return dhlResult ? statusError : statusOK; } /* Dmc_ResizeVideo ÀÇ sub ½ÇÇà ÇÔ¼ö. */ static STATUS doDmc_CmdVideoResize(DmcMessage *pmsg) { DHL_RESULT dhlResult = DHL_OK; CmdParam_VideoResize *arg = (CmdParam_VideoResize *) pmsg->param; dprint(1, "cmdVideoResize: cid %d\n", pmsg->cancelId); dhlResult = DHL_AV_VideoResize(0, arg->x, arg->y, arg->w, arg->h); return dhlResult ? statusError : statusOK; } #if COMMENT ________Task____________(){} #endif void tDmc_Task(INT32 arg) { DmcMessage msg; STATUS status; while(1) { status = statusOK; //------------------------- User Message ó¸® ÄÚµå -------------------------------- // // ÇöÀç »óÅ¿¡¼­ ¸ðµç DmcQMsg°¡ UserMsgQ·Î À̵¿µÇ¾ú´Ù. // //doDmc_PrintUserMsgs(); // cafrii 040910 add, UserMsgQÀÇ ¸ðµç msg¿¡ ´ëÇØ cid Á¤º¸¸¦ Ç¥½ÃÇÑ´Ù. if (SCN_ScanRunning()) { status = doDmc_GetUserMsg(&msg, 50); if (status != statusOK) { SCN_ScanTask(); continue; } } else { // º°µµÀÇ background idle ÀÛ¾÷ÀÌ ¾øÀ» °æ¿ì¿£ wait foreverÇÑ´Ù. status = doDmc_GetUserMsg(&msg, 0xFFFFFFFF); // wait forever.. if (status) { dprint(0, "!! No message in UserMsgQueue ??\n"); DHL_OS_Delay(100); continue; // no message. } } if (doDmc_RefreshCancelQue()) // °¡Àå ¸¶Áö¸·À¸·Î µé¾î¿Â cancel request ID¸¦ ¾ò´Â´Ù. { // cancel command°¡ ¿À¸é ÇöÀç ÁøÇà ÁßÀÎ scanµµ ÁßÁöÇÑ´Ù. if (SCN_ScanRunning()) { DmcMessage msg; memset(&msg, 0, sizeof(DmcMessage)); msg.param = TRUE; // bUpdate dprint(2, "\t new cancel %d. stop scan.\n", doDmc_GetLastCancelId()); status = SCN_ScanStop(&msg); // ignore status value because this is cancel. } } dprint(2, "\t %s (%d) cid %d (last %d)\n", Dmc_MsgString(msg.type), msg.type, msg.cancelId, doDmc_GetLastCancelId()); if (doDmc_IsCancelledMsg(msg.cancelId)) { dprint(1, "!! %s %s cid %d canceled by cid %d\n", Dmc_IsCommand(msg.type) ? "command" : "event", Dmc_MsgString(msg.type), msg.cancelId, doDmc_GetLastCancelId()); // command°¡ ¾Æ´Ñ eventÀÇ °æ¿ì¿¡´Â event.fn °ªÀÌ NULLÀϰÍÀÌ´Ù. // ÀÌ °æ¿ì¿¡´Â callback¸¦ ºÎ¸£Áö ¾Ê´Â´Ù. // cafrii 091222 comment // ÇöÀç ¾î¶² commandÀÎÁö ±¸ºÐÇÏÁö ¾ÊÀº »óÅÂÀ̹ǷΠ¸¶Áö¸· ÀÎÀÚ¸¦ NULL·Î ÁÙ ¼ö ¹Û¿¡ ¾øÀ½. // °¢ complete callback ÇÔ¼ö ³»¿¡¼­ null üũ ÇÊ¿äÇÔ. if (Dmc_IsCommand(msg.type) && msg.pfnCompleted) { (msg.pfnCompleted)(statusCancelled, msg.userParam, NULL); // Äݹé ÀÎÀÚ¸¦ ÅëÇÑ ¿¡·¯ ¸®ÅÏ.. } if (msg.pfnResourceFree) { dprint(3, " free parameter 0x%x\n", msg.param); msg.pfnResourceFree(msg.param); } // cancelÀÌ µÈ command¶óµµ ack¸¦ º¸³»Áà¾ß ÇÑ´Ù. // status = statusCancelled; goto label_wait_for_complete; } switch (msg.type) { case evtPatChange: doDmc_HandlePatChange(&msg); // new PAT break; case evtPmtChange: doDmc_HandlePmtChange(&msg); // new PMT break; case evtVideoImportantChange: doDmc_HandleImportantVideoChange(&msg); break; case evtVideoUserChange : doDmc_HandleUserChange(&msg); break; case evtVideoMajorChange: doDmc_HandleMajorVideoChange(&msg); break; case evtVideoFatalError: dprint(0, "!! evtVideoFatalError: cid %d\n", msg.cancelId); doDmc_HandleMajorVideoChange(&msg); break; case evtFreezeVideoEnd: doDmc_HandleFreezeVideoEnd(&msg); break; case evtVideoScrambled: doDmc_HandleVideoScrambled(&msg); break; //--------------------------------------------- case cmdRfTune: status = doDmc_CmdRfTune(&msg); break; case cmdExtInputCapture: status = doDmc_CmdExtInputCapture(&msg); break; case cmdVideoStop: status = doDmc_CmdStop(&msg); break; case cmdRestartVideo: status = doDmc_CmdRestartVideo(&msg); break; case cmdChangeDisplay: status = doDmc_CmdChangeDisplay(&msg); break; case cmdChangeVideoAdjustment: status = doDmc_CmdChangeVideoAdjustment(&msg); break; case cmdAdjustScreen: // cafrii 060928 add status = doDmc_CmdAdjustScreen(&msg); break; case cmdVideoResize: // cafrii 060519 add status = doDmc_CmdVideoResize(&msg); break; case cmdEnqueueDPC: status = doDmc_CmdEnqueueDPC(&msg); break; //--------------------------------------------- // ¾Æ·¡ ¼¼ ÇÔ¼ö´Â Autoscan ±â´ÉÀ» DMC task¸¦ ÀÌ¿ëÇØ¼­ ¼öÇàÇϱâ À§ÇØ ÀÛ¼ºµÇ¾úÀ½. // // ÀÌ ÇÔ¼öµéÀº º°µµ·Î parameter ³»ºÎ¿¡ AutoScan Callback ÇÔ¼ö°¡ À־ // ±× callbackÀ» ÀÌ¿ëÇÏ¿© ´ëºÎºÐÀÇ communicationÀ» ¼öÇàÇÑ´Ù. // case cmdScanStart: status = SCN_ScanStart(&msg); break; case cmdScanStop: status = SCN_ScanStop(&msg); break; case cmdScanChannel: status = SCN_ScanOneChannel(&msg); break; //--------------------------------------------- case cmdVideoSelfDelete: dprint(1, "cmdVideoSelfDelete: cid %d\n", msg.cancelId); doDmc_Stop(); Dmc_DeleteCancelQue(); doDmc_DeleteUserMsgQue(); dmc_bInitCM = FALSE; dmc_TaskID = 0; if (msg.waitSem) DHL_OS_GiveSemaphore(msg.waitSem); DHL_OS_SelfDeleteTask(); break; default: #if DEVELOPMENT_BUILD DHL_ASSERT(0,"Dmc_Task: bad event. check event type constant."); #else dprint(0, "!! %s: bad event %d\n", __FUNCTION__, msg.type); break; #endif } // switch (event.type) label_wait_for_complete: if (msg.bWaitForComplete) { // synchronous mode·Î È£ÃâµÈ APIÀÇ °æ¿ì // ½ÇÇàÈÄÀÇ °á°ú°ªÀ» ¸®ÅÏÇØÁÙ ¼ö ÀÖ´Ù. dprint(2, "dmc command complete.. result %d\n", status); if (msg.pStatus) *(msg.pStatus) = status; if (msg.waitSem) DHL_OS_GiveSemaphore(msg.waitSem); else dprint(0, "!! wait mode, but no waitSem!!\n"); } } // while (1) DHL_OS_SelfDeleteTask(); } #if COMMENT _____API_________________(){} #endif //----------------------------------------------------------- // Dmc_InitChannelTask // ½Ã½ºÅÛÀ» ÃʱâÈ­ Çϰí, ºñµð¿À Å×½ºÅ©¸¦ »ý¼ºÇÑ´Ù. // ÀÌ ÇÔ¼ö´Â ÀÓÀÇÀÇ Å½ºÅ©¿¡¼­ ºÒ¸°´Ù. // STATUS Dmc_InitChannelTask() { DHL_OS_TASK_ID tid; STATUS status; //--------- DMC component ÃʱâÈ­ ------------ if (dmc_bInitCM) { dprint(0, "!! dmc already inited. skip..\n"); return statusOK; } status = Dmc_InitAVResources(); if (status) { dprint(0, "!! AV resource init err %d\n", status); return status; } SCN_ScanInit(); //--------- DMC ÃʱâÈ­ ------------ status = doDmc_InitUserMsgQue(sizeof(DmcMessage), MAX_DECODE_MESSAGES); if (status) { dprint(0, "!! init dmc MsgQ err %d\n", status); return status; } if (Dmc_InitCancelQue(MAX_DECODE_MESSAGES)) return statusOutOfResource; tid = DHL_OS_CreateTask((DHL_OS_TASKFUNCTION)tDmc_Task, "tDmc", DMC_TASK_PRIORITY, DMC_TASK_STACKSIZE, 0); // reference // VIDEOCONTROL_TASK_PRIORITY, VIDEOCONTROL_TASK_STACKSIZE if (tid == (DHL_OS_TASK_ID)0) { dprint(0, "!!! DHL_OS_CreateTask error! dmc_TaskID %x\n", tid); return statusOutOfResource; } dmc_TaskID = tid; dmc_tsd = DHL_DMX_GetTsd(); dmc_tickStarted = DHL_OS_GetMsCount(); // cafrii 060720 add dmc_bInitCM = TRUE; return statusOK; } //----------------------------------------------------------- // Dmc_Terminate // Call this function to undo everything we did above // »ç½Ç ÀÌ ÇÔ¼ö¸¦ ºÎ¸¦ ÀÏÀº °ÅÀÇ ¾ø´Ù. // void Dmc_EndChannelTask(void) { STATUS status; dprint(1, "Dmc_EndChannelTask()\n"); if (dmc_TaskID) { status = Dmc_SendCommandEx(cmdVideoSelfDelete, 0, NULL, TRUE, // no wait NULL, 0, // no callback TRUE); // cancel prev cmds if (status) { DHL_OS_Delay(1000); dprint(0, "!! Dmc_Task would not die\n"); //DHL_OS_DeleteTask(dmc_TaskID); dmc_TaskID = 0; } dprint(2, "Dmc_Task deleted.\n"); } // dmc_eventQ´Â dmc_Task¿¡¼­ »èÁ¦¸¦ Çϰí self-die¸¦ Çϵµ·Ï µÇ¾î ÀÖÁö¸¸, // °­Á¦ delete µÈ °æ¿ì¶ó¸é eventQ°¡ »ì¾Æ ÀÖÀ» °ÍÀÓ.. // ±×·¡¼­ ¿©±â¼­ ´Ù½Ã Çѹø È®ÀÎÇÏ°í »èÁ¦ÇÑ´Ù. // doDmc_DeleteUserMsgQue(); Dmc_DeleteCancelQue(); dmc_bInitCM = FALSE; // DmcTask¿¡¼­ FALSE·Î settingÇÏÁö¸¸ Çѹø ´õ È®ÀÎ. } //----------------------------------------------------------- // Dmc_GetSystemRunningTime // // return runnig time in seconds // UINT32 Dmc_GetSystemRunningTime(void) { return (DHL_OS_GetMsCount() - dmc_tickStarted)/1000; } //----------------------------------------------------------- // Dmc_StopVideo // // ¸ðµç Á¾·ùÀÇ Audio/Video¸¦ ¸ðµÎ stop ½ÃŲ´Ù. // Analog/Digital, Air/Cable, RF/1394/DV °ü°è¾øÀÌ ÇöÀç µ¿ÀÛÁßÀÎ ÀÛ¾÷À» ¸ðµÎ Stop½ÃŲ´Ù. // STATUS Dmc_StopVideo() { dprint(1, "Dmc_StopVideo()\n"); return Dmc_SendCommand(cmdVideoStop, 0, TRUE); // cancel prev-cmds. // jump to doDmc_Stop(); } STATUS Dmc_RestartVideo(void) { // DMC task¿¡¼­ ºÒ·È´Ù¸é send command¸¦ ÇÒ Çʿ䵵 ¾øÀÌ ¹Ù·Î ÀÛ¾÷ ¼öÇà.. // ÀÌ °æ¿ì Ç×»ó wait for completion ¸ðµå·Î µ¿ÀÛÇÏ°Ô µÈ´Ù. // if (Dmc_GetCurrentTaskID() == dmc_TaskID) { return doDmc_CmdRestartVideo(NULL); } else { return Dmc_SendCommand(cmdRestartVideo, 0, TRUE); // jump to doDmc_CmdRestartVideo .. } } #if COMMENT _____Enque_API__________(){} #endif void *Dmc_ParamHeapAllocator(UINT32 size) { void* ptr; ptr = DHL_OS_Malloc(size); memset(ptr, 0, size); return ptr; } void Dmc_ParamHeapDeallocator(UINT32 param) { // ½ÇÁ¦·Î arg´Â ¾î¶² ¸Þ¸ð¸®ÀÇ pointerÀÏ °ÍÀÓ. void *ptr = (void *)param; DHL_OS_Free((void**)&ptr); } //----------------- // Dmc_EnqueueDPC // // ƯÁ¤ ÀÛ¾÷À» DMC task¿¡ defer½ÃÄѼ­ ó¸®ÇÏ°í ½ÍÀ»¶§ »ç¿ëÇÏ´Â ÇÔ¼ö // param¿¡ memory block°ú °°Àº ¸®¼Ò½º ¸µÅ©¸¦ »ç¿ëÇÑ °æ¿ì // ¸®ÅϰªÀÌ DmcQFull ÀÌ µÉ °æ¿ì¸¦ ²À Ã¼Å©ÇØ¼­ ÇÊ¿äÇÒ °æ¿ì ¸®¼Ò½º¸¦ ÇØÁ¦½ÃÄÑ¾ß ÇÑ´Ù. // // cafrii 070412 add more params. // ÇϳªÀÇ paramÀ¸·Î´Â DPC·Î »ç¿ë°¡´ÉÇÑ ÇÔ¼ö°¡ ³Ê¹« Á¦¾àÀûÀÌ´Ù. // STATUS Dmc_EnqueueDPC(DMC_FN_DPC dpcfn, UINT32 param1, UINT32 param2, UINT32 param3, UINT32 param4, BOOL bWaitComplete) { CmdParam_DPC *paramblk; STATUS status; if (dpcfn == NULL) // ÀÌ ÀÎÀÚ´Â ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. ÀÌ APIÀÇ ¸ñÀûÀ̱⠶§¹®.. return statusInvalidArgument; paramblk = Dmc_ParamHeapAllocator(sizeof(CmdParam_DPC)); if (paramblk == NULL) return statusOutOfMemory; dprint(1, "Dmc_EnqueueDPC(%x, %x %x %x %x): paramblk %x\n", dpcfn, param1, param2, param3, param4, paramblk); paramblk->dpcfn = dpcfn; paramblk->param1 = param1; paramblk->param2 = param2; paramblk->param3 = param3; paramblk->param4 = param4; status = Dmc_SendCommandEx(cmdEnqueueDPC, (UINT32)paramblk, Dmc_ParamHeapDeallocator, bWaitComplete, // wait for complete NULL, 0, // user callback¶m FALSE); // do not cancel previous command // jump to doDmc_CmdEnqueueDPC // cafrii 060529 delete. codes are inside SendCommandEx. //if (status) { // Dmc_ParamHeapDeallocator((UINT32)param); //} return status; } #if COMMENT ______Tuning_API_______(){} #endif //----------------------------------------------------------- // STATUS Dmc_ChangeRfChannelByTuneParam(TuneParam *param, BOOL bWaitForCompletion, void *pfnCallback, UINT32 userparam) { TuneParam *tuneParam; STATUS status; char flagstring[50]; dprint(1, "Dmc_ChangeRfChannelTuneParam(%s)\n", bWaitForCompletion ? "wait" : "NoWait"); // Note, 030614 // bWaitForCompletion ¿É¼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ·Á¸é TuneParam ±¸Á¶Ã¼ Æ÷ÀÎÅ͸¦ ¹Ù·Î DMC task¿¡ // ³Ñ±â¸é ¾ÈµÇ°í º¹»ç¸¦ ÇØ¾ß ÇÑ´Ù. // ¹®Á¦´Â TuneParam ³»ºÎÀÇ VideoStreamDescriptor ¸Þ¸ð¸® ¿µ¿ª±îÁö º¹»ç¸¦ ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. // µû¶ó¼­ ÇöÀç´Â vidDesc Æ÷ÀÎÅÍ ºÎºÐÀº º¹»çÇÏÁö ¾Ê°í NULL·Î ¼¼ÆÃÇÑ´Ù. tuneParam = Dmc_ParamHeapAllocator(sizeof(TuneParam)); if (tuneParam == NULL) { dprint(0, "!! ChangeRfChannel: out of memory for TuneParam\n"); return statusOutOfResource; //outOfOSResourcesError; } memcpy(tuneParam, param, sizeof(TuneParam)); // cafrii 060630 add.. ³»ºÎ¿¡¼­ ¾Ë¾Æ¼­ ÇÏÁö¸¸ ¸í½ÃÀûÀ¸·Î ÁöÁ¤.. if (tuneParam->vidPid == 0 && tuneParam->audPid == 0 && tuneParam->pcrPid == 0) tuneParam->flag |= CTF_SkipPrescanPidInfo; //neverdai add. 100802 after autoscan, at the first time of tuning, audio type and video type are 0. if(tuneParam->vidType == eDHL_VIDEO_TYPE_UNKNOWN && tuneParam->audType == eDHL_VIDEO_TYPE_UNKNOWN) tuneParam->flag |= CTF_SkipPrescanPidInfo; // cafrii 031205 add if ((tuneParam->flag & CTF_Mask_Tuning) == CTF_VCTOnly) { sprintf(flagstring, "0x%x: %sVCT%s%s", tuneParam->flag, tuneParam->flag & CTF_RetryAnalogIfSignalUnlock ? "[+NTSC] " : "", tuneParam->flag & CTF_RetryOtherChannel ? "+" : "", tuneParam->flag & CTF_RetryMainChannel ? "*" : ""); } else if ((tuneParam->flag & CTF_Mask_Tuning) == CTF_PSIOnly) { sprintf(flagstring, "0x%x: PSI%s", tuneParam->flag, tuneParam->flag & CTF_RetryOtherProgram ? "+" : ""); } else { sprintf(flagstring, "0x%x: %sVCT%s%s/PSI%s", tuneParam->flag, tuneParam->flag & CTF_RetryAnalogIfSignalUnlock ? "[+NTSC] " : "", tuneParam->flag & CTF_RetryOtherChannel ? "+" : "", tuneParam->flag & CTF_RetryMainChannel ? "*" : "", tuneParam->flag & CTF_RetryOtherProgram ? "+" : ""); } dprint(2, "\tParam: rf %d, type %d, p%d v%d a%d, %d-%d #%d\n" "\t flag %s\n", //tuneParam->tuneRequired ? "" : "prev", // cafrii 060630 delete tuneParam->rf, tuneParam->type, tuneParam->pcrPid, tuneParam->vidPid, tuneParam->audPid, tuneParam->major, tuneParam->minor, tuneParam->progNumber, flagstring ); status = Dmc_SendCommandEx(cmdRfTune, (UINT32)tuneParam, Dmc_ParamHeapDeallocator, bWaitForCompletion, (DMC_FN_COMPLETED)pfnCallback, userparam, TRUE); // jump to doDmc_CmdRfTune // previous command´Â ¸ðµÎ cancel ½ÃŲ´Ù. // cafrii 060529 delete. codes are inside SendCommandEx. //if (status) { // cafrii 040528 add err handle code // // send command¿¡ ¿¡·¯°¡ ¹ß»ýÇϸé ÀÌ command´Â °¨Âʰ°ÀÌ »ç¶óÁ® ¹ö¸° °ÍÀ̹ǷΠ// // allocationÇÑ ¸Þ¸ð¸®´Â ÇØÁ¦ÇÑ ´ÙÀ½ ¸®ÅÏÀ» ÇØ¾ß ÇÑ´Ù. // Dmc_ParamHeapDeallocator((UINT32)tuneParam); //} return status; } STATUS Dmc_ChangeRfChannel(int rf, ModulationType type, BOOL bWaitForCompletion, void *fn, UINT32 userparam) { // RF·Î ¹Ù·Î Æ©´×ÇØ¼­ ä³Î º¯°æÀ» ÇÏ´Â ÇÔ¼öÀÌ´Ù. // TuneParam param, *tuneParam = ¶m; dprint(1, "Dmc_ChangeRfChannel(rf%d type %d)\n", rf, type); memset(tuneParam, 0, sizeof(TuneParam)); if (rf == 0) { ProgramAVInfo *av = Dmc_LockAVMutex(); //tuneParam->tuneRequired = FALSE; // cafrii 060630 delete tuneParam->rf = av->rf; tuneParam->type = av->mod; // // tuneRequired ¶ó°í ÇØµµ ¹Ýµå½Ã rf¿¡´Â ¿Ã¹Ù¸¥ rf ¹øÈ£¸¦ ³Ñ°ÜÁà¾ß ÇÑ´Ù. // modulation typeÀº ³»ºÎ¿¡¼­ retry code°¡ ÀÖÀ¸¹Ç·Î // digital/analog ±¸ºÐ¸¸ ÇØµµ µÈ´Ù. Dmc_UnlockAVMutex(); dprint(2, "\tNo tunet set. previous rf %d, type %d used.\n", tuneParam->rf, tuneParam->type); } else { tuneParam->rf = rf; //tuneParam->tuneRequired = TRUE; // cafrii 060630 delete // ¹æ¹ý 1: »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ °ªÀÌ ±×´ë·Î µé¾î°£´Ù. //tuneParam->type = type; // ¹æ¹ý 2: Digital Cable ÀÎ °æ¿ì´Â Auto detect ·Î ¼öÇàÇÑ´Ù. tuneParam->type = type == 0 ? Modulation_NTSC : g_CurChannelType == ChannelType_Air ? Modulation_8VSB : Modulation_CableAuto; } tuneParam->major = tuneParam->minor = 0; tuneParam->progNumber = 0; tuneParam->flag = CTF_Automatic | CTF_RetryOtherChannel | CTF_RetryOtherProgram | CTF_DontRetryTVCTOnCable | CTF_SkipPrescanPidInfo; return Dmc_ChangeRfChannelByTuneParam(tuneParam, bWaitForCompletion, fn, userparam); } STATUS Dmc_ChangeRfChannel2(int rf, ModulationType type, int pPid, int vPid, int aPid, int major, int minor, int progNumber, BOOL bWaitForCompletion, void *fn, UINT32 userparam) { // // if you don't want to use prescan PIDs, set PIDs to all zero. // if one of these three is non-zero, // 'pPid' should be non-zero. // 'vPid' or 'aPid' either should be non-zero. // // ex: // 6-1, #3 : try VCT 6-1 first -> try #3 PMT program. // 9-1, #0 : try VCT 9-1 first -> try any program. // 0-0, #2 : try any VCT channel -> try #2 PMT program. // 9-1, #-1 : try VCT 9-1. do not use PSI info. // 0-0, #0 : try any VCT channel -> try any program. // -1-?, #2 : try #2 PMT program. do not use VCT info. // -1-?, #0 : try any PMT program. do not use VCT info. // -1-?, #-1 : error. TuneParam param_0, *param = ¶m_0; dprint(1, "Dmc_ChangeRfChannel2(rf%d type %d)\n", rf, type); // cafrii, for safety, reset first.. memset(param, 0, sizeof(TuneParam)); // if 'rf' is zero, we do not set tuner. use last tuned frequency. if (rf == 0) { ProgramAVInfo *av = Dmc_LockAVMutex(); param->rf = av->rf; param->type = av->mod; //param->tuneRequired = FALSE; // cafrii 060630 delete Dmc_UnlockAVMutex(); dprint(2, "\tNo tunet set. previous rf %d, type %d used.\n", param->rf, param->type); } else { param->rf = rf; //param->tuneRequired = TRUE; // cafrii 060630 delete param->type = type; } // if PID values are zero, we will ignore this pre-scan PID values. if (pPid == 0 && vPid == 0 && aPid == 0) { param->flag |= CTF_SkipPrescanPidInfo; } else { param->pcrPid = pPid; param->vidPid = vPid; param->audPid = aPid; } // if 'major' is zero, we will tune first (lowest) channels and repeat next channel if error. // if 'major' is non-zero, we try only that major-minor channel, not others. param->major = major; param->minor = minor; //leon 2003.10.30 audio is mute bug at ATSC // if audio type is AC-3, mute bug. //param->audType = (tDHL_AudioCodingType) 0; if (major == 0) param->flag |= CTF_RetryOtherChannel; else if (major < 0) param->flag = ((param->flag & ~CTF_Mask_Tuning) | CTF_PSIOnly); // do not use VCT info. // if 'progNumber' is non-zero, do not use VCT info. PSI only mode. param->progNumber = progNumber; if (progNumber == 0) param->flag |= CTF_RetryOtherProgram; else if (progNumber < 0) param->flag = ((param->flag & ~CTF_Mask_Tuning) | CTF_VCTOnly); // do not use PSI info. //param->flag |= CTF_DontRetryTVCTOnCable; // for PCE, this flag also available. return Dmc_ChangeRfChannelByTuneParam(param, bWaitForCompletion, fn, userparam); // param ±¸Á¶Ã¼´Â Dmc_ChangeRfChannelByTuneParam() ÇÔ¼ö ¾È¿¡¼­ // ´Ù½Ã allocateÇϹǷΠ¿©±â¼­´Â °£´ÜÇÏ°Ô stackÀ» ÀÌ¿ëÇØµµ µÈ´Ù. } //---------------------- // Dmc_ChangeExtInput // // // // STATUS Dmc_ChangeExtInput(tDHL_CapVideoInput video, tDHL_CapAudioInput audio, BOOL bWaitForCompletion) { // Áö±ÝÀº callbackÀ» Áö¿øÇÏÁö´Â ¾Ê´Â´Ù. // video¿Í audio inputÀº ¼­·Î ÀÏÄ¡Çϵµ·Ï ÁöÁ¤ÇØÁà¾ß ÇÑ´Ù. STATUS status; CaptureParam *pCapParam; dprint(1, "Dmc_ChangeExtInput(video %d, audio %d, %s)\n", video, audio, bWaitForCompletion ? "wait" : "NoWait"); pCapParam = Dmc_ParamHeapAllocator(sizeof(CaptureParam)); if (pCapParam == NULL) { dprint(0, "!! Dmc_ChangeExtInput: out of memory for CaptureParam\n"); return statusOutOfMemory; } pCapParam->input_video = video; pCapParam->input_audio = audio; status = Dmc_SendCommandEx(cmdExtInputCapture, (UINT32)pCapParam, Dmc_ParamHeapDeallocator, TRUE, // wait for complete NULL, 0, // user callback¶m TRUE); // cancel prev commands // jump to doDmc_CmdExtInputCapture // cafrii 060529 delete. codes are inside SendCommandEx. //if (status) { // // send command¿¡ ¿¡·¯°¡ ¹ß»ýÇϸé ÀÌ command´Â °¨Âʰ°ÀÌ »ç¶óÁ® ¹ö¸° °ÍÀ̹ǷΠ// // allocationÇÑ ¸Þ¸ð¸®´Â ÇØÁ¦ÇÑ ´ÙÀ½ ¸®ÅÏÀ» ÇØ¾ß ÇÑ´Ù. // // // Dmc_ParamHeapDeallocator((UINT32)pCapParam); //} return status; } //---------------------- // Dmc_ChangeProgram // // Digital TS playback ÀÏ °æ¿ì ´Ù¸¥ programÀ» playÇÑ´Ù. // playÇÏ°í ½ÍÀº program number¸¦ ÁöÁ¤ÇÑ´Ù. // invalidµÈ program_number¸¦ ÁöÁ¤Çϸé next programÀ» ¼±ÅÃ. // ¸¸¾à 1 program ¸¸ ÀÖ´Â °æ¿ì¶ó¸é no action.. // STATUS Dmc_ChangeProgram(int program_number, BOOL bWaitForCompletion) { int i; STATUS status; ProgramAVInfo *av; dprint(1, "Dmc_ChangeProgram(prog num %d, wait %d)\n", program_number, bWaitForCompletion); // AVInfo mutex¿Í PSI mutex µÎ°³°¡ µ¿½Ã¿¡ ÇÊ¿äÇѵ¥, // dead-lockÀÇ À§ÇèÀ» ÇÇÇϱâ À§Çؼ­ aVInfo´Â º¹»çÇØ¼­ »ç¿ëÇϰí // psi mutex¸¸ »ç¿ëÇϱâ·Î ÇÑ´Ù. av = Dmc_LockAVMutex(); if (av->active == 0 || av->analog) { dprint(0, "!! ChangeAudio: invalid state! active %d, analog %d\n", av->active, av->analog); status = statusInvalidState; goto label_exit; } // PMT¸¦ ã¾Æ¼­ »õ ÇÁ·Î±×·¥ÀÇ program_number¸¸ °Ç³×ÁØ´Ù. if (program_number <= 0) { // next program mode.. for (i=0; ipat->numPrograms; i++) { if (av->pat->programs[i].program_number == av->program_number) break; } if (i >= av->pat->numPrograms) { dprint(0, "!! ChangeProgram: cannot find current program !\n"); status = statusInvalidPSI; goto label_exit; } if (av->pat->numPrograms < 2) { dprint(0, "\tonly one program exist. no other program !\n"); status = statusNotFound; goto label_exit; } // ´ÙÀ½ ÇÁ·Î±×·¥À» ¼±ÅÃÇÑ´Ù. ¸¶Áö¸·À̸é wrap-around µÈ´Ù. program_number = av->pat->programs[(i+1)%av->pat->numPrograms].program_number; } if (1) { // NIM mode TuneParam param; memset(¶m, 0, sizeof(TuneParam)); param.rf = av->rf; param.type = av->mod; //param.tuneRequired = FALSE; // cafrii 060630 delete param.flag = CTF_PSIOnly; param.progNumber = program_number; dprint(2, " program number %d selected (rf %d, type %d)\n", program_number, param.rf, param.type); // ¹Ø¿¡¼­ tuning ÇÔ¼ö°¡ synchronous modeÀÏ ¼ö Àֱ⠶§¹®¿¡ // lockÀ» Ç®¾îÁà¾ß¸¸ ÇÑ´Ù. // Dmc_UnlockAVMutex(); status = Dmc_ChangeRfChannelByTuneParam(¶m, bWaitForCompletion, NULL, 0); return status; } label_exit: Dmc_UnlockAVMutex(); return status; } #if COMMENT ______ETC_API_______(){} #endif #if 0 STATUS dmc_change_audio_stream(UINT32 param1, UINT32 param2, UINT32 param3) { // this function should be called in DMC task!! // DHL_RESULT dhlResult; STATUS status; // cafrii 070412 change »õ·Ó°Ô º¯°æµÈ DPC ±¸Á¶¿¡ ¸ÂÃã. // UINT32 audioPID = param1; UINT32 pcrPID = param2; tDHL_AudioCodingType audioType = (tDHL_AudioCodingType) param3; DHL_AUD_STREAMTYPE streamType; ProgramAVInfo *av; av = Dmc_LockAVMutex(); if (av->active == 0 || av->analog) { dprint(0, "!! ChangeAudio: invalid state! active %d, analog %d\n", av->active, av->analog); status = statusInvalidState; goto label_end; } streamType = audioType == tDHL_AudioCodingType_AC3 ? DHL_STREAM_AUDIO_AC3 : audioType == tDHL_AudioCodingType_MPEG_2 ? DHL_STREAM_AUDIO_MPEG2 : audioType == tDHL_AudioCodingType_AAC ? DHL_STREAM_AUDIO_AAC : DHL_STREAM_AUDIO_AC3; // default.. if (pcrPID == 0) { dprint(2, " pcrPID 0.. use current pcr %d\n", av->pcr_pid); pcrPID = av->pcr_pid; } dprint(2, " stop current audio..\n"); dhlResult = DHL_AV_AudioStop(); // just continue without error check dprint(2, " restart new audio (%d, %d, 0x%x)..\n", audioPID, pcrPID, streamType); dhlResult = DHL_AV_AudioStart(audioPID, pcrPID, streamType); status = dhlResult ? statusError : statusOK; av->audio_pid = audioPID; // ¿¡·¯°¡ ¹ß»ýÇ߾ pid´Â update¸¦ ÇØÁÖÀÚ.. label_end: Dmc_UnlockAVMutex(); return status; } #else STATUS dmc_change_audio_stream(UINT32 audioPID, UINT32 pcrPID, tDHL_AudioCodingType audioType) { ProgramAVInfo *av; STATUS status; dprint(1, "%s (0x%x 0x%x)\n", __FUNCTION__, audioPID, pcrPID); if (pcrPID == 0) { av = Dmc_LockAVMutex(); dprint(2, " pcrPID 0.. use current pcr %d\n", av->pcr_pid); pcrPID = av->pcr_pid; Dmc_UnlockAVMutex(); } // audio ¸¸ stopÀ» ÇÑ´Ù. video´Â °Çµå¸®¸é ¾ÈµÊ. doDmc_StopDigitalAudio(); // video´Â »©°í audio¸¸ start¸¦ ÇÑ´Ù. status = doDmc_StartDigital(0, /* uVidPID */ audioPID, pcrPID, (DMC_VIDEO_CACHE)0, /* DMC_VIDEO_CACHE vcache */ (tDHL_VideoCodingType)0, audioType); av = Dmc_LockAVMutex(); if (status) { av->audio_pid = 0; } else { av->audio_pid = audioPID; av->audio_type = audioType; av->pcr_pid = pcrPID; } label_end: Dmc_UnlockAVMutex(); return status; } #endif STATUS dmc_change_video_stream(UINT32 videoPID, UINT32 pcrPID, tDHL_VideoCodingType videoType) { ProgramAVInfo *av; STATUS status; dprint(1, "%s (0x%x 0x%x)\n", __FUNCTION__, videoPID, pcrPID); if (pcrPID == 0) { av = Dmc_LockAVMutex(); dprint(2, " pcrPID 0.. use current pcr %d\n", av->pcr_pid); pcrPID = av->pcr_pid; Dmc_UnlockAVMutex(); } // video ¸¸ stopÀ» ÇÑ´Ù. doDmc_StopDigitalVideo(FALSE); // cache¿¡ ÀúÀå ÇÏÁö ¾ÊÀ½.. // video¸¸ start¸¦ ÇÑ´Ù. status = doDmc_StartDigital(videoPID, 0, /* uAudPID */ pcrPID, (DMC_VIDEO_CACHE)0, /* DMC_VIDEO_CACHE vcache */ videoType, (tDHL_AudioCodingType)0 /* tDHL_AudioCodingType */ ); av = Dmc_LockAVMutex(); if (status) { av->video_pid = 0; } else { av->video_pid = videoPID; av->video_type=videoType; av->pcr_pid = pcrPID; } Dmc_UnlockAVMutex(); return status; } STATUS Dmc_ChangeAudioStream(UINT32 audioPID, UINT32 pcrPID, tDHL_AudioCodingType audioType) { // Audio¸¸ ´Ù½Ã ¼±ÅÃÇÏ¿© Àç»ýÇÑ´Ù. // Á÷Á¢ Dmc_Audio API¸¦ ÀÌ¿ëÇØµµ µÇÁö¸¸, ChannelTask¿¡¼­ warpper API¸¦ º°µµ·Î Á¦°øÇÑ´Ù. // // ÀÌ¹Ì digital TS°¡ °¡µ¿ÁßÀ̾î¾ß ÇÑ´Ù. (from NIMÀ̵ç, from 1394µç ±¸º°ÇÏÁö ¾ÊÀ½) // // DmcAudioAPI´Â dmc_tsd ¸¦ ÀÔ·ÂÀ¸·Î Çϴµ¥, dmc_tsd´Â ¸¶Áö¸· tuning API¿¡¼­ // ¼³Á¤µÈ °ÍÀ» ±×´ë·Î »ç¿ëÇÑ´Ù. // PCR PID¸¦ 0À¸·Î ÁöÁ¤ÇÏ¸é ±âÁ¸ PCR PID¸¦ ±×´ë·Î »ç¿ëÇÑ´Ù. (ÀϹÝÀûÀÎ »óȲÀÓ) // audioType Àº ÀϹÝÀûÀ¸·Î AC3 (2)ÀÇ °ªÀ» °¡Áú °ÍÀÌ´Ù. // STATUS status; if (audioPID == 0) return statusInvalidArgument; // Updated by Chjeon 2007.09.07 if (Dmc_IsDmcTask()) { // Caller is DmcTask (Direct Call) status = dmc_change_audio_stream(audioPID, pcrPID, audioType); } else { // Caller is not DmcTask (Deffered Call) status = Dmc_EnqueueDPC((DMC_FN_DPC)dmc_change_audio_stream, audioPID, pcrPID, audioType, 0, FALSE); } return status; } STATUS Dmc_ChangeVideoStream(UINT32 videoPID, UINT32 pcrPID, tDHL_VideoCodingType videoType) { STATUS status; if (videoPID == 0) return statusInvalidArgument; // Updated by Chjeon 2007.09.07 if (Dmc_IsDmcTask()) { // Caller is DmcTask (Direct Call) status = dmc_change_video_stream(videoPID, pcrPID, videoType); } else { // Caller is not DmcTask (Deffered Call) status = Dmc_EnqueueDPC((DMC_FN_DPC)dmc_change_video_stream, videoPID, pcrPID, videoType, 0, FALSE); // Wait Option Ãß°¡ FALSE ±â´Ù¸®Áö ¾Ê´Â´Ù . } return status; } #if COMMENT ______Wrapper_API_______(){} #endif // cafrii 070830 comment // // ÀÌ ÇÔ¼öµéÀº »ç½Ç»ó Channel Tuning ÀÛ¾÷°ú Å« °ü·ÃÀÌ ¾ø´Â ÀÛ¾÷ µéÀÌ´Ù. // // ÀÌ·± ÇÔ¼öÀÇ È£ÃâÀº cancel µ¿ÀÛ¿¡ ¾Ö¸ÅÇÔ¸¸ °¡Áß½Ã۱⠶§¹®¿¡ // °¡´ÉÇϸé HAL ÇÔ¼ö¸¦ Á÷Á¢ »ç¿ëÇϵµ·Ï º¯°æÇÏ´Â °Ô ³´´Ù. // // Channel Tuning Task´Â ¿À·ÎÁö ½Ã°£ÀÌ ¸¹ÀÌ ¼Ò¿äµÇ´Â Channel Tuning ÀÛ¾÷¸¸ Àü´ãÇϵµ·Ï ÇÑ´Ù. // /* Ãâ·Â timing ¼³Á¤ÇÏ´Â API. */ STATUS Dmc_ChangeDisplay(VOUT_COLOR color, VOUT_FORMAT format, VOUT_RATIO ratio, tDHL_DispARC ScrAdj, AuxVideoSetting AuxType) { CmdParam_ChangeDisplay param; STATUS status; param.color = color; param.format = format; param.ratio = ratio; param.adj = ScrAdj; param.aux = AuxType; #if SUPPORT_ETC_API_SYNC status = Dmc_SendCommand(cmdChangeDisplay, (UINT32)¶m, FALSE); // jump to doDmc_CmdChangeDisplay #else // ÇöÀçÀÇ task¿¡¼­ Á÷Á¢ È£Ãâ. status = Dmc_ExecuteCommand(cmdChangeDisplay, (UINT32)¶m, doDmc_CmdChangeDisplay); #endif return status; } /* Ãâ·Â Aspect Ration Adjustment ¼³Á¤/º¯°æ ÇÏ´Â API. ¹Ì¸® Ãâ·Â timing ¼³Á¤ÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. */ STATUS Dmc_ChangeVideoAdjustment(tDHL_DispARC adj_hd, tDHL_DispARC adj_sd) { STATUS status; UINT32 param; dprint(1, "Dmc_VideoAspectRatioAdjustment(%d, %d)\n", adj_hd, adj_sd); param = ((UINT32)adj_sd << 16) | ((UINT32)adj_hd & 0xffff); #if SUPPORT_ETC_API_SYNC // send command with wait mode, not cancel prev commands.. status = Dmc_SendCommand(cmdChangeVideoAdjustment, param, FALSE); // jumpt doDmc_CmdChangeVideoAdjustment #else // ÇöÀçÀÇ task¿¡¼­ Á÷Á¢ È£Ãâ. status = Dmc_ExecuteCommand(cmdChangeVideoAdjustment, param, doDmc_CmdChangeVideoAdjustment); #endif return status; } /* ºñµð¿ÀÀÇ Ãâ·Â È­¸é ¼³Á¤ÇÏ´Â API. Dmc_ChangeVideoAdjustmentÀÇ super set ±â´É. */ STATUS Dmc_AdjustVideoScreen(tDHL_DispARC adj, INT32 x, INT32 y, INT32 w, INT32 h) { STATUS status; CmdParam_AdjustScreen param; dprint(1, "Dmc_AdjustVideoScreen(%d, %d)\n", adj); param.adj = adj; param.x = x; param.y = y; param.w = w; param.h = h; #if SUPPORT_ETC_API_SYNC // send command with wait mode, not cancel prev commands.. status = Dmc_SendCommand(cmdAdjustScreen, (UINT32)¶m, FALSE); // jumpt doDmc_CmdAdjustScreen #else // ÇöÀçÀÇ task¿¡¼­ Á÷Á¢ È£Ãâ. status = Dmc_ExecuteCommand(cmdAdjustScreen, (UINT32)¶m, doDmc_CmdAdjustScreen); #endif return status; } /* ºñµð¿À È­¸éÀÌ ³ª¿À´Â window Å©±â¸¦ º¯°æÇÏ´Â ÇÔ¼ö. */ STATUS Dmc_ResizeVideo(INT32 x, INT32 y, UINT32 w, UINT32 h) { // cafrii 060519 add CmdParam_VideoResize param; STATUS status; param.x = x; param.y = y; param.w = w; param.h = h; #if SUPPORT_ETC_API_SYNC // send command with wait mode, not cancel prev commands.. status = Dmc_SendCommand(cmdVideoResize, (UINT32)¶m, FALSE); // jump to doDmc_CmdVideoResize #else // ÇöÀçÀÇ task¿¡¼­ Á÷Á¢ È£Ãâ. status = Dmc_ExecuteCommand(cmdVideoResize, (UINT32)¶m, doDmc_CmdVideoResize); #endif return status; } STATUS Dmc_FreezeVideo(UINT32 bFreeze, BOOL bWaitComplete) { #if SUPPORT_ETC_API_SYNC // cafrii 070830 do not synchronize dmc task // cafrii 070412 add 'bWaitComplete' arg. // app may want to call hide/show command without pending. // but app should care all possible side-effects when 'No Wait' mode is used. // if (bWaitComplete && !Dmc_IsDmcTask()) { dprint(1, "Dmc_FreezeVideo(%d)\n", bFreeze); return Dmc_EnqueueDPC((DMC_FN_DPC)Dmc_FreezeVideo, (UINT32)bFreeze, FALSE, 0, 0, TRUE); } #endif // SUPPORT_ETC_API_SYNC { DHL_RESULT dhlResult = DHL_OK; dprint(1, "cmdVideoFreeze(%d):\n", bFreeze); dhlResult = DHL_AV_VideoFreeze(0, bFreeze ? TRUE : FALSE); return dhlResult ? statusError : statusOK; } } STATUS Dmc_HideVideo(UINT32 bHide, BOOL bWaitComplete) { #if SUPPORT_ETC_API_SYNC // cafrii 070830 do not synchronize dmc task // cafrii 070412 add 'bWaitComplete' arg. // app may want to call hide/show command without pending. // but app should care all possible side-effects when 'No Wait' mode is used. // if (bWaitComplete && !Dmc_IsDmcTask()) { dprint(1, "Dmc_HideVideo(%d)\n", bHide); return Dmc_EnqueueDPC((DMC_FN_DPC)Dmc_HideVideo, (UINT32)bHide, FALSE, 0, 0, TRUE); } #endif // SUPPORT_ETC_API_SYNC { DHL_RESULT dhlResult = DHL_OK; dprint(1, "cmdVideoHide(%d):\n", bHide); if (bHide) dmc_bRequestVideoHide |= DMC_VIDEO_HIDE_USER; else dmc_bRequestVideoHide &= ~DMC_VIDEO_HIDE_USER; if (1) { ProgramAVInfo *av = Dmc_LockAVMutex(); av->video_hidden = (dmc_bRequestVideoHide & DMC_VIDEO_HIDE_USER) ? TRUE : FALSE; Dmc_UnlockAVMutex(); } dhlResult = DHL_AV_VideoHide(0, dmc_bRequestVideoHide ? TRUE : FALSE); return dhlResult ? statusError : statusOK; } } #if COMMENT ________(){} #endif #if DMW_REGISTER_DEBUG_SYMBOL static DHL_SymbolTable ChannelSymbols[] = { //---- functions DHL_FNC_SYM_ENTRY(Dmc_StopVideo), DHL_FNC_SYM_ENTRY(Dmc_FreezeVideo), DHL_FNC_SYM_ENTRY(Dmc_RestartVideo), DHL_FNC_SYM_ENTRY(Dmc_HideVideo), DHL_FNC_SYM_ENTRY(Dmc_ChangeDisplay), DHL_FNC_SYM_ENTRY(Dmc_ChangeVideoAdjustment), DHL_FNC_SYM_ENTRY(Dmc_ResizeVideo), DHL_FNC_SYM_ENTRY(Dmc_ChangeRfChannelByTuneParam), DHL_FNC_SYM_ENTRY(Dmc_ChangeRfChannel), DHL_FNC_SYM_ENTRY(Dmc_ChangeRfChannel2), DHL_FNC_SYM_ENTRY(Dmc_ChangeExtInput), DHL_FNC_SYM_ENTRY(Dmc_ChangeProgram), DHL_FNC_SYM_ENTRY(Dmc_ChangeAudioStream), //---- variables DHL_VAR_SYM_ENTRY(g_Timeout_SignalLock), DHL_VAR_SYM_ENTRY(g_Timeout_AnalogSignalLock), DHL_VAR_SYM_ENTRY(g_Timeout_VctLoading), DHL_VAR_SYM_ENTRY(g_Timeout_PatLoading), DHL_VAR_SYM_ENTRY(g_Timeout_PmtLoading), //DHL_VAR_SYM_ENTRY(g_Trace_DmcMain), DHL_VAR_SYM_ENTRY(dmc_bTestNoAux), }; #endif // DMW_REGISTER_DEBUG_SYMBOL void Dmc_RegisterChannelSymbols() { #if DMW_REGISTER_DEBUG_SYMBOL DHL_DBG_RegisterSymbols(ChannelSymbols, DHL_NUMSYMBOLS(ChannelSymbols)); RegisterChannelAVSymbols(); RegisterChannelTuneSymbols(); RegisterChannelUtilSymbols(); RegisterChannelScanSymbols(); #endif } /************************************************************************** 2.26 2005/4/4 Dmc_Init¿¡¼­ Demux start Ãß°¡ 2.25 2005/3/22 Dmc_IsDmcTask Ãß°¡ dmc_TaskID ÀÇ const specifier »èÁ¦ 2.24 2005/3/15 ParseXXX API »ç¿ë ÈÄ ¿¡·¯ ¸®ÅÏÇÏ¸é ¹Ýµå½Ã pointer NULL ¼³Á¤Çϵµ·Ï ¼öÁ¤ MonitorPMTÀÇ pid°ª validity üũ NtscFreqOffset->freqOffset À̸§ º¯°æ 2.23 2005/2/21 ProcessTimingChange ¿¡¼­ source/display wide¸¦ ±¸ºÐÇØ¼­ Àû¿ë 2.22 2005/1/26 DigitalCable Æ©´×½Ã ¸ðµç modulation¿¡ g_Timeout_SignalLock Àû¿ë 2.21 2005/1/24 ReportCaPmt in NTSC, dmc_bRequestVideoWidthReduction °ü·Ã ÃʱⰪ ÁöÁ¤ 2.20 2005/01/19 Tning½Ã Modulation ÀÚµ¿ °Ë»ö ±â´É Ãß°¡ 2.19 2004/12/01 PmtChange ¿¡µµ DHL_AV_ReportPmtChange Ãß°¡ ´Ü PodActiveMode ¿¡¼­¸¸ È£ÃâÇϵµ·Ï ÇÔ. tuner set ÈÄ ¼º°øÀ̸é DHL_AV_ReportTunerStatus Àü¼Û Pod ¸ðµå¿¡¼­ PSI·Î¸¸ Æ©´×Çϵµ·Ï ¼öÁ¤ CTF_SkipPrescanPidInfo Á¶°Ç Ãß°¡ doDmc_MakeAppBannerPararm ¿¡ program_number Ãß°¡ 2.18 2004/11/11 AppBannerParam ¿¡¼­ type field Ãß°¡ 2.17 2004/11/10 PID tuning¿¡¼­ StartDigitalÀÌ cancel µÈ °æ¿ì ó¸® Ãß°¡ 2.16 2004/11/5 Dmc_PrintVideoFormat debug level Ãß°¡ 2.15 2004/11/4 Dmc_ChangeRfChannel ¿¡¼­ digital cableÀ̸é modulation autodetect ¸ðµå analog RfTune/video restart ¿¡¼­ freeze Àû¿ë 2.14 2004/11/3 audio only ä³Î¿¡¼­ AddProgramFlattenInfo ÇÏÁö ¾ÊÀ½, pcr pid update Dmc_PrintProgramInfo ¿¡¼­ dbg level Àμö Ãß°¡ 2.13 2004/9/20 DMW_Config µµÀÔ, config »çÇ× À̵¿ 2.12 2004/9/10 cancel id °ü·Ã µð¹ö±× ¸Þ½ÃÁö¸¦ Ãß°¡ Dmc_RegisterPodActivityReporter Ãß°¡ 2.11 2004/9/03 Video width reduction ÇÔ¼ö/º¯¼ö Ãß°¡ IsWideDisplay api Ãß°¡ ChangeDisplayEx ¿¡¼­ wide ÀÎÀÚ »ç¿ëÇÏÁö ¾ÊÀ½ 2.10 2004/8/30 ChannelAPI Çì´õ ºÐ¸®, Channel.h ¿¡ HAL, ChannelType µîÀÇ º¯¼ö Ãß°¡ 2.09 2004/7/26 send_command¿¡¼­ OS_LockTask/OS_UnlockTask Ãß°¡ 2.08 2004/7/23 debug print categorization 2.07 2004/7/21 comment update, restructuring of CmdParam_xxx 2.06 2004/7/8 smart video freeze, selective audio play bugfix deferred video adjustment 2.05 2004/6/16 xVCT,PSI¿¡¼­ selectAudioStream¿¡ audio type Ãß°¡, audType display bugfix ChangeAudioStream, PlayNextAudio Ãß°¡ _Dmc_DecodeStopCallback ±¸ÇöÇϰí StopDigitalVideoCtx¿¡¼­ À̸¦ ºÒ·¯ÁÜ 2.04 2004/06/04 tuningÇÒ¶§ selectAudioStream ÀÌÈÄ pid°¡ À¯È¿ÇÑÁö üũÇÑ ÈÄ ¿¡·¯Ã³¸® 2.03 2004/06/03 _dmc_PatEventProc¿¡¼­ dmc_pmtPsiCtl üũ 2.02 2004/06/01 Dmc_EnqueueDPC API Ãß°¡ 2.01 2004/05/31 statusDmcQFull üũ Ãß°¡ 2.0 2004/05/28 send_command ½ÇÆÐÇÒ °æ¿ì ¸®¼Ò½º ´©¼ö ¹®Á¦ ¼öÁ¤ tunecallback¿¡ userparam Ãß°¡ 1.4 2004/01/12 SLD ¾ø´Â VCTÀÏ °æ¿ì PSI ¿ìȸ ó¸® ±â´É Ãß°¡ , #SupportVCTWithoutSLD 1.3 2003/12/31 AppBannerÁö¿ø, CTF_SemiAutomatic Ãß°¡ 1.2 2003/12/30 »õ·Î¿î PCE Tuning PolicyÀû¿ë. CTF_RetryMainChannel Ãß°¡ 1.1 2003/12/05 ¿¡·¯ ¹ß»ý½Ã retry¸¦ ÇÒ ¼ö ÀÖµµ·Ï Ç÷¡±× Ãß°¡ 1.0 2003/11/27 remove all VideoFlatten feature (do not use anymore) support 1394 by default (remove SUPPORT_1394_INPUT) * **************************************************************************/