查看: 130|回复: 7

[hi3559/hi3559a] NNIE怎样拿到VPSS中的数据

[复制链接]
发表于 2019-7-4 09:52:59 | 显示全部楼层 |阅读模式
各位前辈,我先做的是h.264->VDEC->VPSS->NNIE->VO的流程,我想问下NNIE怎样可以拿到VPSS的数据,这条流程可行吗?十分感谢!
发表于 2019-7-4 10:01:10 | 显示全部楼层
看看这个接口是否符合你的需求  HI_MPI_VPSS_GetChnFrame
发表于 2019-7-5 09:45:21 | 显示全部楼层
你可以参考SDK VDEC sample code去做修改
[\mpp\sample\vdec\sample_vdec.c]
-h.264->VDEC->VPSS->VO可以参考SAMPLE_H264_VDEC_VPSS_VO()
-HI_MPI_VPSS_GetChnFrame可以参考SAMPLE_JPEG_VDEC_TO_RGB(),将HI_MPI_GetFrame改为HI_MPI_VPSS_GetChnFrame
-将这两个流程整合在一起后,加入NNIE
 楼主| 发表于 2019-7-7 15:09:55 | 显示全部楼层
qn1534489079 发表于 2019-7-5 09:45
你可以参考SDK VDEC sample code去做修改
[\mpp\sample\vdec\sample_vdec.c]
-h.264->VDEC->VPSS->VO可以 ...

HI_VOID * SAMPLE_COMM_VDEC_GetPic(HI_VOID *pArgs)
{
    VDEC_THREAD_PARAM_S *pstVdecThreadParam =(VDEC_THREAD_PARAM_S *)pArgs;
    FILE *fp = HI_NULL;
    HI_S32 s32Ret, s32Cnt = 0;
    VDEC_CHN_ATTR_S  stAttr; //解码通道属性指针
    VIDEO_FRAME_INFO_S stVFrame; //定义视频图像帧信息结构体
    HI_CHAR cSaveFile[256];

    prctl(PR_SET_NAME, "VdecGetPic", 0,0,0);

    s32Ret = HI_MPI_VDEC_GetChnAttr(pstVdecThreadParam->s32ChnId, &stAttr); // 获取视频解码通道属性
    if(HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("chn %d get chn attr fail for %#x!\n", pstVdecThreadParam->s32ChnId, s32Ret);
        return (HI_VOID *)(HI_FAILURE);
    }
    if(PT_JPEG != stAttr.enType)
    {
        SAMPLE_PRT("chn %d enType %d do not suport save file!\n", pstVdecThreadParam->s32ChnId, stAttr.enType);
        return (HI_VOID *)(HI_FAILURE);
    }

    while(1)
    {
        if (pstVdecThreadParam->eThreadCtrl == THREAD_CTRL_STOP)
        {
            break;
        }

        s32Ret=HI_MPI_VDEC_GetFrame(pstVdecThreadParam->s32ChnId, &stVFrame, pstVdecThreadParam->s32MilliSec); //获取视频解码通道的解码图像
        if(HI_SUCCESS == s32Ret)
        {
            s32Cnt++;
            SAVE_FILE_NAME(cSaveFile, pstVdecThreadParam->s32ChnId, s32Cnt, pstVdecThreadParam->cFileName, stVFrame.stVFrame.enPixelFormat);
            if (cSaveFile != 0)
            {
                fp=fopen(cSaveFile,"wb");
                if(fp==NULL)
                {
                    SAMPLE_PRT("chn %d can't open file %s in get picture thread!\n", pstVdecThreadParam->s32ChnId, cSaveFile);
                    return (HI_VOID *)(HI_FAILURE);
                }
                printf("\033[0;34m chn %d saving yuv file:%s \033[0;39m \n",pstVdecThreadParam->s32ChnId, cSaveFile);
            }

            if ( (PIXEL_FORMAT_YVU_SEMIPLANAR_420 != stVFrame.stVFrame.enPixelFormat) && (PIXEL_FORMAT_YUV_400 != stVFrame.stVFrame.enPixelFormat)) //解码输出格式
               {
                SAMPLE_COMM_VDEC_SaveRGBFile(fp, &stVFrame.stVFrame); //save rgb
               }
            else if( (stVFrame.stVFrame.enCompressMode == COMPRESS_MODE_NONE) &&   //视频压缩模式
                     (stVFrame.stVFrame.enVideoFormat == VIDEO_FORMAT_LINEAR) )   // 视频图像格式
            {
                SAMPLE_COMM_VDEC_SaveYUVFile_Linear8Bit(fp,&stVFrame.stVFrame); // save yuv
            }
            else
            {
                SAMPLE_PRT("chn %d enPixelFormat %d do not suport save file!\n", pstVdecThreadParam->s32ChnId, stVFrame.stVFrame.enPixelFormat);
                break;
            }
            s32Ret=HI_MPI_VDEC_ReleaseFrame(pstVdecThreadParam->s32ChnId, &stVFrame); //释放视频解码通道的解码图像
            if (HI_SUCCESS != s32Ret)
            {
                SAMPLE_PRT("chn %d HI_MPI_VDEC_ReleaseFrame fail for s32Ret=0x%x!\n", pstVdecThreadParam->s32ChnId, s32Ret);
            }
            if (fp != NULL)
            {
                fclose(fp);
            }
        }
        else
        {
            usleep(1000);
        }
    }

    printf("\033[0;35m chn %d get pic thread return ...  \033[0;39m\n", pstVdecThreadParam->s32ChnId);

    return (HI_VOID *)HI_SUCCESS;
}

