HI_S32 SAMPLE_COMM_AUDIO_StartHdmi(AIO_ATTR_S *pstAioAttr)
{
    HI_S32 s32Ret;
    HI_HDMI_ATTR_S stHdmiAttr;
    HI_HDMI_ID_E enHdmi = HI_HDMI_ID_0;
    VO_PUB_ATTR_S stPubAttr;
    VO_DEV VoDev = 0;
    
    stPubAttr.u32BgColor = 0x0000ff00;
    stPubAttr.enIntfType = VO_INTF_HDMI|VO_INTF_VGA;
    stPubAttr.bDoubleFrame = HI_FALSE;
    stPubAttr.enIntfSync = VO_OUTPUT_1080P30;

    if(HI_SUCCESS != SAMPLE_COMM_VO_StartDevLayer(VoDev, &stPubAttr, 25))
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }

    s32Ret = SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync);
    if(HI_SUCCESS != s32Ret)
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }

    HI_MPI_HDMI_SetAVMute(enHdmi, HI_TRUE);
    
    s32Ret = HI_MPI_HDMI_GetAttr(enHdmi, &stHdmiAttr);
    if(HI_SUCCESS != s32Ret)
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }
    stHdmiAttr.bEnableAudio = HI_TRUE;        /**< \CAǷ\F1Enable\D2\F4Ƶ */
    stHdmiAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S; /**< HDMI\D2\F4Ƶ\C0\B4Դ, \BD\A8\D2\E9HI_HDMI_SND_INTERFACE_I2S,\B4˲\CE\CA\FD\D0\E8Ҫ\D3\EBAO\CA\E4\C8뱣\B3\D6һ\D6\C2 */
    stHdmiAttr.enSampleRate = (HI_HDMI_SAMPLE_RATE_E)pstAioAttr->enSamplerate;        /**< PCM\D2\F4Ƶ\B2\C9\D1\F9\C2\CA,\B4˲\CE\CA\FD\D0\E8Ҫ\D3\EBAO\B5\C4\C5\E4\D6ñ\A3\B3\D6һ\D6\C2 */
    stHdmiAttr.u8DownSampleParm = HI_FALSE;    /**< PCM\D2\F4Ƶ\CF\F2\CF\C2downsample\B2\C9\D1\F9\C2ʵIJ\CE\CA\FD\A3\ACĬ\C8\CFΪ0 */
    
    stHdmiAttr.enBitDepth = 8 * (pstAioAttr->enBitwidth+1);   /**< \D2\F4Ƶλ\BF\ED\A3\ACĬ\C8\CFΪ16,\B4˲\CE\CA\FD\D0\E8Ҫ\D3\EBAO\B5\C4\C5\E4\D6ñ\A3\B3\D6һ\D6\C2 */
    stHdmiAttr.u8I2SCtlVbit = 0;        /**< \B1\A3\C1\F4\A3\AC\C7\EB\C5\E4\D6\C3Ϊ0, I2S control (0x7A:0x1D) */
    
    stHdmiAttr.bEnableAviInfoFrame = HI_TRUE; /**< \CAǷ\F1ʹ\C4\DC AVI InfoFrame\A3\AC\BD\A8\D2\E9ʹ\C4\DC */
    stHdmiAttr.bEnableAudInfoFrame = HI_TRUE;; /**< \CAǷ\F1ʹ\C4\DC AUDIO InfoFrame\A3\AC\BD\A8\D2\E9ʹ\C4\DC */

    s32Ret = HI_MPI_HDMI_SetAttr(enHdmi, &stHdmiAttr);
    if(HI_SUCCESS != s32Ret)
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }
    HI_MPI_HDMI_SetAVMute(enHdmi, HI_FALSE);
    
    return HI_SUCCESS;
}
Example #2
0
HI_S32 SAMPLE_COMM_AUDIO_StartHdmi(AIO_ATTR_S *pstAioAttr)
{
    HI_S32 s32Ret;
    HI_HDMI_ATTR_S stHdmiAttr;
    HI_HDMI_ID_E enHdmi = HI_HDMI_ID_0;
    VO_PUB_ATTR_S stPubAttr;
    VO_DEV VoDev = 0;
    
    stPubAttr.u32BgColor = 0x000000ff;
    stPubAttr.enIntfType = VO_INTF_HDMI;
    stPubAttr.bDoubleFrame = HI_FALSE;
    stPubAttr.enIntfSync = VO_OUTPUT_1080P30;

    if(HI_SUCCESS != SAMPLE_COMM_VO_StartDevLayer(VoDev, &stPubAttr, 25))
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }

    s32Ret = SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync);
    if(HI_SUCCESS != s32Ret)
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }

    HI_MPI_HDMI_SetAVMute(enHdmi, HI_TRUE);
    
    s32Ret = HI_MPI_HDMI_GetAttr(enHdmi, &stHdmiAttr);
    if(HI_SUCCESS != s32Ret)
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }
    stHdmiAttr.bEnableAudio = HI_TRUE;        /**< 是否Enable音频 */
    stHdmiAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S; /**< HDMI音频来源, 建议HI_HDMI_SND_INTERFACE_I2S,此参数需要与AO输入保持一致 */
    stHdmiAttr.enSampleRate = pstAioAttr->enSamplerate;        /**< PCM音频采样率,此参数需要与AO的配置保持一致 */
    stHdmiAttr.u8DownSampleParm = HI_FALSE;    /**< PCM音频向下downsample采样率的参数,默认为0 */
    
    stHdmiAttr.enBitDepth = 8 * (pstAioAttr->enBitwidth+1);   /**< 音频位宽,默认为16,此参数需要与AO的配置保持一致 */
    stHdmiAttr.u8I2SCtlVbit = 0;        /**< 保留,请配置为0, I2S control (0x7A:0x1D) */
    
    stHdmiAttr.bEnableAviInfoFrame = HI_TRUE; /**< 是否使能 AVI InfoFrame,建议使能 */
    stHdmiAttr.bEnableAudInfoFrame = HI_TRUE;; /**< 是否使能 AUDIO InfoFrame,建议使能 */

    s32Ret = HI_MPI_HDMI_SetAttr(enHdmi, &stHdmiAttr);
    if(HI_SUCCESS != s32Ret)
    {
        printf("[Func]:%s [Line]:%d [Info]:%s\n", __FUNCTION__, __LINE__, "failed");
        return HI_FAILURE;
    }
    HI_MPI_HDMI_SetAVMute(enHdmi, HI_FALSE);
    
    return HI_SUCCESS;
}
Example #3
0
/*****************************************************************************
description: 	this sample shows how to use TDE interface to draw graphic.
                
note	   :    for showing graphic layer, VO device should be enabled first.
				This sample draws graphic on layer G0 which belongs to HD VO device.
				(here we insmod HiFB.ko like 'insmod hifb.ko video="hifb:vram0_size=XXX" '
				 so opening hifb sub-device '/dev/fb0' means to opening G0,
				 and G0 was fixed binded to HD VO device in Hi3531)
*****************************************************************************/
int main()
{
	HI_S32 s32Ret = 0;
	VO_PUB_ATTR_S stPubAttr;
	VB_CONF_S stVbConf;

	stPubAttr.u32BgColor = 0x000000ff;
	stPubAttr.enIntfType = VO_INTF_BT1120;
    stPubAttr.enIntfSync = VO_OUTPUT_720P50;
	stPubAttr.bDoubleFrame = HI_FALSE;

	memset(&stVbConf, 0, sizeof(VB_CONF_S));
    stVbConf.u32MaxPoolCnt             = 16;
	stVbConf.astCommPool[0].u32BlkSize = 1280*720*2;
	stVbConf.astCommPool[0].u32BlkCnt  = 8;	
	
    /*1 enable Vo device HD first*/
	if(HI_SUCCESS != SAMPLE_COMM_SYS_Init(&stVbConf))
	{
		return -1;
	}
	if(HI_SUCCESS != SAMPLE_COMM_VO_StartDevLayer(VoDev, &stPubAttr, 25))
	{
		SAMPLE_COMM_SYS_Exit();
		return -1;
	}
	
	/*2 run tde sample which draw grahpic on HiFB memory*/
	s32Ret = TDE_DrawGraphicSample();
	if(s32Ret != HI_SUCCESS)
	{
		goto err;
	}

	err:
	SAMPLE_COMM_VO_StopDevLayer(VoDev);
	SAMPLE_COMM_SYS_Exit();

	return 0;
}		
Example #4
0
/******************************************************************************
* function :  VI: DC(720P); VO: SD0(CVBS). Embeded isp, phychn channel preview.
******************************************************************************/
HI_S32 SAMPLE_VIO_720P_PreView(SAMPLE_VI_CONFIG_S* pstViConfig)
{
    HI_U32 u32ViChnCnt = 2;
    VB_CONF_S stVbConf;
    VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;;
    VO_CHN VoChn = 0;
    VI_CHN ViChn = 0;
    VO_PUB_ATTR_S stVoPubAttr;
    SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX;
    PIC_SIZE_E enPicSize = g_enPicSize;

    HI_S32 s32Ret = HI_SUCCESS;
    HI_U32 u32BlkSize;
    SIZE_S stSize;
    ROTATE_E enRotate = ROTATE_NONE;

    /******************************************
     step  1: init global  variable
    ******************************************/
    gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm)? 25: 30;
    memset(&stVbConf,0,sizeof(VB_CONF_S));
    
    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize,
                            SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.u32MaxPoolCnt = 128;

    /*ddr0 video buffer*/
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8;

    /******************************************
     step 2: start vpss and vi bind vpss (subchn needn't bind vpss in this mode)
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_720P_1;
    }

    if(pstViConfig)
    {
        enRotate = pstViConfig->enRotate;
        if(ROTATE_90 == enRotate || ROTATE_270 == enRotate)
        {
            u32BlkSize = (CEILING_2_POWER(stSize.u32Width, SAMPLE_SYS_ALIGN_WIDTH) * \
                                CEILING_2_POWER(stSize.u32Height,SAMPLE_SYS_ALIGN_WIDTH) * \
                                   ((PIXEL_FORMAT_YUV_SEMIPLANAR_422 == SAMPLE_PIXEL_FORMAT) ? 2 : 1.5));
            stVbConf.astCommPool[1].u32BlkSize = u32BlkSize;
            stVbConf.astCommPool[1].u32BlkCnt = 8;
        }
    }

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

    /******************************************
     step 4: start vi dev & chn to capture
    ******************************************/
    s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vi failed!\n");
        goto END_720P_0;
    }

    /******************************************
    step 5: start VO SD0 (bind * vi )
    ******************************************/
    stVoPubAttr.enIntfType = g_enVoIntfType;
    if(VO_INTF_BT1120 == g_enVoIntfType)
    {
        stVoPubAttr.enIntfSync = VO_OUTPUT_720P50;
        gs_u32ViFrmRate = 50;
    }
    else
    {
        stVoPubAttr.enIntfSync = VO_OUTPUT_PAL;
    }
    stVoPubAttr.u32BgColor = 0x000000ff;

    /* In HD, this item should be set to HI_FALSE */
    stVoPubAttr.bDoubleFrame = HI_FALSE;
    s32Ret = SAMPLE_COMM_VO_StartDevLayer(VoDev, &stVoPubAttr, gs_u32ViFrmRate);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer failed!\n");
       goto END_720P_1;
    }

    s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, &stVoPubAttr, enVoMode);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n");
       goto END_720P_2;
    }

    s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_BindVi(vo:%d)-(vichn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret);
       goto END_720P_3;
    }



    VI_PAUSE();
    /******************************************
     step 6: exit process
    ******************************************/
