You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

837 lines
25 KiB

3 years ago
/******************************************************************************
Some simple Hisilicon Hi3531 video output functions.
Copyright (C), 2010-2011, Hisilicon Tech. Co., Ltd.
******************************************************************************
Modification: 2011-2 Created
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/time.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <math.h>
#include <unistd.h>
#include <signal.h>
#include "sample_comm.h"
static HI_S32 gs_s32SnapCnt = 0;
HI_S32 SAMPLE_COMM_VO_GetWH(VO_INTF_SYNC_E enIntfSync, HI_U32 *pu32W,HI_U32 *pu32H, HI_U32 *pu32Frm)
{
switch (enIntfSync)
{
case VO_OUTPUT_PAL : *pu32W = 720; *pu32H = 576; *pu32Frm = 25; break;
case VO_OUTPUT_NTSC : *pu32W = 720; *pu32H = 480; *pu32Frm = 30; break;
case VO_OUTPUT_576P50 : *pu32W = 720; *pu32H = 576; *pu32Frm = 50; break;
case VO_OUTPUT_480P60 : *pu32W = 720; *pu32H = 480; *pu32Frm = 60; break;
case VO_OUTPUT_800x600_60: *pu32W = 800; *pu32H = 600; *pu32Frm = 60; break;
case VO_OUTPUT_720P50 : *pu32W = 1280; *pu32H = 720; *pu32Frm = 50; break;
case VO_OUTPUT_720P60 : *pu32W = 1280; *pu32H = 720; *pu32Frm = 60; break;
case VO_OUTPUT_1080I50 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 50; break;
case VO_OUTPUT_1080I60 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 60; break;
case VO_OUTPUT_1080P24 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 24; break;
case VO_OUTPUT_1080P25 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 25; break;
case VO_OUTPUT_1080P30 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 30; break;
case VO_OUTPUT_1080P50 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 50; break;
case VO_OUTPUT_1080P60 : *pu32W = 1920; *pu32H = 1080; *pu32Frm = 60; break;
case VO_OUTPUT_1024x768_60: *pu32W = 1024; *pu32H = 768; *pu32Frm = 60; break;
case VO_OUTPUT_1280x1024_60: *pu32W = 1280; *pu32H = 1024; *pu32Frm = 60; break;
case VO_OUTPUT_1366x768_60: *pu32W = 1366; *pu32H = 768; *pu32Frm = 60; break;
case VO_OUTPUT_1440x900_60: *pu32W = 1440; *pu32H = 900; *pu32Frm = 60; break;
case VO_OUTPUT_1280x800_60: *pu32W = 1280; *pu32H = 800; *pu32Frm = 60; break;
case VO_OUTPUT_1600x1200_60: *pu32W = 1600; *pu32H = 1200; *pu32Frm = 60; break;
case VO_OUTPUT_1680x1050_60: *pu32W = 1680; *pu32H = 1050; *pu32Frm = 60; break;
case VO_OUTPUT_1920x1200_60: *pu32W = 1920; *pu32H = 1200; *pu32Frm = 60; break;
case VO_OUTPUT_3840x2160_30: *pu32W = 3840; *pu32H = 2160; *pu32Frm = 30; break;
case VO_OUTPUT_3840x2160_60: *pu32W = 3840; *pu32H = 2160; *pu32Frm = 60; break;
case VO_OUTPUT_USER : *pu32W = 720; *pu32H = 576; *pu32Frm = 25; break;
default:
SAMPLE_PRT("vo enIntfSync not support!\n");
return HI_FAILURE;
}
return HI_SUCCESS;
}
/******************************************************************************
* function : Set system memory location
******************************************************************************/
HI_S32 SAMPLE_COMM_VO_MemConfig(VO_DEV VoDev, HI_CHAR *pcMmzName)
{
HI_S32 s32Ret = HI_SUCCESS;
MPP_CHN_S stMppChnVO;
/* config vo dev */
stMppChnVO.enModId = HI_ID_VOU;
stMppChnVO.s32DevId = VoDev;
stMppChnVO.s32ChnId = 0;
s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVO, pcMmzName);
if (s32Ret)
{
SAMPLE_PRT("HI_MPI_SYS_SetMemConf ERR !\n");
return HI_FAILURE;
}
return HI_SUCCESS;
}
HI_S32 SAMPLE_COMM_VO_StartDev(VO_DEV VoDev, VO_PUB_ATTR_S *pstPubAttr)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VO_Enable(VoDev);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_StopDev(VO_DEV VoDev)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_Disable(VoDev);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_StartLayer(VO_LAYER VoLayer,const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_SetVideoLayerAttr(VoLayer, pstLayerAttr);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VO_EnableVideoLayer(VoLayer);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_StopLayer(VO_LAYER VoLayer)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_DisableVideoLayer(VoLayer);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_StartChn(VO_LAYER VoLayer, SAMPLE_VO_MODE_E enMode)
{
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32WndNum = 0;
HI_U32 u32Square = 0;
HI_U32 u32Width = 0;
HI_U32 u32Height = 0;
VO_CHN_ATTR_S stChnAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
HI_S32 s32ChnFrmRate;
switch (enMode)
{
case VO_MODE_1MUX:
u32WndNum = 1;
u32Square = 1;
break;
case VO_MODE_4MUX:
u32WndNum = 4;
u32Square = 2;
break;
case VO_MODE_9MUX:
u32WndNum = 9;
u32Square = 3;
break;
case VO_MODE_16MUX:
u32WndNum = 16;
u32Square = 4;
break;
default:
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VO_GetVideoLayerAttr(VoLayer, &stLayerAttr);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
u32Width = stLayerAttr.stImageSize.u32Width;
u32Height = stLayerAttr.stImageSize.u32Height;
printf("u32Width:%d, u32Square:%d\n", u32Width, u32Square);
if (stLayerAttr.u32DispFrmRt <= 0)
{
s32ChnFrmRate = 30;
}
else if (stLayerAttr.u32DispFrmRt > 30)
{
s32ChnFrmRate = stLayerAttr.u32DispFrmRt / 2;
}
else
{
s32ChnFrmRate = stLayerAttr.u32DispFrmRt;
}
for (i=0; i<u32WndNum; i++)
{
stChnAttr.stRect.s32X = ALIGN_BACK((u32Width/u32Square) * (i%u32Square), 2);
stChnAttr.stRect.s32Y = ALIGN_BACK((u32Height/u32Square) * (i/u32Square), 2);
stChnAttr.stRect.u32Width = ALIGN_BACK(u32Width/u32Square, 2);
stChnAttr.stRect.u32Height = ALIGN_BACK(u32Height/u32Square, 2);
stChnAttr.u32Priority = 0;
stChnAttr.bDeflicker = HI_FALSE;
s32Ret = HI_MPI_VO_SetChnAttr(VoLayer, i, &stChnAttr);
if (s32Ret != HI_SUCCESS)
{
printf("%s(%d):failed with %#x!\n", __FUNCTION__, __LINE__, s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VO_SetChnFrameRate(VoLayer, i, s32ChnFrmRate);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VO_EnableChn(VoLayer, i);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
}
return HI_SUCCESS;
}
HI_S32 SAMPLE_COMM_VO_StopChn(VO_LAYER VoLayer, SAMPLE_VO_MODE_E enMode)
{
HI_S32 i;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 u32WndNum = 0;
switch (enMode)
{
case VO_MODE_1MUX:
{
u32WndNum = 1;
break;
}
case VO_MODE_4MUX:
{
u32WndNum = 4;
break;
}
case VO_MODE_9MUX:
{
u32WndNum = 9;
break;
}
case VO_MODE_16MUX:
{
u32WndNum = 16;
break;
}
default:
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
for (i=0; i<u32WndNum; i++)
{
s32Ret = HI_MPI_VO_DisableChn(VoLayer, i);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_StartWbc(VO_WBC VoWbc,const VO_WBC_ATTR_S *pstWbcAttr)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_SetWbcAttr(VoWbc, pstWbcAttr);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VO_EnableWbc(VoWbc);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_StopWbc(VO_WBC VoWbc)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_DisableWbc(VoWbc);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_Vpss_BindVpss(VPSS_GRP VpssDestGrp,VO_CHN VoChn,VPSS_GRP VpssSrcGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_SUCCESS;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssSrcGrp;
stSrcChn.s32ChnId = VpssChn;
stDestChn.enModId = HI_ID_VPSS;
stDestChn.s32DevId = VpssDestGrp;
stDestChn.s32ChnId = VoChn;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_BindVpss(VO_LAYER VoLayer,VO_CHN VoChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_SUCCESS;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssGrp;
stSrcChn.s32ChnId = VpssChn;
stDestChn.enModId = HI_ID_VOU;
stDestChn.s32DevId = VoLayer;
stDestChn.s32ChnId = VoChn;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_UnBindVpss(VO_LAYER VoLayer,VO_CHN VoChn,VPSS_GRP VpssGrp,VPSS_CHN VpssChn)
{
HI_S32 s32Ret = HI_SUCCESS;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssGrp;
stSrcChn.s32ChnId = VpssChn;
stDestChn.enModId = HI_ID_VOU;
stDestChn.s32DevId = VoLayer;
stDestChn.s32ChnId = VoChn;
s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_WBC_BindVo(VO_WBC VoWbc,VO_WBC_SOURCE_S *pstWbcSource)
{
HI_S32 s32Ret = HI_SUCCESS;
s32Ret = HI_MPI_VO_SetWbcSource(VoWbc, pstWbcSource);
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
return s32Ret;
}
HI_S32 SAMPLE_COMM_VO_BindVoWbc(VO_DEV VoWbcDev, VO_LAYER VoLayer, VO_CHN VoChn)
{
MPP_CHN_S stSrcChn, stDestChn;
stSrcChn.enModId = HI_ID_VOU;
stSrcChn.s32DevId = VoWbcDev;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = HI_ID_VOU;
stDestChn.s32ChnId = VoChn;
stDestChn.s32DevId = VoLayer;
return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
}
HI_S32 SAMPLE_COMM_VO_UnBindVoWbc(VO_LAYER VoLayer, VO_CHN VoChn)
{
MPP_CHN_S stDestChn;
stDestChn.enModId = HI_ID_VOU;
stDestChn.s32DevId = VoLayer;
stDestChn.s32ChnId = VoChn;
return HI_MPI_SYS_UnBind(NULL, &stDestChn);
}
HI_S32 SAMPLE_COMM_VO_BindVi(VO_LAYER VoLayer, VO_CHN VoChn, VI_CHN ViChn)
{
MPP_CHN_S stSrcChn, stDestChn;
stSrcChn.enModId = HI_ID_VIU;
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = ViChn;
stDestChn.enModId = HI_ID_VOU;
stDestChn.s32ChnId = VoChn;
stDestChn.s32DevId = VoLayer;
return HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
}
HI_S32 SAMPLE_COMM_VO_UnBindVi(VO_LAYER VoLayer, VO_CHN VoChn)
{
MPP_CHN_S stDestChn;
stDestChn.enModId = HI_ID_VOU;
stDestChn.s32DevId = VoLayer;
stDestChn.s32ChnId = VoChn;
return HI_MPI_SYS_UnBind(NULL, &stDestChn);
}
static HI_VOID SAMPLE_COMM_VO_HdmiConvertSync(VO_INTF_SYNC_E enIntfSync,
HI_HDMI_VIDEO_FMT_E *penVideoFmt)
{
switch (enIntfSync)
{
case VO_OUTPUT_PAL:
*penVideoFmt = HI_HDMI_VIDEO_FMT_PAL;
break;
case VO_OUTPUT_NTSC:
*penVideoFmt = HI_HDMI_VIDEO_FMT_NTSC;
break;
case VO_OUTPUT_1080P24:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_24;
break;
case VO_OUTPUT_1080P25:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_25;
break;
case VO_OUTPUT_1080P30:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_30;
break;
case VO_OUTPUT_720P50:
*penVideoFmt = HI_HDMI_VIDEO_FMT_720P_50;
break;
case VO_OUTPUT_720P60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_720P_60;
break;
case VO_OUTPUT_1080I50:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080i_50;
break;
case VO_OUTPUT_1080I60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080i_60;
break;
case VO_OUTPUT_1080P50:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_50;
break;
case VO_OUTPUT_1080P60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_1080P_60;
break;
case VO_OUTPUT_576P50:
*penVideoFmt = HI_HDMI_VIDEO_FMT_576P_50;
break;
case VO_OUTPUT_480P60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_480P_60;
break;
case VO_OUTPUT_800x600_60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_800X600_60;
break;
case VO_OUTPUT_1024x768_60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1024X768_60;
break;
case VO_OUTPUT_1280x1024_60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1280X1024_60;
break;
case VO_OUTPUT_1366x768_60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1366X768_60;
break;
case VO_OUTPUT_1440x900_60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1440X900_60;
break;
case VO_OUTPUT_1280x800_60:
*penVideoFmt = HI_HDMI_VIDEO_FMT_VESA_1280X800_60;
break;
default :
SAMPLE_PRT("Unkonw VO_INTF_SYNC_E value!\n");
break;
}
return;
}
static HI_S32 SAMPLE_COMM_HdmiHotPlugEvent(HI_VOID *pPrivateData)
{
HI_S32 s32Ret = HI_SUCCESS;
HDMI_CALLBACK_ARGS_S *pArgs = (HDMI_CALLBACK_ARGS_S*)pPrivateData;
HI_HDMI_ID_E hHdmi = pArgs->enHdmi;
HI_HDMI_ATTR_S stHdmiAttr;
HI_HDMI_SINK_CAPABILITY_S stSinkCap;
HI_HDMI_INFOFRAME_S stHdmiInfoFrame;
printf("\n --- hotplug event handling ---\n");
s32Ret = HI_MPI_HDMI_GetAttr(hHdmi, &stHdmiAttr);
if(HI_SUCCESS != s32Ret)
{
printf("HI_MPI_HDMI_GetAttr ERROR \n");
return HI_FAILURE;
}
s32Ret = HI_MPI_HDMI_GetSinkCapability(hHdmi, &stSinkCap);
if(HI_SUCCESS != s32Ret)
{
printf("HI_MPI_HDMI_GetSinkCapability ERROR \n");
return HI_FAILURE;
}
if (HI_FALSE == stSinkCap.bConnected )
{
printf("stSinkCap.bConnected is HI_FALSE!\n");
return HI_FAILURE;
}
stHdmiAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
if(HI_TRUE == stSinkCap.bSupportHdmi)
{
stHdmiAttr.bEnableHdmi = HI_TRUE;
if(HI_TRUE != stSinkCap.bSupportYCbCr)
{
stHdmiAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_RGB444;
}
}
else
{
stHdmiAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_RGB444;
//read real edid ok && sink not support hdmi,then we run in dvi mode
stHdmiAttr.bEnableHdmi = HI_FALSE;
}
if(HI_TRUE == stHdmiAttr.bEnableHdmi)
{
stHdmiAttr.bEnableVideo = HI_TRUE;
stHdmiAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_OFF;
stHdmiAttr.bxvYCCMode = HI_FALSE;
stHdmiAttr.bEnableAudio = HI_FALSE;
stHdmiAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
stHdmiAttr.bIsMultiChannel = HI_FALSE;
stHdmiAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
stHdmiAttr.bEnableAviInfoFrame = HI_TRUE;
stHdmiAttr.bEnableAudInfoFrame = HI_TRUE;
stHdmiAttr.bEnableSpdInfoFrame = HI_FALSE;
stHdmiAttr.bEnableMpegInfoFrame = HI_FALSE;
stHdmiAttr.bDebugFlag = HI_FALSE;
stHdmiAttr.bHDCPEnable = HI_FALSE;
stHdmiAttr.b3DEnable = HI_FALSE;
HI_MPI_HDMI_GetInfoFrame(hHdmi, HI_INFOFRAME_TYPE_AVI, &stHdmiInfoFrame);
stHdmiInfoFrame.unInforUnit.stAVIInfoFrame.enOutputType = stHdmiAttr.enVidOutMode;
HI_MPI_HDMI_SetInfoFrame(hHdmi, &stHdmiInfoFrame);
}
else
{
stHdmiAttr.bEnableVideo = HI_TRUE;
stHdmiAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_RGB444;
stHdmiAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_OFF;
stHdmiAttr.bEnableAudio = HI_FALSE;
stHdmiAttr.bEnableAviInfoFrame = HI_FALSE;
stHdmiAttr.bEnableAudInfoFrame = HI_FALSE;
}
if ( pArgs->eForceFmt >= HI_HDMI_VIDEO_FMT_1080P_60
&& pArgs->eForceFmt < HI_HDMI_VIDEO_FMT_BUTT
&& stSinkCap.bVideoFmtSupported[pArgs->eForceFmt] )
{
printf("set force format=%d\n",pArgs->eForceFmt);
stHdmiAttr.enVideoFmt = pArgs->eForceFmt;
}
else
{
printf("not support expected format=%d, we set native format=%d\n",pArgs->eForceFmt,stSinkCap.enNativeVideoFormat);
stHdmiAttr.enVideoFmt = stSinkCap.enNativeVideoFormat;
}
s32Ret = HI_MPI_HDMI_SetAttr(hHdmi, &stHdmiAttr);
if(HI_SUCCESS != s32Ret)
{
printf("HI_MPI_HDMI_SetAttr ERROR \n");
return HI_FAILURE;
}
/* HI_MPI_HDMI_SetAttr must before HI_MPI_HDMI_Start! */
s32Ret = HI_MPI_HDMI_Start(hHdmi);
if(HI_SUCCESS != s32Ret)
{
printf("HI_MPI_HDMI_Start ERROR \n");
return HI_FAILURE;
}
return s32Ret;
}
static HI_S32 SAMPLE_COMM_HdmiUnPlugEvent(HI_VOID *pPrivateData)
{
HI_S32 s32Ret = HI_SUCCESS;
HDMI_CALLBACK_ARGS_S *pArgs = (HDMI_CALLBACK_ARGS_S*)pPrivateData;
HI_HDMI_ID_E hHdmi = pArgs->enHdmi;
printf("\n --- UnPlug event handling. --- \n");
s32Ret = HI_MPI_HDMI_Stop(hHdmi);
if(HI_SUCCESS != s32Ret)
{
printf("HI_MPI_HDMI_Stop ERROR \n");
return HI_FAILURE;
}
return s32Ret;
}
HI_VOID SAMPLE_COMM_HdmiCallbackEvent(HI_HDMI_EVENT_TYPE_E event, HI_VOID *pPrivateData)
{
printf("\ncallback fun HDMI_EventProc handling event:%d(0x%02x)\n",event,event);
switch ( event )
{
case HI_HDMI_EVENT_HOTPLUG:
printf("[HDMI EVENT]==>HI_HDMI_EVENT_HOTPLUG \n");
SAMPLE_COMM_HdmiHotPlugEvent(pPrivateData);
break;
case HI_HDMI_EVENT_NO_PLUG:
printf("[HDMI EVENT]==>HI_HDMI_EVENT_NO_PLUG \n");
SAMPLE_COMM_HdmiUnPlugEvent(pPrivateData);
break;
case HI_HDMI_EVENT_EDID_FAIL:
printf("[HDMI EVENT]==>HI_HDMI_EVENT_EDID_FAIL \n");
break;
case HI_HDMI_EVENT_HDCP_FAIL:
printf("[HDMI EVENT]==>HI_HDMI_EVENT_HDCP_FAIL \n");
break;
case HI_HDMI_EVENT_HDCP_SUCCESS:
printf("[HDMI EVENT]==>HI_HDMI_EVENT_HDCP_SUCCESS \n");
break;
case HI_HDMI_EVENT_HDCP_USERSETTING:
printf("[HDMI EVENT]==>HI_HDMI_EVENT_HDCP_USERSETTING \n");
break;
default:
printf("[HDMI EVENT]==>un-known event:%d\n",event);
return;
}
return;
}
HI_S32 SAMPLE_COMM_VO_HdmiCallbackStart(VO_INTF_SYNC_E enIntfSync, HDMI_CALLBACK_ARGS_S *pstCallbackArgs)
{
HI_HDMI_VIDEO_FMT_E enVideoFmt;
HI_HDMI_INIT_PARA_S stHdmiPara;
SAMPLE_COMM_VO_HdmiConvertSync(enIntfSync, &enVideoFmt);
pstCallbackArgs->eForceFmt = enVideoFmt;
pstCallbackArgs->enHdmi = HI_HDMI_ID_0;
stHdmiPara.enForceMode = HI_HDMI_FORCE_HDMI;
stHdmiPara.pCallBackArgs = (void *)pstCallbackArgs;
stHdmiPara.pfnHdmiEventCallback = SAMPLE_COMM_HdmiCallbackEvent;
HI_MPI_HDMI_Init(&stHdmiPara);
HI_MPI_HDMI_Open(HI_HDMI_ID_0);
printf("HDMI start success.\n");
return HI_SUCCESS;
}
HI_S32 SAMPLE_COMM_VO_HdmiStart(VO_INTF_SYNC_E enIntfSync)
{
HI_HDMI_ATTR_S stAttr;
HI_HDMI_VIDEO_FMT_E enVideoFmt;
HI_HDMI_INIT_PARA_S stHdmiPara;
SAMPLE_COMM_VO_HdmiConvertSync(enIntfSync, &enVideoFmt);
stHdmiPara.pfnHdmiEventCallback = NULL;
stHdmiPara.pCallBackArgs = NULL;
stHdmiPara.enForceMode = HI_HDMI_FORCE_HDMI;
HI_MPI_HDMI_Init(&stHdmiPara);
HI_MPI_HDMI_Open(HI_HDMI_ID_0);
HI_MPI_HDMI_GetAttr(HI_HDMI_ID_0, &stAttr);
stAttr.bEnableHdmi = HI_TRUE;
stAttr.bEnableVideo = HI_TRUE;
stAttr.enVideoFmt = enVideoFmt;
stAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_OFF;
stAttr.bxvYCCMode = HI_FALSE;
stAttr.bEnableAudio = HI_FALSE;
stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
stAttr.bIsMultiChannel = HI_FALSE;
stAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
stAttr.bEnableAviInfoFrame = HI_TRUE;
stAttr.bEnableAudInfoFrame = HI_TRUE;
stAttr.bEnableSpdInfoFrame = HI_FALSE;
stAttr.bEnableMpegInfoFrame = HI_FALSE;
stAttr.bDebugFlag = HI_FALSE;
stAttr.bHDCPEnable = HI_FALSE;
stAttr.b3DEnable = HI_FALSE;
HI_MPI_HDMI_SetAttr(HI_HDMI_ID_0, &stAttr);
HI_MPI_HDMI_Start(HI_HDMI_ID_0);
printf("HDMI start success.\n");
return HI_SUCCESS;
}
HI_S32 SAMPLE_COMM_VO_HdmiStop(HI_VOID)
{
HI_MPI_HDMI_Stop(HI_HDMI_ID_0);
HI_MPI_HDMI_Close(HI_HDMI_ID_0);
HI_MPI_HDMI_DeInit();
return HI_SUCCESS;
}
HI_S32 SAMPLE_COMM_VO_SnapStart(VENC_CHN VencChn, SIZE_S *pstSize)
{
HI_S32 s32Ret;
VENC_CHN_ATTR_S stVencChnAttr;
VENC_ATTR_JPEG_S stJpegAttr;
/******************************************
step 1: Create Venc Channel
******************************************/
stVencChnAttr.stVeAttr.enType = PT_JPEG;
stJpegAttr.u32MaxPicWidth = pstSize->u32Width;
stJpegAttr.u32MaxPicHeight = pstSize->u32Height;
stJpegAttr.u32PicWidth = pstSize->u32Width;
stJpegAttr.u32PicHeight = pstSize->u32Height;
stJpegAttr.u32BufSize = pstSize->u32Width * pstSize->u32Height * 2;
stJpegAttr.bByFrame = HI_TRUE;/*get stream mode is field mode or frame mode*/
stJpegAttr.bSupportDCF = HI_FALSE;
memcpy(&stVencChnAttr.stVeAttr.stAttrJpeg, &stJpegAttr, sizeof(VENC_ATTR_JPEG_S));
s32Ret = HI_MPI_VENC_CreateChn(VencChn, &stVencChnAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_CreateChn [%d] faild with %#x!\n",\
VencChn, s32Ret);
return s32Ret;
}
return HI_SUCCESS;
}
/******************************************************************************
* funciton : Stop snap
******************************************************************************/
HI_S32 SAMPLE_COMM_VO_SnapStop(VENC_CHN VencChn)
{
HI_S32 s32Ret;
s32Ret = HI_MPI_VENC_StopRecvPic(VencChn);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_StopRecvPic vechn[%d] failed with %#x!\n", VencChn, s32Ret);
return HI_FAILURE;
}
s32Ret = HI_MPI_VENC_DestroyChn(VencChn);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_DestroyChn vechn[%d] failed with %#x!\n", VencChn, s32Ret);
return HI_FAILURE;
}
return HI_SUCCESS;
}