首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[DM642]SEED的DDK,如何配置才能同时采集2路以上视频呢?

[DM642]SEED的DDK,如何配置才能同时采集2路以上视频呢?

本帖最后由 古董 于 2013-9-16 11:59 编辑

第一路是能正常采集的,第二路是参考DDK说明及仿第一路配置的--不正常.
1.BIOS配置
第一路是能正常采集的,第二路有问题.



2.第一路的配置参数:
VPORTCAP_Params SEEDVPM642_vCapParamsChan = {
    VPORT_MODE_BT656_8BIT, /* cmode:3 工作模式BT656_8bit */
    VPORT_FLDOP_FRAME,     /* fldOp:3 帧或场的操作模式,这里选择帧模式 */   
    VPORT_SCALING_ENABLE, /* scale:1  水平方向上缩小1/2使用*/   
    VPORT_RESMPL_DISABLE,  /* resmpl:1 */
    VPORTCAP_BPK_10BIT_ZERO_EXTENDED, /*bpk10Bit:2   */
    VPORTCAP_HRST_SAV,     /*hCtRst:1  */
    VPORTCAP_VRST_END_VBLK,/*vCtRst:1  */
    VPORTCAP_FLDD_DISABLE, /*fldDect:1 */
    VPORTCAP_EXC_DISABLE,  /*extCtl:1  */   
    VPORTCAP_FINV_ENABLE,  /* fldInv:1 */
   
    8,                     /*fldXStrt1 */
    1,                     /*fldYStrt1 */  
    8,                     /*fldXStrt2 */  
    1, //15,               /*fldYStrt2 */
   
    LINE_SZ+7,             /*fldXStop1 */
    NUM_LINES,             /*fldYStop1 */
   
    LINE_SZ+7,             /*fldXStop2 */
    NUM_LINES,             /*fldYStop2 */
   
    (LINE_SZ>>3),          /*thrld     */
    3,                     /*numFrmBufs*/
    128,                   /*alignment */
    FALSE,                  /*mergeFlds */
    NULL,                  /*segId     */            
    EDMA_OPT_PRI_HIGH,     /*edmaPri   */
    8,                     /* irqId    */
};

VPORT_PortParams SEEDVPM642_vCapParamsPort = {
    TRUE,                       /*  enableDualChan;     */
    VPORT_POLARITY_ACTIVE_HIGH, /* vport control pin 1 polarity    */
    VPORT_POLARITY_ACTIVE_HIGH, /* vport control pin 2 polarity    */
    VPORT_POLARITY_ACTIVE_HIGH, /* vport control pin 3 polarity    */
    &TVP51XX_Fxns,
    INV,
};   