END_720P_3:
    SAMPLE_COMM_VO_UnBindVi(VoDev,VoChn);
    SAMPLE_COMM_VO_StopChn(VoDev, enVoMode);
END_720P_2:
    SAMPLE_COMM_VO_StopDevLayer(VoDev);
END_720P_1:
    SAMPLE_COMM_VI_StopVi(pstViConfig);
END_720P_0:
    SAMPLE_COMM_SYS_Exit();

    return s32Ret;
}
Example #5
0
/******************************************************************************
* function :  VI: DC(720P); VO: SD0(CVBS). Embeded isp, one ExtChn preview.
******************************************************************************/
HI_S32 SAMPLE_VIO_720P_LDC_Preview(SAMPLE_VI_CONFIG_S* pstViConfig)
{
    HI_U32 u32ViChnCnt = 3;
    VB_CONF_S stVbConf;
    VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;;
    VO_CHN VoChn = 0;
    VI_CHN ViChn = 0;
    VO_PUB_ATTR_S stVoPubAttr;
    SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX;

    HI_S32 s32Ret = HI_SUCCESS;
    HI_U32 u32BlkSize;
    SIZE_S stSize;
    VI_LDC_ATTR_S stLDCAttr;
    PIC_SIZE_E enPicSize = g_enPicSize;

    /******************************************
     step  1: init global  variable
    ******************************************/
    gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm)? 25: 30;
    memset(&stVbConf,0,sizeof(VB_CONF_S));

    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize,
                            SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.u32MaxPoolCnt = 128;

    /*ddr0 video buffer*/
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8;

    /******************************************
     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_720P_0;
    }

    /******************************************
     step 3: start vi dev & chn to capture
    ******************************************/
    s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vi failed!\n");
        goto END_720P_0;
    }

    stLDCAttr.bEnable = HI_TRUE;
    stLDCAttr.stAttr.enViewType = LDC_VIEW_TYPE_CROP;   //LDC_VIEW_TYPE_CROP; LDC_VIEW_TYPE_ALL
    stLDCAttr.stAttr.s32CenterXOffset = 0;
    stLDCAttr.stAttr.s32CenterYOffset = 0;
    stLDCAttr.stAttr.s32Ratio = 255;

    HI_MPI_VI_SetLDCAttr(ViChn, &stLDCAttr);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VI_SetLDCAttr failed!\n");
        goto END_720P_1;
    }

    /******************************************
     step 4: start vpss and vi bind vpss (subchn needn't bind vpss in this mode)
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_720P_1;
    }

    /******************************************
    step 5: start VO SD0 (bind * vi )
    ******************************************/
    stVoPubAttr.enIntfType = g_enVoIntfType;
    if(VO_INTF_BT1120 == g_enVoIntfType)
    {
        stVoPubAttr.enIntfSync = VO_OUTPUT_720P50;
    }
    else
    {
        stVoPubAttr.enIntfSync = VO_OUTPUT_PAL;
    }
    stVoPubAttr.u32BgColor = 0x000000ff;
    /* In HD, this item should be set to HI_FALSE */
    stVoPubAttr.bDoubleFrame = HI_FALSE;
    s32Ret = SAMPLE_COMM_VO_StartDevLayer(VoDev, &stVoPubAttr, gs_u32ViFrmRate);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer failed!\n");
       goto END_720P_1;
    }

    s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, &stVoPubAttr, enVoMode);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n");
       goto END_720P_2;
    }

    s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ViChn);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_BindVi(vo:%d)-(vichn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret);
       goto END_720P_3;
    }

    printf("press 'q' key to exit, other key to disable LDC!");;
    while(1)
    {
        char ch = getchar();
        char ch1 = getchar();

        if('q' == ch || 'q' == ch1)
            break;

        stLDCAttr.bEnable = !stLDCAttr.bEnable;
        HI_MPI_VI_SetLDCAttr(ViChn, &stLDCAttr);
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_VI_SetLDCAttr failed!\n");
            break;
        }

        if(stLDCAttr.bEnable)
        {
            printf("press 'q' key to exit, other key to disable LDC!\n");
        }
        else
        {
            printf("press 'q' key to exit, other key to enable LDC!\n");
        }
    }
    /******************************************
     step 6: exit process
    ******************************************/
