-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoutudppool.cpp
115 lines (101 loc) · 2.65 KB
/
outudppool.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "outudppool.h"
outudppool::outudppool( unsigned long lBufSize )
{
m_lBufferSize = lBufSize;
m_MAXCNT = m_lBufferSize/188;
m_pabyBuffer = new BYTE[m_lBufferSize];
if( NULL != m_pabyBuffer )
memset( m_pabyBuffer, 0, m_lBufferSize );
m_lHead = 0;
m_lRear = 0;
m_nSampleCount = 0;
continuity_cnt = 0;
fpVideo = NULL;
m_tmpPcr = 0;
pthread_mutex_init( &m_mutex, NULL );
}
outudppool::~outudppool(void)
{
if( m_pabyBuffer )
{
delete m_pabyBuffer;
m_pabyBuffer = NULL;
}
pthread_mutex_destroy( &m_mutex );
}
bool outudppool::Get( PSAMPLE pGetSample, bool bGetSampleFromBuffer )
{
if( 0 == m_nSampleCount ) // buffer is empty
return false;
if( NULL == m_pabyBuffer || NULL == pGetSample )
return false;
pthread_mutex_lock( &m_mutex );
bool bRet = true;
PBYTE pBuf = m_pabyBuffer;
PSAMPLE pSample = (PSAMPLE)(pBuf+m_lHead);
unsigned long lRear = m_lRear;
unsigned long lSize = pSample->lSampleLength+sizeof( pSample->lTimeStamp )+sizeof( pSample->lSampleLength )
+sizeof( pSample->lDecodeTimeStamp );
if( lSize >= m_lBufferSize)
return false;
memcpy( pGetSample, pSample, lSize );
if( lRear > m_lHead )
{
if( ( lRear - m_lHead ) >= lSize )
{
if( bGetSampleFromBuffer )
{
m_lHead += lSize;
--m_nSampleCount;
}
}
else
{
bRet = false;
}
}
else
{
if( NLOOPBUF_SIZE - m_lHead >= lSize && pSample->lSampleLength != 0 )
{
if( bGetSampleFromBuffer )
{
m_lHead += lSize;
--m_nSampleCount;
}
}
else
{
pSample = (PSAMPLE)pBuf;
lSize = pSample->lSampleLength+sizeof( pSample->lTimeStamp )+sizeof( pSample->lSampleLength )
+sizeof( pSample->lDecodeTimeStamp );
if( lSize >= m_lBufferSize)
return false;
memcpy( pGetSample, pSample, lSize );
if( lRear >= lSize )
{
if( bGetSampleFromBuffer )
{
m_lHead = lSize;
--m_nSampleCount;
}
}
else
bRet = false;
}
}
pthread_mutex_unlock( &m_mutex );
return bRet;
}
int outudppool::GetSampleCount()
{
return m_nSampleCount;
}
void outudppool::ClearBuffer()
{
if( NULL != m_pabyBuffer )
memset( m_pabyBuffer, 0, m_lBufferSize );
m_lHead = 0;
m_lRear = 0;
m_nSampleCount = 0;
}