Skip to content

Commit 53254e9

Browse files
committed
fix: avpacket queue iterator invalid
1 parent 27ff66f commit 53254e9

File tree

5 files changed

+422
-472
lines changed

5 files changed

+422
-472
lines changed

libmpeg/include/mpeg-proto.h

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ enum EPSI_STREAM_TYPE
9393
PSI_STREAM_AUDIO_DTS = 0x8a, // ffmpeg/libavformat/mpegts.h
9494
PSI_STREAM_VIDEO_DIRAC = 0xd1, // ffmpeg/libavformat/mpegts.h
9595
PSI_STREAM_VIDEO_AVS3 = 0xd4, // ffmpeg/libavformat/mpegts.h
96+
PSI_STREAM_AUDIO_AVS3 = 0xd5, // avs3-p6
9697
PSI_STREAM_VIDEO_VC1 = 0xea, // ffmpeg/libavformat/mpegts.h
9798
PSI_STREAM_VIDEO_SVAC = 0x80, // GBT 25724-2010 SVAC(2014)
9899
PSI_STREAM_AUDIO_SVAC = 0x9B, // GBT 25724-2010 SVAC(2014)

librtsp/test/media/avpacket-queue.cpp

+128-163
Original file line numberDiff line numberDiff line change
@@ -1,163 +1,128 @@
1-
#include "avpacket-queue.h"
2-
#include "sys/sync.hpp"
3-
#include <deque>
4-
5-
struct avpacket_queue_t
6-
{
7-
std::deque<avpacket_t*>::size_type maxsize;
8-
std::deque<avpacket_t*> q;
9-
std::deque<avpacket_t*>::iterator it;
10-
ThreadLocker locker;
11-
ThreadEvent event;
12-
};
13-
14-
struct avpacket_queue_t* avpacket_queue_create(int size)
15-
{
16-
struct avpacket_queue_t* q = new struct avpacket_queue_t;
17-
q->maxsize = size;
18-
q->it = q->q.begin();
19-
return q;
20-
}
21-
22-
void avpacket_queue_destroy(struct avpacket_queue_t* q)
23-
{
24-
avpacket_queue_clear(q);
25-
delete q;
26-
}
27-
28-
void avpacket_queue_clear(struct avpacket_queue_t* q)
29-
{
30-
AutoThreadLocker locker(q->locker);
31-
while (!q->q.empty())
32-
{
33-
struct avpacket_t* pkt = q->q.front();
34-
avpacket_release(pkt);
35-
q->q.pop_front();
36-
}
37-
q->it = q->q.begin();
38-
}
39-
40-
int avpacket_queue_count(struct avpacket_queue_t* q)
41-
{
42-
AutoThreadLocker locker(q->locker);
43-
return (int)q->q.size();
44-
}
45-
46-
int avpacket_queue_pop(struct avpacket_queue_t* q)
47-
{
48-
struct avpacket_t* pkt;
49-
{
50-
AutoThreadLocker locker(q->locker);
51-
if (q->q.empty())
52-
return -1;
53-
54-
pkt = q->q.front();
55-
q->q.pop_front();
56-
q->event.Signal();
57-
}
58-
59-
if (*q->it == pkt)
60-
q->it++;
61-
62-
avpacket_release(pkt);
63-
return 0;
64-
}
65-
66-
struct avpacket_t* avpacket_queue_front(struct avpacket_queue_t* q)
67-
{
68-
struct avpacket_t* pkt;
69-
AutoThreadLocker locker(q->locker);
70-
if (q->q.empty())
71-
return NULL;
72-
73-
pkt = q->q.front();
74-
avpacket_addref(pkt);
75-
return pkt;
76-
}
77-
78-
int avpacket_queue_push(struct avpacket_queue_t* q, struct avpacket_t* pkt)
79-
{
80-
AutoThreadLocker locker(q->locker);
81-
if (q->maxsize > 0 && q->q.size() >= q->maxsize)
82-
return -1;
83-
84-
avpacket_addref(pkt);
85-
q->q.push_back(pkt);
86-
q->event.Signal();
87-
return 0;
88-
}
89-
90-
struct avpacket_t* avpacket_queue_front_wait(struct avpacket_queue_t* q, int ms)
91-
{
92-
q->locker.Lock();
93-
if (q->q.empty())
94-
{
95-
q->locker.Unlock();
96-
if (0 != q->event.TimeWait(ms))
97-
return NULL;
98-
q->locker.Lock();
99-
}
100-
101-
if (q->q.empty())
102-
{
103-
q->locker.Unlock();
104-
return NULL;
105-
}
106-
107-
struct avpacket_t* pkt = q->q.front();
108-
avpacket_addref(pkt);
109-
q->locker.Unlock();
110-
return pkt;
111-
}
112-
113-
int avpacket_queue_push_wait(struct avpacket_queue_t* q, struct avpacket_t* pkt, int ms)
114-
{
115-
q->locker.Lock();
116-
if (q->maxsize > 0 && q->q.size() >= q->maxsize)
117-
{
118-
q->locker.Unlock();
119-
if (0 != q->event.TimeWait(ms))
120-
return -1;
121-
q->locker.Lock();
122-
}
123-
124-
if (q->maxsize > 0 && q->q.size() >= q->maxsize)
125-
{
126-
q->locker.Unlock();
127-
return -1;
128-
}
129-
130-
avpacket_addref(pkt);
131-
q->q.push_back(pkt);
132-
q->locker.Unlock();
133-
return 0;
134-
}
135-
136-
struct avpacket_t* avpacket_queue_cur(struct avpacket_queue_t* q)
137-
{
138-
struct avpacket_t* pkt;
139-
AutoThreadLocker locker(q->locker);
140-
if (q->q.empty())
141-
return NULL;
142-
143-
if (q->it == q->q.end())
144-
return NULL;
145-
146-
pkt = *q->it++;
147-
avpacket_addref(pkt);
148-
return pkt;
149-
}
150-
151-
bool avpacket_queue_end(struct avpacket_queue_t* q)
152-
{
153-
AutoThreadLocker locker(q->locker);
154-
155-
return q->it == q->q.end();
156-
}
157-
158-
void avpacket_queue_reset(struct avpacket_queue_t* q)
159-
{
160-
AutoThreadLocker locker(q->locker);
161-
162-
q->it = q->q.begin();
163-
}
1+
#include "avpacket-queue.h"
2+
#include "sys/sync.hpp"
3+
#include <queue>
4+
5+
struct avpacket_queue_t
6+
{
7+
std::queue<avpacket_t*>::size_type maxsize;
8+
std::queue<avpacket_t*> q;
9+
ThreadLocker locker;
10+
ThreadEvent event;
11+
};
12+
13+
struct avpacket_queue_t* avpacket_queue_create(int size)
14+
{
15+
struct avpacket_queue_t* q = new struct avpacket_queue_t;
16+
q->maxsize = size;
17+
return q;
18+
}
19+
20+
void avpacket_queue_destroy(struct avpacket_queue_t* q)
21+
{
22+
avpacket_queue_clear(q);
23+
delete q;
24+
}
25+
26+
void avpacket_queue_clear(struct avpacket_queue_t* q)
27+
{
28+
AutoThreadLocker locker(q->locker);
29+
while (!q->q.empty())
30+
{
31+
struct avpacket_t* pkt = q->q.front();
32+
avpacket_release(pkt);
33+
q->q.pop();
34+
}
35+
}
36+
37+
int avpacket_queue_count(struct avpacket_queue_t* q)
38+
{
39+
AutoThreadLocker locker(q->locker);
40+
return (int)q->q.size();
41+
}
42+
43+
int avpacket_queue_pop(struct avpacket_queue_t* q)
44+
{
45+
struct avpacket_t* pkt;
46+
{
47+
AutoThreadLocker locker(q->locker);
48+
if (q->q.empty())
49+
return -1;
50+
51+
pkt = q->q.front();
52+
q->q.pop();
53+
q->event.Signal();
54+
}
55+
56+
avpacket_release(pkt);
57+
return 0;
58+
}
59+
60+
struct avpacket_t* avpacket_queue_front(struct avpacket_queue_t* q)
61+
{
62+
struct avpacket_t* pkt;
63+
AutoThreadLocker locker(q->locker);
64+
if (q->q.empty())
65+
return NULL;
66+
67+
pkt = q->q.front();
68+
avpacket_addref(pkt);
69+
return pkt;
70+
}
71+
72+
int avpacket_queue_push(struct avpacket_queue_t* q, struct avpacket_t* pkt)
73+
{
74+
AutoThreadLocker locker(q->locker);
75+
if (q->q.size() >= q->maxsize)
76+
return -1;
77+
78+
avpacket_addref(pkt);
79+
q->q.push(pkt);
80+
q->event.Signal();
81+
return 0;
82+
}
83+
84+
struct avpacket_t* avpacket_queue_front_wait(struct avpacket_queue_t* q, int ms)
85+
{
86+
q->locker.Lock();
87+
if (q->q.empty())
88+
{
89+
q->locker.Unlock();
90+
if (0 != q->event.TimeWait(ms))
91+
return NULL;
92+
q->locker.Lock();
93+
}
94+
95+
if (q->q.empty())
96+
{
97+
q->locker.Unlock();
98+
return NULL;
99+
}
100+
101+
struct avpacket_t* pkt = q->q.front();
102+
avpacket_addref(pkt);
103+
q->locker.Unlock();
104+
return pkt;
105+
}
106+
107+
int avpacket_queue_push_wait(struct avpacket_queue_t* q, struct avpacket_t* pkt, int ms)
108+
{
109+
q->locker.Lock();
110+
if (q->q.size() >= q->maxsize)
111+
{
112+
q->locker.Unlock();
113+
if (0 != q->event.TimeWait(ms))
114+
return -1;
115+
q->locker.Lock();
116+
}
117+
118+
if (q->q.size() >= q->maxsize)
119+
{
120+
q->locker.Unlock();
121+
return -1;
122+
}
123+
124+
avpacket_addref(pkt);
125+
q->q.push(pkt);
126+
q->locker.Unlock();
127+
return 0;
128+
}