END_720P_3:
    SAMPLE_COMM_VO_UnBindVi(VoDev,VoChn);
    SAMPLE_COMM_VO_StopChn(VoDev, enVoMode);
END_720P_2:
    SAMPLE_COMM_VO_StopDevLayer(VoDev);
END_720P_1:
    s32Ret = HI_MPI_VI_DisableChn(ViChn);
    SAMPLE_COMM_VI_StopVi(pstViConfig);
END_720P_0:
    SAMPLE_COMM_SYS_Exit();

    return s32Ret;
}
Example #6
0
/******************************************************************************
* function :  VI: DC(720P); VO: SD0(CVBS). Embeded isp, one ExtChn preview.
******************************************************************************/
HI_S32 SAMPLE_VIO_720P_Extchn_Preview(SAMPLE_VI_CONFIG_S* pstViConfig)
{
    HI_U32 u32ViChnCnt = 2;
    VB_CONF_S stVbConf;
    VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;;
    VO_CHN VoChn = 0;
    VI_CHN ViChn = 0;
    VO_PUB_ATTR_S stVoPubAttr;
    SAMPLE_VO_MODE_E enVoMode = VO_MODE_1MUX;

    HI_S32 s32Ret = HI_SUCCESS;
    HI_U32 u32BlkSize;
    SIZE_S stSize;
    VI_EXT_CHN_ATTR_S stExtChnAttr;
    VI_CHN ExtChn = 1;
    PIC_SIZE_E enPicSize = g_enPicSize;

    /******************************************
     step  1: init global  variable
    ******************************************/
    gs_u32ViFrmRate = (VIDEO_ENCODING_MODE_PAL == gs_enNorm)? 25: 30;
    memset(&stVbConf,0,sizeof(VB_CONF_S));

    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enPicSize,
                            SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.u32MaxPoolCnt = 128;

    /*ddr0 video buffer*/
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = u32ViChnCnt * 8;

    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, PIC_D1,
                            SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.astCommPool[1].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[1].u32BlkCnt = 8;


    /******************************************
     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_720P_0;
    }

    /******************************************
     step 3: start vi dev & chn to capture
    ******************************************/
    s32Ret = SAMPLE_COMM_VI_StartVi(pstViConfig);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vi failed!\n");
        goto END_720P_0;
    }

    stExtChnAttr.enPixFormat = SAMPLE_PIXEL_FORMAT;
    stExtChnAttr.s32BindChn = ViChn;
    stExtChnAttr.stDestSize.u32Width = 720;
    stExtChnAttr.stDestSize.u32Height = 576;
    stExtChnAttr.s32FrameRate = -1;
    stExtChnAttr.s32SrcFrameRate = -1;

    s32Ret = HI_MPI_VI_SetExtChnAttr(ExtChn, &stExtChnAttr);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VI_SetExtChnAttr failed!\n");
        goto END_720P_0;
    }
    s32Ret = HI_MPI_VI_EnableChn(ExtChn);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("HI_MPI_VI_EnableChn failed!\n");
        goto END_720P_0;
    }

    /******************************************
     step 4: start vpss and vi bind vpss (subchn needn't bind vpss in this mode)
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enPicSize, &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_720P_1;
    }

    /******************************************
    step 5: start VO SD0 (bind * vi )
    ******************************************/
    stVoPubAttr.enIntfType = g_enVoIntfType;
    if(VO_INTF_BT1120 == g_enVoIntfType)
    {
        stVoPubAttr.enIntfSync = VO_OUTPUT_720P50;
    }
    else
    {
        stVoPubAttr.enIntfSync = VO_OUTPUT_PAL;
    }
    stVoPubAttr.u32BgColor = 0x000000ff;
    /* In HD, this item should be set to HI_FALSE */
    stVoPubAttr.bDoubleFrame = HI_FALSE;
    s32Ret = SAMPLE_COMM_VO_StartDevLayer(VoDev, &stVoPubAttr, gs_u32ViFrmRate);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_StartDevLayer failed!\n");
       goto END_720P_1;
    }

    s32Ret = SAMPLE_COMM_VO_StartChn(VoDev, &stVoPubAttr, enVoMode);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_StartChn failed!\n");
       goto END_720P_2;
    }

    s32Ret = SAMPLE_COMM_VO_BindVi(VoDev, VoChn, ExtChn);
    if (HI_SUCCESS != s32Ret)
    {
       SAMPLE_PRT("SAMPLE_COMM_VO_BindVi(vo:%d)-(vichn:%d) failed with %#x!\n", VoDev, VoChn, s32Ret);
       goto END_720P_3;
    }

    VI_PAUSE();
    /******************************************
     step 6: exit process
    ******************************************/
