|

楼主 |
发表于 2018-12-28 19:46:49
|
显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:05 编辑
- static int AF_PIPCombineFrame(VIDEO_FRAME_INFO_S *pstFrameDst, VIDEO_FRAME_INFO_S *pstFrameSrc)
- {
- if (pstFrameDst == NULL || pstFrameSrc == NULL)
- return -1;
- int nStartX = 0;
- int nStartY = pstFrameDst->stVFrame.u32Height - pstFrameSrc->stVFrame.u32Height;
- int i = 0;
- // YUV 420SP
- for (i = 0; i < pstFrameSrc->stVFrame.u32Height; i++)
- {
- int nY = i + nStartY;
- // Y分量
- void *pDst = pstFrameDst->stVFrame.pVirAddr[0] + (nY * pstFrameDst->stVFrame.u32Stride[0]) + nStartX;
- void *pSrc = pstFrameSrc->stVFrame.pVirAddr[0] + (i * pstFrameSrc->stVFrame.u32Stride[0]);
- memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0]);
-
- // UV分量
- if ((i % 2) == 0)
- {
- pDst = pstFrameDst->stVFrame.pVirAddr[0] + (pstFrameDst->stVFrame.u32Height * pstFrameDst->stVFrame.u32Stride[0]) + ((nY * pstFrameDst->stVFrame.u32Stride[0]) + nStartX) / 2;
- pSrc = pstFrameSrc->stVFrame.pVirAddr[0] + (pstFrameSrc->stVFrame.u32Height * pstFrameSrc->stVFrame.u32Stride[0]) + (i * pstFrameSrc->stVFrame.u32Stride[0]) / 2;
- memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0] / 2);
- }
- }
- return 0;
- }
- static void *AF_PIPThread(void *p)
- {
- AF_PIPThreadParam *pstPara = (AF_PIPThreadParam*)p;
- VENC_CHN VencChn = pstPara->nVencCh;
- VPSS_GRP nVpssGrpMain = pstPara->nVpssGrpMain;
- VPSS_CHN nVpssChMain = pstPara->nVpssChMain;
- VPSS_GRP nVpssGrpSub = pstPara->nVpssGrpSub;
- VPSS_CHN nVpssChSub = pstPara->nVpssChSub;
-
- VIDEO_FRAME_INFO_S stFrameMain;
- VIDEO_FRAME_INFO_S stFrameSub;
- VIDEO_FRAME_INFO_S stFramePIP;
- VB_BLK VbBlk = VB_INVALID_HANDLE;
- while (HI_TRUE == pstPara->bThreadRun) {
- memset(&stFrameMain, 0, sizeof(stFrameMain));
- memset(&stFrameSub, 0, sizeof(stFrameSub));
- memset(&stFramePIP, 0, sizeof(stFramePIP));
-
- // printf("nVpssGrpMain %d nVpssChMain %d nVpssGrpSub %d nVpssChSub %d, VencChn %d\n", nVpssGrpMain, nVpssChMain, nVpssGrpSub, nVpssChSub, VencChn);
-
- HI_S32 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain, -1);
- if (HI_SUCCESS != s32Ret) {
- printf("HI_MPI_VPSS_GetChnFrame failed s32ret[%#x]\n", s32Ret);
- break;
- }
-
- s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub, -1);
- if (HI_SUCCESS != s32Ret) {
- printf("HI_MPI_VPSS_GetChnFrame failed s32ret[%#x]\n", s32Ret);
- break;
- }
- do {
- VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2, NULL);
- } while (VB_INVALID_HANDLE == VbBlk);
- VB_POOL poolID = HI_MPI_VB_Handle2PoolId(VbBlk);
- stFramePIP.stVFrame.u32PhyAddr[0] = HI_MPI_VB_Handle2PhysAddr(VbBlk);
- if (stFramePIP.stVFrame.u32PhyAddr[0] == 0) {
- printf("HI_MPI_VB_Handle2PhysAddr for VbBlk failed\n");
- break;
- }
- stFramePIP.u32PoolId = poolID;
- stFramePIP.stVFrame.u32Width = stFrameMain.stVFrame.u32Width;
- stFramePIP.stVFrame.u32Height = stFrameMain.stVFrame.u32Height;
- stFramePIP.stVFrame.u32Field = stFrameMain.stVFrame.u32Field;
- stFramePIP.stVFrame.enPixelFormat = stFrameMain.stVFrame.enPixelFormat;
- stFramePIP.stVFrame.enVideoFormat = stFrameMain.stVFrame.enVideoFormat;
- stFramePIP.stVFrame.enCompressMode = stFrameMain.stVFrame.enCompressMode;
- stFramePIP.stVFrame.pVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFramePIP.stVFrame.u32PhyAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
- stFramePIP.stVFrame.pVirAddr[1] = stFramePIP.stVFrame.pVirAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
- // stFramePIP.stVFrame.pVirAddr[2] = stFramePIP.stVFrame.pVirAddr[1];
- stFramePIP.stVFrame.u32Stride[0] = stFrameMain.stVFrame.u32Stride[0];
- stFramePIP.stVFrame.u32Stride[1] = stFrameMain.stVFrame.u32Stride[1];
- stFramePIP.stVFrame.u32Stride[2] = stFrameMain.stVFrame.u32Stride[2];
- // stFramePIP.stVFrame.u32HeaderPhyAddr[0];
- // stFramePIP.stVFrame.u32HeaderPhyAddr[1];
- // stFramePIP.stVFrame.u32HeaderPhyAddr[2];
- // stFramePIP.stVFrame.pHeaderVirAddr[0];
- // stFramePIP.stVFrame.pHeaderVirAddr[1];
- // stFramePIP.stVFrame.pHeaderVirAddr[2];
- // stFramePIP.stVFrame.u32HeaderStride[0];
- // stFramePIP.stVFrame.u32HeaderStride[1];
- // stFramePIP.stVFrame.u32HeaderStride[2];
- stFramePIP.stVFrame.s16OffsetTop = stFrameMain.stVFrame.s16OffsetTop;
- stFramePIP.stVFrame.s16OffsetBottom = stFrameMain.stVFrame.s16OffsetBottom;
- stFramePIP.stVFrame.s16OffsetLeft = stFrameMain.stVFrame.s16OffsetLeft;
- stFramePIP.stVFrame.s16OffsetRight = stFrameMain.stVFrame.s16OffsetRight;
-
- stFramePIP.stVFrame.u64pts = stFrameMain.stVFrame.u64pts;
- stFramePIP.stVFrame.u32TimeRef = stFrameMain.stVFrame.u32TimeRef;
- // stFramePIP.stVFrame.u32PrivateData;
- // stFramePIP.stVFrame.stSupplement;
- stFrameMain.stVFrame.pVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFrameMain.stVFrame.u32PhyAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
- stFrameSub.stVFrame.pVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFrameSub.stVFrame.u32PhyAddr[0], stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height * 3 / 2);
- memcpy(stFramePIP.stVFrame.pVirAddr[0], stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
- AF_PIPCombineFrame(&stFramePIP, &stFrameSub);
- // s32Ret = HI_MPI_VENC_SendFrame(VencChn, &stFramePIP, -1);
- s32Ret = HI_MPI_VENC_SendFrame(5, &stFramePIP, -1);
- if (HI_SUCCESS != s32Ret) {
- printf("HI_MPI_VENC_SendFrame VencChn %d failed s32ret[%#x]\n", VencChn, s32Ret);
- // break;
- }
- HI_MPI_SYS_Munmap(stFramePIP.stVFrame.pVirAddr[0], stFramePIP.stVFrame.u32Stride[0] * stFramePIP.stVFrame.u32Height * 3 / 2);
- HI_MPI_SYS_Munmap(stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
- HI_MPI_SYS_Munmap(stFrameSub.stVFrame.pVirAddr[0], stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height * 3 / 2);
- s32Ret = HI_MPI_VB_ReleaseBlock(VbBlk);
- if (HI_SUCCESS != s32Ret) {
- printf("vb release block failed![%#x]\n", s32Ret);
- break;
- }
- HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub);
- HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain);
- pthread_mutex_lock(&pstPara->atrrMutex);
- nVpssGrpMain = pstPara->nVpssGrpMain;
- nVpssChMain = pstPara->nVpssChMain;
- nVpssGrpSub = pstPara->nVpssGrpSub;
- nVpssChSub = pstPara->nVpssChSub;
- pthread_mutex_unlock(&pstPara->atrrMutex);
- }
- return NULL;
- }
复制代码
// ----------------------------------------------------------------
// 如题,
// 数据都是YUV420SP的,stFrameMain.stVFrame.u32Stride[0] = 1920; stFrameMain.stVFrame.u32Height = 1080;
// stFrameSub.stVFrame.u32Stride[0] = 640; stFrameSub.stVFrame.u32Height = 360;
// s32Ret = HI_MPI_VENC_SendFrame(5, &stFramePIP, -1);报错0xa0088003
// 修改为s32Ret = HI_MPI_VENC_SendFrame(5, &stFrameMain, -1);编码正常
// 不太清楚哪里出现问题,求大神指点下 |
|