TI中文支持网
TI专业的中文技术问题搜集分享网站

达芬奇A8传递数据给M3时BUFSTATE改变?

如题,A8在传递h264视频文件时,发送的状态为2(即IPC_BITBUF_STATE_OUTQUE),但VIDEOM3接收到时判断得到的状态为3(即IPC_BITBUF_STATE_INQUE),导致ASSERTION报错,为什么BUFSTATE会改变?

下面是具体提示:

[host] ###chenh<encdec>>> IpcBitsOutLink_putFullBufs sending notify to 268435486,NOW STATE is :0x00000002
 [m3video] NOW GET BUF STATE IS : 3
 [m3video]  15715: Assertion @ Line: 292 in links_common/ipcBitsIn/ipcBitsInLink_tsk.c: SYSTEM_IPC_BITS_GET_BUFSTATE(pListElem->bufState) == IPC_BITBUF_STATE_OUTQUE : failed !!!

tony gan:

另外,发送h264文件时,IpcBitsOutLink_getEmptyVideoBitStreamBufs(gIpcBitsOutHLOSId,&emptyBitsBufList,&ipcReqInfo)中的ipcReqInfo参数如何确定?emptyBitsBufList要怎么修改参数才能把h264文件发送给VIDEOM3?下面是我现在的h264发送线程(h264的分辨率时1280×738):