END_720P_3:
    SAMPLE_COMM_VO_UnBindVi(VoDev,VoChn);
    SAMPLE_COMM_VO_StopChn(VoDev, enVoMode);
END_720P_2:
    SAMPLE_COMM_VO_StopDevLayer(VoDev);
END_720P_1:
    s32Ret = HI_MPI_VI_DisableChn(ExtChn);
    SAMPLE_COMM_VI_StopVi(pstViConfig);
END_720P_0:
    SAMPLE_COMM_SYS_Exit();

    return s32Ret;
}
int main(int argc, char *argv[])
{
	HI_S32 s32Ret = 0;
	VO_PUB_ATTR_S stPubAttr;
	VB_CONF_S stVbConf = {0};
    HI_U32 u32FrmRate;
	SAMPLE_VO_MODE_E stVoMode = VO_MODE_1MUX;
	stPubAttr.u32BgColor = 0x000000ff;
	stPubAttr.enIntfType = VO_INTF_CVBS;
    stPubAttr.enIntfSync = VO_OUTPUT_PAL;
	stPubAttr.bDoubleFrame = HI_FALSE;
    u32FrmRate = 25;

    if (argc < 2)
    {
        printf("Usage : %s  <intf>\n", argv[0]);
        printf("intf : \n");
        printf("\t0) CVBS(PAL).  Default\n");
        printf("\t1) BT1120(720P50).\n");        
    }
    else
    {
        if(*argv[1] == '1')
        {
			stPubAttr.enIntfType = VO_INTF_BT1120;
            stPubAttr.enIntfSync = VO_OUTPUT_720P50;
            u32FrmRate = 50;
        }
    }

    if(VO_INTF_CVBS == stPubAttr.enIntfType)
    {
        printf("now is cvbs output.\n");
    }
    else
    {
        printf("now is bt1120 output.\n");
    }

	stVbConf.u32MaxPoolCnt = 16;
	/*no need common video buffer!*/
	
    /*1 enable Vo device first*/
	if(HI_SUCCESS != SAMPLE_COMM_SYS_Init(&stVbConf))
	{
		return -1;
	}    

    s32Ret = SAMPLE_COMM_VO_StartDevLayer(VoDev, &stPubAttr, u32FrmRate);
	if(HI_SUCCESS != s32Ret)
	{
		SAMPLE_COMM_SYS_Exit();
		return -1;
	}

	if (HI_SUCCESS != SAMPLE_COMM_VO_StartChn(SAMPLE_VO_DEV_DSD0, &stPubAttr, stVoMode))
	{
		SAMPLE_COMM_SYS_Exit();
		return -1;
	}

	/*2 run tde sample which draw grahpic on HiFB memory*/
	s32Ret = TDE_DrawGraphicSample();
	if(s32Ret != HI_SUCCESS)
	{
		goto err;
	}

err:
    SAMPLE_COMM_VO_StopChn(SAMPLE_VO_DEV_DSD0, stVoMode);  
    SAMPLE_COMM_VO_StopDevLayer(SAMPLE_VO_DEV_DSD0);
    SAMPLE_COMM_SYS_Exit();

	return 0;
}