You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

537 lines
15KB

  1. #include "PacketQueue.hpp"
  2. namespace SRT {
  3. static inline bool isSeqEdge(uint32_t seq, uint32_t cap) {
  4. if (seq > (MAX_SEQ - cap)) {
  5. return true;
  6. }
  7. return false;
  8. }
  9. static inline bool isSeqCycle(uint32_t first, uint32_t second) {
  10. uint32_t diff;
  11. if (first > second) {
  12. diff = first - second;
  13. } else {
  14. diff = second - first;
  15. }
  16. if (diff > (MAX_SEQ >> 1)) {
  17. return true;
  18. } else {
  19. return false;
  20. }
  21. }
  22. static inline bool isTSCycle(uint32_t first, uint32_t second) {
  23. uint32_t diff;
  24. if (first > second) {
  25. diff = first - second;
  26. } else {
  27. diff = second - first;
  28. }
  29. if (diff > (MAX_TS >> 1)) {
  30. return true;
  31. } else {
  32. return false;
  33. }
  34. }
  35. PacketQueue::PacketQueue(uint32_t max_size, uint32_t init_seq, uint32_t latency)
  36. : _pkt_cap(max_size)
  37. , _pkt_latency(latency)
  38. , _pkt_expected_seq(init_seq) {}
  39. void PacketQueue::tryInsertPkt(DataPacket::Ptr pkt) {
  40. if (_pkt_expected_seq <= pkt->packet_seq_number) {
  41. auto diff = pkt->packet_seq_number - _pkt_expected_seq;
  42. if (diff >= (MAX_SEQ >> 1)) {
  43. TraceL << "drop packet too later for cycle "
  44. << "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number;
  45. return;
  46. } else {
  47. _pkt_map.emplace(pkt->packet_seq_number, pkt);
  48. }
  49. } else {
  50. auto diff = _pkt_expected_seq - pkt->packet_seq_number;
  51. if (diff >= (MAX_SEQ >> 1)) {
  52. _pkt_map.emplace(pkt->packet_seq_number, pkt);
  53. TraceL << " cycle packet "
  54. << "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number;
  55. } else {
  56. // TraceL << "drop packet too later "<< "expected seq=" << _pkt_expected_seq << " pkt seq=" <<
  57. // pkt->packet_seq_number;
  58. }
  59. }
  60. }
  61. bool PacketQueue::inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out) {
  62. tryInsertPkt(pkt);
  63. auto it = _pkt_map.find(_pkt_expected_seq);
  64. while (it != _pkt_map.end()) {
  65. out.push_back(it->second);
  66. _pkt_map.erase(it);
  67. _pkt_expected_seq = genExpectedSeq(_pkt_expected_seq + 1);
  68. it = _pkt_map.find(_pkt_expected_seq);
  69. }
  70. while (_pkt_map.size() > _pkt_cap) {
  71. // 防止回环
  72. it = _pkt_map.find(_pkt_expected_seq);
  73. if (it != _pkt_map.end()) {
  74. out.push_back(it->second);
  75. _pkt_map.erase(it);
  76. }
  77. _pkt_expected_seq = genExpectedSeq(_pkt_expected_seq + 1);
  78. }
  79. while (timeLatency() > _pkt_latency) {
  80. it = _pkt_map.find(_pkt_expected_seq);
  81. if (it != _pkt_map.end()) {
  82. out.push_back(it->second);
  83. _pkt_map.erase(it);
  84. }
  85. _pkt_expected_seq = genExpectedSeq(_pkt_expected_seq + 1);
  86. }
  87. return true;
  88. }
  89. bool PacketQueue::drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out) {
  90. uint32_t end = genExpectedSeq(last + 1);
  91. decltype(_pkt_map.end()) it;
  92. for (uint32_t i = _pkt_expected_seq; i < end;) {
  93. it = _pkt_map.find(i);
  94. if (it != _pkt_map.end()) {
  95. out.push_back(it->second);
  96. _pkt_map.erase(it);
  97. }
  98. i = genExpectedSeq(i + 1);
  99. }
  100. _pkt_expected_seq = end;
  101. return true;
  102. }
  103. uint32_t PacketQueue::timeLatency() {
  104. if (_pkt_map.empty()) {
  105. return 0;
  106. }
  107. auto first = _pkt_map.begin()->second->timestamp;
  108. auto last = _pkt_map.rbegin()->second->timestamp;
  109. uint32_t dur;
  110. if (last > first) {
  111. dur = last - first;
  112. } else {
  113. dur = first - last;
  114. }
  115. if (dur > 0x80000000) {
  116. dur = MAX_TS - dur;
  117. WarnL << "cycle dur " << dur;
  118. }
  119. return dur;
  120. }
  121. std::list<PacketQueue::LostPair> PacketQueue::getLostSeq() {
  122. std::list<PacketQueue::LostPair> re;
  123. if (_pkt_map.empty()) {
  124. return re;
  125. }
  126. if (getExpectedSize() == getSize()) {
  127. return re;
  128. }
  129. uint32_t end = 0;
  130. uint32_t first, last;
  131. first = _pkt_map.begin()->second->packet_seq_number;
  132. last = _pkt_map.rbegin()->second->packet_seq_number;
  133. if ((last - first) > (MAX_SEQ >> 1)) {
  134. TraceL << " cycle seq first " << first << " last " << last << " size " << _pkt_map.size();
  135. end = first;
  136. } else {
  137. end = last;
  138. }
  139. PacketQueue::LostPair lost;
  140. lost.first = 0;
  141. lost.second = 0;
  142. uint32_t i = _pkt_expected_seq;
  143. bool finish = true;
  144. for (i = _pkt_expected_seq; i <= end;) {
  145. if (_pkt_map.find(i) == _pkt_map.end()) {
  146. if (finish) {
  147. finish = false;
  148. lost.first = i;
  149. lost.second = genExpectedSeq(i + 1);
  150. } else {
  151. lost.second = genExpectedSeq(i + 1);
  152. }
  153. } else {
  154. if (!finish) {
  155. finish = true;
  156. re.push_back(lost);
  157. }
  158. }
  159. i = genExpectedSeq(i + 1);
  160. }
  161. return re;
  162. }
  163. size_t PacketQueue::getSize() {
  164. return _pkt_map.size();
  165. }
  166. size_t PacketQueue::getExpectedSize() {
  167. if (_pkt_map.empty()) {
  168. return 0;
  169. }
  170. uint32_t max = _pkt_map.rbegin()->first;
  171. uint32_t min = _pkt_map.begin()->first;
  172. if ((max - min) >= (MAX_SEQ >> 1)) {
  173. TraceL << "cycle "
  174. << "expected seq " << _pkt_expected_seq << " min " << min << " max " << max << " size "
  175. << _pkt_map.size();
  176. return MAX_SEQ - _pkt_expected_seq + min + 1;
  177. } else {
  178. return max - _pkt_expected_seq + 1;
  179. }
  180. }
  181. size_t PacketQueue::getAvailableBufferSize() {
  182. auto size = getExpectedSize();
  183. if (_pkt_cap > size) {
  184. return _pkt_cap - size;
  185. }
  186. if (_pkt_cap > _pkt_map.size()) {
  187. return _pkt_cap - _pkt_map.size();
  188. }
  189. WarnL << " cap " << _pkt_cap << " expected size " << size << " map size " << _pkt_map.size();
  190. return _pkt_cap;
  191. }
  192. uint32_t PacketQueue::getExpectedSeq() {
  193. return _pkt_expected_seq;
  194. }
  195. std::string PacketQueue::dump() {
  196. _StrPrinter printer;
  197. if (_pkt_map.empty()) {
  198. printer << " expected seq :" << _pkt_expected_seq;
  199. } else {
  200. printer << " expected seq :" << _pkt_expected_seq << " size:" << _pkt_map.size()
  201. << " first:" << _pkt_map.begin()->second->packet_seq_number;
  202. printer << " last:" << _pkt_map.rbegin()->second->packet_seq_number;
  203. printer << " latency:" << timeLatency() / 1e3;
  204. }
  205. return std::move(printer);
  206. }
  207. //////////////////// PacketRecvQueue //////////////////////////////////
  208. PacketRecvQueue::PacketRecvQueue(uint32_t max_size, uint32_t init_seq, uint32_t latency, uint32_t flag)
  209. : _pkt_cap(max_size)
  210. , _pkt_latency(latency)
  211. , _pkt_expected_seq(init_seq)
  212. , _srt_flag(flag)
  213. , _pkt_buf(max_size) {}
  214. bool PacketRecvQueue::TLPKTDrop(){
  215. return (_srt_flag&HSExtMessage::HS_EXT_MSG_TLPKTDROP) && (_srt_flag &HSExtMessage::HS_EXT_MSG_TSBPDRCV);
  216. }
  217. bool PacketRecvQueue::inputPacket(DataPacket::Ptr pkt, std::list<DataPacket::Ptr> &out) {
  218. // TraceL << dump() << " seq:" << pkt->packet_seq_number;
  219. while (_size > 0 && _start == _end) {
  220. if (_pkt_buf[_start]) {
  221. out.push_back(_pkt_buf[_start]);
  222. _size--;
  223. _pkt_buf[_start] = nullptr;
  224. }
  225. _start = (_start + 1) % _pkt_cap;
  226. _pkt_expected_seq = genExpectedSeq(_pkt_expected_seq + 1);
  227. }
  228. tryInsertPkt(pkt);
  229. DataPacket::Ptr it = _pkt_buf[_start];
  230. while (it) {
  231. out.push_back(it);
  232. _size--;
  233. _pkt_buf[_start] = nullptr;
  234. _pkt_expected_seq = genExpectedSeq(_pkt_expected_seq + 1);
  235. _start = (_start + 1) % _pkt_cap;
  236. it = _pkt_buf[_start];
  237. }
  238. while (timeLatency() > _pkt_latency && TLPKTDrop()) {
  239. it = _pkt_buf[_start];
  240. if (it) {
  241. _pkt_buf[_start] = nullptr;
  242. out.push_back(it);
  243. _size--;
  244. }
  245. _pkt_expected_seq = genExpectedSeq(_pkt_expected_seq + 1);
  246. _start = (_start + 1) % _pkt_cap;
  247. }
  248. return true;
  249. }
  250. uint32_t PacketRecvQueue::timeLatency() {
  251. if (_size <= 0) {
  252. return 0;
  253. }
  254. auto first = getFirst()->timestamp;
  255. auto last = getLast()->timestamp;
  256. uint32_t dur;
  257. if (last > first) {
  258. dur = last - first;
  259. } else {
  260. dur = first - last;
  261. }
  262. if (dur > 0x80000000) {
  263. dur = MAX_TS - dur;
  264. WarnL << "cycle dur " << dur;
  265. }
  266. return dur;
  267. }
  268. std::list<PacketQueueInterface::LostPair> PacketRecvQueue::getLostSeq() {
  269. std::list<PacketQueueInterface::LostPair> re;
  270. if (_size <= 0) {
  271. return re;
  272. }
  273. if (getExpectedSize() == getSize()) {
  274. return re;
  275. }
  276. LostPair lost;
  277. uint32_t steup = 0;
  278. bool finish = true;
  279. for (uint32_t i = _start; i != _end;) {
  280. if (!_pkt_buf[i]) {
  281. if (finish) {
  282. finish = false;
  283. lost.first = _pkt_expected_seq + steup;
  284. lost.second = genExpectedSeq(lost.first + 1);
  285. } else {
  286. lost.second = genExpectedSeq(_pkt_expected_seq + steup + 1);
  287. }
  288. } else {
  289. if (!finish) {
  290. finish = true;
  291. re.push_back(lost);
  292. }
  293. }
  294. i = (i + 1) % _pkt_cap;
  295. steup++;
  296. }
  297. return re;
  298. }
  299. size_t PacketRecvQueue::getSize() {
  300. return _size;
  301. }
  302. size_t PacketRecvQueue::getExpectedSize() {
  303. if (_size <= 0) {
  304. return 0;
  305. }
  306. uint32_t max, min;
  307. auto first = _pkt_expected_seq;
  308. auto last = getLast()->packet_seq_number;
  309. if (last >= first) {
  310. max = last;
  311. min = first;
  312. } else {
  313. max = first;
  314. min = last;
  315. }
  316. if ((max - min) >= (MAX_SEQ >> 1)) {
  317. TraceL << "cycle "
  318. << "expected seq " << _pkt_expected_seq << " min " << min << " max " << max << " size " << _size;
  319. return MAX_SEQ - _pkt_expected_seq + min + 1;
  320. } else {
  321. return max - _pkt_expected_seq + 1;
  322. }
  323. }
  324. size_t PacketRecvQueue::getAvailableBufferSize() {
  325. auto size = getExpectedSize();
  326. if (_pkt_cap > size) {
  327. return _pkt_cap - size;
  328. }
  329. if (_pkt_cap > _size) {
  330. return _pkt_cap - _size;
  331. }
  332. WarnL << " cap " << _pkt_cap << " expected size " << size << " map size " << _size;
  333. return _pkt_cap;
  334. }
  335. uint32_t PacketRecvQueue::getExpectedSeq() {
  336. return _pkt_expected_seq;
  337. }
  338. std::string PacketRecvQueue::dump() {
  339. _StrPrinter printer;
  340. if (_size <= 0) {
  341. printer << " expected seq :" << _pkt_expected_seq;
  342. } else {
  343. printer << " expected seq :" << _pkt_expected_seq << " size:" << _size
  344. << " first:" << getFirst()->packet_seq_number;
  345. printer << " last:" << getLast()->packet_seq_number;
  346. printer << " latency:" << timeLatency() / 1e3;
  347. printer << " start:" << _start;
  348. printer << " end:" << _end;
  349. }
  350. return std::move(printer);
  351. }
  352. bool PacketRecvQueue::drop(uint32_t first, uint32_t last, std::list<DataPacket::Ptr> &out) {
  353. uint32_t diff = 0;
  354. if (isSeqCycle(_pkt_expected_seq, last)) {
  355. if (last < _pkt_expected_seq) {
  356. diff = MAX_SEQ - _pkt_expected_seq + last + 1;
  357. } else {
  358. WarnL << "drop first " << first << " last " << last << " expected " << _pkt_expected_seq;
  359. return false;
  360. }
  361. } else {
  362. if (last < _pkt_expected_seq) {
  363. WarnL << "drop first " << first << " last " << last << " expected " << _pkt_expected_seq;
  364. return false;
  365. }
  366. diff = last - _pkt_expected_seq + 1;
  367. }
  368. if (diff > getExpectedSize()) {
  369. WarnL << " diff " << diff << " expected size " << getExpectedSize();
  370. return false;
  371. }
  372. for (uint32_t i = 0; i < diff; i++) {
  373. auto pos = (i + _start) % _pkt_cap;
  374. if (_pkt_buf[pos]) {
  375. out.push_back(_pkt_buf[pos]);
  376. _pkt_buf[pos] = nullptr;
  377. _size--;
  378. }
  379. }
  380. _pkt_expected_seq = genExpectedSeq(last + 1);
  381. _start = (diff + _start) % _pkt_cap;
  382. if (_size <= 0) {
  383. _end = _start;
  384. WarnL;
  385. }
  386. return true;
  387. }
  388. void PacketRecvQueue::insertToCycleBuf(DataPacket::Ptr pkt, uint32_t diff) {
  389. auto pos = (_start + diff) % _pkt_cap;
  390. if (!_pkt_buf[pos]) {
  391. _size++;
  392. } else {
  393. // WarnL << "repate packet " << pkt->packet_seq_number;
  394. return;
  395. }
  396. _pkt_buf[pos] = pkt;
  397. if (_start <= _end && pos >= _end) {
  398. _end = (pos + 1) % _pkt_cap;
  399. return;
  400. }
  401. if (_start <= _end && pos < _start) {
  402. _end = (pos + 1) % _pkt_cap;
  403. return;
  404. }
  405. if (_start > _end && _end <= pos && _start > pos) {
  406. _end = (pos + 1) % _pkt_cap;
  407. return;
  408. }
  409. }
  410. void PacketRecvQueue::tryInsertPkt(DataPacket::Ptr pkt) {
  411. if (_pkt_expected_seq <= pkt->packet_seq_number) {
  412. auto diff = pkt->packet_seq_number - _pkt_expected_seq;
  413. if (diff >= (MAX_SEQ >> 1)) {
  414. TraceL << "drop packet too later for cycle "
  415. << "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number;
  416. return;
  417. } else {
  418. if (diff >= _pkt_cap) {
  419. WarnL << "too new "
  420. << "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number << " cap "
  421. << _pkt_cap;
  422. return;
  423. }
  424. insertToCycleBuf(pkt, diff);
  425. }
  426. } else {
  427. auto diff = _pkt_expected_seq - pkt->packet_seq_number;
  428. if (diff >= (MAX_SEQ >> 1)) {
  429. diff = MAX_SEQ - diff;
  430. if (diff >= _pkt_cap) {
  431. WarnL << "too new "
  432. << "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number << " cap "
  433. << _pkt_cap;
  434. return;
  435. }
  436. insertToCycleBuf(pkt, diff);
  437. TraceL << " cycle packet "
  438. << "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number;
  439. } else {
  440. // TraceL << "drop packet too later "
  441. //<< "expected seq=" << _pkt_expected_seq << " pkt seq=" << pkt->packet_seq_number;
  442. }
  443. }
  444. }
  445. DataPacket::Ptr PacketRecvQueue::getFirst() {
  446. if (_size <= 0) {
  447. return nullptr;
  448. }
  449. uint32_t i = _start;
  450. while (1) {
  451. if (_pkt_buf[i]) {
  452. return _pkt_buf[i];
  453. }
  454. i = (i + 1) % _pkt_cap;
  455. }
  456. }
  457. DataPacket::Ptr PacketRecvQueue::getLast() {
  458. if (_size <= 0) {
  459. return nullptr;
  460. }
  461. uint32_t steup = 1;
  462. uint32_t i = (_end + _pkt_cap - steup) % _pkt_cap;
  463. /*
  464. while (1) {
  465. if (_pkt_buf[i]) {
  466. _end = (i + 1) % _pkt_cap;
  467. return _pkt_buf[i];
  468. }
  469. i = (_end + _pkt_cap - steup) % _pkt_cap;
  470. steup++;
  471. }
  472. */
  473. if (!_pkt_buf[i]) {
  474. WarnL << "start " << _start << " end" << _end << " size " << _size;
  475. }
  476. return _pkt_buf[i];
  477. }
  478. } // namespace SRT