关于hi3516ev100调试zbar二维码和链接wifi问题

识别二维码是在vpss通道使用海思提供的API接口HI_MPI_VPSS_SetDepth、HI_MPI_VPSS_GetChnFrame来获得图像,并进行二维码识别(这里的二维码是wifi二维码,用于板子和wifi连接的)总体流程如下:
在海思进行mpp初始化等一系列初始化之后,在vpss通道获得yuv数据,并调用zbar接口对获得的图形数据进行解析,如果捕捉到含有wifi图片并能成功的进行解析,并将解析到的wifi信息的ssid和psk更新到wifi的配置文件当中(我这里是板端/etc/wpa.conf),然后调用wifi启动命令,就能成功的实现扫描链接wifi的功能。

1.在实现这个功能的过程中,我开始是在vpss的后面获得图像并直接进行二维码解析,连接wifi,认为板子会继续venc编码,并能得到码流,rtmp推流,但实际情况是并不能推流,会发生报错
,但是吧扫描连接wifi函数屏蔽掉就可以推流
解决办法:在板子上电第一步先进行初始化,包括mpp初始化,相机初始化,isp初始化,vpss初始化,vi与vpss的绑定,然后vpss获得图像,并进行二维码的识别解析,之后连接wifi


注意:这里对海思进行初始化,是为了启动相机,获取相机数据,来进行二维码识别连接wifi的,一旦连接了wifi,一定要对起进行“释放”,比如解绑,去初始化,关掉相机等等。
代码如下:

void SAMPLE_ZBAR_CLASSIC(void )
//HI_S32 SAMPLE_VENC_NORMALP_CLASSIC(HI_VOID)
{
    PAYLOAD_TYPE_E enPayLoad[2]= {PT_H264, PT_H264};
    PIC_SIZE_E enSize[2] = {PIC_HD1080, PIC_VGA};
	HI_U32 u32Profile = 0;

    VB_CONF_S stVbConf;
    SAMPLE_VI_CONFIG_S stViConfig = {0};

    VPSS_GRP VpssGrp;
    VPSS_CHN VpssChn;
    VPSS_GRP_ATTR_S stVpssGrpAttr = {0};
    VPSS_CHN_ATTR_S stVpssChnAttr = {0};
    VPSS_CHN_MODE_S stVpssChnMode;

    VENC_CHN VencChn;
    SAMPLE_RC_E enRcMode= SAMPLE_RC_CBR;

#ifndef hi3516ev100
    HI_S32 s32ChnNum=1;
#else
    HI_S32 s32ChnNum=1;
#endif

    HI_S32 s32Ret = HI_SUCCESS;
    HI_U32 u32BlkSize;
    SIZE_S stSize;
    char c;


    /******************************************
     step  1: init sys variable
    ******************************************/
    memset(&stVbConf,0,sizeof(VB_CONF_S));

    SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]);

    stVbConf.u32MaxPoolCnt = 128;
	//printf("s32ChnNum:%d,Sensor Size:%d\n",s32ChnNum,enSize[0]);
    /*video buffer*/
	if(s32ChnNum >= 1)
    {
	    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
	                enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
	    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
        #ifndef hi3516ev100
	    stVbConf.astCommPool[0].u32BlkCnt = 10;
        #else
        stVbConf.astCommPool[0].u32BlkCnt = 4;
        #endif
	}
	if(s32ChnNum >= 2)
    {
	    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
	                enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
	    stVbConf.astCommPool[1].u32BlkSize = u32BlkSize;
	    stVbConf.astCommPool[1].u32BlkCnt =10;
	}
	if(s32ChnNum >= 3)
    {
	    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\
	                enSize[2], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
	    stVbConf.astCommPool[2].u32BlkSize = u32BlkSize;
	    stVbConf.astCommPool[2].u32BlkCnt = 10;
	}

    /******************************************
     step 2: mpp system init.
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("system init failed with %d!\n", s32Ret);
        goto END_VENC_1080P_CLASSIC_0;
    }

    /******************************************
     step 3: start vi dev & chn to capture
    ******************************************/
    stViConfig.enViMode   = SENSOR_TYPE;
    stViConfig.enRotate   = ROTATE_NONE;
    stViConfig.enNorm     = VIDEO_ENCODING_MODE_AUTO;
    stViConfig.enViChnSet = VI_CHN_SET_NORMAL;
    stViConfig.enWDRMode  = WDR_MODE_NONE;
	printf("VI_StartVi!\n");
    s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vi failed!\n");
        goto END_VENC_1080P_CLASSIC_1;
    }

    /******************************************
     step 4: start vpss and vi bind vpss
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_VENC_1080P_CLASSIC_1;
    }

    if(s32ChnNum >= 1)
    {
	    VpssGrp = 0;
	    stVpssGrpAttr.u32MaxW = stSize.u32Width;
	    stVpssGrpAttr.u32MaxH = stSize.u32Height;
	    stVpssGrpAttr.bIeEn = HI_FALSE;
	    stVpssGrpAttr.bNrEn = HI_TRUE;
	    stVpssGrpAttr.bHistEn = HI_FALSE;
	    stVpssGrpAttr.bDciEn = HI_FALSE;
	    stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE;
	    stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;
	    stVpssGrpAttr.bSharpenEn = HI_FALSE;

	    s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr);
	    if (HI_SUCCESS != s32Ret)
	    {
		    SAMPLE_PRT("Start Vpss failed!\n");
		    goto END_VENC_1080P_CLASSIC_2;
	    }

	    s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode);
	    if (HI_SUCCESS != s32Ret)
	    {
		    SAMPLE_PRT("Vi bind Vpss failed!\n");
		    goto END_VENC_1080P_CLASSIC_3;
	    }

	    VpssChn = 0;
	    stVpssChnMode.enChnMode      = VPSS_CHN_MODE_USER;
	    stVpssChnMode.bDouble        = HI_FALSE;
	    stVpssChnMode.enPixelFormat  = SAMPLE_PIXEL_FORMAT;
	    stVpssChnMode.u32Width       = stSize.u32Width;
	    stVpssChnMode.u32Height      = stSize.u32Height;
	    stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE;
	    memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr));
	    stVpssChnAttr.s32SrcFrameRate = -1;
	    stVpssChnAttr.s32DstFrameRate = -1;
	    s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL);
	    if (HI_SUCCESS != s32Ret)
	    {
		    SAMPLE_PRT("Enable vpss chn failed!\n");
		    goto END_VENC_1080P_CLASSIC_4;
	    }
		
			
		SAMPLE_COMM_VPSS_GetImg(VpssGrp, VpssChn);
			
    }
    if(s32ChnNum >= 2)
    {
		s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[1], &stSize);
		if (HI_SUCCESS != s32Ret)
		{
			SAMPLE_PRT(	"SAMPLE_COMM_SYS_GetPicSize failed!\n");
			goto END_VENC_1080P_CLASSIC_4;
		}
	    VpssChn = 1;
	    stVpssChnMode.enChnMode       = VPSS_CHN_MODE_USER;
	    stVpssChnMode.bDouble         = HI_FALSE;
	    stVpssChnMode.enPixelFormat   = SAMPLE_PIXEL_FORMAT;
	    stVpssChnMode.u32Width        = stSize.u32Width;
	    stVpssChnMode.u32Height       = stSize.u32Height;
	    stVpssChnMode.enCompressMode  = COMPRESS_MODE_NONE;
	    stVpssChnAttr.s32SrcFrameRate = -1;
	    stVpssChnAttr.s32DstFrameRate = -1;
	    s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL);
	    if (HI_SUCCESS != s32Ret)
	    {
		    SAMPLE_PRT("Enable vpss chn failed!\n");
		    goto END_VENC_1080P_CLASSIC_4;
	    }
		
		SAMPLE_COMM_VPSS_GetImg(VpssGrp, VpssChn);
		
    }
    if(s32ChnNum >= 3)
    {
		s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[2], &stSize);
		if (HI_SUCCESS != s32Ret)
		{
			SAMPLE_PRT(	"SAMPLE_COMM_SYS_GetPicSize failed!\n");
			goto END_VENC_1080P_CLASSIC_4;
		}

	    VpssChn = 2;
	    stVpssChnMode.enChnMode 	= VPSS_CHN_MODE_USER;
	    stVpssChnMode.bDouble		= HI_FALSE;
	    stVpssChnMode.enPixelFormat = SAMPLE_PIXEL_FORMAT;
	    stVpssChnMode.u32Width		= 720;
	    stVpssChnMode.u32Height 	= (VIDEO_ENCODING_MODE_PAL==gs_enNorm)?576:480;;
	    stVpssChnMode.enCompressMode = COMPRESS_MODE_NONE;

	    stVpssChnAttr.s32SrcFrameRate = -1;
	    stVpssChnAttr.s32DstFrameRate = -1;

	    s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL);
	    if (HI_SUCCESS != s32Ret)
	    {
		    SAMPLE_PRT("Enable vpss chn failed!\n");
		    goto END_VENC_1080P_CLASSIC_4;
	    }
		
		SAMPLE_COMM_VPSS_GetImg(VpssGrp, VpssChn);
    }
		goto END_VENC_1080P_CLASSIC_4;
	 	goto END_VENC_1080P_CLASSIC_3;
	    goto END_VENC_1080P_CLASSIC_2;
	    goto END_VENC_1080P_CLASSIC_1;
	    goto END_VENC_1080P_CLASSIC_0;
	    //上面5个goto就是对使用的资源进行释放
//****************************************************************
	END_VENC_1080P_CLASSIC_5:
	
		VpssGrp = 0;
		switch(s32ChnNum)
		{
			case 3:
				VpssChn = 2;
				VencChn = 2;
				SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
				SAMPLE_COMM_VENC_Stop(VencChn);
			case 2:
				VpssChn = 1;
				VencChn = 1;
				SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
				SAMPLE_COMM_VENC_Stop(VencChn);
			case 1:
				VpssChn = 0;
				VencChn = 0;
				SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
				SAMPLE_COMM_VENC_Stop(VencChn);
				break;
	
		}
		SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);
	
	END_VENC_1080P_CLASSIC_4:	//vpss stop
	
		VpssGrp = 0;
		switch(s32ChnNum)
		{
			case 3:
				VpssChn = 2;
				SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);
			case 2:
				VpssChn = 1;
				SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);
			case 1:
				VpssChn = 0;
				SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);
			break;
	
		}
	
	END_VENC_1080P_CLASSIC_3:	 //vpss stop
		SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);
	END_VENC_1080P_CLASSIC_2:	 //vpss stop
		SAMPLE_COMM_VPSS_StopGroup(VpssGrp);
	END_VENC_1080P_CLASSIC_1:	//vi stop
		SAMPLE_COMM_VI_StopVi(&stViConfig);
	END_VENC_1080P_CLASSIC_0:	//system exit
		SAMPLE_COMM_SYS_Exit();
//*****************************************************

 


}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值