@@ -206,6 +206,7 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
206
206
const int end_pos = incPos(m_iStartPos, m_iMaxPosInc);
207
207
if (msgno != 0)
208
208
{
209
+
int minDroppedOffset = -1;
209
210
for (int i = m_iStartPos; i != end_pos; i = incPos(i))
210
211
{
211
212
// TODO: Maybe check status?
@@ -215,11 +216,26 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
215
216
const int32_t msgseq = m_entries[i].pUnit->m_Packet.getMsgSeq(m_bPeerRexmitFlag);
216
217
if (msgseq == msgno)
217
218
{
218
-
releaseUnitInPos(i);
219
+
dropUnitInPos(i);
219
220
m_entries[i].status = EntryState_Drop;
221
+
if (minDroppedOffset == -1)
222
+
minDroppedOffset = offPos(m_iStartPos, i);
220
223
}
221
224
}
222
-
225
+
// Check if units before m_iFirstNonreadPos are dropped.
226
+
bool needUpdateNonreadPos = (minDroppedOffset != -1 && minDroppedOffset <= getRcvDataSize());
227
+
releaseNextFillerEntries();
228
+
if (needUpdateNonreadPos)
229
+
{
230
+
m_iFirstNonreadPos = m_iStartPos;
231
+
updateNonreadPos();
232
+
}
233
+
if (!m_tsbpd.isEnabled() && m_bMessageAPI)
234
+
{
235
+
if (!checkFirstReadableOutOfOrder())
236
+
m_iFirstReadableOutOfOrder = -1;
237
+
updateFirstReadableOutOfOrder();
238
+
}
223
239
return;
224
240
}
225
241
@@ -235,17 +251,32 @@ void CRcvBufferNew::dropMessage(int32_t seqnolo, int32_t seqnohi, int32_t msgno)
235
251
236
252
const int start_off = max(0, offset_a);
237
253
const int last_pos = incPos(m_iStartPos, offset_b);
254
+
int minDroppedOffset = -1;
238
255
for (int i = incPos(m_iStartPos, start_off); i != end_pos && i != last_pos; i = incPos(i))
239
256
{
240
-
if (m_entries[i].pUnit)
241
-
{
242
-
releaseUnitInPos(i);
243
-
}
257
+
dropUnitInPos(i);
244
258
m_entries[i].status = EntryState_Drop;
259
+
if (minDroppedOffset == -1)
260
+
minDroppedOffset = offPos(m_iStartPos, i);
245
261
}
246
262
247
263
LOGC(rbuflog.Debug, log << "CRcvBufferNew.dropMessage(): [" << seqnolo << "; "
248
264
<< seqnohi << "].");
265
+
266
+
// Check if units before m_iFirstNonreadPos are dropped.
267
+
bool needUpdateNonreadPos = (minDroppedOffset != -1 && minDroppedOffset <= getRcvDataSize());
268
+
releaseNextFillerEntries();
269
+
if (needUpdateNonreadPos)
270
+
{
271
+
m_iFirstNonreadPos = m_iStartPos;
272
+
updateNonreadPos();
273
+
}
274
+
if (!m_tsbpd.isEnabled() && m_bMessageAPI)
275
+
{
276
+
if (!checkFirstReadableOutOfOrder())
277
+
m_iFirstReadableOutOfOrder = -1;
278
+
updateFirstReadableOutOfOrder();
279
+
}
249
280
}
250
281
251
282
int CRcvBufferNew::readMessage(char* data, size_t len, SRT_MSGCTRL* msgctrl)
@@ -720,6 +751,34 @@ void CRcvBufferNew::onInsertNotInOrderPacket(int insertPos)
720
751
return;
721
752
}
722
753
754
+
bool CRcvBufferNew::checkFirstReadableOutOfOrder()
755
+
{
756
+
if (m_numOutOfOrderPackets <= 0 || m_iFirstReadableOutOfOrder < 0 || m_iMaxPosInc == 0)
757
+
return false;
758
+
759
+
const int endPos = incPos(m_iStartPos, m_iMaxPosInc);
760
+
int msgno = -1;
761
+
for (int pos = m_iFirstReadableOutOfOrder; pos != endPos; pos = incPos(pos))
762
+
{
763
+
if (!m_entries[pos].pUnit)
764
+
return false;
765
+
766
+
const CPacket& pkt = m_entries[pos].pUnit->m_Packet;
767
+
if (pkt.getMsgOrderFlag())
768
+
return false;
769
+
770
+
if (msgno == -1)
771
+
msgno = pkt.getMsgSeq(m_bPeerRexmitFlag);
772
+
else if (msgno != pkt.getMsgSeq(m_bPeerRexmitFlag))
773
+
return false;
774
+
775
+
if (pkt.getMsgBoundary() & PB_LAST)
776
+
return true;
777
+
}
778
+
779
+
return false;
780
+
}
781
+
723
782
void CRcvBufferNew::updateFirstReadableOutOfOrder()
724
783
{
725
784
if (hasReadableInorderPkts() || m_numOutOfOrderPackets <= 0 || m_iFirstReadableOutOfOrder >= 0)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4