TVP51XX_ConfParams SEEDVPM642_vCapParamsTVP5150 = {
   TVP51XX_MODE_PAL601, /*TVP5150的视频模式*/
   TVP51XX_AFMT_COMPOSITE, /*TVP5150的输入方式*/
   2,      /*input port*/
};      /*handleI2C */
3.第二路的配置参数
VPORTCAP_Params SEEDVPM642_vCapParamsChan2a = {
    VPORT_MODE_BT656_8BIT, /* cmode:3 工作模式BT656_8bit */
    VPORT_FLDOP_FRAME,     /* fldOp:3 帧或场的操作模式,这里选择帧模式 */   
    VPORT_SCALING_ENABLE, /* scale:1  水平方向上缩小1/2使用*/   
    VPORT_RESMPL_DISABLE,  /* resmpl:1 */
    VPORTCAP_BPK_10BIT_ZERO_EXTENDED, /*bpk10Bit:2   */
    VPORTCAP_HRST_SAV,     /*hCtRst:1  */
    VPORTCAP_VRST_END_VBLK,/*vCtRst:1  */
    VPORTCAP_FLDD_DISABLE, /*fldDect:1 */
    VPORTCAP_EXC_DISABLE,  /*extCtl:1  */   
    VPORTCAP_FINV_ENABLE,  /* fldInv:1 */
   
    8,                     /*fldXStrt1 */
    1,                     /*fldYStrt1 */  
    8,                     /*fldXStrt2 */  
    1, //15,               /*fldYStrt2 */
   
    LINE_SZ+7,             /*fldXStop1 */
    NUM_LINES,             /*fldYStop1 */
   
    LINE_SZ+7,             /*fldXStop2 */
    NUM_LINES,             /*fldYStop2 */
   
    (LINE_SZ>>3),          /*thrld     */
    3,                     /*numFrmBufs*/
    128,                   /*alignment */
    FALSE,                  /*mergeFlds */
    NULL,                  /*segId     */            
    EDMA_OPT_PRI_HIGH,     /*edmaPri   */
    10,                     /* irqId    */
};
4.初始化程序
void tskVideoInputInit()
{
   
    int status,status2;   
    SEEDVPM642_vCapParamsChan.segId   = EXTERNALHEAP ;//EXTERNALHEAP;
    SEEDVPM642_vCapParamsChan2a.segId = EXTERNALHEAP ;//EXTERNALHEAP;
    SEEDVPM642_vCapParamsTVP5150.hI2C = SEEDVPM642_I2C_hI2C; /*打开驱动程序*/  

/******************************************************/
    /* initialization of capture driver                   */
    /******************************************************/
/*打开第一通路*/
capChanCh1  = FVID_create( "/VP1ACAPTURE/A/1",
                    IOM_INPUT,
                    &status,
                    (Ptr)&SEEDVPM642_vCapParamsChan,
                    NULL);
                    
capChanCh2  = FVID_create( "/VP2ACAPTURE/A/1",
                    IOM_INPUT,
                    &status2,
                    (Ptr)&SEEDVPM642_vCapParamsChan2a,
                    NULL);                        
    /******************************************************/
    /* configure video encoder                      */
    /******************************************************/
    /*配置第一通路的TVP5150*/
    FVID_control( capChanCh1,
         VPORT_CMD_EDC_BASE+EDC_CONFIG,
            (Ptr)&SEEDVPM642_vCapParamsTVP5150);
    FVID_control( capChanCh2,
         VPORT_CMD_EDC_BASE+EDC_CONFIG,
            (Ptr)&SEEDVPM642_vCapParamsTVP5150);

}
5.启动采集程序
/*-----------------------------------------------------------*/
/*Start the capturing                                        */
/*-----------------------------------------------------------*/
void tskVideoInputStart()
{
FVID_control(capChanCh1, VPORT_CMD_START, NULL);
FVID_control(capChanCh2, VPORT_CMD_START, NULL);
}
6.实时采集处理程序[第一路参与采集不处理]
/*-----------------------------------------------------------*/
/* handle video capture, scaling and re-format               */
/*-----------------------------------------------------------*/
void tskVideoInput()
{
   
short i=0,j;
//FILE *fp;
    SCOM_Handle fromTSK1TOTSK2;
    SCOM_Handle fromTSK4TOTSK1,netINIT;  //自定义的
    IMG in1,in2,out1;
unsigned char *rgbBufSrc=NULL;
    //LgUns time_s,time_e;
   
fromTSK1TOTSK2 = SCOM_open("Tsk1ToTsk2");
fromTSK4TOTSK1 = SCOM_open("Tsk4ToTsk1");
netINIT        = SCOM_open("NETINIT");         //网络初始化消息
FVID_alloc(capChanCh1, &capFrameBuf);
FVID_alloc(capChanCh2, &capFrameBuf2);
rgbBufSrc  = (unsigned char *)MEM_calloc(EXTERNALHEAP, H264_W*H264_H*3,0);
rgbBuf     = (unsigned char *)MEM_calloc(EXTERNALHEAP, LEN_PIC,0); //后面的30KB是给x264码的
x264_frame = rgbBuf+RGB_W*RGB_H*3;
printf("RGB24[%d*%d][0x%x]\n",H264_W,H264_H,rgbBufSrc);
printf("RGB24[220*140][0x%x]\n",rgbBuf);
SCOM_getMsg(netINIT, SYS_FOREVER);  //等网络初始化成功
//fp = fopen("YUV352288_420.yuv", "w+b");
  while(1)
  {
     for(i = 0; i<NUM_SCOM_OBJS_IN; i++)
  {
   in1.Y_data  = (unsigned char *)capFrameBuf->frame.iFrm.y1; //360*576
   in1.Cb_data = (unsigned char *)capFrameBuf->frame.iFrm.cb1;
   in1.Cr_data = (unsigned char *)capFrameBuf->frame.iFrm.cr1;
   
   in2.Y_data  = (unsigned char *)capFrameBuf2->frame.iFrm.y1; //360*576
   in2.Cb_data = (unsigned char *)capFrameBuf2->frame.iFrm.cb1;
   in2.Cr_data = (unsigned char *)capFrameBuf2->frame.iFrm.cr1;
   
   out1.Y_data  = YArray_temp1;  //720*576,YUV422
   out1.Cb_data = CbArray_temp1;
   out1.Cr_data = CrArray_temp1;
   
   //time_s = CLK_getltime();
   /***********************************************/
   /*YUV422尺寸变换,352*288->176*144,结果在in1中  */
   /***********************************************/
   YUV422SIZE(in2.Y_data,in2.Cb_data,in2.Cr_data,  /*原始视频源,结束后变换好的数据仍存放在这个里面*/
           out1.Y_data,out1.Cb_data,out1.Cr_data,  /*临时区*/
        352,288,2); //长宽各缩小1/2
   /***********************************************/
   /*YUV422->YUV420,结果在out1中         */
   /***********************************************/
   memcpy(out1.Y_data,in1.Y_data,H264_W*H264_H);
   for(j=0;j<H264_H;j+=2)
   {
    memcpy(out1.Cb_data+H264_W*(j/2),in1.Cb_data+H264_W*j,352);
    memcpy(out1.Cr_data+H264_W*(j/2),in1.Cr_data+H264_W*j,352);
   }
    (thrInput.scomMsgTx).bufChannel = (void *)&out1;
   //time_e = CLK_getltime();
   //LOG_printf(&LOG_trace,"YUV[%d ms]",_abs(time_e-time_s));
   CACHE_clean(CACHE_L2ALL,NULL,NULL);
   /***********************************************/
   /*YUV420->BGR24,结果在rgbBufSrc中      */
   /***********************************************/
   YUV420toRGB24(out1.Y_data,out1.Cb_data,out1.Cr_data,rgbBufSrc,H264_W,H264_H);  //YUV420[352*288]-->RGB24[352*288]
   /***********************************************/
   /*BGR24尺寸变换,结果在rgbBuf中          */
   /***********************************************/  
   ImageResizeNNK2(rgbBufSrc,3,H264_W,H264_H,H264_W*3,rgbBuf,220,140,220*3);      //RGB24[352*288]-->RGB24[220*140]
   CACHE_clean(CACHE_L2ALL,NULL,NULL);
   gClient.bNew=TRUE;
   SCOM_putMsg(fromTSK1TOTSK2, &(thrInput.scomMsgTx)); //发送信息到任务2作编码
   SCOM_getMsg(fromTSK4TOTSK1, SYS_FOREVER);   //等待网络发送完成
   CACHE_clean(CACHE_L2ALL,NULL,NULL);
         /*-----------------------------------------------------------*/
         /* Capture a new frame.                                      */
         /*-----------------------------------------------------------*/
         //FVID_exchange(capChanCh1, &capFrameBuf);
   FVID_exchange(capChanCh2, &capFrameBuf2);
   }
  }     
}


