status_t task_daemon_init(osa_console_object_t *pobj) { int i; status_t status = OSA_SOK; status |= dlist_init(&pobj->m_cmds_list); //for (i = 0; i < OSA_ARRAYSIZE(glb_module_cmds); i++) { for (i = 0; i < OSA_ARRAYSIZE(glb_vcs_cmds); i++) { status |= dlist_initialize_element((dlist_element_t *)&glb_vcs_cmds[i]); status |= dlist_put_tail(&pobj->m_cmds_list, (dlist_element_t *)&glb_vcs_cmds[i]); } snprintf((char *)pobj->m_name, sizeof(pobj->m_name), "%s", "MAIN_TSK"); pobj->m_task_obj.m_name = (unsigned char *)pobj->m_name; pobj->m_task_obj.m_main = NULL; pobj->m_task_obj.m_find = __osa_console_cmd_find; pobj->m_task_obj.m_pri = 0; pobj->m_task_obj.m_stack_size = 0; pobj->m_task_obj.m_init_state = 0; pobj->m_task_obj.m_userdata = (void *)pobj; pobj->m_task_obj.m_task = TASK_INVALID_TSK; status = task_mgr_register(&pobj->m_task_obj); status = osa_console_init(NULL); return status; }
static Void Vdec_copyChannelInfo(VIDEO_CHANNEL_LIST_INFO_S *dst, System_LinkQueInfo *src) { Int i; OSA_COMPILETIME_ASSERT(OSA_ARRAYSIZE(src->chInfo) == OSA_ARRAYSIZE(dst->chInfo)); OSA_assert(src->numCh <= OSA_ARRAYSIZE(src->chInfo)); dst->numCh = src->numCh; for (i = 0; i < src->numCh; i++) { dst->chInfo[i].width = src->chInfo[i].width; dst->chInfo[i].height = src->chInfo[i].height; } }
static Void VdecVdis_ipcFramesFillBufInfo(VIDEO_FRAMEBUF_LIST_S *bufList, VdecVdis_IpcFramesBufObj frameObj[], UInt32 numFrames) { Int i,j; bufList->numFrames = 0; for (i = 0; i < numFrames;i++) { if (frameObj[i].refCnt == 0) { /* Send the same buffer to all enabled channels */ for (j = 0; j < frameObj[i].numCh; j++) { if (bufList->numFrames >= OSA_ARRAYSIZE(bufList->frames)) { OSA_assert(bufList->numFrames == OSA_ARRAYSIZE(bufList->frames)); break; } bufList->frames[bufList->numFrames].addr[0][0] = frameObj[i].bufVirt; bufList->frames[bufList->numFrames].phyAddr[0][0] = (Ptr)frameObj[i].bufPhy; bufList->frames[bufList->numFrames].frameWidth = frameObj[i].curWidth; bufList->frames[bufList->numFrames].frameHeight = frameObj[i].curHeight; bufList->frames[bufList->numFrames].fid = VIDEO_FID_TYPE_FRAME; bufList->frames[bufList->numFrames].channelNum = j; bufList->frames[bufList->numFrames].timeStamp = 0; bufList->numFrames++; } frameObj[i].refCnt += bufList->numFrames; } } }
status_t thread_create(thread_t *pthd, Fxn fxn, thread_attrs_t * attrs, ...) { int i; va_list va; status_t status = OSA_SOK; struct __thread_t * thd = NULL; thread_check_arguments2(pthd, fxn); (*pthd) = INVALID_HANDLE; status = OSA_memAlloc(sizeof(struct __thread_t), &thd); if (OSA_ISERROR(status) || thd == NULL) { return status; } thd->pri = attrs->priority; /* * TODO: Bug here, the attrs variable may be exist at stack, * the thd_hdl->name pointer may be invalid soon. */ thd->name = attrs->name; thd->env = attrs->environ; thd->fxn = fxn; thd->thd_status = -1; thd->exit_status = -1; /* Copy up to 'THREAD_MAX_ARGS' arguments from task */ va_start(va, attrs); for (i = 0; i < OSA_ARRAYSIZE(thd->args); i++) { thd->args[i] = va_arg(va, Arg); } va_end(va); /* Create a realtime detached thread */ pthread_attr_init(&thd->pattrs); pthread_attr_setdetachstate(&thd->pattrs, PTHREAD_CREATE_DETACHED); thd->thd_status = pthread_create(&thd->thd_id, &thd->pattrs, (void * (*)(void *))__thread_run_stub, (void *)thd); if (thd->thd_status != 0) { thread_delete((thread_t *)&thd); } (*pthd) = (thread_t)thd; return status; }
static Void * VdecVdis_ipcFramesSendFxn(Void * prm) { VdecVdis_IpcFramesCtrl *ipcFramesObj = (VdecVdis_IpcFramesCtrl *) prm; VdecVdis_IpcFramesCtrlThrObj *thrObj = &ipcFramesObj->thrObj; static Int printStatsInterval = 0; VIDEO_FRAMEBUF_LIST_S bufList; Int status; OSA_printf("MCFW_IPCFRAMES:%s:Entered...",__func__); OSA_semWait(&thrObj->thrStartSem,OSA_TIMEOUT_FOREVER); OSA_printf("MCFW_IPCFRAMES:Received start signal..."); while (FALSE == thrObj->exitFramesOutThread) { VdecVdis_ipcFramesFillBufInfo(&bufList, ipcFramesObj->frameObj, OSA_ARRAYSIZE(ipcFramesObj->frameObj)); if (bufList.numFrames) { status = Vdis_putFullVideoFrames(&bufList); OSA_assert(0 == status); } status = Vdis_getEmptyVideoFrames(&bufList,0); OSA_assert(0 == status); if (bufList.numFrames) { VdecVdis_ipcFramesPrintFullFrameListInfo(&bufList,"EmptyFrameList"); VdecVdis_ipcFramesFreeFrameBuf(&bufList, ipcFramesObj->frameObj, OSA_ARRAYSIZE(ipcFramesObj->frameObj)); } printStatsInterval++; OSA_waitMsecs(MCFW_IPCFRAMES_SENDFXN_PERIOD_MS); } OSA_printf("MCFW_IPCFRAMES:%s:Leaving...",__func__); return NULL; }
static Void VcapVencVdecVdis_FreeBitBufFree(VCODEC_BITSBUF_S * bitBufInfo) { Int entryIndex; struct VcapVencVdecVdis_FreeBitBufInfoEntry * entry = NULL; OSA_mutexLock(&g_FreeBitBufInfoTbl.mutex); entryIndex = VcapVencVdecVdis_FreeBitBufGetIndex(bitBufInfo); OSA_assert((entryIndex >= 0) && (entryIndex < OSA_ARRAYSIZE(g_FreeBitBufInfoTbl.tbl))); entry = &g_FreeBitBufInfoTbl.tbl[entryIndex]; entry->nextFreeIndex = g_FreeBitBufInfoTbl.freeIndex; g_FreeBitBufInfoTbl.freeIndex = entryIndex; OSA_mutexUnlock(&g_FreeBitBufInfoTbl.mutex); }
static Void VcapVencVdecVdis_FreeBitBufDeInit() { Int status,i; status = OSA_mutexDelete(&g_FreeBitBufInfoTbl.mutex); OSA_assert(status == OSA_SOK); for (i = 0; i < (OSA_ARRAYSIZE(g_FreeBitBufInfoTbl.tbl) - 1);i++) { g_FreeBitBufInfoTbl.tbl[i].nextFreeIndex = (i + 1); } g_FreeBitBufInfoTbl.tbl[i].nextFreeIndex = APP_IPCBITSCTRL_FREE_BITBUFINFO_INVALIDID; g_FreeBitBufInfoTbl.freeIndex = 0; }
static VCODEC_BITSBUF_S * VcapVencVdecVdis_FreeBitBufAlloc() { VCODEC_BITSBUF_S *freeBitBufInfo = NULL; struct VcapVencVdecVdis_FreeBitBufInfoEntry * entry = NULL; OSA_mutexLock(&g_FreeBitBufInfoTbl.mutex); OSA_assert((g_FreeBitBufInfoTbl.freeIndex != APP_IPCBITSCTRL_FREE_BITBUFINFO_INVALIDID) && (g_FreeBitBufInfoTbl.freeIndex < OSA_ARRAYSIZE(g_FreeBitBufInfoTbl.tbl))); entry = &g_FreeBitBufInfoTbl.tbl[g_FreeBitBufInfoTbl.freeIndex]; g_FreeBitBufInfoTbl.freeIndex = entry->nextFreeIndex; entry->nextFreeIndex = APP_IPCBITSCTRL_FREE_BITBUFINFO_INVALIDID; freeBitBufInfo = &entry->bitBuf; OSA_mutexUnlock(&g_FreeBitBufInfoTbl.mutex); return freeBitBufInfo; }