查看: 11819|回复: 40

[视频处理] 【已实现】两路sensor图像叠加编码

    [复制链接]
发表于 2018-12-27 18:44:15 | 显示全部楼层 |阅读模式
本帖最后由 qn1540561804 于 2019-4-12 11:20 编辑

如题,hi3519接入可见和红外摄像头,怎么实现两幅图像透明叠加成一幅图?

谢谢

补充内容 (2018-12-29 14:13):
红外光640*480,可见光1080P
第一步,数据覆盖;
第二步,半透明叠加。

补充内容 (2019-1-22 10:35):
代码实现见16楼的附件
 楼主| 发表于 2019-1-22 10:08:46 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-1-22 10:34 编辑
gongyounan 发表于 2019-1-21 17:54
牛啊!   楼主做下来 有多少帧啊


使用memcpy的方式只有5帧;
缩放使用VGS,数据搬移和透明叠加使用IVE实现之后,25帧没有问题;
需要注意的是缩放超过8192的问题,可以先抠图再缩放
代码实现见附件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-1-7 16:04:12 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:11 编辑

缩放使用VGS,数据搬移和透明叠加使用IVE实现
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2018-12-27 21:04:24 | 显示全部楼层
本帖最后由 qn1540561804 于 2018-12-27 21:05 编辑

各自从VPSS ch取帧,合并成一帧,然后送venc编码?
发表于 2018-12-27 21:56:34 | 显示全部楼层
融合,这个一般不好做啊
 楼主| 发表于 2018-12-28 10:39:19 | 显示全部楼层
