arduino-audio-tools
Loading...
Searching...
No Matches
RTSPFragmentQueue.h
Go to the documentation of this file.
1/*
2 * Author: Phil Schatzmann
3 */
4
5#pragma once
6
8
9namespace audio_tools {
10
37 protected:
38 // RTSPMediaStreamer infers the RTP marker bit from "nothing left queued
39 // after this fragment", which is only exact when at most one frame's
40 // fragments are queued at a time - so keep the backlog capped at 1 frame
41 // (older, stale frames are dropped rather than queued behind a newer one,
42 // which also keeps real-time video latency low).
44
46 size_t m_queueHead = 0;
47 size_t m_queuedFrames = 0;
48
49 void clearQueue() {
50 m_queue.clear();
51 m_queueHead = 0;
53 }
54
55 uint32_t readQueueU32(size_t pos) {
56 return ((uint32_t)m_queue[pos] << 24) | ((uint32_t)m_queue[pos + 1] << 16) |
57 ((uint32_t)m_queue[pos + 2] << 8) | (uint32_t)m_queue[pos + 3];
58 }
59
60 void appendFragment(const uint8_t *payload, size_t len, bool last) {
61 size_t pos = m_queue.size();
62 m_queue.resize(pos + 5 + len);
63 uint8_t *p = m_queue.data() + pos;
64 p[0] = (uint8_t)((len >> 24) & 0xFF);
65 p[1] = (uint8_t)((len >> 16) & 0xFF);
66 p[2] = (uint8_t)((len >> 8) & 0xFF);
67 p[3] = (uint8_t)(len & 0xFF);
68 p[4] = last ? 1 : 0;
69 memcpy(p + 5, payload, len);
70
71 if (last) {
75 }
76 }
77 }
78
80 size_t pos = m_queueHead;
81 while (pos < m_queue.size()) {
82 uint32_t len = readQueueU32(pos);
83 bool last = m_queue[pos + 4] != 0;
84 pos += 5 + len;
85 if (last) break;
86 }
87 m_queueHead = pos;
89 LOGW("RTSPFragmentQueue: consumer too slow, dropped oldest queued video frame");
90 }
91
93 if (m_queueHead >= m_queue.size()) {
94 if (m_queue.size() > 0) clearQueue();
95 return 0;
96 }
97 return (int)readQueueU32(m_queueHead);
98 }
99
102 int queueReadBytes(void *dest, int maxBytes) {
103 if (m_queueHead >= m_queue.size()) return 0;
104
105 uint32_t len = readQueueU32(m_queueHead);
106 bool last = m_queue[m_queueHead + 4] != 0;
107 size_t payloadStart = m_queueHead + 5;
108 if (payloadStart + len > m_queue.size()) {
109 LOGE("RTSPFragmentQueue: corrupt fragment queue; resetting");
110 clearQueue();
111 return 0;
112 }
113
114 m_queueHead = payloadStart + len;
115 if (last && m_queuedFrames > 0) --m_queuedFrames;
116
117 if ((int)len > maxBytes) {
118 LOGE(
119 "RTSPFragmentQueue: fragment (%u bytes) exceeds destination "
120 "buffer (%d bytes); dropping",
121 (unsigned)len, maxBytes);
122 return 0;
123 }
124 memcpy(dest, m_queue.data() + payloadStart, len);
125 return (int)len;
126 }
127};
128
129} // namespace audio_tools
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGE(...)
Definition AudioLoggerIDF.h:30
Self-delimited fragment queue shared by packetized RTP video encoders (JPEGRtpEncoder,...
Definition RTSPFragmentQueue.h:36
void dropOldestFrame()
Definition RTSPFragmentQueue.h:79
void appendFragment(const uint8_t *payload, size_t len, bool last)
Definition RTSPFragmentQueue.h:60
void clearQueue()
Definition RTSPFragmentQueue.h:49
Vector< uint8_t > m_queue
Definition RTSPFragmentQueue.h:45
int queueReadBytes(void *dest, int maxBytes)
Definition RTSPFragmentQueue.h:102
uint32_t readQueueU32(size_t pos)
Definition RTSPFragmentQueue.h:55
size_t m_queuedFrames
Definition RTSPFragmentQueue.h:47
int queuePacketSize()
Definition RTSPFragmentQueue.h:92
size_t m_queueHead
Definition RTSPFragmentQueue.h:46
size_t m_maxQueuedFrames
Definition RTSPFragmentQueue.h:43
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
void clear()
Definition Vector.h:176
bool resize(size_t newSize, T value)
Definition Vector.h:266
T * data()
Definition Vector.h:316
int size()
Definition Vector.h:178
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition LMSEchoCancellationStream.h:6