#include "mcfw/src_linux/mcfw_api/usecases/multich_common.h"
#include "mcfw/interfaces/link_api/system_tiler.h"
#include <mcfw/interfaces/common_def/ti_vsys_common_def.h>
#include"mcfw/src_linux/osa/inc/osa.h"
#include <mcfw/interfaces/link_api/algLink.h>
#include <mcfw/interfaces/link_api/vidframe.h>
#include <mcfw/interfaces/link_api/osdLink.h>
#include "../shared/interface_app_link.h"
#include <stdint.h>
#include <stdbool.h>
#include <osa_que.h>
#include <osa_mutex.h>
#include <osa_thr.h>
#include <osa_sem.h>
const int NUM_CHANNELS = 1;
const int FRAME_WIDTH = 1920;
const int FRAME_HEIGHT = 1080;
Vsys_AllocBufInfo bufInfo;
Vsys_AllocBufInfo osdTextBufInfo;
Vsys_AllocBufInfo osdTimeBufInfo;
System_LinkInfo framesProducerLinkInfo;
//#define CAP_DEV_TVP5158
#define NUM_CAPTURE_DEVICES 1
#define CH_NUM 1
#define NUM_FRAMES 10
#define IDX_CAHNNEL_SAVE 0
const UInt32 VPSS_LINK_ID_MERGE = SYSTEM_VPSS_LINK_ID_MERGE_0;
int memmapper_map(uint32_t addr_phy, uint32_t size , uint32_t *addr_virt);
void memmapper_unmap();
static void get_frames_from_ipcframe_src(VIDEO_FRAMEBUF_LIST_S *buf_list);
static void put_frames_back_to_ipcframe_src(VIDEO_FRAMEBUF_LIST_S *buf_list);
static void copy_frame_info_link2mcfw(VIDEO_FRAMEBUF_S *dst, VIDFrame_Buf *src);
static void copy_frame_info_mcfw2link(VIDFrame_Buf *dst, VIDEO_FRAMEBUF_S *src);
static void save_frames(Ptr arg);
static void copy_frame_info_link2mcfw(VIDEO_FRAMEBUF_S *dst, VIDFrame_Buf *src) {
OSA_assert(VIDEO_MAX_FIELDS == VIDFRAME_MAX_FIELDS);
OSA_assert(VIDEO_MAX_PLANES == VIDFRAME_MAX_PLANES);
int i, j;
for (i = 0; i < VIDEO_MAX_FIELDS; i++) {
for (j = 0; j < VIDEO_MAX_PLANES; j++) {
dst->addr[i][j] = src->addr[i][j];
dst->phyAddr[i][j] = src->phyAddr[i][j];
}
}
dst->channelNum = src->channelNum;
dst->fid = src->fid;
dst->frameWidth = src->frameWidth;
dst->frameHeight = src->frameHeight;
dst->linkPrivate = src->linkPrivate;
dst->timeStamp = src->timeStamp;
dst->framePitch[0] = src->framePitch[0];
dst->framePitch[1] = src->framePitch[1];
}
static void get_frames_from_ipcframe_src(VIDEO_FRAMEBUF_LIST_S *buf_list) {
VIDFrame_BufList vid_buf_list;
buf_list->numFrames = 0;
vid_buf_list.numFrames = 0;
IpcFramesInLink_getFullVideoFrames(gVcapModuleContext.ipcFramesInHostId, &vid_buf_list);
buf_list->numFrames = vid_buf_list.numFrames;
int i;
for (i = 0; i < vid_buf_list.numFrames; i++) {
VIDFrame_Buf *src = &vid_buf_list.frames[i];
VIDEO_FRAMEBUF_S *dst = &buf_list->frames[i];
copy_frame_info_link2mcfw(dst, src);
}
}
static void copy_frame_info_mcfw2link(VIDFrame_Buf *dst, VIDEO_FRAMEBUF_S *src) {
OSA_assert(VIDEO_MAX_FIELDS == VIDFRAME_MAX_FIELDS);
OSA_assert(VIDEO_MAX_PLANES == VIDFRAME_MAX_PLANES);
int i,j;
for (i = 0; i < VIDEO_MAX_FIELDS; i++) {
for (j = 0; j < VIDEO_MAX_PLANES; j++) {
dst->addr[i][j] = src->addr[i][j];
dst->phyAddr[i][j] = src->phyAddr[i][j];
}
}
dst->channelNum = src->channelNum;
dst->fid = src->fid;
dst->frameWidth = src->frameWidth;
dst->frameHeight = src->frameHeight;
dst->linkPrivate = src->linkPrivate;
dst->timeStamp = src->timeStamp;
dst->framePitch[0] = src->framePitch[0];
dst->framePitch[1] = src->framePitch[1];
}
static void put_frames_back_to_ipcframe_src(VIDEO_FRAMEBUF_LIST_S *buf_list) {
VIDFrame_BufList vid_buf_list;
vid_buf_list.numFrames = buf_list->numFrames;
int i;
for (i = 0; i < vid_buf_list.numFrames; i++) {
VIDEO_FRAMEBUF_S *src = &buf_list->frames[i];
VIDFrame_Buf *dst = &vid_buf_list.frames[i];
copy_frame_info_mcfw2link(dst,src);
}
if (vid_buf_list.numFrames)
IpcFramesInLink_putEmptyVideoFrames(gVcapModuleContext.ipcFramesInHostId, &vid_buf_list);
}
static void save_frames1(Ptr arg) {
VIDEO_FRAMEBUF_LIST_S bufList;
VIDEO_FRAMEBUF_S *buf;
UInt8 *yuyv1;
UInt32 k =0 ;
UInt8 j =0 ;
get_frames_from_ipcframe_src(&bufList);
OSA_printf("save_frames\n");
for (j = 0; j < bufList.numFrames; j++) {
buf = &bufList.frames[j];
OSA_printf(" ch=%u, frameWidth=%d, frameHeight=%d\n",
buf->channelNum, buf->frameWidth, buf->frameHeight);
OSA_printf("tim = %d\n",OSA_getCurTimeInMsec());
// map phy addr
uint32_t frameSize = (buf->framePitch[0] * buf->frameHeight);
//uint32_t yuv_buf = 0 ;
uint32_t yuv_buf = 0;
memmapper_map((uint32_t)(buf->phyAddr[0][0]), frameSize, &yuv_buf);
UInt8 *p = (UInt8 *)yuv_buf;
//***************************alg 1 on the host*************************************
int k = 0;
for (k = 0; k < buf->frameWidth << 1; k++) {
p[k]= 0x80;
}
//Draw_rec1(p,500,500,700,700);
memmapper_unmap();
}
put_frames_back_to_ipcframe_src(&bufList);
}
Void Multich_init() {
//UInt32 i = 0;
CaptureLink_CreateParams capPrms;
//DupLink_CreateParams dupPrm;
MergeLink_CreateParams mergePrm;
IpcFramesOutLinkRTOS_CreateParams ipcOutVpssPrm;
IpcFramesInLinkHLOS_CreateParams hostInPrm;
IpcFramesOutLinkHLOS_CreateParams hostOutPrm;
IpcFramesInLinkRTOS_CreateParams ipcInVpssPrm;
DisplayLink_CreateParams disPrms;
MULTICH_INIT_STRUCT(IpcFramesOutLinkRTOS_CreateParams,ipcOutVpssPrm);
MULTICH_INIT_STRUCT(IpcFramesInLinkHLOS_CreateParams, hostInPrm);
MULTICH_INIT_STRUCT(IpcFramesOutLinkHLOS_CreateParams,hostOutPrm);
MULTICH_INIT_STRUCT(IpcFramesInLinkRTOS_CreateParams,ipcInVpssPrm);
MULTICH_INIT_STRUCT(DisplayLink_CreateParams, disPrms);
gVcapModuleContext.captureId = SYSTEM_LINK_ID_CAPTURE;
//gVcapModuleContext.ipcFramesOutVpssId[0] = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
gVcapModuleContext.ipcFramesOutVpssToHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_OUT_0;
gVcapModuleContext.ipcFramesInHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_IN_0;
gVdisModuleContext.ipcFramesOutHostId = SYSTEM_HOST_LINK_ID_IPC_FRAMES_OUT_0;
gVdisModuleContext.ipcFramesInVpssFromHostId = SYSTEM_VPSS_LINK_ID_IPC_FRAMES_IN_0;
gVdisModuleContext.displayId[0] = SYSTEM_LINK_ID_DISPLAY_0;
/* capture link init */
CaptureLink_CreateParams_Init(&capPrms);
// capPrms.outQueParams[0].nextLink = gVcapModuleContext.deiId[0];
capPrms.outQueParams[0].nextLink = gVcapModuleContext.ipcFramesOutVpssToHostId;
capPrms.numVipInst = 1;
capPrms.tilerEnable = FALSE;
capPrms.numBufsPerCh = 8;
capPrms.maxBlindAreasPerCh = 4;
capPrms.isPalMode = Vcap_isPalMode();
#if ! defined CAP_DEV_TVP5158
capPrms.doCropInCapture = FALSE;
capPrms.enableSdCrop = FALSE;
#endif
/* capture instance init */
CaptureLink_VipInstParams *prm_cap_inst = &capPrms.vipInst[0];
prm_cap_inst->vipInstId = (SYSTEM_CAPTURE_INST_VIP0_PORTA + 0 ) % SYSTEM_CAPTURE_INST_MAX;
prm_cap_inst->inDataFormat = SYSTEM_DF_YUV422P;
prm_cap_inst->numOutput = 1;
#if ! defined CAP_DEV_TVP5158
prm_cap_inst->standard = SYSTEM_STD_1080P_60;
prm_cap_inst->videoIfMode = DEVICE_CAPT_VIDEO_IF_MODE_16BIT;
prm_cap_inst->videoCaptureMode = DEVICE_CAPT_VIDEO_CAPTURE_MODE_SINGLE_CH_NON_MUX_EMBEDDED_SYNC;
#else
prm_cap_inst->videoDecoderId = SYSTEM_DEVICE_VID_DEC_TVP5158_DRV;
prm_cap_inst->standard = SYSTEM_STD_MUX_4CH_D1; // set input mode as 4 input with D1 resolution
#endif
/* capture out init */
CaptureLink_OutParams *prm_cap_out = &prm_cap_inst->outParams[0];
prm_cap_out->scEnable = FALSE;
prm_cap_out->scOutWidth = 0;
prm_cap_out->scOutHeight = 0;
prm_cap_out->outQueId = 0;
prm_cap_out->dataFormat = SYSTEM_DF_YUV422I_YUYV;
ipcOutVpssPrm.baseCreateParams.noNotifyMode = FALSE;
ipcOutVpssPrm.baseCreateParams.notifyNextLink = FALSE;
ipcOutVpssPrm.baseCreateParams.notifyPrevLink = TRUE;
ipcOutVpssPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.captureId;
ipcOutVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcOutVpssPrm.baseCreateParams.outQueParams[0].nextLink = gVcapModuleContext.ipcFramesInHostId;
hostInPrm.baseCreateParams.noNotifyMode = TRUE;
hostInPrm.baseCreateParams.notifyNextLink = FALSE;
hostInPrm.baseCreateParams.notifyPrevLink = FALSE;
hostInPrm.baseCreateParams.inQueParams.prevLinkId = gVcapModuleContext.ipcFramesOutVpssToHostId;
hostInPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
hostInPrm.baseCreateParams.outQueParams[0].nextLink = SYSTEM_LINK_ID_INVALID;
hostInPrm.exportOnlyPhyAddr = TRUE;
hostInPrm.cbCtx = NULL;
hostInPrm.cbFxn = save_frames1;
hostOutPrm.baseCreateParams.noNotifyMode = TRUE;
hostOutPrm.baseCreateParams.notifyNextLink = FALSE;
hostOutPrm.baseCreateParams.notifyPrevLink = FALSE;
hostOutPrm.baseCreateParams.inQueParams.prevLinkId = SYSTEM_LINK_ID_INVALID;
hostOutPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
hostOutPrm.baseCreateParams.outQueParams[0].nextLink = gVdisModuleContext.ipcFramesInVpssFromHostId;
hostOutPrm.inQueInfo.numCh = NUM_CHANNELS;
hostOutPrm.inQueInfo.chInfo[0].bufType = SYSTEM_BUF_TYPE_VIDFRAME;
hostOutPrm.inQueInfo.chInfo[0].dataFormat = SYSTEM_DF_YUV422I_YUYV;
hostOutPrm.inQueInfo.chInfo[0].memType = SYSTEM_MT_NONTILEDMEM;
hostOutPrm.inQueInfo.chInfo[0].scanFormat = SYSTEM_SF_PROGRESSIVE;//
hostOutPrm.inQueInfo.chInfo[0].startX = 0;
hostOutPrm.inQueInfo.chInfo[0].startY = 0;
hostOutPrm.inQueInfo.chInfo[0].width = FRAME_WIDTH;
hostOutPrm.inQueInfo.chInfo[0].height = FRAME_HEIGHT;
hostOutPrm.inQueInfo.chInfo[0].pitch[0] = FRAME_WIDTH*2;
hostOutPrm.inQueInfo.chInfo[0].pitch[1] = hostOutPrm.inQueInfo.chInfo[0].pitch[0];
hostOutPrm.inQueInfo.chInfo[0].pitch[2] = 0;
ipcInVpssPrm.baseCreateParams.noNotifyMode = FALSE;
ipcInVpssPrm.baseCreateParams.notifyNextLink = TRUE;
ipcInVpssPrm.baseCreateParams.notifyPrevLink = FALSE;
ipcInVpssPrm.baseCreateParams.inQueParams.prevLinkId = gVdisModuleContext.ipcFramesOutHostId;
ipcInVpssPrm.baseCreateParams.inQueParams.prevLinkQueId = 0;
ipcInVpssPrm.baseCreateParams.outQueParams[0].nextLink = gVdisModuleContext.displayId[0];
disPrms.inQueParams[0].prevLinkId = gVdisModuleContext.ipcFramesInVpssFromHostId;
disPrms.inQueParams[0].prevLinkQueId = 0;
disPrms.displayRes = gVdisModuleContext.vdisConfig.deviceParams[0].resolution;
disPrms.forceFieldSeparatedInputMode = FALSE;
System_linkControl( SYSTEM_LINK_ID_M3VPSS, SYSTEM_M3VPSS_CMD_RESET_VIDEO_DEVICES, NULL, 0, TRUE);
/* root */
System_linkCreate(gVcapModuleContext.captureId, &capPrms, sizeof(capPrms));
/* A8 branch */
System_linkCreate(gVcapModuleContext.ipcFramesInHostId, &hostInPrm, sizeof(hostInPrm));
System_linkCreate(gVcapModuleContext.ipcFramesOutVpssToHostId, &ipcOutVpssPrm, sizeof(ipcOutVpssPrm));
System_linkCreate(gVdisModuleContext.ipcFramesOutHostId, &hostOutPrm, sizeof(hostOutPrm));
System_linkCreate(gVdisModuleContext.ipcFramesInVpssFromHostId, &ipcInVpssPrm, sizeof(ipcInVpssPrm));
System_linkCreate(gVdisModuleContext.displayId[0] , &disPrms, sizeof(disPrms));
}
Void Multich_deInit() {
System_linkDelete(gVcapModuleContext.captureId);
System_linkDelete(gVcapModuleContext.ipcFramesOutVpssToHostId);
System_linkDelete(gVcapModuleContext.ipcFramesInHostId);
System_linkDelete(gVdisModuleContext.ipcFramesOutHostId);
System_linkDelete(gVdisModuleContext.ipcFramesInVpssFromHostId);
System_linkDelete(gVdisModuleContext.displayId[0]);
}
请问下,cap -> vpss out -> host in -> host out -> vpss in -> dis 这个链路怎么是白屏,不管接不接视频输入,可能是哪些问题。