顶一下,别沉
 楼主| 发表于 2018-12-28 19:46:49 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:05 编辑
  1. static int AF_PIPCombineFrame(VIDEO_FRAME_INFO_S *pstFrameDst, VIDEO_FRAME_INFO_S *pstFrameSrc)
  2. {
  3.         if (pstFrameDst == NULL || pstFrameSrc == NULL)
  4.                 return -1;

  5.         int nStartX = 0;
  6.         int nStartY = pstFrameDst->stVFrame.u32Height - pstFrameSrc->stVFrame.u32Height;
  7.         int i = 0;
  8.         // YUV 420SP
  9.         for (i = 0; i < pstFrameSrc->stVFrame.u32Height; i++)
  10.         {
  11.                 int nY = i + nStartY;
  12.                 // Y分量
  13.                 void *pDst = pstFrameDst->stVFrame.pVirAddr[0] + (nY * pstFrameDst->stVFrame.u32Stride[0]) + nStartX;
  14.                 void *pSrc = pstFrameSrc->stVFrame.pVirAddr[0] + (i * pstFrameSrc->stVFrame.u32Stride[0]);
  15.                 memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0]);
  16.                
  17.                 // UV分量
  18.                 if ((i % 2) == 0)
  19.                 {
  20.                         pDst = pstFrameDst->stVFrame.pVirAddr[0] + (pstFrameDst->stVFrame.u32Height * pstFrameDst->stVFrame.u32Stride[0]) + ((nY * pstFrameDst->stVFrame.u32Stride[0]) + nStartX) / 2;
  21.                         pSrc = pstFrameSrc->stVFrame.pVirAddr[0] + (pstFrameSrc->stVFrame.u32Height * pstFrameSrc->stVFrame.u32Stride[0]) + (i * pstFrameSrc->stVFrame.u32Stride[0]) / 2;
  22.                         memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0] / 2);
  23.                 }
  24.         }

  25.         return 0;
  26. }

  27. static void *AF_PIPThread(void *p)
  28. {
  29.         AF_PIPThreadParam *pstPara = (AF_PIPThreadParam*)p;
  30.         VENC_CHN VencChn = pstPara->nVencCh;
  31.         VPSS_GRP nVpssGrpMain = pstPara->nVpssGrpMain;
  32.         VPSS_CHN nVpssChMain = pstPara->nVpssChMain;
  33.         VPSS_GRP nVpssGrpSub = pstPara->nVpssGrpSub;
  34.         VPSS_CHN nVpssChSub = pstPara->nVpssChSub;
  35.        
  36.         VIDEO_FRAME_INFO_S stFrameMain;
  37.         VIDEO_FRAME_INFO_S stFrameSub;
  38.         VIDEO_FRAME_INFO_S stFramePIP;
  39.         VB_BLK VbBlk = VB_INVALID_HANDLE;
  40.         while (HI_TRUE == pstPara->bThreadRun) {
  41.                 memset(&stFrameMain, 0, sizeof(stFrameMain));
  42.                 memset(&stFrameSub, 0, sizeof(stFrameSub));
  43.                 memset(&stFramePIP, 0, sizeof(stFramePIP));
  44.                
  45. //                printf("nVpssGrpMain %d nVpssChMain %d nVpssGrpSub %d nVpssChSub %d, VencChn %d\n", nVpssGrpMain, nVpssChMain, nVpssGrpSub, nVpssChSub, VencChn);
  46.                
  47.                 HI_S32 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain, -1);
  48.                 if (HI_SUCCESS != s32Ret) {
  49.                         printf("HI_MPI_VPSS_GetChnFrame failed s32ret[%#x]\n", s32Ret);
  50.                         break;
  51.                 }
  52.                
  53.                 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub, -1);
  54.                 if (HI_SUCCESS != s32Ret) {
  55.                         printf("HI_MPI_VPSS_GetChnFrame failed s32ret[%#x]\n", s32Ret);
  56.                         break;
  57.                 }

  58.         do {
  59.                         VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2, NULL);
  60.                 } while (VB_INVALID_HANDLE == VbBlk);

  61.                 VB_POOL poolID =  HI_MPI_VB_Handle2PoolId(VbBlk);
  62.                 stFramePIP.stVFrame.u32PhyAddr[0] = HI_MPI_VB_Handle2PhysAddr(VbBlk);
  63.                 if (stFramePIP.stVFrame.u32PhyAddr[0] == 0) {
  64.                         printf("HI_MPI_VB_Handle2PhysAddr for VbBlk failed\n");
  65.                         break;
  66.                 }

  67.                 stFramePIP.u32PoolId                                = poolID;
  68.                 stFramePIP.stVFrame.u32Width                 = stFrameMain.stVFrame.u32Width;
  69.                 stFramePIP.stVFrame.u32Height                 = stFrameMain.stVFrame.u32Height;
  70.                 stFramePIP.stVFrame.u32Field                 = stFrameMain.stVFrame.u32Field;
  71.                 stFramePIP.stVFrame.enPixelFormat         = stFrameMain.stVFrame.enPixelFormat;

  72.                 stFramePIP.stVFrame.enVideoFormat          = stFrameMain.stVFrame.enVideoFormat;
  73.                 stFramePIP.stVFrame.enCompressMode         = stFrameMain.stVFrame.enCompressMode;

  74.                 stFramePIP.stVFrame.pVirAddr[0]         = (HI_U32*)HI_MPI_SYS_Mmap(stFramePIP.stVFrame.u32PhyAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  75.                 stFramePIP.stVFrame.pVirAddr[1]         = stFramePIP.stVFrame.pVirAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  76. //                stFramePIP.stVFrame.pVirAddr[2]         = stFramePIP.stVFrame.pVirAddr[1];

  77.                 stFramePIP.stVFrame.u32Stride[0]         = stFrameMain.stVFrame.u32Stride[0];
  78.                 stFramePIP.stVFrame.u32Stride[1]         = stFrameMain.stVFrame.u32Stride[1];
  79.                 stFramePIP.stVFrame.u32Stride[2]         = stFrameMain.stVFrame.u32Stride[2];

  80. //                stFramePIP.stVFrame.u32HeaderPhyAddr[0];
  81. //                stFramePIP.stVFrame.u32HeaderPhyAddr[1];
  82. //                stFramePIP.stVFrame.u32HeaderPhyAddr[2];
  83. //                stFramePIP.stVFrame.pHeaderVirAddr[0];
  84. //                stFramePIP.stVFrame.pHeaderVirAddr[1];
  85. //                stFramePIP.stVFrame.pHeaderVirAddr[2];
  86. //                stFramePIP.stVFrame.u32HeaderStride[0];
  87. //                stFramePIP.stVFrame.u32HeaderStride[1];
  88. //                stFramePIP.stVFrame.u32HeaderStride[2];

  89.                 stFramePIP.stVFrame.s16OffsetTop        = stFrameMain.stVFrame.s16OffsetTop;
  90.                 stFramePIP.stVFrame.s16OffsetBottom = stFrameMain.stVFrame.s16OffsetBottom;
  91.                 stFramePIP.stVFrame.s16OffsetLeft        = stFrameMain.stVFrame.s16OffsetLeft;
  92.                 stFramePIP.stVFrame.s16OffsetRight        = stFrameMain.stVFrame.s16OffsetRight;
  93.                
  94.                 stFramePIP.stVFrame.u64pts                         = stFrameMain.stVFrame.u64pts;
  95.         stFramePIP.stVFrame.u32TimeRef                 = stFrameMain.stVFrame.u32TimeRef;

  96. //                stFramePIP.stVFrame.u32PrivateData;
  97. //                stFramePIP.stVFrame.stSupplement;

  98.                 stFrameMain.stVFrame.pVirAddr[0]         = (HI_U32*)HI_MPI_SYS_Mmap(stFrameMain.stVFrame.u32PhyAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  99.                 stFrameSub.stVFrame.pVirAddr[0]         = (HI_U32*)HI_MPI_SYS_Mmap(stFrameSub.stVFrame.u32PhyAddr[0], stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height * 3 / 2);

  100.                 memcpy(stFramePIP.stVFrame.pVirAddr[0], stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  101.                 AF_PIPCombineFrame(&stFramePIP, &stFrameSub);

  102. //                s32Ret = HI_MPI_VENC_SendFrame(VencChn, &stFramePIP, -1);
  103.                 s32Ret = HI_MPI_VENC_SendFrame(5, &stFramePIP, -1);
  104.                 if (HI_SUCCESS != s32Ret) {
  105.                         printf("HI_MPI_VENC_SendFrame VencChn %d failed s32ret[%#x]\n", VencChn, s32Ret);
  106. //                        break;
  107.                 }

  108.         HI_MPI_SYS_Munmap(stFramePIP.stVFrame.pVirAddr[0], stFramePIP.stVFrame.u32Stride[0] * stFramePIP.stVFrame.u32Height * 3 / 2);
  109.                 HI_MPI_SYS_Munmap(stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  110.                 HI_MPI_SYS_Munmap(stFrameSub.stVFrame.pVirAddr[0], stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height * 3 / 2);

  111.                 s32Ret = HI_MPI_VB_ReleaseBlock(VbBlk);
  112.         if (HI_SUCCESS != s32Ret) {
  113.             printf("vb release block failed![%#x]\n", s32Ret);
  114.                         break;
  115.         }

  116.                 HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub);
  117.                 HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain);

  118.                 pthread_mutex_lock(&pstPara->atrrMutex);
  119.                 nVpssGrpMain = pstPara->nVpssGrpMain;
  120.                 nVpssChMain = pstPara->nVpssChMain;
  121.                 nVpssGrpSub = pstPara->nVpssGrpSub;
  122.                 nVpssChSub = pstPara->nVpssChSub;
  123.                 pthread_mutex_unlock(&pstPara->atrrMutex);
  124.         }

  125.         return NULL;
  126. }
