如题,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,©1D,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?
TI中文支持网

