This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

mcfw下A8端白屏问题

Other Parts Discussed in Thread: TVP5158


#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 这个链路怎么是白屏,不管接不接视频输入,可能是哪些问题。