复制代码

// ----------------------------------------------------------------
// 如题,
// 数据都是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);编码正常
// 不太清楚哪里出现问题,求大神指点下
 楼主| 发表于 2018-12-29 11:22:48 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:05 编辑

// 代码修改如下:
  1. static void *AF_PIPThread(void *p)
  2. {
  3.         AF_PIPThreadParam *pstPara = (AF_PIPThreadParam*)p;
  4.         VENC_CHN VencChn = pstPara->nVencCh;
  5.         VPSS_GRP nVpssGrpMain = pstPara->nVpssGrpMain;
  6.         VPSS_CHN nVpssChMain = pstPara->nVpssChMain;
  7.         VPSS_GRP nVpssGrpSub = pstPara->nVpssGrpSub;
  8.         VPSS_CHN nVpssChSub = pstPara->nVpssChSub;

  9.         VIDEO_FRAME_INFO_S stFrameMain;
  10.         VIDEO_FRAME_INFO_S stFrameSub;
  11.         VIDEO_FRAME_INFO_S stFramePIP;
  12.         VB_BLK VbBlk = VB_INVALID_HANDLE;
  13.         while (HI_TRUE == pstPara->bThreadRun) {
  14.                 memset(&stFrameMain, 0, sizeof(stFrameMain));
  15.                 memset(&stFrameSub, 0, sizeof(stFrameSub));
  16.                 memset(&stFramePIP, 0, sizeof(stFramePIP));
  17.                                
  18.                 HI_S32 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain, -1);
  19.                 if (HI_SUCCESS != s32Ret) {
  20.                         printf("HI_MPI_VPSS_GetChnFrame failed s32ret[%#x]\n", s32Ret);
  21.                         break;
  22.                 }
  23.                
  24.                 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub, -1);
  25.                 if (HI_SUCCESS != s32Ret) {
  26.                         printf("HI_MPI_VPSS_GetChnFrame failed s32ret[%#x]\n", s32Ret);
  27.                         break;
  28.                 }

  29.         do {
  30.                         VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, (stFrameMain.stVFrame.u32Stride[0] + stFrameMain.stVFrame.u32HeaderStride[0]) * stFrameMain.stVFrame.u32Height * 3 / 2, NULL);
  31.                 } while (VB_INVALID_HANDLE == VbBlk);       

  32.                 VB_POOL poolID =  HI_MPI_VB_Handle2PoolId(VbBlk);
  33.                 stFramePIP.stVFrame.u32HeaderPhyAddr[0] = HI_MPI_VB_Handle2PhysAddr(VbBlk);
  34.                 stFramePIP.stVFrame.u32HeaderPhyAddr[1] = stFramePIP.stVFrame.u32HeaderPhyAddr[0] + stFrameMain.stVFrame.u32HeaderStride[0] * stFrameMain.stVFrame.u32Height;
  35. //                stFramePIP.stVFrame.u32HeaderPhyAddr[2] = stFramePIP.stVFrame.u32HeaderPhyAddr[1];
  36.                 stFramePIP.stVFrame.u32PhyAddr[0] = stFramePIP.stVFrame.u32HeaderPhyAddr[0] + stFrameMain.stVFrame.u32HeaderStride[0] * stFrameMain.stVFrame.u32Height * 3 / 2;
  37.                 stFramePIP.stVFrame.u32PhyAddr[1] = stFramePIP.stVFrame.u32PhyAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  38.                 stFramePIP.stVFrame.u32PhyAddr[2] = stFramePIP.stVFrame.u32PhyAddr[1];

  39.                 stFramePIP.u32PoolId                                = poolID;
  40.                 stFramePIP.stVFrame.u32Width                 = stFrameMain.stVFrame.u32Width;
  41.                 stFramePIP.stVFrame.u32Height                 = stFrameMain.stVFrame.u32Height;
  42.                 stFramePIP.stVFrame.u32Field                 = stFrameMain.stVFrame.u32Field;
  43.                 stFramePIP.stVFrame.enPixelFormat         = stFrameMain.stVFrame.enPixelFormat;

  44.                 stFramePIP.stVFrame.enVideoFormat          = stFrameMain.stVFrame.enVideoFormat;
  45.                 stFramePIP.stVFrame.enCompressMode         = stFrameMain.stVFrame.enCompressMode;

  46.                 stFramePIP.stVFrame.pHeaderVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFramePIP.stVFrame.u32HeaderPhyAddr[0], (stFrameMain.stVFrame.u32Stride[0] + stFrameMain.stVFrame.u32HeaderStride[0]) * stFrameMain.stVFrame.u32Height * 3 / 2);
  47.                 stFramePIP.stVFrame.pHeaderVirAddr[1] = stFramePIP.stVFrame.pHeaderVirAddr[0] + stFrameMain.stVFrame.u32HeaderStride[0] * stFrameMain.stVFrame.u32Height;
  48. //                stFramePIP.stVFrame.pHeaderVirAddr[2] = stFramePIP.stVFrame.pHeaderVirAddr[1];
  49.                 stFramePIP.stVFrame.pVirAddr[0] = stFramePIP.stVFrame.pHeaderVirAddr[0] + stFrameMain.stVFrame.u32HeaderStride[0] * stFrameMain.stVFrame.u32Height * 3 / 2;
  50.                 stFramePIP.stVFrame.pVirAddr[1] = stFramePIP.stVFrame.pVirAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  51.                 stFramePIP.stVFrame.pVirAddr[2] = stFramePIP.stVFrame.pVirAddr[1];
  52.                
  53.                 stFramePIP.stVFrame.u32Stride[0]         = stFrameMain.stVFrame.u32Stride[0];
  54.                 stFramePIP.stVFrame.u32Stride[1]         = stFrameMain.stVFrame.u32Stride[1];
  55.                 stFramePIP.stVFrame.u32Stride[2]         = stFrameMain.stVFrame.u32Stride[2];

  56.                 stFramePIP.stVFrame.u32HeaderStride[0] = stFrameMain.stVFrame.u32HeaderStride[0];
  57.                 stFramePIP.stVFrame.u32HeaderStride[1] = stFrameMain.stVFrame.u32HeaderStride[1];
  58.                 stFramePIP.stVFrame.u32HeaderStride[2] = stFrameMain.stVFrame.u32HeaderStride[2];

  59.                 stFramePIP.stVFrame.s16OffsetTop        = stFrameMain.stVFrame.s16OffsetTop;
  60.                 stFramePIP.stVFrame.s16OffsetBottom = stFrameMain.stVFrame.s16OffsetBottom;
  61.                 stFramePIP.stVFrame.s16OffsetLeft        = stFrameMain.stVFrame.s16OffsetLeft;
  62.                 stFramePIP.stVFrame.s16OffsetRight        = stFrameMain.stVFrame.s16OffsetRight;
  63.                
  64.                 stFramePIP.stVFrame.u64pts                         = stFrameMain.stVFrame.u64pts;
  65.         stFramePIP.stVFrame.u32TimeRef                 = stFrameMain.stVFrame.u32TimeRef;

  66.                 stFrameMain.stVFrame.pHeaderVirAddr[0]         = (HI_U32*)HI_MPI_SYS_Mmap(stFrameMain.stVFrame.u32HeaderPhyAddr[0], (stFrameMain.stVFrame.u32Stride[0] + stFrameMain.stVFrame.u32HeaderStride[0]) * stFrameMain.stVFrame.u32Height * 3 / 2);
  67.                 stFrameMain.stVFrame.pHeaderVirAddr[1] = stFrameMain.stVFrame.pHeaderVirAddr[0] + stFrameMain.stVFrame.u32HeaderStride[0] * stFrameMain.stVFrame.u32Height;
  68. //                stFrameMain.stVFrame.pHeaderVirAddr[2] = stFrameMain.stVFrame.pHeaderVirAddr[1];
  69.                 stFrameMain.stVFrame.pVirAddr[0] = stFrameMain.stVFrame.pHeaderVirAddr[0] + stFrameMain.stVFrame.u32HeaderStride[0] * stFrameMain.stVFrame.u32Height * 3 / 2;
  70.                 stFrameMain.stVFrame.pVirAddr[1] = stFrameMain.stVFrame.pVirAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  71.                 stFrameMain.stVFrame.pVirAddr[2] = stFrameMain.stVFrame.pVirAddr[1];

  72.                 stFrameSub.stVFrame.pHeaderVirAddr[0]         = (HI_U32*)HI_MPI_SYS_Mmap(stFrameSub.stVFrame.u32HeaderPhyAddr[0], (stFrameSub.stVFrame.u32Stride[0] + stFrameSub.stVFrame.u32HeaderStride[0]) * stFrameSub.stVFrame.u32Height * 3 / 2);
  73.                 stFrameSub.stVFrame.pHeaderVirAddr[1] = stFrameSub.stVFrame.pHeaderVirAddr[0] + stFrameSub.stVFrame.u32HeaderStride[0] * stFrameSub.stVFrame.u32Height;
  74. //                stFrameSub.stVFrame.pHeaderVirAddr[2] = stFrameSub.stVFrame.pHeaderVirAddr[1];
  75.                 stFrameSub.stVFrame.pVirAddr[0] = stFrameSub.stVFrame.pHeaderVirAddr[0] + stFrameSub.stVFrame.u32HeaderStride[0] * stFrameSub.stVFrame.u32Height * 3 / 2;
  76.                 stFrameSub.stVFrame.pVirAddr[1] = stFrameSub.stVFrame.pVirAddr[0] + stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height;
  77.                 stFrameSub.stVFrame.pVirAddr[2] = stFrameSub.stVFrame.pVirAddr[1];

  78.                 memcpy(stFramePIP.stVFrame.pHeaderVirAddr[0], stFrameMain.stVFrame.pHeaderVirAddr[0], (stFrameMain.stVFrame.u32Stride[0] + stFrameMain.stVFrame.u32HeaderStride[0]) * stFrameMain.stVFrame.u32Height * 3 / 2);
  79.                 AF_PIPCombineFrame(&stFramePIP, &stFrameSub);

  80.                 s32Ret = HI_MPI_VENC_SendFrame(VencChn, &stFramePIP, -1);
  81. //                s32Ret = HI_MPI_VENC_SendFrame(5, &stFramePIP, -1);
  82.                 if (HI_SUCCESS != s32Ret) {
  83.                         printf("HI_MPI_VENC_SendFrame VencChn %d failed s32ret[%#x]\n", VencChn, s32Ret);
  84. //                        break;
  85.                 }

  86.         HI_MPI_SYS_Munmap(stFramePIP.stVFrame.pHeaderVirAddr[0], (stFramePIP.stVFrame.u32Stride[0] + stFramePIP.stVFrame.u32HeaderStride[0]) * stFramePIP.stVFrame.u32Height * 3 / 2);
  87.                 HI_MPI_SYS_Munmap(stFrameMain.stVFrame.pHeaderVirAddr[0], (stFrameMain.stVFrame.u32Stride[0] + stFrameMain.stVFrame.u32HeaderStride[0]) * stFrameMain.stVFrame.u32Height * 3 / 2);
  88.                 HI_MPI_SYS_Munmap(stFrameSub.stVFrame.pHeaderVirAddr[0], (stFrameSub.stVFrame.u32Stride[0] + stFrameSub.stVFrame.u32HeaderStride[0]) * stFrameSub.stVFrame.u32Height * 3 / 2);

  89.                 s32Ret = HI_MPI_VB_ReleaseBlock(VbBlk);
  90.         if (HI_SUCCESS != s32Ret) {
  91.             printf("vb release block failed![%#x]\n", s32Ret);
  92.                         break;
  93.         }

  94.                 HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub);
  95.                 HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain);

  96.                 pthread_mutex_lock(&pstPara->atrrMutex);
  97.                 nVpssGrpMain = pstPara->nVpssGrpMain;
  98.                 nVpssChMain = pstPara->nVpssChMain;
  99.                 nVpssGrpSub = pstPara->nVpssGrpSub;
  100.                 nVpssChSub = pstPara->nVpssChSub;
  101.                 pthread_mutex_unlock(&pstPara->atrrMutex);

  102.                 usleep(10 * 1000);
  103.         }

  104.         return NULL;
  105. }
