DSP RF5構架SCOM模塊例子詳解

例子:

定義:
SCOM_Handle objSCOMINToDIS[NUM_SCOM_OBJS_IN][2];

Ptr msgSCOMInToProc[NUM_SCOM_OBJS_IN];
main()函數中
/*-------------------------------------------------------*/
/* create all SCOM and message objects */
/*-------------------------------------------------------*/
objSCOMINToDIS[0][0] = SCOM_create("IN1TODIS", NULL);
objSCOMINToDIS[0][1] = SCOM_create("DISTOIN1", NULL);

objSCOMINToDIS[1][0] = SCOM_create("IN2ATODIS", NULL);
objSCOMINToDIS[1][1] = SCOM_create("DISTOIN2A", NULL);

objSCOMINToDIS[2][0] = SCOM_create("IN2BTODIS", NULL);
objSCOMINToDIS[2][1] = SCOM_create("DISTOIN2B", NULL);
在採集線程1中:
FVID_Frame *capFrameBuf;
SCOM_Handle fromInput1toDIS,fromDIStoInput1;

/*
打開SCOM模塊*/
fromInput1toDIS = SCOM_open("IN1TODIS");
fromDIStoInput1 = SCOM_open("DISTOIN1");
/*
申請一個空間
*/
FVID_alloc(capChanCh1, &capFrameBuf);

while(1)
{
/*-----------------------------------------------------------*/
/* Send message to process task with pointers to captured frame*/
/*-----------------------------------------------------------*/
SCOM_putMsg(fromInput1toDIS, (FVID_Frame *)capFrameBuf);

/*-----------------------------------------------------------*/
/* Wait for the message from the process task */
/*-----------------------------------------------------------*/
SCOM_getMsg(fromDIStoInput1, SYS_FOREVER);

/*-----------------------------------------------------------*/
/* Capture a new frame. */
/*-----------------------------------------------------------*/
FVID_exchange(capChanCh1, &capFrameBuf);
}
採集線程2中:

FVID_Frame *capFrameBuf;
SCOM_Handle fromInput2atoDIS,fromDIStoInput2a;

/*
打開SCOM模塊*/
fromInput2atoDIS = SCOM_open("IN2ATODIS");
fromDIStoInput2a = SCOM_open("DISTOIN2A");
/*
申請一個空間
*/
FVID_alloc(capChanCh2a, &capFrameBuf);

while(1)
{
/*-----------------------------------------------------------*/
/* Send message to process task with pointers to captured frame*/
/*-----------------------------------------------------------*/
SCOM_putMsg(fromInput2atoDIS, (FVID_Frame *)capFrameBuf);

/*-----------------------------------------------------------*/
/* Wait for the message from the process task */
/*-----------------------------------------------------------*/
SCOM_getMsg(fromDIStoInput2a, SYS_FOREVER);

/*-----------------------------------------------------------*/
/* Capture a new frame. */
/*-----------------------------------------------------------*/
FVID_exchange(capChanCh2a, &capFrameBuf);
}
顯示線程3中:

void tskVideoLoopback()
{
Int i;

SCOM_Handle fromInput1toDIS,fromDIStoInput1;
SCOM_Handle fromInput2atoDIS,fromDIStoInput2a;
SCOM_Handle fromInput2btoDIS,fromDIStoInput2b;

FVID_Frame *capFrameBuf;
FVID_Frame *disFrameBuf;
/*
設置顯示的行數*/
Int numLinesDis = EVMDM642_vDisParamsChan.imgVSizeFld1;
/*
設置採集的行數
*/
Int numLinesCap = SEEDVPM642_vCapParamsChan.fldYStop1 -
SEEDVPM642_vCapParamsChan.fldYStrt1+1;
/*
判斷是顯示區域大,還是採集區域大,取其小者
*/
Int numLines = (numLinesDis > numLinesCap) ? numLinesCap : numLinesDis;
/*
設置採集像素數
*/
Int numPixels = (SEEDVPM642_vCapParamsChan.fldXStop1 -
SEEDVPM642_vCapParamsChan.fldXStrt1+1)/2;
/*
設置採集行的增量
*/
Int capLinePitch = (SEEDVPM642_vCapParamsChan.fldXStop1 -
SEEDVPM642_vCapParamsChan.fldXStrt1+1)/2;
/*
設置顯示行的增量
*/
Int disLinePitch = EVMDM642_vDisParamsChan.imgHSizeFld1;

// numLines *= 2; /* both fields */

/*
打開SCOM模塊
*/
fromInput1toDIS = SCOM_open("IN1TODIS");
fromDIStoInput1 = SCOM_open("DISTOIN1");

fromInput2atoDIS = SCOM_open("IN2ATODIS");
fromDIStoInput2a = SCOM_open("DISTOIN2A");

fromInput2btoDIS = SCOM_open("IN2BTODIS");
fromDIStoInput2b = SCOM_open("DISTOIN2B");
/*
申請一個空間
*/
FVID_alloc(disChan, &disFrameBuf);

while(1)
{
/*-----------------------------------------------------------*/
/* Wait for the message from the process task to recieve new */
/* frame to be displayed. */
/*-----------------------------------------------------------*/
capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput1toDIS, SYS_FOREVER);

/*
將數據放入相應的顯示緩衝區
*/
for(i = 0; i < numLines; i ++)
{
DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
disFrameBuf->frame.iFrm.y1 + i * disLinePitch+352,
numPixels);
DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1)+172,
numPixels>>1);

DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1)+172,
numPixels>>1);
}
// DAT_wait(DAT_XFRID_WAITALL);
/*-----------------------------------------------------------*/
/* Wait for the message from the process task to recieve new */
/* frame to be displayed. */
/*-----------------------------------------------------------*/
capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput2atoDIS, SYS_FOREVER);
/*
將數據放入相應的顯示緩衝區
*/
for(i = 0; i < numLines; i ++)
{
DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
disFrameBuf->frame.iFrm.y1 + i * disLinePitch+720*287,
numPixels);
DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1)+360*287,
numPixels>>1);

DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1)+360*287,
numPixels>>1);
}
// DAT_wait(DAT_XFRID_WAITALL);
/*-----------------------------------------------------------*/
/* Wait for the message from the process task to recieve new */
/* frame to be displayed. */
/*-----------------------------------------------------------*/
capFrameBuf = (FVID_Frame *)SCOM_getMsg(fromInput2btoDIS, SYS_FOREVER);
/*
將數據放入相應的顯示緩衝區
*/
for(i = 0; i < numLines; i ++)
{
DAT_copy(capFrameBuf->frame.iFrm.y1 + i * capLinePitch,
disFrameBuf->frame.iFrm.y1 + i * disLinePitch+720*287+352,
numPixels);
DAT_copy(capFrameBuf->frame.iFrm.cb1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cb1 + i * (disLinePitch >> 1)+360*287+172,
numPixels>>1);

DAT_copy(capFrameBuf->frame.iFrm.cr1 + i * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cr1 + i * (disLinePitch >> 1)+360*287+172,
numPixels>>1);
}

DAT_wait(DAT_XFRID_WAITALL);
CACHE_clean(CACHE_L2ALL,NULL,NULL);
/*-----------------------------------------------------------*/
/* Display the decoded frame. */
/*-----------------------------------------------------------*/
FVID_exchange(disChan, &disFrameBuf);

/*-----------------------------------------------------------*/
/* Send message to process task to continue */
/*-----------------------------------------------------------*/
SCOM_putMsg(fromDIStoInput1, NULL);/* loop forever */
/*-----------------------------------------------------------*/
/* Send message to process task to continue */
/*-----------------------------------------------------------*/
SCOM_putMsg(fromDIStoInput2a, NULL);/* loop forever */
/*-----------------------------------------------------------*/
/* Send message to process task to continue */
/*-----------------------------------------------------------*/
SCOM_putMsg(fromDIStoInput2b, NULL);/* loop forever */
}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章