附件: 你需要登录才可以下载或查看附件。没有帐号?注册

[DM642]SEED的DDK,如何配置才能同时采集2路以上视频呢?

本帖最后由 古董 于 2013-9-16 11:59 编辑

第一路是能正常采集的,第二路是参考DDK说明及仿第一路配置的--不正常.
1.BIOS配置
第一路是能正常采集的,第二路有问题.



2.第一路的配置参数:
VPORTCAP_Params SEEDVPM642_vCapParamsChan = {
    VPORT_MODE_BT656_8BIT, /* cmode:3 工作模式BT656_8bit */
    VPORT_FLDOP_FRAME,     /* fldOp:3 帧或场的操作模式,这里选择帧模式 */   
    VPORT_SCALING_ENABLE, /* scale:1  水平方向上缩小1/2使用*/   
    VPORT_RESMPL_DISABLE,  /* resmpl:1 */
    VPORTCAP_BPK_10BIT_ZERO_EXTENDED, /*bpk10Bit:2   */
    VPORTCAP_HRST_SAV,     /*hCtRst:1  */
    VPORTCAP_VRST_END_VBLK,/*vCtRst:1  */
    VPORTCAP_FLDD_DISABLE, /*fldDect:1 */
    VPORTCAP_EXC_DISABLE,  /*extCtl:1  */   
    VPORTCAP_FINV_ENABLE,  /* fldInv:1 */
   
    8,                     /*fldXStrt1 */
    1,                     /*fldYStrt1 */  
    8,                     /*fldXStrt2 */  
    1, //15,               /*fldYStrt2 */
   
    LINE_SZ+7,             /*fldXStop1 */
    NUM_LINES,             /*fldYStop1 */
   
    LINE_SZ+7,             /*fldXStop2 */
    NUM_LINES,             /*fldYStop2 */
   
    (LINE_SZ>>3),          /*thrld     */
    3,                     /*numFrmBufs*/
    128,                   /*alignment */
    FALSE,                  /*mergeFlds */
    NULL,                  /*segId     */            
    EDMA_OPT_PRI_HIGH,     /*edmaPri   */
    8,                     /* irqId    */
};