复制代码

// 目前该线程HI_MPI_VENC_SendFrame成功,另一个线程select取流一直返回0
// s32Ret = select(maxfd + 1, &read_fds, NULL, NULL, &TimeoutVal);
 楼主| 发表于 2018-12-29 11:52:12 | 显示全部楼层
qn1540561804 发表于 2018-12-29 11:22
// 代码修改如下:
static void *AF_PIPThread(void *p)
{

注释掉接口AF_PIPCombineFrame,select正常
 楼主| 发表于 2018-12-29 12:19:23 | 显示全部楼层
qn1540561804 发表于 2018-12-29 11:52
注释掉接口AF_PIPCombineFrame,select正常

注释掉接口AF_PIPCombineFrame
修改
                memcpy(stFramePIP.stVFrame.pHeaderVirAddr[0], stFrameMain.stVFrame.pHeaderVirAddr[0], (stFrameMain.stVFrame.u32Stride[0] + stFrameMain.stVFrame.u32HeaderStride[0]) * stFrameMain.stVFrame.u32Height * 3 / 2);
//                AF_PIPCombineFrame(&stFramePIP, &stFrameSub);

                memcpy(stFramePIP.stVFrame.pVirAddr[0], stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
//                AF_PIPCombineFrame(&stFramePIP, &stFrameSub);

select返回0
 楼主| 发表于 2018-12-29 13:25:24 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:16 编辑
qn1540561804 发表于 2018-12-29 12:19
注释掉接口AF_PIPCombineFrame
修改
                memcpy(stFramePIP.stVFrame.pHeaderVirAddr[0], stFrameMain.st ...


修改stVpssChnMode.enCompressMode  = COMPRESS_MODE_NONE;//COMPRESS_MODE_SEG;
AF_PIPThread去掉对u32HeaderPhyAddr的操作,代码修改如下:
  1. static void *AF_PIPThread(void *p)
  2. {
  3.         AF_PIPThreadParam *pstPara = (AF_PIPThreadParam*)p;
  4.         VENC_CHN VencChn = pstPara->nVencCh;
  5.         VPSS_GRP nVpssGrpMain = pstPara->nVpssGrpMain;
  6.         VPSS_CHN nVpssChMain = pstPara->nVpssChMain;
  7.         VPSS_GRP nVpssGrpSub = pstPara->nVpssGrpSub;
  8.         VPSS_CHN nVpssChSub = pstPara->nVpssChSub;

  9.         VIDEO_FRAME_INFO_S stFrameMain;
  10.         VIDEO_FRAME_INFO_S stFrameSub;
  11.         VIDEO_FRAME_INFO_S stFramePIP;
  12.         VB_BLK VbBlk = VB_INVALID_HANDLE;
  13.         while (HI_TRUE == pstPara->bThreadRun) {
  14.                 memset(&stFrameMain, 0, sizeof(stFrameMain));
  15.                 memset(&stFrameSub, 0, sizeof(stFrameSub));
  16.                 memset(&stFramePIP, 0, sizeof(stFramePIP));
  17.                
  18.                 usleep(10 * 1000);
  19.                 pthread_mutex_lock(&pstPara->atrrMutex);
  20.                 nVpssGrpMain = pstPara->nVpssGrpMain;
  21.                 nVpssChMain = pstPara->nVpssChMain;
  22.                 nVpssGrpSub = pstPara->nVpssGrpSub;
  23.                 nVpssChSub = pstPara->nVpssChSub;
  24.                 pthread_mutex_unlock(&pstPara->atrrMutex);
  25.                                
  26.                 HI_S32 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain, -1);
  27.                 if (HI_SUCCESS != s32Ret) {
  28.                         AFERR("HI_MPI_VPSS_GetChnFrame nVpssGrpMain %d nVpssChMain %d s32ret[%#x]\n", nVpssGrpMain, nVpssChMain, s32Ret);
  29.                         continue;
  30.                 }
  31.                
  32.                 s32Ret = HI_MPI_VPSS_GetChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub, -1);
  33.                 if (HI_SUCCESS != s32Ret) {
  34.                         AFERR("HI_MPI_VPSS_GetChnFrame nVpssGrpSub %d nVpssChSub %d s32ret[%#x]\n", nVpssGrpSub, nVpssChSub, s32Ret);
  35.                         HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain);
  36.                         continue;
  37.                 }

  38.                 if ((stFrameMain.stVFrame.u32Width < stFrameSub.stVFrame.u32Width) || (stFrameMain.stVFrame.u32Height < stFrameSub.stVFrame.u32Height)) {
  39.                         AFERR("Main.W %d Main.H %d Sub.W %d Sub.H %d\n",
  40.                                 stFrameMain.stVFrame.u32Width, stFrameMain.stVFrame.u32Height, stFrameSub.stVFrame.u32Width, stFrameSub.stVFrame.u32Height);
  41.                         HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub);
  42.                         HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain);
  43.                         continue;
  44.                 }

  45.         do {
  46.                         VbBlk = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2, NULL);
  47.                 } while (VB_INVALID_HANDLE == VbBlk);       

  48.                 VB_POOL poolID =  HI_MPI_VB_Handle2PoolId(VbBlk);
  49.                 stFramePIP.stVFrame.u32PhyAddr[0] = HI_MPI_VB_Handle2PhysAddr(VbBlk);
  50.                 stFramePIP.stVFrame.u32PhyAddr[1] = stFramePIP.stVFrame.u32PhyAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  51.                 stFramePIP.stVFrame.u32PhyAddr[2] = stFramePIP.stVFrame.u32PhyAddr[1];

  52.                 stFramePIP.u32PoolId                                = poolID;
  53.                 stFramePIP.stVFrame.u32Width                 = stFrameMain.stVFrame.u32Width;
  54.                 stFramePIP.stVFrame.u32Height                 = stFrameMain.stVFrame.u32Height;
  55.                 stFramePIP.stVFrame.u32Field                 = stFrameMain.stVFrame.u32Field;
  56.                 stFramePIP.stVFrame.enPixelFormat         = stFrameMain.stVFrame.enPixelFormat;

  57.                 stFramePIP.stVFrame.enVideoFormat          = stFrameMain.stVFrame.enVideoFormat;
  58.                 stFramePIP.stVFrame.enCompressMode         = stFrameMain.stVFrame.enCompressMode;

  59.                 stFramePIP.stVFrame.pVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFramePIP.stVFrame.u32PhyAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  60.                 stFramePIP.stVFrame.pVirAddr[1] = stFramePIP.stVFrame.pVirAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  61.                 stFramePIP.stVFrame.pVirAddr[2] = stFramePIP.stVFrame.pVirAddr[1];
  62.                
  63.                 stFramePIP.stVFrame.u32Stride[0]         = stFrameMain.stVFrame.u32Stride[0];
  64.                 stFramePIP.stVFrame.u32Stride[1]         = stFrameMain.stVFrame.u32Stride[1];
  65.                 stFramePIP.stVFrame.u32Stride[2]         = stFrameMain.stVFrame.u32Stride[2];

  66.                 stFramePIP.stVFrame.u32HeaderStride[0] = stFrameMain.stVFrame.u32HeaderStride[0];
  67.                 stFramePIP.stVFrame.u32HeaderStride[1] = stFrameMain.stVFrame.u32HeaderStride[1];
  68.                 stFramePIP.stVFrame.u32HeaderStride[2] = stFrameMain.stVFrame.u32HeaderStride[2];

  69.                 stFramePIP.stVFrame.s16OffsetTop        = stFrameMain.stVFrame.s16OffsetTop;
  70.                 stFramePIP.stVFrame.s16OffsetBottom = stFrameMain.stVFrame.s16OffsetBottom;
  71.                 stFramePIP.stVFrame.s16OffsetLeft        = stFrameMain.stVFrame.s16OffsetLeft;
  72.                 stFramePIP.stVFrame.s16OffsetRight        = stFrameMain.stVFrame.s16OffsetRight;
  73.                
  74.                 stFramePIP.stVFrame.u64pts                         = stFrameMain.stVFrame.u64pts;
  75.         stFramePIP.stVFrame.u32TimeRef                 = stFrameMain.stVFrame.u32TimeRef;

  76.                 stFrameMain.stVFrame.pVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFrameMain.stVFrame.u32PhyAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  77.                 stFrameMain.stVFrame.pVirAddr[1] = stFrameMain.stVFrame.pVirAddr[0] + stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height;
  78.                 stFrameMain.stVFrame.pVirAddr[2] = stFrameMain.stVFrame.pVirAddr[1];

  79.                 stFrameSub.stVFrame.pVirAddr[0] = (HI_U32*)HI_MPI_SYS_Mmap(stFrameSub.stVFrame.u32PhyAddr[0], stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height * 3 / 2);
  80.                 stFrameSub.stVFrame.pVirAddr[1] = stFrameSub.stVFrame.pVirAddr[0] + stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height;
  81.                 stFrameSub.stVFrame.pVirAddr[2] = stFrameSub.stVFrame.pVirAddr[1];

  82.                 memcpy(stFramePIP.stVFrame.pVirAddr[0], stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  83.                 AF_PIPCombineFrame(&stFramePIP, &stFrameSub);

  84.                 s32Ret = HI_MPI_VENC_SendFrame(VencChn, &stFramePIP, -1);
  85.                 if (HI_SUCCESS != s32Ret) {
  86.                         AFWARN("HI_MPI_VENC_SendFrame VencChn %d failed s32Ret[%#x]\n", VencChn, s32Ret);
  87.                 }

  88.         HI_MPI_SYS_Munmap(stFramePIP.stVFrame.pVirAddr[0], stFramePIP.stVFrame.u32Stride[0] * stFramePIP.stVFrame.u32Height * 3 / 2);
  89.                 HI_MPI_SYS_Munmap(stFrameMain.stVFrame.pVirAddr[0], stFrameMain.stVFrame.u32Stride[0] * stFrameMain.stVFrame.u32Height * 3 / 2);
  90.                 HI_MPI_SYS_Munmap(stFrameSub.stVFrame.pVirAddr[0], stFrameSub.stVFrame.u32Stride[0] * stFrameSub.stVFrame.u32Height * 3 / 2);

  91.                 s32Ret = HI_MPI_VB_ReleaseBlock(VbBlk);
  92.         if (HI_SUCCESS != s32Ret) {
  93.             AFWARN("HI_MPI_VB_ReleaseBlock failed s32Ret[%#x]\n", s32Ret);
  94.         }

  95.                 HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpSub, nVpssChSub, &stFrameSub);
  96.                 HI_MPI_VPSS_ReleaseChnFrame(nVpssGrpMain, nVpssChMain, &stFrameMain);
  97.         }

  98.         return NULL;
  99. }
