#define SNAP_QUEUE_MAX 5
typedef struct __snap_queue_ {
HI_BOOL bHasLP;
char szLP[64];
unsigned int uiSpeed;
unsigned short usColor;
unsigned char ucWay;
unsigned int uiBrokenRuleType;
unsigned int uiLPLeft;
unsigned int uiLPTop;
unsigned int uiLPRight;
unsigned int uiLPBottom;
unsigned char *p_YBuff;
unsigned char *p_UVBuff;
unsigned int uiFrameID;
unsigned int uiWidth;
unsigned int uiSnapMS;//
unsigned long ulSnapTM;//
}strc_snap_queue;
strc_snap_queue m_SnapQueueArray[SNAP_QUEUE_MAX];
int m_iSnapQueueIn=0;
int m_iSnapQueueOut=0;
//从队列中取 数据
void *SH_snap_queue_thread(void *arg) {
strc_snap_queue *p_que;
int iTimes;
m_iSnapQueueIn=0;
m_iSnapQueueOut=0;
iTimes = 0;
while(1) {
if (m_iSnapQueueIn == m_iSnapQueueOut) //队列没有数据,等待
{
usleep(10000);//10mS
iTimes ++;
if (iTimes > 500) {
iTimes = 0;
//printf("m_iSnapQueueIn=%d m_iSnapQueueOut=%d in %s\n", m_iSnapQueueIn , m_iSnapQueueOut, __FUNCTION__);
}
continue;
}
p_que = &m_SnapQueueArray[m_iSnapQueueOut];
m_fSnapFuncCallBackDoSnapDone(
p_que->uiFrameID,
p_que->p_YBuff,
p_que->p_UVBuff,
p_que->uiWidth,
p_que->bHasLP,
p_que->szLP,
p_que->uiSpeed,
p_que->usColor,
p_que->ucWay,
p_que->uiBrokenRuleType,
p_que->uiLPLeft,
p_que->uiLPTop,
p_que->uiLPRight,
p_que->uiLPBottom,
p_que->uiSnapMS,
p_que->ulSnapTM
);
m_iSnapQueueOut = (m_iSnapQueueOut + 1) % SNAP_QUEUE_MAX; //m_iSnapQueueOut +1 , 注意%是求余, 1%5=1 ,2%5=2
}
}
//向队列中存 数据
void CallBack_VirtCle_DoOsd(unsigned char bHasLP, char *p_cLPArray,
unsigned int uiSpeed, unsigned short usColor, unsigned char ucWay,
unsigned int uiBrokenRuleType,
unsigned int uiLPLeft, unsigned int uiLPTop, unsigned int uiLPRight, unsigned int uiLPBottom,
unsigned char *p_ucYData, unsigned char *p_ucUVDta, unsigned int uiWidth, unsigned int uiFrameID
) {
int iSnapQueueIn;
struct timeval tvSnap;
unsigned int uiSnapMS;
unsigned long ulSnapTM;
//记录抓拍时间
gettimeofday(&tvSnap,0);
uiSnapMS = tvSnap.tv_usec/1000;
ulSnapTM = time(NULL);
iSnapQueueIn = (m_iSnapQueueIn + 1) % SNAP_QUEUE_MAX;// m_iSnapQueueIn 的下一个位置
if ( iSnapQueueIn == m_iSnapQueueOut) { //队列满了,存的快,取的慢
printf("Err: Snap Queue is full m_iSnapQueueIn=%d m_iSnapQueueOut=%d in %s. \n", m_iSnapQueueIn , m_iSnapQueueOut, __FUNCTION__);
SH_drvif_ReleaseFrame(uiFrameID);
return;
}
//存 数据
m_SnapQueueArray[m_iSnapQueueIn].p_YBuff = p_ucYData;
m_SnapQueueArray[m_iSnapQueueIn].p_UVBuff = p_ucUVDta;
m_SnapQueueArray[m_iSnapQueueIn].uiFrameID = uiFrameID;
m_SnapQueueArray[m_iSnapQueueIn].uiWidth = uiWidth;
m_SnapQueueArray[m_iSnapQueueIn].bHasLP = bHasLP;
strcpy(m_SnapQueueArray[m_iSnapQueueIn].szLP, p_cLPArray);
m_SnapQueueArray[m_iSnapQueueIn].uiSpeed = uiSpeed;
m_SnapQueueArray[m_iSnapQueueIn].usColor = usColor;
m_SnapQueueArray[m_iSnapQueueIn].ucWay = ucWay;
m_SnapQueueArray[m_iSnapQueueIn].uiBrokenRuleType = uiBrokenRuleType;
m_SnapQueueArray[m_iSnapQueueIn].uiLPLeft = uiLPLeft;
m_SnapQueueArray[m_iSnapQueueIn].uiLPTop = uiLPTop;
m_SnapQueueArray[m_iSnapQueueIn].uiLPRight = uiLPRight;
m_SnapQueueArray[m_iSnapQueueIn].uiLPBottom = uiLPBottom;
m_SnapQueueArray[m_iSnapQueueIn].uiSnapMS = uiSnapMS;
m_SnapQueueArray[m_iSnapQueueIn].ulSnapTM = ulSnapTM;
m_iSnapQueueIn = iSnapQueueIn;//m_iSnapQueueIn 向下移动一位,+1 ;iSnapQueueIn为m_iSnapQueueIn的下一个
}
typedef struct __snap_queue_ {
HI_BOOL bHasLP;
char szLP[64];
unsigned int uiSpeed;
unsigned short usColor;
unsigned char ucWay;
unsigned int uiBrokenRuleType;
unsigned int uiLPLeft;
unsigned int uiLPTop;
unsigned int uiLPRight;
unsigned int uiLPBottom;
unsigned char *p_YBuff;
unsigned char *p_UVBuff;
unsigned int uiFrameID;
unsigned int uiWidth;
unsigned int uiSnapMS;//
unsigned long ulSnapTM;//
}strc_snap_queue;
strc_snap_queue m_SnapQueueArray[SNAP_QUEUE_MAX];
int m_iSnapQueueIn=0;
int m_iSnapQueueOut=0;
//从队列中取 数据
void *SH_snap_queue_thread(void *arg) {
strc_snap_queue *p_que;
int iTimes;
m_iSnapQueueIn=0;
m_iSnapQueueOut=0;
iTimes = 0;
while(1) {
if (m_iSnapQueueIn == m_iSnapQueueOut) //队列没有数据,等待
{
usleep(10000);//10mS
iTimes ++;
if (iTimes > 500) {
iTimes = 0;
//printf("m_iSnapQueueIn=%d m_iSnapQueueOut=%d in %s\n", m_iSnapQueueIn , m_iSnapQueueOut, __FUNCTION__);
}
continue;
}
p_que = &m_SnapQueueArray[m_iSnapQueueOut];
m_fSnapFuncCallBackDoSnapDone(
p_que->uiFrameID,
p_que->p_YBuff,
p_que->p_UVBuff,
p_que->uiWidth,
p_que->bHasLP,
p_que->szLP,
p_que->uiSpeed,
p_que->usColor,
p_que->ucWay,
p_que->uiBrokenRuleType,
p_que->uiLPLeft,
p_que->uiLPTop,
p_que->uiLPRight,
p_que->uiLPBottom,
p_que->uiSnapMS,
p_que->ulSnapTM
);
m_iSnapQueueOut = (m_iSnapQueueOut + 1) % SNAP_QUEUE_MAX; //m_iSnapQueueOut +1 , 注意%是求余, 1%5=1 ,2%5=2
}
}
//向队列中存 数据
void CallBack_VirtCle_DoOsd(unsigned char bHasLP, char *p_cLPArray,
unsigned int uiSpeed, unsigned short usColor, unsigned char ucWay,
unsigned int uiBrokenRuleType,
unsigned int uiLPLeft, unsigned int uiLPTop, unsigned int uiLPRight, unsigned int uiLPBottom,
unsigned char *p_ucYData, unsigned char *p_ucUVDta, unsigned int uiWidth, unsigned int uiFrameID
) {
int iSnapQueueIn;
struct timeval tvSnap;
unsigned int uiSnapMS;
unsigned long ulSnapTM;
//记录抓拍时间
gettimeofday(&tvSnap,0);
uiSnapMS = tvSnap.tv_usec/1000;
ulSnapTM = time(NULL);
iSnapQueueIn = (m_iSnapQueueIn + 1) % SNAP_QUEUE_MAX;// m_iSnapQueueIn 的下一个位置
if ( iSnapQueueIn == m_iSnapQueueOut) { //队列满了,存的快,取的慢
printf("Err: Snap Queue is full m_iSnapQueueIn=%d m_iSnapQueueOut=%d in %s. \n", m_iSnapQueueIn , m_iSnapQueueOut, __FUNCTION__);
SH_drvif_ReleaseFrame(uiFrameID);
return;
}
//存 数据
m_SnapQueueArray[m_iSnapQueueIn].p_YBuff = p_ucYData;
m_SnapQueueArray[m_iSnapQueueIn].p_UVBuff = p_ucUVDta;
m_SnapQueueArray[m_iSnapQueueIn].uiFrameID = uiFrameID;
m_SnapQueueArray[m_iSnapQueueIn].uiWidth = uiWidth;
m_SnapQueueArray[m_iSnapQueueIn].bHasLP = bHasLP;
strcpy(m_SnapQueueArray[m_iSnapQueueIn].szLP, p_cLPArray);
m_SnapQueueArray[m_iSnapQueueIn].uiSpeed = uiSpeed;
m_SnapQueueArray[m_iSnapQueueIn].usColor = usColor;
m_SnapQueueArray[m_iSnapQueueIn].ucWay = ucWay;
m_SnapQueueArray[m_iSnapQueueIn].uiBrokenRuleType = uiBrokenRuleType;
m_SnapQueueArray[m_iSnapQueueIn].uiLPLeft = uiLPLeft;
m_SnapQueueArray[m_iSnapQueueIn].uiLPTop = uiLPTop;
m_SnapQueueArray[m_iSnapQueueIn].uiLPRight = uiLPRight;
m_SnapQueueArray[m_iSnapQueueIn].uiLPBottom = uiLPBottom;
m_SnapQueueArray[m_iSnapQueueIn].uiSnapMS = uiSnapMS;
m_SnapQueueArray[m_iSnapQueueIn].ulSnapTM = ulSnapTM;
m_iSnapQueueIn = iSnapQueueIn;//m_iSnapQueueIn 向下移动一位,+1 ;iSnapQueueIn为m_iSnapQueueIn的下一个
}