前辈,您好,您是说把HI_MPI_VDEC_GetFrame(pstVdecThreadParam->s32ChnId, &stVFrame, pstVdecThreadParam->s32MilliSec); //获取视频解码通道的解码图像
修改成 HI_MPI_VPSS_GetChnFrame()吗?我还有一点想要请教您:HI_MPI_VDEC_GetFrame()中的参数来自
for(i=0; i<u32VdecChnNum; i++)
    {
        snprintf(stVdecSend.cFileName, sizeof(stVdecSend.cFileName), "×××××××");
        stVdecSend.enType          = astSampleVdec.enType;
        stVdecSend.s32StreamMode   = astSampleVdec.enMode;
        stVdecSend.s32ChnId        = i;
        stVdecSend.s32IntervalTime = 1000; //设置延时?
        stVdecSend.u64PtsInit      = 0;
        stVdecSend.u64PtsIncrease  = 0;
        stVdecSend.eThreadCtrl     = THREAD_CTRL_START;
        stVdecSend.bCircleSend     = HI_TRUE; // 设置是否循环读取文件
        stVdecSend.s32MilliSec     = 0;
        stVdecSend.s32MinBufSize   = (astSampleVdec.u32Width * astSampleVdec.u32Height * 3)>>1;
    }
HI_MPI_VPSS_GetChnFrame()的参数应该传什么呢?期待您的答复,万分感谢!
 楼主| 发表于 2019-7-7 15:26:48 | 显示全部楼层
qn1534489079 发表于 2019-7-5 09:45
你可以参考SDK VDEC sample code去做修改
[\mpp\sample\vdec\sample_vdec.c]
-h.264->VDEC->VPSS->VO可以 ...

HI_S32 SAMPLE_COMM_VPSS_Start(VPSS_GRP VpssGrp, HI_BOOL* pabChnEnable, VPSS_GRP_ATTR_S* pstVpssGrpAttr, VPSS_CHN_ATTR_S* pastVpssChnAttr)
{
    VPSS_CHN VpssChn;
    HI_S32 s32Ret;
    HI_S32 j;

    s32Ret = HI_MPI_VPSS_CreateGrp(VpssGrp, pstVpssGrpAttr);

    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_CreateGrp(grp:%d) failed with %#x!\n", VpssGrp, s32Ret);
        return HI_FAILURE;
    }
       
    for (j = 0; j < VPSS_MAX_PHY_CHN_NUM; j++)
    {       
            //printf("\n --------------VPSS_MAX_PHY_CHN_NUM = %d-------------", VPSS_MAX_PHY_CHN_NUM);  //4
        if(HI_TRUE == pabChnEnable[j])
        {
            VpssChn = j;
            s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, &pastVpssChnAttr[VpssChn]);

            if (s32Ret != HI_SUCCESS)
            {
                SAMPLE_PRT("HI_MPI_VPSS_SetChnAttr failed with %#x\n", s32Ret);
                return HI_FAILURE;
            }

            s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
            

            if (s32Ret != HI_SUCCESS)
            {
                SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret);
                return HI_FAILURE;
            }
        }
    }

    s32Ret = HI_MPI_VPSS_StartGrp(VpssGrp);
       
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_StartGrp failed with %#x\n", s32Ret);
        return HI_FAILURE;
    }
   
   
    /*VIDEO_FRAME_INFO_S stVFrame; //定义视频图像帧信息结构体
   
    while(1)
    {       
                s32Ret = HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stVFrame, 1000);  //用户从通道获取一帧处理完成的图像。 参数(VPSS GROUP 号, VPSS通道号,图像信息, 超时时间)
                printf("\n ------------s32Ret = %d--------\n", s32Ret);
    }*/
    return HI_SUCCESS;
}
给出的demo中开了四个VPSS通道,我应该怎样从通道中拿到数据呢?
 楼主| 发表于 2019-7-9 16:14:10 | 显示全部楼层
qn1534489079 发表于 2019-7-5 09:45
你可以参考SDK VDEC sample code去做修改
[\mpp\sample\vdec\sample_vdec.c]
-h.264->VDEC->VPSS->VO可以 ...

前辈,您好,我现在已经将两个流程整合到一起了,我想请教下如何加入NNIE,因为VEDC和SVP是两个独立的模块,怎样才能让其联系在一起呢?
发表于 2019-7-11 14:55:51 | 显示全部楼层
qn1562136485 发表于 2019-7-9 16:14
前辈,您好,我现在已经将两个流程整合到一起了,我想请教下如何加入NNIE,因为VEDC和SVP是两个独立的模块 ...

在 \Hi3559AV100_SDK_V2.0.2.0\package\mpp\sample\svp\multi-core\nnie中,
case 0) RFCN(VI->VPSS->NNIE->VGS->VO).也是用HI_MPI_VPSS_GetChnFrame将Video frame data丢给RFCN nnie,你可以将此流程套入
 楼主| 发表于 2019-7-11 16:24:15 | 显示全部楼层
qn1534489079 发表于 2019-7-11 14:55
在 \Hi3559AV100_SDK_V2.0.2.0\package\mpp\sample\svp\multi-core\nnie中,
case 0) RFCN(VI->VPSS->NN ...

好的,感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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