复制代码

编码正常。
PS:头部的数据是和hisi压缩有关的。
PPS:
海思的压缩不是一般意义的压缩,我们可以理解为一种特定格式,不是真正的yuv420,只有非压缩的才是我们通常认识的yuv420,才能用你那个函数去拷贝数据

谢谢某位大神的耐心指导

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2018-12-29 14:11:42 | 显示全部楼层
qn1540561804 发表于 2018-12-29 13:25
修改stVpssChnMode.enCompressMode  = COMPRESS_MODE_NONE;//COMPRESS_MODE_SEG;
AF_PIPThread去掉对u ...

下一步,将数据搬移用HI_MPI_IVE_DMA去做,用硬件搬数据性能应该会好很多;
下下一步,将红外光640*480半透明叠加到可见光1080P。
 楼主| 发表于 2018-12-29 18:13:45 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:12 编辑

数据拷贝UV代码有个错误:
  1. //memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0] / 2);
  2. memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0]);
复制代码



 楼主| 发表于 2018-12-31 15:09:27 | 显示全部楼层
本帖最后由 qn1540561804 于 2019-4-12 11:18 编辑
qn1540561804 发表于 2018-12-29 18:13
数据拷贝UV代码有个错误

memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0] / 2);

  1. if ((i % 2) == 0) {
  2.     pDst = pstFrameDst->stVFrame.pVirAddr[0] + (pstFrameDst->stVFrame.u32Height * pstFrameDst->stVFrame.u32Stride[0]) + (nY * pstFrameDst->stVFrame.u32Stride[0]) / 2 + nStartX;
  3.     pSrc = pstFrameSrc->stVFrame.pVirAddr[0] + (pstFrameSrc->stVFrame.u32Height * pstFrameSrc->stVFrame.u32Stride[0]) + (i * pstFrameSrc->stVFrame.u32Stride[0]) / 2;
  4.     memcpy(pDst, pSrc, pstFrameSrc->stVFrame.u32Stride[0]);
  5. }
复制代码
 楼主| 发表于 2018-12-31 15:57:56 | 显示全部楼层
YUV透明叠加
公式:z=alpha*x+(1-alpha)*y
应用时,注意不要用浮点参与运算,Y和UV分开运算

初步调试效果见图片,后期还需要根据视场角做缩放

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2019-1-21 17:54:40 | 显示全部楼层
牛啊!   楼主做下来 有多少帧啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

© 2008-2017 当前位置 易百纳技术社区论坛 返回 易百纳技术社区 ( 苏ICP备14036084 )   Powered by Discuz! X3.1
快速回复 返回顶部 返回列表