summaryrefslogtreecommitdiff
path: root/lib/avtp_pipeline/mediaq/openavb_mediaq.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/avtp_pipeline/mediaq/openavb_mediaq.c')
-rw-r--r--lib/avtp_pipeline/mediaq/openavb_mediaq.c79
1 files changed, 9 insertions, 70 deletions
diff --git a/lib/avtp_pipeline/mediaq/openavb_mediaq.c b/lib/avtp_pipeline/mediaq/openavb_mediaq.c
index 463b15c2..eda2c68d 100644
--- a/lib/avtp_pipeline/mediaq/openavb_mediaq.c
+++ b/lib/avtp_pipeline/mediaq/openavb_mediaq.c
@@ -1,5 +1,6 @@
/*************************************************************************************************************
Copyright (c) 2012-2015, Symphony Teleca Corporation, a Harman International Industries, Incorporated company
+Copyright (c) 2016-2017, Harman International Industries, Incorporated
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -40,8 +41,6 @@ https://github.com/benhoyt/inih/commit/74d2ca064fb293bc60a77b0bd068075b293cf175.
#include "openavb_mediaq.h"
#include "openavb_avtp_time_pub.h"
-#include "openavb_printbuf.h"
-
#define AVB_LOG_COMPONENT "Media Queue"
#include "openavb_log.h"
@@ -49,10 +48,6 @@ static MUTEX_HANDLE(gMediaQMutex);
#define MEDIAQ_LOCK() { MUTEX_CREATE_ERR(); MUTEX_LOCK(gMediaQMutex); MUTEX_LOG_ERR("Mutex Lock failure"); }
#define MEDIAQ_UNLOCK() { MUTEX_CREATE_ERR(); MUTEX_UNLOCK(gMediaQMutex); MUTEX_LOG_ERR("Mutex Unlock failure"); }
-// CORE_TODO : Currently this first future logic for purge the media queue and incoming items
-// may be too aggressive and can result in never catching up. Therefore it is disabled for now
-//#define ENABLE_FIRST_FUTURE 1
-
//#define DUMP_HEAD_PUSH 1
//#define DUMP_TAIL_PULL 1
@@ -85,9 +80,6 @@ typedef struct {
// True is next item to be pulled is locked
bool tailLocked;
- // set if timestamp is ever in the future
- bool firstFuture;
-
// Maximum latency
U32 maxLatencyUsec;
@@ -167,18 +159,6 @@ void x_openavbMediaQPurgeStaleTail(media_q_t *pMediaQ)
{
AVB_TRACE_ENTRY(AVB_TRACE_MEDIAQ_DETAIL);
-#if 0 // debug
- // Debug code to report delta from TS
- static bool init = TRUE;
- static U32 cnt = 0;
- static openavb_printbuf_t printBuf;
- if (init) {
- printBuf = openavbPrintbufNew(2000, 20);
- init = FALSE;
- }
-#endif
-
-
if (pMediaQ) {
if (pMediaQ->pPvtMediaQInfo) {
media_q_info_t *pMediaQInfo = (media_q_info_t *)(pMediaQ->pPvtMediaQInfo);
@@ -196,14 +176,12 @@ void x_openavbMediaQPurgeStaleTail(media_q_t *pMediaQ)
pMediaQInfo->tailLocked = TRUE;
bool bPurge = FALSE;
-#ifdef ENABLE_FIRST_FUTURE
if (bFirst) {
S32 delta = openavbAvtpTimeUsecDelta(pTail->pAvtpTime);
S32 maxStale = (S32)(0 - pMediaQInfo->maxStaleTailUsec);
if (delta < maxStale) {
- IF_LOG_INTERVAL(100) AVB_LOGF_INFO("Purging stale MediaQ items: delta:%dus maxStale%dus", delta, maxStale);
-
+ AVB_LOGF_DEBUG("Purging stale MediaQ items: delta %d us, maxStale %d us", delta, maxStale);
bPurge = TRUE;
}
bFirst = FALSE;
@@ -211,6 +189,7 @@ void x_openavbMediaQPurgeStaleTail(media_q_t *pMediaQ)
else {
// Once we have triggered a stale tail purge everything past presentation time.
if (openavbAvtpTimeIsPast(pTail->pAvtpTime)) {
+ AVB_LOG_DEBUG("Purging stale MediaQ items");
bPurge = TRUE;
}
}
@@ -224,46 +203,6 @@ void x_openavbMediaQPurgeStaleTail(media_q_t *pMediaQ)
pMediaQInfo->tailLocked = FALSE;
pTail = NULL;
}
-#else // ENABLE_FIRST_FUTURE
- if (bFirst) {
- S32 delta = openavbAvtpTimeUsecDelta(pTail->pAvtpTime);
- S32 maxStale = (S32)(0 - pMediaQInfo->maxStaleTailUsec);
- if(delta >= 0) {
- pMediaQInfo->firstFuture = TRUE;
- }
- else if (delta < maxStale) {
- bPurge = TRUE;
- pMediaQInfo->firstFuture = FALSE;
- }
-
- bFirst = FALSE;
- }
- else {
- // Once we have triggered a stale tail purge everything past presentation time.
- if (openavbAvtpTimeIsPast(pTail->pAvtpTime)) {
-#if 0 // debug
- if (!(++cnt % 1)) {
- openavbPrintbufPrintf(printBuf, "Purge More\n");
- }
-#endif
- bPurge = TRUE;
- }
- else {
- pMediaQInfo->firstFuture = TRUE;
- }
- }
-
- if (bPurge || (pMediaQInfo->firstFuture == FALSE)) {
- openavbMediaQTailPull(pMediaQ);
- pTail = NULL;
- bMore = TRUE;
- }
- else {
- pMediaQInfo->tailLocked = FALSE;
- pTail = NULL;
- }
-#endif // ENABLE_FIRST_FUTURE
-
}
}
}
@@ -292,7 +231,6 @@ media_q_t* openavbMediaQCreate()
pMediaQInfo->headLocked = FALSE;
pMediaQInfo->tail = -1;
pMediaQInfo->tailLocked = FALSE;
- pMediaQInfo->firstFuture = TRUE;
pMediaQInfo->maxLatencyUsec = 0;
pMediaQInfo->threadSafeOn = FALSE;
pMediaQInfo->maxStaleTailUsec = MICROSECONDS_PER_SECOND;
@@ -347,7 +285,7 @@ bool openavbMediaQSetSize(media_q_t *pMediaQ, int itemCount, int itemSize)
int i1;
for (i1 = 0; i1 < itemCount; i1++) {
pMediaQInfo->pItems[i1].pAvtpTime = openavbAvtpTimeCreate(pMediaQInfo->maxLatencyUsec);
- pMediaQInfo->pItems[i1].pPubData = calloc(1, itemSize);
+ pMediaQInfo->pItems[i1].pPubData = calloc(1, itemSize + 4 /* Just in case */);
pMediaQInfo->pItems[i1].dataLen = 0;
pMediaQInfo->pItems[i1].itemSize = itemSize;
if (!pMediaQInfo->pItems[i1].pPubData) {
@@ -399,7 +337,7 @@ bool openavbMediaQAllocItemMapData(media_q_t *pMediaQ, int itemPubMapSize, int i
}
}
else {
- AVB_LOG_ERROR("Attemping to reallocate public map data");
+ AVB_LOG_ERROR("Attempting to reallocate public map data");
AVB_TRACE_EXIT(AVB_TRACE_MEDIAQ);
return FALSE;
}
@@ -413,7 +351,7 @@ bool openavbMediaQAllocItemMapData(media_q_t *pMediaQ, int itemPubMapSize, int i
}
}
else {
- AVB_LOG_ERROR("Attemping to reallocate private map data");
+ AVB_LOG_ERROR("Attempting to reallocate private map data");
AVB_TRACE_EXIT(AVB_TRACE_MEDIAQ);
return FALSE;
}
@@ -449,7 +387,7 @@ bool openavbMediaQAllocItemIntfData(media_q_t *pMediaQ, int itemIntfSize)
}
}
else {
- AVB_LOG_ERROR("Attemping to reallocate private interface data");
+ AVB_LOG_ERROR("Attempting to reallocate private interface data");
AVB_TRACE_EXIT(AVB_TRACE_MEDIAQ);
return FALSE;
}
@@ -699,13 +637,14 @@ media_q_item_t* openavbMediaQTailLock(media_q_t *pMediaQ, bool ignoreTimestamp)
if (pMediaQInfo->threadSafeOn) {
MEDIAQ_UNLOCK();
}
+ AVB_TRACE_EXIT(AVB_TRACE_MEDIAQ_DETAIL);
return NULL;
}
}
pMediaQInfo->tailLocked = TRUE;
- AVB_TRACE_EXIT(AVB_TRACE_MEDIAQ_DETAIL);
// Mutex (LOCK()) if acquired stays locked
+ AVB_TRACE_EXIT(AVB_TRACE_MEDIAQ_DETAIL);
return pTail;
}
}