This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

达芬奇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 !!!

  • 另外,发送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;
    }



  • Tony,

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

    会不会和cache相关?

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

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

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

  • 提示错误发生在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?