librtsp/test/media/avpacket-queue.h

+43-51
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,43 @@
1-
#ifndef _avpacket_queue_h_
2-
#define _avpacket_queue_h_
3-
4-
#include "avpacket.h"
5-
#include <stdint.h>
6-
7-
struct avpacket_queue_t;
8-
9-
struct avpacket_queue_t* avpacket_queue_create(int size);
10-
void avpacket_queue_destroy(struct avpacket_queue_t* q);
11-
12-
void avpacket_queue_clear(struct avpacket_queue_t* q);
13-
int avpacket_queue_count(struct avpacket_queue_t* q);
14-
int avpacket_queue_pop(struct avpacket_queue_t* q);
15-
16-
struct avpacket_t* avpacket_queue_front(struct avpacket_queue_t* q);
17-
int avpacket_queue_push(struct avpacket_queue_t* q, struct avpacket_t* pkt);
18-
19-
struct avpacket_t* avpacket_queue_front_wait(struct avpacket_queue_t* q, int ms);
20-
int avpacket_queue_push_wait(struct avpacket_queue_t* q, struct avpacket_t* pkt, int ms);
21-
22-
struct avpacket_t* avpacket_queue_cur(struct avpacket_queue_t* q);
23-
bool avpacket_queue_end(struct avpacket_queue_t* q);
24-
void avpacket_queue_reset(struct avpacket_queue_t* q);
25-
26-
#if defined(__cplusplus)
27-
class AVPacketQueue
28-
{
29-
public:
30-
AVPacketQueue(int size) :m_pkts(avpacket_queue_create(size)) {}
31-
~AVPacketQueue() { if (m_pkts) avpacket_queue_destroy(m_pkts); }
32-
33-
public:
34-
void Clear() { avpacket_queue_clear(m_pkts); }
35-
int Count() const { return avpacket_queue_count(m_pkts); }
36-
37-
int Pop() { return avpacket_queue_pop(m_pkts); }
38-
int Push(struct avpacket_t* pkt) { return avpacket_queue_push(m_pkts, pkt); }
39-
int PushWait(struct avpacket_t* pkt, int ms) { return avpacket_queue_push_wait(m_pkts, pkt, ms); }
40-
struct avpacket_t* Front() { return avpacket_queue_front(m_pkts); }
41-
struct avpacket_t* FrontWait(int ms) { return avpacket_queue_front_wait(m_pkts, ms); }
42-
43-
struct avpacket_t* Cur() { return avpacket_queue_cur(m_pkts); };
44-
bool End() { return avpacket_queue_end(m_pkts); };
45-
void Reset() { return avpacket_queue_reset(m_pkts); };
46-
47-
private:
48-
struct avpacket_queue_t* m_pkts;
49-
};
50-
#endif
51-
#endif /* !_avpacket_queue_h_*/
1+
#ifndef _avpacket_queue_h_
2+
#define _avpacket_queue_h_
3+
4+
#include "avpacket.h"
5+
#include <stdint.h>
6+
7+
struct avpacket_queue_t;
8+
9+
struct avpacket_queue_t* avpacket_queue_create(int size);
10+
void avpacket_queue_destroy(struct avpacket_queue_t* q);
11+
12+
void avpacket_queue_clear(struct avpacket_queue_t* q);
13+
int avpacket_queue_count(struct avpacket_queue_t* q);
14+
int avpacket_queue_pop(struct avpacket_queue_t* q);
15+
16+
struct avpacket_t* avpacket_queue_front(struct avpacket_queue_t* q);
17+
int avpacket_queue_push(struct avpacket_queue_t* q, struct avpacket_t* pkt);
18+
19+
struct avpacket_t* avpacket_queue_front_wait(struct avpacket_queue_t* q, int ms);
20+
int avpacket_queue_push_wait(struct avpacket_queue_t* q, struct avpacket_t* pkt, int ms);
21+
22+
#if defined(__cplusplus)
23+
class AVPacketQueue
24+
{
25+
public:
26+
AVPacketQueue(int size) :m_pkts(avpacket_queue_create(size)) {}
27+
~AVPacketQueue() { if (m_pkts) avpacket_queue_destroy(m_pkts); }
28+
29+
public:
30+
void Clear() { avpacket_queue_clear(m_pkts); }
31+
int Count() const { return avpacket_queue_count(m_pkts); }
32+
33+
int Pop() { return avpacket_queue_pop(m_pkts); }
34+
int Push(struct avpacket_t* pkt) { return avpacket_queue_push(m_pkts, pkt); }
35+
int PushWait(struct avpacket_t* pkt, int ms) { return avpacket_queue_push_wait(m_pkts, pkt, ms); }
36+
struct avpacket_t* Front() { return avpacket_queue_front(m_pkts); }
37+
struct avpacket_t* FrontWait(int ms) { return avpacket_queue_front_wait(m_pkts, ms); }
38+
39+
private:
40+
struct avpacket_queue_t* m_pkts;
41+
};
42+
#endif
43+
#endif /* !_avpacket_queue_h_*/

0 commit comments

Comments
 (0)