VPORT_PortParams SEEDVPM642_vCapParamsPort = {
    TRUE,                       /*  enableDualChan;     */
    VPORT_POLARITY_ACTIVE_HIGH, /* vport control pin 1 polarity    */
    VPORT_POLARITY_ACTIVE_HIGH, /* vport control pin 2 polarity    */
    VPORT_POLARITY_ACTIVE_HIGH, /* vport control pin 3 polarity    */
    &TVP51XX_Fxns,
    INV,
};   

TVP51XX_ConfParams SEEDVPM642_vCapParamsTVP5150 = {
   TVP51XX_MODE_PAL601, /*TVP5150的视频模式*/
   TVP51XX_AFMT_COMPOSITE, /*TVP5150的输入方式*/
   2,      /*input port*/
};      /*handleI2C */
3.第二路的配置参数
VPORTCAP_Params SEEDVPM642_vCapParamsChan2a = {
    VPORT_MODE_BT656_8BIT, /* cmode:3 工作模式BT656_8bit */
    VPORT_FLDOP_FRAME,     /* fldOp:3 帧或场的操作模式,这里选择帧模式 */   
    VPORT_SCALING_ENABLE, /* scale:1  水平方向上缩小1/2使用*/   
    VPORT_RESMPL_DISABLE,  /* resmpl:1 */
    VPORTCAP_BPK_10BIT_ZERO_EXTENDED, /*bpk10Bit:2   */
    VPORTCAP_HRST_SAV,     /*hCtRst:1  */
    VPORTCAP_VRST_END_VBLK,/*vCtRst:1  */
    VPORTCAP_FLDD_DISABLE, /*fldDect:1 */
    VPORTCAP_EXC_DISABLE,  /*extCtl:1  */   
    VPORTCAP_FINV_ENABLE,  /* fldInv:1 */
   
    8,                     /*fldXStrt1 */
    1,                     /*fldYStrt1 */  
    8,                     /*fldXStrt2 */  
    1, //15,               /*fldYStrt2 */
   
    LINE_SZ+7,             /*fldXStop1 */
    NUM_LINES,             /*fldYStop1 */
   
    LINE_SZ+7,             /*fldXStop2 */
    NUM_LINES,             /*fldYStop2 */
   
    (LINE_SZ>>3),          /*thrld     */
    3,                     /*numFrmBufs*/
    128,                   /*alignment */
    FALSE,                  /*mergeFlds */
    NULL,                  /*segId     */            
    EDMA_OPT_PRI_HIGH,     /*edmaPri   */
    10,                     /* irqId    */
};
4.初始化程序
void tskVideoInputInit()
{
   
    int status,status2;   
    SEEDVPM642_vCapParamsChan.segId   = EXTERNALHEAP ;//EXTERNALHEAP;
    SEEDVPM642_vCapParamsChan2a.segId = EXTERNALHEAP ;//EXTERNALHEAP;
    SEEDVPM642_vCapParamsTVP5150.hI2C = SEEDVPM642_I2C_hI2C; /*打开驱动程序*/  

/******************************************************/
    /* initialization of capture driver                   */
    /******************************************************/
/*打开第一通路*/
capChanCh1  = FVID_create( "/VP1ACAPTURE/A/1",
                    IOM_INPUT,
                    &status,
                    (Ptr)&SEEDVPM642_vCapParamsChan,
                    NULL);
                    
capChanCh2  = FVID_create( "/VP2ACAPTURE/A/1",
                    IOM_INPUT,
                    &status2,
                    (Ptr)&SEEDVPM642_vCapParamsChan2a,
                    NULL);                        
    /******************************************************/
    /* configure video encoder                      */
    /******************************************************/
    /*配置第一通路的TVP5150*/
    FVID_control( capChanCh1,
         VPORT_CMD_EDC_BASE+EDC_CONFIG,
            (Ptr)&SEEDVPM642_vCapParamsTVP5150);
    FVID_control( capChanCh2,
         VPORT_CMD_EDC_BASE+EDC_CONFIG,
            (Ptr)&SEEDVPM642_vCapParamsTVP5150);

}
5.启动采集程序
/*-----------------------------------------------------------*/
/*Start the capturing                                        */
/*-----------------------------------------------------------*/
void tskVideoInputStart()
{
FVID_control(capChanCh1, VPORT_CMD_START, NULL);
FVID_control(capChanCh2, VPORT_CMD_START, NULL);
}
6.实时采集处理程序[第一路参与采集不处理]
/*-----------------------------------------------------------*/
/* handle video capture, scaling and re-format               */
/*-----------------------------------------------------------*/
void tskVideoInput()
{
   
short i=0,j;
//FILE *fp;
    SCOM_Handle fromTSK1TOTSK2;
    SCOM_Handle fromTSK4TOTSK1,netINIT;  //自定义的
    IMG in1,in2,out1;
unsigned char *rgbBufSrc=NULL;
    //LgUns time_s,time_e;
   
fromTSK1TOTSK2 = SCOM_open("Tsk1ToTsk2");
fromTSK4TOTSK1 = SCOM_open("Tsk4ToTsk1");
netINIT        = SCOM_open("NETINIT");         //网络初始化消息
FVID_alloc(capChanCh1, &capFrameBuf);
FVID_alloc(capChanCh2, &capFrameBuf2);
rgbBufSrc  = (unsigned char *)MEM_calloc(EXTERNALHEAP, H264_W*H264_H*3,0);
rgbBuf     = (unsigned char *)MEM_calloc(EXTERNALHEAP, LEN_PIC,0); //后面的30KB是给x264码的
x264_frame = rgbBuf+RGB_W*RGB_H*3;
printf("RGB24[%d*%d][0x%x]\n",H264_W,H264_H,rgbBufSrc);
printf("RGB24[220*140][0x%x]\n",rgbBuf);
SCOM_getMsg(netINIT, SYS_FOREVER);  //等网络初始化成功
//fp = fopen("YUV352288_420.yuv", "w+b");
  while(1)
  {
     for(i = 0; i<NUM_SCOM_OBJS_IN; i++)
  {
   in1.Y_data  = (unsigned char *)capFrameBuf->frame.iFrm.y1; //360*576
   in1.Cb_data = (unsigned char *)capFrameBuf->frame.iFrm.cb1;
   in1.Cr_data = (unsigned char *)capFrameBuf->frame.iFrm.cr1;
   
   in2.Y_data  = (unsigned char *)capFrameBuf2->frame.iFrm.y1; //360*576
   in2.Cb_data = (unsigned char *)capFrameBuf2->frame.iFrm.cb1;
   in2.Cr_data = (unsigned char *)capFrameBuf2->frame.iFrm.cr1;
   
   out1.Y_data  = YArray_temp1;  //720*576,YUV422
   out1.Cb_data = CbArray_temp1;
   out1.Cr_data = CrArray_temp1;
   
   //time_s = CLK_getltime();
   /***********************************************/
   /*YUV422尺寸变换,352*288->176*144,结果在in1中  */
   /***********************************************/
   YUV422SIZE(in2.Y_data,in2.Cb_data,in2.Cr_data,  /*原始视频源,结束后变换好的数据仍存放在这个里面*/
           out1.Y_data,out1.Cb_data,out1.Cr_data,  /*临时区*/
        352,288,2); //长宽各缩小1/2
   /***********************************************/
   /*YUV422->YUV420,结果在out1中         */
   /***********************************************/
   memcpy(out1.Y_data,in1.Y_data,H264_W*H264_H);
   for(j=0;j<H264_H;j+=2)
   {
    memcpy(out1.Cb_data+H264_W*(j/2),in1.Cb_data+H264_W*j,352);
    memcpy(out1.Cr_data+H264_W*(j/2),in1.Cr_data+H264_W*j,352);
   }
    (thrInput.scomMsgTx).bufChannel = (void *)&out1;
   //time_e = CLK_getltime();
   //LOG_printf(&LOG_trace,"YUV[%d ms]",_abs(time_e-time_s));
   CACHE_clean(CACHE_L2ALL,NULL,NULL);
   /***********************************************/
   /*YUV420->BGR24,结果在rgbBufSrc中      */
   /***********************************************/
   YUV420toRGB24(out1.Y_data,out1.Cb_data,out1.Cr_data,rgbBufSrc,H264_W,H264_H);  //YUV420[352*288]-->RGB24[352*288]
   /***********************************************/
   /*BGR24尺寸变换,结果在rgbBuf中          */
   /***********************************************/  
   ImageResizeNNK2(rgbBufSrc,3,H264_W,H264_H,H264_W*3,rgbBuf,220,140,220*3);      //RGB24[352*288]-->RGB24[220*140]
   CACHE_clean(CACHE_L2ALL,NULL,NULL);
   gClient.bNew=TRUE;
   SCOM_putMsg(fromTSK1TOTSK2, &(thrInput.scomMsgTx)); //发送信息到任务2作编码
   SCOM_getMsg(fromTSK4TOTSK1, SYS_FOREVER);   //等待网络发送完成
   CACHE_clean(CACHE_L2ALL,NULL,NULL);
         /*-----------------------------------------------------------*/
         /* Capture a new frame.                                      */
         /*-----------------------------------------------------------*/
         //FVID_exchange(capChanCh1, &capFrameBuf);
   FVID_exchange(capChanCh2, &capFrameBuf2);
   }
  }     
}


附件: 你需要登录才可以下载或查看附件。没有帐号?注册
返回列表