模塊分析-------Sync

功能介紹:收到前一個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

 

        

 

 

 

 

 

 

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