void *encdec_main(void *prm){    UInt32 i;    OSA_DmaCopy1D copy1D;    Bitstream_BufList fullBitsBufList;    Bitstream_BufList emptyBitsBufList;    IpcBitsOutLinkHLOS_BitstreamBufReqInfo ipcReqInfo;    OSA_printf("Entered IPC Bits Handler function\n");    gIpcBitsThObj.exitTh   = FALSE;    gIpcBitsThObj.exitDone = FALSE;    FILE *file;    unsigned int x, j, k;    int framesize = 0;     int tempframesize = 0;     int retValue = 0;     int stream[944688];    int *Strptr;    int new_nal = 1;     unsigned int Total = 0;     unsigned int bufferlen = 1280*738;//10000;    char filename[]="in.h264";    sleep(8);    System_linkStart(gIpcBitsOutHLOSId);    sleep(1);    ipcReqInfo.numBufs = 1;     ipcReqInfo.minBufSize[0] = bufferlen;    while(1)    {            file = fopen(filename, "rb");        if (file == NULL)        {            OSA_printf("Error: can't open Input file.\n");            exit(1);        }        else        {            OSA_printf("Input File opened successfully.\n");        }        x = getc(file);        while(x != EOF)         {            stream[j++] = x;             if (j >= bufferlen)            {                OSA_printf("###chenh<encdec>>> Buffer is full….");                //BUFLEN满,发送                if(IpcBitsOutLink_getEmptyVideoBitStreamBufs(gIpcBitsOutHLOSId,&emptyBitsBufList,&ipcReqInfo) == IPC_BITSOUT_LINK_S_SUCCESS)                {                    emptyBitsBufList.numBufs = 1;                    for(i = 0;i < emptyBitsBufList.numBufs;i++)                    {                        if((Int32)emptyBitsBufList.bufs[i]->addr & 0x80000000)                        {                            OSA_printf("\n###chenh<encdec>>> skipping…\n");                            goto skip;                        }                        emptyBitsBufList.bufs[i]->fillLength=bufferlen;                        emptyBitsBufList.bufs[i]->channelNum = 1;                        emptyBitsBufList.bufs[i]->timeStamp  = 0;                        if(encdecDmaHndl.chId == 0xFF)                        {                            OSA_printf("###chenh<encdec>>> MEM COPYING…");                            memcpy(emptyBitsBufList.bufs[i]->addr,                                    stream,//(fullBitsBufList.bufs[i]->addr + fullBitsBufList.bufs[i]->startOffset),                                    emptyBitsBufList.bufs[i]->fillLength);                        }                        else                        {                            OSA_printf("###chenh<encdec>>> DMA COPYING…");                            copy1D.srcPhysAddr = (unsigned long)CMEM_getPhys(stream);//fullBitsBufList.bufs[i]->addr + fullBitsBufList.bufs[i]-        >startOffset);                            copy1D.dstPhysAddr = (unsigned long)CMEM_getPhys(emptyBitsBufList.bufs[i]->addr);                            copy1D.size        = emptyBitsBufList.bufs[i]->fillLength;                            OSA_dmaCopy1D(&encdecDmaHndl,&copy1D,1);                        }                    }                    IpcBitsOutLink_putFullVideoBitStreamBufs(gIpcBitsOutHLOSId,&emptyBitsBufList);                }skip:                IpcBitsInLink_putEmptyVideoBitStreamBufs(gIpcBitsInHLOSId,&emptyBitsBufList);                sleep(1);                j=0;            }            x = getc(file);        }        bufferlen = i;        //TODO:发送剩余数据        fclose(file);        sleep(5);    }    gIpcBitsThObj.exitDone = TRUE;    OSA_printf("Exiting IPC Bits Handler function\n");    return NULL;}

Chris Meng:

Tony,

你有修改过memory map/bld/cache相关的部分?

会不会和cache相关?

tony gan:

回复 Chris Meng:

你好Chris Meng,我没有修改过cache,状态改变的问题找到了,是发送完成后多加了一句IpcBitsInLink_putEmptyVideoBitStreamBufs(gIpcBitsInHLOSId,&emptyBitsBufList);

删掉之后状态就正常来~不过,出现了其它问题:

[m3video]  15495: Assertion @ Line: 1312 in links_m3video/iva_dec/decLink_common.c: status == FVID2_SOK : failed !!!

tony gan:

回复 Chris Meng:

提示错误发生在Utils_quePut()函数里,我加了打印信息:

Int32 Utils_quePut(Utils_QueHandle * handle, Ptr data, Int32 timeout){    Int32 status = -1;                                     /* init status to                                                            * error */    UInt32 cookie;    do    {        cookie = Hwi_disable();        if (handle->count < handle->maxElements)        {            handle->queue[handle->curWr] = data;            handle->curWr = (handle->curWr + 1) % handle->maxElements;            handle->count++;            Hwi_restore(cookie);            status = 0;            if (handle->flags & UTILS_QUE_FLAG_BLOCK_QUE_GET)            {                Semaphore_post(handle->semRd);            }            break;        }        else        {            Vps_printf("###chenh<encdec>>> %s:que is full,request %d >= max %d",__func__,handle->count,handle->maxElements);            Hwi_restore(cookie);            if (timeout == BIOS_NO_WAIT)                break;                                                 if (handle->flags & UTILS_QUE_FLAG_BLOCK_QUE_PUT)            {                Bool semPendStatus;               handle->blockedOnPut = TRUE;                semPendStatus = Semaphore_pend(handle->semWr, timeout);                handle->blockedOnPut = FALSE;                if (!semPendStatus || handle->forceUnblockPut)                {                    handle->forceUnblockPut = FALSE;                    break;                                                 }            }            else            {                break;            }        }    }    while (1);    return status;}然后,日志输出:

[m3video] NOW GET BUF STATE IS : 2 [m3video] ###chenh>>>Utils_tskFlushMsg[in utils/src/utils_tsk.c] get cmd:4 [m3video] ###chenh>>>DecLink_tskMain[in links_m3video/iva_dec/decLink_tsk.c] get cmd:4 [m3video] ###chenh<encdec>>> Utils_quePut:que is full,request 0 >= max 0 [m3video]  15495: Assertion @ Line: 1312 in links_m3video/iva_dec/decLink_common.c: status == FVID2_SOK : failed !!! [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/ipcBitsInLink_tsk.c] get cmd:4 [host] ###chenh<encdec>>> Buffer is full…. [host] ###chenh<encdec>>> IpcBitsOutLink_getEmptyVideoBitStreamBufs run to 1067 [host] ###chenh<encdec>>> Requested for buf size:944640 [host] ###chenh<encdec>>> DMA COPYING… [host] ###chenh<encdec>>> IpcBitsOutLink_putFullBufs sending notify to 268435486,NOW STATE is :0x00000002 [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/i4 [m3video] NOW GET BUF STATE IS : 2 [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/ipcBitsInLink_tsk.c] get cmd:4 [host] ###chenh<encdec>>> Buffer is full…. [host] ###chenh<encdec>>> IpcBitsOutLink_getEmptyVideoBitStreamBufs run to 1067 [host] ###chenh<encdec>>> Requested for buf size:944640 [host] ###chenh<encdec>>> DMA COPYING… [host] ###chenh<encdec>>> IpcBitsOutLink_putFullBufs sending notify to 268435486,NOW STATE is :0x00000002 [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/i4 [m3video] NOW GET BUF STATE IS : 2 [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/ipcBitsInLink_tsk.c] get cmd:4 [host] ###chenh<encdec>>> Buffer is full…. [host] ###chenh<encdec>>> IpcBitsOutLink_getEmptyVideoBitStreamBufs run to 1067 [host] ###chenh<encdec>>> Requested for buf size:944640 [host] ###chenh<encdec>>> DMA COPYING… [host] ###chenh<encdec>>> IpcBitsOutLink_putFullBufs sending notify to 268435486,NOW STATE is :0x00000002 [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/i4 [m3video] NOW GET BUF STATE IS : 2 [m3video] ###chenh>>>IpcBitsInLink_tskMain[in links_common/ipcBitsIn/ipcBitsInLink_tsk.c] get cmd:4 [m3video] ###chenh<encdec>>> Utils_quePut:que is full,request 1024 >= max 1024 [m3video] ###chenh<encdec>>> Utils_quePut:que is full,request 1024 >= max 1024 [m3video] ###chenh<encdec>>> Utils_quePut:que is full,request 1024 >= max 1024 [m3video] ###chenh<encdec>>> Utils_quePut:que is full,request 1024 >= max 1024

提示que is full,可为什么第一次提示时最大元素个数是0?

赞(0)
未经允许不得转载:TI中文支持网 » 达芬奇A8传递数据给M3时BUFSTATE改变?
分享到: 更多 (0)