Hi,
I have some issue with the encoded video,
previously I was using camera and I'm very sure that the video speed was according to real time.
I than change from camera input to dvd (NAKASUMI IT-DIVX100), using it's s-video output, and now I see that the video speed is slower then real time.
I made some tried with changing video standard in both vcapture depice, and capture link, but it did not help.
I'm not sure what exactly I should change.
Can you please point me to the required changes ? Attached is the use case (the use case is very simple: single D1 encoding)
Thanks, Ran
Ran
/*******************************************************************************
* *
* Copyright (c) 2009 Texas Instruments Incorporated - http://www.ti.com/ *
* ALL RIGHTS RESERVED *
* *
******************************************************************************/
/* ranran new file */
/*
Capture (YUV422I) 1CH 720P 60fps
|
|
|
DEIH (DEI-SC YUV422I )
|
|
|
DUP
| |
+--------- ---- NSF (YUV420)-----IPC-OUT(VPSS)---IPC-IN(VIDEO-M3)---ENC--IPCBITS-OUT(M3)---IPCBITS-IN(Host)
|
|
SW Mosaic
(SC5 YUV422I)
|
On-Chip HDMI
1080p60
*/
#include "mcfw/src_linux/mcfw_api/usecases/multich_common.h"
#include "mcfw/src_linux/mcfw_api/usecases/multich_ipcbits.h"
#include "mcfw/src_linux/mcfw_api/ti_vdis_priv.h"
#include "mcfw/src_linux/devices/tw2968/src/tw2968_priv.h"
#include "mcfw/src_linux/devices/tvp5158/src/tvp5158_priv.h"
#include "mcfw/interfaces/link_api/system_tiler.h"
#include "mcfw/interfaces/link_api/avsync_hlos.h"
#include "mcfw/interfaces/ti_vdis_timings.h"
/* ranran #define ENABLE_FAKE_HD_MODE */
/* =============================================================================
* Use case code
* =============================================================================
*/
static
Void MultiCh_singlewin_layoutprm(SwMsLink_LayoutPrm *layoutInfo,VSYS_VIDEO_STANDARD_E outRes)
{
SwMsLink_LayoutWinInfo *winInfo;
UInt32 outWidth, outHeight, winId, widthAlign, heightAlign;
MultiCh_swMsGetOutSize(outRes, &outWidth, &outHeight);
widthAlign = 8;
heightAlign = 1;
/* init to known default */
memset(layoutInfo, 0, sizeof(*layoutInfo));
layoutInfo->onlyCh2WinMapChanged = FALSE;
layoutInfo->outputFPS = 60;
layoutInfo->numWin = 1;
winId = 0;
winInfo = &layoutInfo->winInfo[winId];
winInfo->width = SystemUtils_floor(outWidth, widthAlign);
winInfo->height = SystemUtils_floor(outHeight, heightAlign);
winInfo->startX = 0;
winInfo->startY = 0;
winInfo->bypass = FALSE;
winInfo->channelNum = 0;
}
#define MAX_NUM_CAPTURE_DEVICES (4)
VCAP_DEVICE_CREATE_PARAM_S vidDecVideoModeArgs[MAX_NUM_CAPTURE_DEVICES];
#ifdef ENABLE_FAKE_HD_MODE
static
Void multich_hddvr_configure_extvideodecoder_prm()
{
int i;
VCAP_VIDEO_SOURCE_STATUS_S vidSourceStatus;
UInt32 deviceId;
UInt32 numCaptureDevices;
deviceId = DEVICE_VID_DEC_TVP5158_DRV;
if (deviceId == DEVICE_VID_DEC_TW2968_DRV)
{
numCaptureDevices = 2;
}
else
{
numCaptureDevices = 4;
}
for(i = 0; i < numCaptureDevices; i++)
{
vidDecVideoModeArgs[i].deviceId = deviceId;
if(deviceId == DEVICE_VID_DEC_TW2968_DRV)
{
/* consider first device connected to VIP0 Port A and second device connected to VIP1 PortA */
vidDecVideoModeArgs[i].vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA+i*2;
vidDecVideoModeArgs[i].numChInDevice = 1;
}
else
{
/* consider first device connected to VIP0 Port A and second device connected to VIP1 PortA */
vidDecVideoModeArgs[i].vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA+i;
vidDecVideoModeArgs[i].numChInDevice = 1;
}
vidDecVideoModeArgs[i].modeParams.videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
vidDecVideoModeArgs[i].modeParams.videoDataFormat = SYSTEM_DF_YUV422P;
vidDecVideoModeArgs[i].modeParams.standard = SYSTEM_STD_D1;
vidDecVideoModeArgs[i].modeParams.videoCaptureMode =
DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
vidDecVideoModeArgs[i].modeParams.videoSystem =
DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
vidDecVideoModeArgs[i].modeParams.videoCropEnable = FALSE;
vidDecVideoModeArgs[i].modeParams.videoAutoDetectTimeout = -1;
}
Vcap_configVideoDecoder(&vidDecVideoModeArgs[0],
numCaptureDevices);
Vcap_getVideoSourceStatus(&vidSourceStatus);
Vcap_setVideoSourceStatus(&vidSourceStatus);
}
#endif
#define NUM_CAPTURE_DEVICES 1
Void CommitCh_createHdDvr()
{
CaptureLink_CreateParams capturePrm;
DeiLink_CreateParams deiPrm;
DupLink_CreateParams dupPrm; /* ranran , dupPrm1; */
SwMsLink_CreateParams swMsPrm;
DisplayLink_CreateParams displayPrm;
NsfLink_CreateParams nsfPrm;
CaptureLink_VipInstParams *pCaptureInstPrm;
CaptureLink_OutParams *pCaptureOutPrm;
EncLink_ChCreateParams *pLinkChPrm;
EncLink_ChDynamicParams *pLinkDynPrm;
VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
VENC_CHN_PARAMS_S *pChPrm;
IpcLink_CreateParams ipcOutVpssPrm;
IpcLink_CreateParams ipcInVideoPrm;
EncLink_CreateParams encPrm;
IpcBitsOutLinkRTOS_CreateParams ipcBitsOutVideoPrm;
IpcBitsInLinkHLOS_CreateParams ipcBitsInHostPrm;
/* MergeLink_CreateParams mergePrm; ranran */
UInt32 grpxId[VDIS_DEV_MAX];
UInt32 dupId;
/*ranran UInt32 mergeId, dupId1;*/
UInt32 deiOutQue;
UInt32 ipcOutVpssId;
UInt32 ipcInVideoId;
UInt32 chId;
UInt32 i;
MULTICH_INIT_STRUCT(CaptureLink_CreateParams ,capturePrm);
MULTICH_INIT_STRUCT(DeiLink_CreateParams ,deiPrm);
MULTICH_INIT_STRUCT(NsfLink_CreateParams ,nsfPrm);
MULTICH_INIT_STRUCT(IpcLink_CreateParams ,ipcInVideoPrm);
MULTICH_INIT_STRUCT(IpcBitsOutLinkRTOS_CreateParams,ipcBitsOutVideoPrm);
MULTICH_INIT_STRUCT(IpcBitsInLinkHLOS_CreateParams,ipcBitsInHostPrm);
MULTICH_INIT_STRUCT(DisplayLink_CreateParams,displayPrm);
MULTICH_INIT_STRUCT(SwMsLink_CreateParams ,swMsPrm);
MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
printf("?????????????????????????????????? aaaaaaaaaaaaaaaaaaa\n");
MultiCh_detectBoard();
System_linkControl(
SYSTEM_LINK_ID_M3VPSS,
SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES,
NULL,
0,
TRUE
);
gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE;
gVcapModuleContext.nsfId[0] = SYSTEM_LINK_ID_NSF_0;
gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_0;
dupId = SYSTEM_VPSS_LINK_ID_DUP_0;
/* ranran dupId1 = SYSTEM_VPSS_LINK_ID_DUP_1;
mergeId = SYSTEM_VPSS_LINK_ID_MERGE_0; */
gVdisModuleContext.swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
swMsPrm.numSwMsInst = 1;
swMsPrm.swMsInstId[0] = SYSTEM_SW_MS_SC_INST_SC5; /* ranran was SYSTEM_SW_MS_SC_INST_DEI_SC */
gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; // ON CHIP HDMI
grpxId[0] = SYSTEM_LINK_ID_GRPX_0;
ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0;
gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
capturePrm.numVipInst = 1;
capturePrm.outQueParams[0].nextLink = gVcapModuleContext.deiId[0];
capturePrm.tilerEnable = FALSE;
capturePrm.enableSdCrop = FALSE;
#ifdef ENABLE_FAKE_HD_MODE
capturePrm.fakeHdMode = TRUE;
#else
capturePrm.fakeHdMode = FALSE;
#endif
pCaptureInstPrm = &capturePrm.vipInst[0];
pCaptureInstPrm->vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA;
pCaptureOutPrm = &pCaptureInstPrm->outParams[0];
#ifdef ENABLE_FAKE_HD_MODE
gVcapModuleContext.isWrbkCaptEnable = TRUE;
pCaptureInstPrm->enableTimestampInInterrupt = TRUE;
pCaptureInstPrm->vipInstIdnsf = SYSTEM_CAPTURE_INST_SC5_WB2;
pCaptureInstPrm->videoDecoderId = 0;
pCaptureInstPrm->inScanFormat = SYSTEM_SF_PROGRESSIVE;
pCaptureInstPrm->inDataFormat = SYSTEM_DF_RGB24_888;
pCaptureInstPrm->standard = SYSTEM_STD_1080P_60;
pCaptureOutPrm->scOutWidth = 1920;
pCaptureOutPrm->scOutHeight = 1080;
#else
pCaptureInstPrm->inScanFormat = SYSTEM_SF_INTERLACED;
pCaptureInstPrm->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV; /* ranran set to tvp5158 */ /* DONT set it to TVP5158 */
pCaptureInstPrm->standard = SYSTEM_STD_D1; /* ranran changed from 1080I */
pCaptureInstPrm->inDataFormat = SYSTEM_DF_YUV422P;
pCaptureOutPrm->scOutWidth = 0;
pCaptureOutPrm->scOutHeight = 0;
#endif
pCaptureInstPrm->videoCaptureMode = DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
pCaptureInstPrm->videoIfMode = SYSTEM_CAPT_VIDEO_IF_MODE_8BIT; /* ranran changed from 16 */
pCaptureOutPrm->dataFormat = SYSTEM_DF_YUV422I_YUYV;
pCaptureInstPrm->numOutput = 1;
pCaptureOutPrm->scEnable = FALSE;
pCaptureOutPrm->outQueId = 0;
/* ranran added *******************************/
for(i = 0; i < NUM_CAPTURE_DEVICES; i++)
{
vidDecVideoModeArgs[i].vipInstId = SYSTEM_CAPTURE_INST_VIP0_PORTA+i;
vidDecVideoModeArgs[i].deviceId = DEVICE_VID_DEC_TVP5158_DRV;
vidDecVideoModeArgs[i].numChInDevice = 4;
vidDecVideoModeArgs[i].modeParams.videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_8BIT;
vidDecVideoModeArgs[i].modeParams.videoDataFormat = SYSTEM_DF_YUV422P;
vidDecVideoModeArgs[i].modeParams.standard = SYSTEM_STD_D1;
vidDecVideoModeArgs[i].modeParams.videoCaptureMode =
DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
vidDecVideoModeArgs[i].modeParams.videoSystem =
DEVICE_VIDEO_DECODER_VIDEO_SYSTEM_AUTO_DETECT;
vidDecVideoModeArgs[i].modeParams.videoCropEnable = FALSE;
vidDecVideoModeArgs[i].modeParams.videoAutoDetectTimeout = -1;
}
/* ranran added *******************************/
Vcap_configVideoDecoder(vidDecVideoModeArgs, NUM_CAPTURE_DEVICES);
#ifdef ENABLE_FAKE_HD_MODE
multich_hddvr_configure_extvideodecoder_prm();
#else
gVcapModuleContext.vcapConfig.enableConfigExtVideoDecoder = FALSE;
#endif
deiOutQue = DEI_LINK_OUT_QUE_DEI_SC;
deiPrm.inQueParams.prevLinkId = gVcapModuleContext.captureId;
deiPrm.inQueParams.prevLinkQueId = 0;
deiPrm.outQueParams[deiOutQue].nextLink = dupId;
deiPrm.enableOut[deiOutQue] = TRUE;
deiPrm.tilerEnable[deiOutQue] = FALSE;
deiPrm.comprEnable = FALSE;
deiPrm.setVipScYuv422Format = FALSE;
deiPrm.enableDeiForceBypass = FALSE; /* ranran */
// deiPrm.interlacedBypassMode = TRUE;
deiPrm.inputFrameRate[deiOutQue] = 60;
deiPrm.outputFrameRate[deiOutQue] = 60;
/* VIP Scalar ratio is 1:1 */
deiPrm.outScaleFactor[deiOutQue][0].scaleMode = DEI_SCALE_MODE_RATIO;
deiPrm.outScaleFactor[deiOutQue][0].ratio.widthRatio.numerator = 1;
deiPrm.outScaleFactor[deiOutQue][0].ratio.widthRatio.denominator = 1;
deiPrm.outScaleFactor[deiOutQue][0].ratio.heightRatio.numerator = 1;
deiPrm.outScaleFactor[deiOutQue][0].ratio.heightRatio.denominator = 1;
for (chId=1; chId < DEI_LINK_MAX_CH; chId++)
deiPrm.outScaleFactor[deiOutQue][chId] = deiPrm.outScaleFactor[DEI_LINK_OUT_QUE_VIP_SC][0];
dupPrm.inQueParams.prevLinkId = gVcapModuleContext.deiId[0];
dupPrm.inQueParams.prevLinkQueId = deiOutQue;
dupPrm.numOutQue = 2;
dupPrm.outQueParams[0].nextLink = gVdisModuleContext.swMsId[0];
dupPrm.outQueParams[1].nextLink = gVcapModuleContext.nsfId[0];
dupPrm.notifyNextLink = TRUE;
nsfPrm.bypassNsf = TRUE; /* ranran was false */
nsfPrm.tilerEnable = FALSE;
nsfPrm.inQueParams.prevLinkId = dupId;
nsfPrm.inQueParams.prevLinkQueId = 1;
nsfPrm.numOutQue = 1;
nsfPrm.outQueParams[0].nextLink = ipcOutVpssId; /* ranran gVdisModuleContext.swMsId[0]; */
/*ranran
dupPrm1.inQueParams.prevLinkId = gVcapModuleContext.nsfId[0];
dupPrm1.inQueParams.prevLinkQueId = 0;
dupPrm1.numOutQue = 2;
dupPrm1.outQueParams[0].nextLink = mergeId;
dupPrm1.outQueParams[1].nextLink = mergeId;
dupPrm1.notifyNextLink = TRUE;
mergePrm.numInQue = 2;
mergePrm.inQueParams[0].prevLinkId = dupId1;
mergePrm.inQueParams[0].prevLinkQueId = 0;
mergePrm.inQueParams[1].prevLinkId = dupId1;
mergePrm.inQueParams[1].prevLinkQueId = 1;
mergePrm.outQueParams.nextLink = ipcOutVpssId;
mergePrm.notifyNextLink = TRUE;
*/
swMsPrm.inQueParams.prevLinkId = dupId;
swMsPrm.inQueParams.prevLinkQueId = 0;
swMsPrm.outQueParams.nextLink = gVdisModuleContext.displayId[0];
swMsPrm.maxInputQueLen = SYSTEM_SW_MS_DEFAULT_INPUT_QUE_LEN;
swMsPrm.maxOutRes = VSYS_STD_1080P_60;
swMsPrm.initOutRes = VSYS_STD_1080P_60;
swMsPrm.lineSkipMode = FALSE;
swMsPrm.enableLayoutGridDraw = gVdisModuleContext.vdisConfig.enableLayoutGridDraw;
MultiCh_singlewin_layoutprm(&swMsPrm.layoutPrm,swMsPrm.initOutRes);
displayPrm.inQueParams[0].prevLinkId = gVdisModuleContext.swMsId[0];
displayPrm.inQueParams[0].prevLinkQueId = 0;
displayPrm.displayRes = swMsPrm.initOutRes;
ipcOutVpssPrm.inQueParams.prevLinkId = gVcapModuleContext.nsfId[0];
ipcOutVpssPrm.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.numOutQue = 1;
ipcOutVpssPrm.outQueParams[0].nextLink = ipcInVideoId;
ipcOutVpssPrm.notifyNextLink = TRUE; /* ranran was FALSE; */
ipcOutVpssPrm.notifyPrevLink = TRUE;
ipcOutVpssPrm.noNotifyMode = FALSE; /* ranran was TRUE; */
ipcInVideoPrm.inQueParams.prevLinkId = ipcOutVpssId;
ipcInVideoPrm.inQueParams.prevLinkQueId = 0;
ipcInVideoPrm.numOutQue = 1;
ipcInVideoPrm.outQueParams[0].nextLink = gVencModuleContext.encId;
ipcInVideoPrm.notifyNextLink = TRUE;
ipcInVideoPrm.notifyPrevLink = TRUE; /* ranran was FALSE; */
ipcInVideoPrm.noNotifyMode = FALSE; /* was TRUE; */
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.encId;
ipcBitsOutVideoPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsOutVideoPrm.baseCreateParams.numOutQue = 1;
ipcBitsOutVideoPrm.baseCreateParams.outQueParams[0].nextLink = gVencModuleContext.ipcBitsInHLOSId;
MultiCh_ipcBitsInitCreateParams_BitsOutRTOS(&ipcBitsOutVideoPrm, TRUE);
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkId = gVencModuleContext.ipcBitsOutRTOSId;
ipcBitsInHostPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcBitsInHostPrm.baseCreateParams.numOutQue = 1;
ipcBitsInHostPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
MultiCh_ipcBitsInitCreateParams_BitsInHLOS(&ipcBitsInHostPrm);
EncLink_CreateParams_Init(&encPrm); /* ranran added */
encPrm.inQueParams.prevLinkId = ipcInVideoId;
encPrm.inQueParams.prevLinkQueId= 0;
encPrm.outQueParams.nextLink = gVencModuleContext.ipcBitsOutRTOSId;
pLinkChPrm = &encPrm.chCreateParams[0];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[0];
pDynPrm = &pChPrm->dynamicParam;
encPrm.numBufPerCh[0] = 6;
encPrm.numBufPerCh[1] = 6;
encPrm.numBufPerCh[2] = 6;
pLinkChPrm->format = IVIDEO_H264HP;
pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
pLinkChPrm->dataLayout = VCODEC_FIELD_SEPARATED;
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
pLinkChPrm->encodingPreset = pChPrm->encodingPreset;
pLinkChPrm->rateControlPreset = pChPrm->rcType;
pLinkChPrm->enableSVCExtensionFlag = pChPrm->enableSVCExtensionFlag;
pLinkChPrm->numTemporalLayer = pChPrm->numTemporalLayer;
pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
pLinkDynPrm->targetBitRate = pDynPrm->targetBitRate;
pLinkDynPrm->interFrameInterval = 1;
pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->rcAlg = pDynPrm->rcAlg;
pLinkDynPrm->qpMin = pDynPrm->qpMin;
pLinkDynPrm->qpMax = pDynPrm->qpMax;
pLinkDynPrm->qpInit = pDynPrm->qpInit;
pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
/* same params for 2nd channel */
encPrm.chCreateParams[1] = encPrm.chCreateParams[0];
System_linkCreate (gVcapModuleContext.captureId, &capturePrm, sizeof(capturePrm));
#ifdef ENABLE_FAKE_HD_MODE
{
CaptureLink_SkipOddFields captureSkipOddFields;
captureSkipOddFields.queId = 0;
captureSkipOddFields.skipOddFieldsChBitMask = 0xFFFFFFFF; /* all CHs */
captureSkipOddFields.oddFieldSkipRatio = CAPTURE_LINK_ODD_FIELD_SKIP_ALL;
System_linkControl(
gVcapModuleContext.captureId,
CAPTURE_LINK_CMD_SKIP_ODD_FIELDS,
&captureSkipOddFields,
sizeof(captureSkipOddFields),
TRUE);
}
#endif
System_linkCreate(gVcapModuleContext.deiId[0] , &deiPrm, sizeof(deiPrm));
System_linkCreate(dupId, &dupPrm, sizeof(dupPrm));
System_linkCreate(gVcapModuleContext.nsfId[0] , &nsfPrm, sizeof(nsfPrm));
/*
ranran
System_linkCreate(dupId1, &dupPrm1, sizeof(dupPrm1));
System_linkCreate(mergeId , &mergePrm , sizeof(mergePrm));
*/
System_linkCreate(ipcOutVpssId , &ipcOutVpssPrm , sizeof(ipcOutVpssPrm) );
System_linkCreate(ipcInVideoId , &ipcInVideoPrm , sizeof(ipcInVideoPrm) );
System_linkCreate(gVencModuleContext.encId, &encPrm, sizeof(encPrm));
System_linkCreate(gVencModuleContext.ipcBitsOutRTOSId, &ipcBitsOutVideoPrm, sizeof(ipcBitsOutVideoPrm));
System_linkCreate(gVencModuleContext.ipcBitsInHLOSId, &ipcBitsInHostPrm, sizeof(ipcBitsInHostPrm));
System_linkCreate(gVdisModuleContext.swMsId[0] , &swMsPrm, sizeof(swMsPrm));
System_linkCreate(gVdisModuleContext.displayId[0], &displayPrm, sizeof(displayPrm));
MultiCh_memPrintHeapStatus();
Vdis_sysfsCmd(3, VDIS_SYSFSCMD_SET_GRPX, VDIS_SYSFS_GRPX0, VDIS_OFF);
Vdis_sysfsCmd(3, VDIS_SYSFSCMD_SET_GRPX, VDIS_SYSFS_GRPX1, VDIS_OFF);
}
Void CommitCh_deleteHdDvr()
{
UInt32 grpxId[VDIS_DEV_MAX];
UInt32 dupId; /* ranran , dupId1, mergeId;*/
UInt32 ipcOutVpssId;
UInt32 ipcInVideoId;
gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE;
gVcapModuleContext.nsfId[0] = SYSTEM_LINK_ID_NSF_0;
gVcapModuleContext.deiId[0] = SYSTEM_LINK_ID_DEI_0;
dupId = SYSTEM_VPSS_LINK_ID_DUP_0;
/*ranran dupId1 = SYSTEM_VPSS_LINK_ID_DUP_1;
mergeId = SYSTEM_VPSS_LINK_ID_MERGE_0;*/
gVdisModuleContext.swMsId[0] = SYSTEM_LINK_ID_SW_MS_MULTI_INST_0;
gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0; // ON CHIP HDMI
grpxId[0] = SYSTEM_LINK_ID_GRPX_0;
ipcOutVpssId = SYSTEM_VPSS_LINK_ID_IPC_OUT_M3_0;
ipcInVideoId = SYSTEM_VIDEO_LINK_ID_IPC_IN_M3_0;
gVencModuleContext.encId = SYSTEM_LINK_ID_VENC_0;
gVencModuleContext.ipcBitsInHLOSId = SYSTEM_HOST_LINK_ID_IPC_BITS_IN_0;
gVencModuleContext.ipcBitsOutRTOSId = SYSTEM_VIDEO_LINK_ID_IPC_BITS_OUT_0;
System_linkDelete(gVcapModuleContext.captureId);
System_linkDelete(gVcapModuleContext.deiId[0]);
System_linkDelete(dupId);
/*ranran System_linkDelete(dupId1);
System_linkDelete(mergeId);*/
System_linkDelete(gVdisModuleContext.swMsId[0] );
System_linkDelete(gVdisModuleContext.displayId[0]);
System_linkDelete(gVcapModuleContext.nsfId[0]);
System_linkDelete(ipcOutVpssId);
System_linkDelete(ipcInVideoId);
System_linkDelete(gVencModuleContext.encId);
System_linkDelete(gVencModuleContext.ipcBitsInHLOSId);
System_linkDelete(gVencModuleContext.ipcBitsOutRTOSId);
/* Print the HWI, SWI and all tasks load */
/* Reset the accumulated timer ticks */
MultiCh_prfLoadCalcEnable(FALSE, TRUE, FALSE);
}
/* Dummy functions */
Int32 CommitCh_hdDvrSetCapDynamicParamChn(VCAP_CHN vcChnId, VCAP_CHN_DYNAMIC_PARAM_S *psCapChnDynaParam, VCAP_PARAMS_E paramId)
{
vcChnId = vcChnId;
psCapChnDynaParam = psCapChnDynaParam;
paramId = paramId;
return 0;
}
Int32 CommitCh_hdDvrGetCapDynamicParamChn(VCAP_CHN vcChnId, VCAP_CHN_DYNAMIC_PARAM_S *psCapChnDynaParam, VCAP_PARAMS_E paramId)
{
vcChnId = vcChnId;
psCapChnDynaParam = psCapChnDynaParam;
paramId = paramId;
return 0;
}
Int32 CommitCh_hdDvrSetCapFrameRate(VCAP_CHN vcChnId, VCAP_STRM vcStrmId, Int32 inputFrameRate, Int32 outputFrameRate)
{
vcChnId = vcChnId;
vcStrmId = vcStrmId;
inputFrameRate = outputFrameRate;
return 0;
}
Int32 CommitCh_hdDvrEnableDisableCapChn(VCAP_CHN vcChnId, VCAP_STRM vcStrmId, Bool enableChn)
{
vcChnId = vcChnId;
vcStrmId = vcStrmId;
enableChn = enableChn;
return 0;
}
void CommitCh_hdDvrSwmsChReMap(VDIS_MOSAIC_S *psVdMosaicParam)
{
psVdMosaicParam = psVdMosaicParam;
}
/* ranran new file */
/**
\file demo_vcap_venc_vdec_vdis.c
\brief
*/
#include <sys/time.h>
#include <demo_vcap_venc_vdec_vdis.h>
#include <demo_scd_bits_wr.h>
/* Setting secondary out <CIF> for 30 frames - this is the validated frame rate;
any higher number will impact performance. */
#define CIF_FPS_ENC_NTSC (30)
#define CIF_FPS_ENC_PAL (25)
#define CIF_BITRATE (500)
#define MJPEG_BITRATE (100)
static Int64 get_current_time_to_msec(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((Int64)tv.tv_sec*1000 + tv.tv_usec/1000);
}
/* used in 814x 16ch usecase */
#define H264_PRIMARY_STREAM_PROFILE VENC_CHN_MAIN_PROFILE
#define H264_SECONDARY_STREAM_PROFILE VENC_CHN_BASELINE_PROFILE
/* used to set resolution / buf size of ipcbits for varying resolutions based on usecase */
VcapVencVdecVdis_chBufInfo ipcBitsChInfo[MCFW_IPCBITS_MAX_CHANNELS];
Void CommitVcapVencVdecVdis_setChannels(int demoId, int *pEnable2ndOut)
{
Int32 i;
printf("ranran CommitVcapVencVdecVdis_setChannels 1");
memset(ipcBitsChInfo, 0, sizeof(ipcBitsChInfo));
switch (demoId)
{
case DEMO_COMMIT_VENC_VDIS:
printf("ranran CommitVcapVencVdecVdis_setChannels 22");
gDemo_info.maxVcapChannels = 1;
gDemo_info.maxVdisChannels = 1;
gDemo_info.maxVencChannels = 1;
gDemo_info.maxVdecChannels = 0;
gDemo_info.VsysNumChs = 1;
gDemo_info.usecase = DEMO_COMMIT_VENC_VDIS;
for(i=0; i<gDemo_info.maxVencChannels; i++)
{
ipcBitsChInfo[i].width = MCFW_IPCBITS_HD_WIDTH;
ipcBitsChInfo[i].height = MCFW_IPCBITS_HD_HEIGHT;
ipcBitsChInfo[i].chBufSize = ipcBitsChInfo[i].width * ipcBitsChInfo[i].height;
}
break;
default:
break;
}
}
Void CommitVcapVencVdecVdis_start( Bool doProgressiveVenc, Bool enableSecondaryOut, int demoId)
{
UInt32 i, resolutionClass;
VSYS_PARAMS_S vsysParams;
VCAP_PARAMS_S vcapParams;
VENC_PARAMS_S vencParams;
VDEC_PARAMS_S vdecParams;
VDIS_PARAMS_S vdisParams;
Bool forceLowCostScale = FALSE, enableFWrite = FALSE, enableLayerWrite = FALSE;
Int32 Enable2ndOut = enableSecondaryOut;
UInt64 wallTimeBase;
Vsys_params_init(&vsysParams);
Vcap_params_init(&vcapParams);
Venc_params_init(&vencParams);
Vdec_params_init(&vdecParams);
Vdis_params_init(&vdisParams);
CommitVcapVencVdecVdis_setChannels(demoId, &Enable2ndOut);
vcapParams.numChn = gDemo_info.maxVcapChannels;
vencParams.numPrimaryChn = gDemo_info.maxVencChannels;
vencParams.numSecondaryChn = 0;
vdecParams.numChn = gDemo_info.maxVdecChannels;
vdisParams.numChannels = gDemo_info.maxVdisChannels;
vsysParams.numChs = gDemo_info.VsysNumChs;
enableSecondaryOut = (Bool)Enable2ndOut;
resolutionClass = DEMO_SCD_RESOLUTION_CLASS_QCIF;
if( doProgressiveVenc)
{
vsysParams.systemUseCase = VSYS_USECASE_COMMIT_VCAP_VENC_VDIS;
if (enableSecondaryOut == FALSE)
{
vsysParams.enableSecondaryOut = FALSE;
vsysParams.enableNsf = FALSE;
}
else
{
vsysParams.enableSecondaryOut = TRUE;
vsysParams.enableNsf = TRUE;
vsysParams.enableMjpegEnc = TRUE;
}
printf("11 vsysParams.systemUseCase = %d %d\n",vsysParams.systemUseCase,DEMO_COMMIT_VENC_VDIS);
vsysParams.enableCapture = TRUE;
vsysParams.enableNullSrc = FALSE;
vsysParams.enableOsd = TRUE;
vsysParams.enableScd = FALSE;
vsysParams.numDeis = 1;
vsysParams.numSwMs = 2;
vsysParams.numDisplays = 2;
vsysParams.enableAVsync = TRUE;
}
if (enableSecondaryOut)
{
vencParams.numSecondaryChn = gDemo_info.maxVencChannels;
/*enableMjpegEnc should always be true in all usecases*/
gDemo_info.maxVencChannels *= 3;
}
printf ("--------------- CHANNEL DETAILS-------------\n");
printf ("Capture Channels => %d\n", vcapParams.numChn);
printf ("Enc Channels => Primary %d, Secondary %d\n", vencParams.numPrimaryChn, vencParams.numSecondaryChn);
printf ("Dec Channels => %d\n", vdecParams.numChn);
printf ("Disp Channels => %d\n", vdisParams.numChannels);
printf ("-------------------------------------------\n");
Vsys_enableFastUsecaseSwitch(FALSE);
if ((vsysParams.systemUseCase == VSYS_USECASE_MULTICHN_HD_VCAP_VENC) ||
(vsysParams.systemUseCase == VSYS_USECASE_COMMIT_VCAP_VENC_VDIS))
{
printf("ranran osd disable !!!!!!!!!!\n");
vsysParams.enableScd = FALSE;
vsysParams.enableOsd = FALSE;
vsysParams.numDeis = 1;
vsysParams.numSwMs = 1;
vsysParams.numDisplays = 1;
vsysParams.enableAVsync = FALSE;
}
/* Override the context here as needed */
Vsys_init(&vsysParams);
/* Override the context here as needed */
Vcap_init(&vcapParams);
/*Enabling generation of motion vector for channel 0 only,
* for other channels please add to the below line*/
vencParams.encChannelParams[0].enableAnalyticinfo = 1;
//vencParams.encChannelParams[1].enableAnalyticinfo = 1;
vencParams.encChannelParams[0].maxBitRate = -1;
/*Note:Specific for h264 Encoder: Enabling this flag adds svc extension
headers to the stream, not all decoders are generally able to play back such a stream. */
/* Needs to be enabled to IH264_SVC_EXTENSION_FLAG_ENABLE for the
svc extension headers to be present in the stream*/
vencParams.encChannelParams[0].enableSVCExtensionFlag =
VENC_IH264_SVC_EXTENSION_FLAG_DISABLE;
/** Note: For the encoder to give out frames with SVC-T properties,
number of layers needs to be increased as per requirement.
A flag enableLayerWrite needs to be set if for any channel the Layer is increased to beyond 1.
This check has also been done for Channel 0, just before VcapVencVdecVdis_ipcBitsInit call.
For example for Channel 0 it has been set to LAYERS_4,
file stream dump will generate four(Base + 3) files with differing frame-rates**/
/** WARNING: SVC-T cannot be used if B Frame is enabled */
vencParams.encChannelParams[0].numTemporalLayer = VENC_TEMPORAL_LAYERS_4;
vencParams.encChannelParams[0].dynamicParam.frameRate = 30 * 1000;
/* Override the context here as needed */
Venc_init(&vencParams);
/* Override the context here as needed */
Vdec_init(&vdecParams);
/* Override the context here as needed */
vdisParams.deviceParams[VDIS_DEV_HDMI].resolution = DEMO_HD_DISPLAY_DEFAULT_STD;
vdisParams.deviceParams[VDIS_DEV_DVO2].resolution = DEMO_HD_DISPLAY_DEFAULT_STD;
vdisParams.deviceParams[VDIS_DEV_HDCOMP].resolution = DEMO_HD_DISPLAY_DEFAULT_STD;
vdisParams.mosaicLayoutResolution[VDIS_DEV_HDMI] =
vdisParams.deviceParams[VDIS_DEV_HDMI].resolution;
vdisParams.mosaicLayoutResolution[VDIS_DEV_DVO2] =
vdisParams.deviceParams[VDIS_DEV_DVO2].resolution;
vdisParams.mosaicLayoutResolution[VDIS_DEV_HDCOMP] =
vdisParams.deviceParams[VDIS_DEV_HDCOMP].resolution;
Vdis_tiedVencInit(VDIS_DEV_DVO2, VDIS_DEV_HDCOMP, &vdisParams);
vdisParams.deviceParams[VDIS_DEV_SD].resolution = VSYS_STD_NTSC;
vdisParams.mosaicLayoutResolution[VDIS_DEV_SD] =
vdisParams.deviceParams[VDIS_DEV_SD].resolution;
vdisParams.enableLayoutGridDraw = FALSE;
if (vsysParams.systemUseCase == VSYS_USECASE_MULTICHN_INTERLACED_VCAP_VDIS_VENC_VDEC)
forceLowCostScale = TRUE;
i = 0;
/* set for 2 displays */
Demo_swMsGenerateLayout(VDIS_DEV_HDMI, 0, gDemo_info.maxVdisChannels,
DEMO_LAYOUT_MODE_1CH,
&vdisParams.mosaicParams[VDIS_DEV_HDMI], forceLowCostScale,
gDemo_info.Type,
Vdis_getSwMsLayoutResolution(VDIS_DEV_HDMI));
vdisParams.mosaicParams[VDIS_DEV_HDMI].userSetDefaultSWMLayout = TRUE;
/* Set swMS outputFPS as 60 or 50 for this default 7x1 layout for TI814X */
Demo_swMsSetOutputFPS(&vdisParams.mosaicParams[VDIS_DEV_HDMI], Demo_swMsGetOutputFPS(&vdisParams.mosaicParams[VDIS_DEV_HDMI])*2);
Demo_swMsGenerateLayout(VDIS_DEV_SD, 0, gDemo_info.maxVdisChannels,
DEMO_LAYOUT_MODE_1CH,
&vdisParams.mosaicParams[VDIS_DEV_SD], forceLowCostScale,
gDemo_info.Type,
Vdis_getSwMsLayoutResolution(VDIS_DEV_SD));
vdisParams.mosaicParams[VDIS_DEV_SD].userSetDefaultSWMLayout = TRUE;
Demo_swMsSetOutputFPS(&vdisParams.mosaicParams[VDIS_DEV_SD], Demo_swMsGetOutputFPS(&vdisParams.mosaicParams[VDIS_DEV_SD])*2);
Vdis_init(&vdisParams);
enableFWrite = TRUE;
/* Init the application specific module which will handle bitstream exchange */
/*h264 Enc: Needs to be checked for any channel where this flag is enabled,
* right now just checking for channel 0, default value for other codecs is 0*/
/* ranran if(vencParams.encChannelParams[0].numTemporalLayer > 1)*/
enableLayerWrite = FALSE; /*ranran */
VcapVencVdecVdis_ipcBitsSetFileExtension("h264");
VcapVencVdecVdis_ipcBitsInit(ipcBitsChInfo, enableFWrite, enableLayerWrite , TRUE);
/* Start audio capture */
/* ranran CommitDemo_startAudio(demoId); */
wallTimeBase = get_current_time_to_msec();
//wallTimeBase = 0;
Vdis_setWallTimeBase(wallTimeBase);
/* Configure display in order to start grpx before video */
Vsys_configureDisplay();
#if USE_FBDEV
grpx_init(GRPX_FORMAT_RGB565);
#endif
/* Create Link instances and connects compoent blocks */
Vsys_create();
/* Start components in reverse order */
Vdis_start();
Vdec_start();
Venc_start();
Vcap_start();
}
Void CommitVcapVencVdecVdis_stop()
{
VSYS_PARAMS_S contextInf;
Vsys_getContext(&contextInf);
Vsys_enableFastUsecaseSwitch(FALSE);
printf("++++++++ VcapVencVdecVdis_stop()\n");
/* Stop components */
VcapVencVdecVdis_ipcBitsStop();
Vcap_stop();
Venc_stop();
Vdec_stop();
Vdis_stop();
#if USE_FBDEV
grpx_exit();
#endif
Vsys_delete();
Vsys_deConfigureDisplay();
VcapVencVdecVdis_ipcBitsExit();
/* De-initialize components */
Vcap_exit();
Venc_exit();
Vdec_exit();
Vdis_exit();
Vsys_exit();
}