功能介紹:收到前一個link發過來的多通道數據時,根據當時時間戳和UC設置的允許時間戳誤差進行同步,如果在誤差範圍之內則發送下一個link,一般和merge配套使用,使用merge把多個通道的數據整合成一路,然後把這幾路數據進行同步組合
代碼位置:links_fw/src/rtos/links_common/sync rtos
links_fw/src/hlos/links_a15/sync hlos
使用示例:
Capture -> Dup -> alg_dsp0 -> merge
Dup -> Merge
Merge -> sync -> Display
一些重要參數:
pObj->numCh 上一個link通道數(例如merge中通道數)
pObj->chObj[chId].localQueHandle 本地隊列,有多少個通道建立多少個,用來保存pre link數據
pObj->outFrameQue 輸出隊列,同步後放在該隊列中
pObj->timer = BspOsal_clockCreate( //這個定時器每33ms往本模塊發送一個SYSTEM_CMD_NEW_DATA
&SyncLink_timerCallback, //用來修正發送給下一link的時間間隔
33U, (Bool)FALSE, pObj);
處理步驟:
1、檢查本地所有通道隊列數據時間戳是否符合要求(UC設置了閾值),不符合則取出放入到dropList等待釋放給pre link
2、釋放dropList
3、獲取pre link所有通道數據,放入對應通道本地隊列
4、檢查本地所有通道隊列是否都有數據,如果都有,計算平均時間戳,否則跳過本地process
5、執行同步邏輯
6、取一個空buff,組裝成綜合buf,包含了video frame和metadata frame
7、發送到next link
部分主要函數分析:
Int32 SyncLink_fillLocalQueues(SyncLink_Obj * pObj)
//從pre link取出所有通道的數據,並分別放入本地對應通道的隊列中保存
System_getLinksFullBuffers(inputBufList)
for(inputBufList.numBuf)
Utils_quePut(&pObj->chObj[pBuffer->chNum].localQueHandle)
SyncLink_addBuffersToDropListLesserThanThreshold
//丟棄離本次處理時間太長的幀
//所有chId buf的src時間戳 - 當前處理時間戳 超過UC設置的syncThreshold時,
全部放入dropList
Utils_quePeek(localQueHandle)
curTime = Utils_getCurGlobalTimeInUsec();
計算diffTime,如果超過syncThreshold,則該通道數據放入dropList
Void SyncLink_dropBuffers(SyncLink_Obj * pObj)
//釋放dropBufList的buf到pre link
System_putLinksEmptyBuffers(&pObj->dropBufList)
Int32 SyncLink_fillLocalQueues(SyncLink_Obj * pObj)
//獲取pre link所有通道數據,並分別放入本地對應chId的隊列中(每個chId有一個本地隊列)
System_getLinksFullBuffers(inputBufList)
for(inputBufList.numBuf)
Utils_quePut(&pObj->chObj[pBuffer->chNum].localQueHandle)
Bool SyncLink_computeMasterTimeStamp(SyncLink_Obj * pObj)
//所有通道都有數據的情況下,計算所有numCh的平均時間戳masterTimeStamp
for(pObj->numCh)
Utils_quePeek(&pObj->chObj[chId].localQueHandle)
計算pObj->masterTimeStamp
Int32 SyncLink_computeDecisionParams(SyncLink_Obj * pObj,
Bool *syncDone)
//不同通道的localQueHandle中時間戳和平均時間戳對比(和UC設置的delta做上下閾值),
如果該通道時間戳小於masterTimeStamp-delta,該chId放入dropList
如果該通道時間戳大於masterTimeStamp+delta,說明除當前chId的幀外其他幀都偏早,丟棄他們放入dropList
如果所有通道時間戳介於之間,則syncDone
Int32 SyncLink_makeCompositeBuffer(SyncLink_Obj * pObj, System_Buffer *pSysBuf)
// 當所有通道有效且同步成功時,組裝成composite buf
for(pObj->numCh)
Utils_queGet(chObj[chId].localQueHandle,pBuf)
根據bufType爲SYSTEM_BUFFER_TYPE_VIDEO_FRAME和SYSTEM_BUFFER_TYPE_METADATA填充數據
video frame: pSysCompBuf->bufAddr[i][numFrames] 每個chId numFrames+1