예제 #1
0
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;
}
예제 #2
0
파일: ti_vdec.c 프로젝트: sdut10523/dvr_rdk
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;
    }
}
예제 #3
0
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;
        }
    }
}
예제 #4
0
파일: thread.c 프로젝트: xiongkaifang/osa
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;
}
예제 #5
0
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;
}