rtp.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990
  1. #include "precompile.h"
  2. #include "rtp.h"
  3. #include <time.h>
  4. #include "modCheck.h"
  5. #include "memutil.h"
  6. #include <winpr/string.h>
  7. #include <winpr/winsock.h>
  8. #include "dbgutil.h"
  9. #ifndef _WIN32
  10. #include <winpr/sysinfo.h>
  11. #include <arpa/inet.h>
  12. #endif //NOT _WIN32
  13. #ifndef H264_VIDEO_PT
  14. #define H264_VIDEO_PT 97 // H264
  15. #endif
  16. #define TAG TOOLKIT_TAG("rtp")
  17. #define DEFAULT_RTP_STATE_TRANSMIT_INTERVAL 1500 /* 1.5 seconds */
  18. struct rtp_state {
  19. /* for rtp sending */
  20. unsigned int ts; /* host byte order */
  21. unsigned int ssrc; /* network byte order */
  22. unsigned int p; /* padding bit */
  23. unsigned short seq; /* host byte order */
  24. unsigned int x; /* extension bit */
  25. /* for sdes */
  26. char *sdes_str[RTCP_SDES_COUNT];
  27. /* for statistics */
  28. rtcp_statistics s;
  29. /* for rtcp sending */
  30. DWORD transmit_interval;
  31. DWORD last_transmit_tick;
  32. /*for rtcp tmmbr */
  33. RtcpTmmbrInfo tmmbr_info;
  34. };
  35. #ifndef JAN_1970
  36. #define JAN_1970 0x83aa7e80 /* 2208988800 1970 - 1900 in seconds */
  37. #endif
  38. #define SECS_TO_FT_MULT 10000000
  39. #define rtcp_fb_tmmbr_fci_get_ssrc(tmmbr) ntohl((tmmbr)->ssrc)
  40. #define rtcp_fb_tmmbr_fci_get_mxtbr_exp(tmmbr) \
  41. ((unsigned char)((ntohl((tmmbr)->value) >> 26) & 0x0000003F))
  42. #define rtcp_fb_tmmbr_fci_set_mxtbr_exp(tmmbr, mxtbr_exp) \
  43. ((tmmbr)->value) = htonl((ntohl((tmmbr)->value) & 0x03FFFFFF) | (((mxtbr_exp) & 0x0000003F) << 26))
  44. #define rtcp_fb_tmmbr_fci_get_mxtbr_mantissa(tmmbr) \
  45. ((unsigned int)((ntohl((tmmbr)->value) >> 9) & 0x0001FFFF))
  46. #define rtcp_fb_tmmbr_fci_set_mxtbr_mantissa(tmmbr, mxtbr_mantissa) \
  47. ((tmmbr)->value) = htonl((ntohl((tmmbr)->value) & 0xFC0001FF) | (((mxtbr_mantissa) & 0x0001FFFF) << 9))
  48. #define rtcp_fb_tmmbr_fci_get_measured_overhead(tmmbr) \
  49. ((unsigned short)(ntohl((tmmbr)->value) & 0x000001FF))
  50. #define rtcp_fb_tmmbr_fci_set_measured_overhead(tmmbr, measured_overhead) \
  51. ((tmmbr)->value) = htonl((ntohl((tmmbr)->value) & 0xFFFFFE00) | ((measured_overhead) & 0x000001FF))
  52. #define MIN_RTCP_PSFB_PACKET_SIZE (sizeof(rtcp_common_t) + sizeof(rtcp_fb_header_t))
  53. #define MIN_RTCP_RTPFB_PACKET_SIZE (sizeof(rtcp_common_t) + sizeof(rtcp_fb_header_t))
  54. TOOLKIT_API int rtp_state_fill_rtcp_sender_info(rtp_state *rs, rtcp_sender_info_t *info);
  55. TOOLKIT_API int rtp_state_fill_rtcp_reception_report(rtp_state *rs, rtcp_rr_t *report);
  56. TOOLKIT_API int rtp_state_fill_rtcp_sdes_item(rtp_state *rs, rtcp_sdes_type_t type, rtcp_sdes_item_t *item, int *fill_n);
  57. TOOLKIT_API int rtp_state_fill_rtcp_sdes_item_raw(rtp_state *rs, rtcp_sdes_type_t type,
  58. const char *str, rtcp_sdes_item_t *item, int *fill_n);
  59. TOOLKIT_API int rtp_state_fill_rtcp_bye(rtp_state *rs, rtcp_bye_t* bye);
  60. TOOLKIT_API int rtp_state_rtcp_make_bye(rtp_state *rs, char *buf, size_t buflen);
  61. TOOLKIT_API int rtp_state_rtcp_make_h261_nack(rtp_state *rs, char *buf, size_t buflen);
  62. TOOLKIT_API int rtp_state_set_sdes_str(rtp_state *rs, rtcp_sdes_type_t type, const char *str);
  63. TOOLKIT_API void rtp_state_update_send_rtcp_ticks(rtp_state *state);
  64. #ifdef _WIN32
  65. // Find 1st Jan 1970 as a FILETIME
  66. static void get_base_time(void)
  67. {
  68. SYSTEMTIME st;
  69. FILETIME ft;
  70. memset(&st, 0, sizeof(st));
  71. st.wYear = 1970;
  72. st.wMonth = 1;
  73. st.wDay = 1;
  74. printf("%s::%d\n", __FUNCTION__, __LINE__);
  75. SystemTimeToFileTime(&st, &ft);
  76. /*for linux compatibility*/
  77. toolkit_getResource()->base_time.u.LowPart = ft.dwLowDateTime;
  78. toolkit_getResource()->base_time.u.HighPart = ft.dwHighDateTime;
  79. toolkit_getResource()->base_time.QuadPart /= SECS_TO_FT_MULT;
  80. }
  81. static void gettimeofday(struct timeval* tv, struct timezone* tzp)
  82. {
  83. SYSTEMTIME st;
  84. FILETIME ft;
  85. LARGE_INTEGER li;
  86. GetSystemTime(&st);
  87. SystemTimeToFileTime(&st, &ft);
  88. if (toolkit_getResource()->base_time.QuadPart == 0)
  89. get_base_time();
  90. li.u.LowPart = ft.dwLowDateTime;
  91. li.u.HighPart = ft.dwHighDateTime;
  92. li.QuadPart /= SECS_TO_FT_MULT;
  93. li.QuadPart -= toolkit_getResource()->base_time.QuadPart;
  94. tv->tv_sec = li.u.LowPart;
  95. tv->tv_usec = st.wMilliseconds * 1000;
  96. }
  97. #endif //_MSC_VER
  98. static char *copymsg(const char *msg, int len)
  99. {
  100. char *newm;
  101. newm = (char*)malloc(len);
  102. if (newm == NULL) return newm;
  103. memcpy(newm,msg,len);
  104. return newm;
  105. }
  106. static void freemsg(char *msg)
  107. {
  108. if (msg != NULL) {
  109. free(msg);
  110. }
  111. }
  112. static size_t rtcp_get_size(const char *msg)
  113. {
  114. rtcp_common_t *ch = (rtcp_common_t *)msg;
  115. if (ch==NULL) return 0;
  116. return (1+ntohs(ch->length))*4;
  117. }
  118. static int rtcp_is_rtpfb(const char *msg)
  119. {
  120. rtcp_common_t *ch = (rtcp_common_t *)msg;
  121. if ((ch != NULL) && (ch->pt == RTCP_RTPFB)) {
  122. return TRUE;
  123. }
  124. return FALSE;
  125. }
  126. static rtcp_rtpfb_type_t rtcp_rtpfb_get_type(const char *msg)
  127. {
  128. rtcp_common_t *ch = (rtcp_common_t *)msg;
  129. return (rtcp_rtpfb_type_t)ch->count;
  130. }
  131. static unsigned int rtcp_rtpfb_get_packet_sender_ssrc(const char *msg)
  132. {
  133. rtcp_fb_header_t *fbh = (rtcp_fb_header_t *)(msg + sizeof(rtcp_common_t));
  134. return ntohl(fbh->packet_sender_ssrc);
  135. }
  136. static unsigned int rtcp_rtpfb_get_media_source_ssrc(const char *msg)
  137. {
  138. rtcp_fb_header_t *fbh = (rtcp_fb_header_t *)(msg + sizeof(rtcp_common_t));
  139. return ntohl(fbh->media_source_ssrc);
  140. }
  141. static rtcp_fb_tmmbr_fci_t * rtcp_rtpfb_tmmbr_get_fci(const char *msg)
  142. {
  143. size_t size = sizeof(rtcp_common_t) + sizeof(rtcp_fb_header_t) + sizeof(rtcp_fb_tmmbr_fci_t);
  144. size_t rtcp_size = rtcp_get_size(msg);
  145. if (size > rtcp_size) {
  146. return NULL;
  147. }
  148. return (rtcp_fb_tmmbr_fci_t *)(msg + size - sizeof(rtcp_fb_tmmbr_fci_t));
  149. }
  150. static u__int64_t rtcp_rtpfb_tmmbr_get_max_bitrate(const char *msg)
  151. {
  152. rtcp_fb_tmmbr_fci_t *fci = rtcp_rtpfb_tmmbr_get_fci(msg);
  153. return rtcp_fb_tmmbr_fci_get_mxtbr_mantissa(fci) * (1 << rtcp_fb_tmmbr_fci_get_mxtbr_exp(fci));
  154. }
  155. const rtcp_rr_t * rtcp_SR_get_report_block(const char *msg)
  156. {
  157. rtcp_sr_t *sr=(rtcp_sr_t*)msg;
  158. rtcp_rr_t *rb=&sr->rb[0];
  159. size_t size=rtcp_get_size(msg);
  160. if ( ( (char *)rb)+sizeof(rtcp_rr_t) <= msg + size ) {
  161. return rb;
  162. }
  163. return NULL;
  164. }
  165. const rtcp_rr_t * rtcp_RR_get_report_block(const char *msg)
  166. {
  167. int n = 0;
  168. size_t size;
  169. unsigned int *sender_ssrc;
  170. rtcp_rr_t *rb;
  171. //rtcp_common
  172. const rtcp_common_t *common = (rtcp_common_t *)msg;
  173. n += sizeof(rtcp_common_t);
  174. //sender_ssrc
  175. sender_ssrc = (unsigned int *)(msg + n);
  176. rb = (rtcp_rr_t *)(msg + n + sizeof(*sender_ssrc));
  177. size=rtcp_get_size(msg);
  178. if ( ( (char *)rb)+sizeof(rtcp_rr_t) <= (msg + size ) ){
  179. return rb;
  180. }
  181. return NULL;
  182. }
  183. TOOLKIT_API int rtp_state_fill_rtp(rtp_state *rs, void *hdr, unsigned int pt, unsigned int mark, unsigned int delta_ts)
  184. {
  185. rtp_hdr *header;
  186. TOOLKIT_ASSERT(rs && hdr);
  187. header = (rtp_hdr*)hdr;
  188. header->csrc = 0;
  189. header->x = rs->x;
  190. header->p = rs->p;
  191. header->v = 2;
  192. header->pt = pt&0x7f;
  193. header->m = !!mark;
  194. header->seq = htons(rs->seq);
  195. rs->seq++;
  196. rs->ts += delta_ts;
  197. if (H264_VIDEO_PT == pt) {
  198. header->ts = htonl(delta_ts);
  199. }
  200. else {
  201. header->ts = htonl(rs->ts);
  202. }
  203. header->ssrc = rs->ssrc;
  204. return 0;
  205. }
  206. TOOLKIT_API int rtp_state_advance_timestamp(rtp_state *rs, unsigned int delta_ts)
  207. {
  208. TOOLKIT_ASSERT(rs);
  209. rs->ts += delta_ts;
  210. return 0;
  211. }
  212. TOOLKIT_API int rtp_state_set_rtcp_sdes_string(rtp_state *rs,
  213. rtcp_sdes_type_t type,
  214. const char *str)
  215. {
  216. if (!rs)
  217. return -1;
  218. if (type <= 0 || type > RTCP_SDES_PRIV)
  219. return -1;
  220. if (rs->sdes_str[type]) {
  221. free(rs->sdes_str[type]);
  222. }
  223. rs->sdes_str[type] = _strdup(str);
  224. return rs->sdes_str[type] ? 0 : -1;
  225. }
  226. static u__int64_t rtp_timeval_to_ntp(const struct timeval *tv)
  227. {
  228. u__int64_t msw;
  229. u__int64_t lsw;
  230. msw=tv->tv_sec + 0x83AA7E80; /* 0x83AA7E80 is the number of seconds from 1900 to 1970 */
  231. lsw=(unsigned int)((double)tv->tv_usec*(double)(((u__int64_t)1)<<32)*1.0e-6);
  232. return msw<<32 | lsw;
  233. }
  234. TOOLKIT_API int rtp_state_fill_rtcp_sender_info(rtp_state *rs, rtcp_sender_info_t *info)
  235. {
  236. struct timeval tv;
  237. u__int64_t ntp;
  238. if (!rs)
  239. return -1;
  240. info->ssrc = rs->ssrc; /* sender's own ssrc */
  241. gettimeofday(&tv, NULL);
  242. ntp=rtp_timeval_to_ntp(&tv);
  243. info->ntp_sec = htonl(ntp >>32);//(unsigned int)htonl(tv.tv_sec + JAN_1970);
  244. info->ntp_frac = htonl(ntp & 0xFFFFFFFF);//(unsigned int)htonl((unsigned long)(tv.tv_usec*4294.967296));
  245. info->rtp_ts = (unsigned int)htonl(rs->ts);
  246. info->psent = (unsigned int)htonl((unsigned long)rs->s.total_tx_packets);
  247. info->osent = (unsigned int)htonl((unsigned long)rs->s.total_tx_bytes);
  248. return 0;
  249. }
  250. TOOLKIT_API int rtp_state_fill_rtcp_reception_report(rtp_state *rs, rtcp_rr_t *report)
  251. {
  252. int packet_loss_since_last_sr;
  253. unsigned char loss_fraction;
  254. unsigned int ext_seq;
  255. unsigned int expected;
  256. unsigned int delay_since_lsr = 0;
  257. if (!rs || !report)
  258. return -1;
  259. if (rs->s.last_seq == rs->s.first_seq && rs->s.seq_circles == 0) /* have not recv any peer's data */
  260. return -1;
  261. ext_seq = ((unsigned int)rs->s.seq_circles << 16 | (unsigned int)rs->s.last_seq);
  262. expected = ext_seq - rs->s.rx_seq_at_last_sr;
  263. packet_loss_since_last_sr = expected - rs->s.rx_packets_since_last_sr;
  264. if (packet_loss_since_last_sr < 0)
  265. packet_loss_since_last_sr = 0;
  266. rs->s.rx_seq_at_last_sr = ext_seq; /* update */
  267. rs->s.rx_packets_since_last_sr = 0;//RESET
  268. rs->s.total_packet_lost += (unsigned int)packet_loss_since_last_sr;
  269. if (expected == 0)
  270. expected = 1;
  271. if (rs->s.lsr_tm.tv_sec != 0) {
  272. struct timeval now;
  273. double delay;
  274. gettimeofday(&now, NULL);
  275. delay= (now.tv_sec-rs->s.lsr_tm.tv_sec)+ ((now.tv_usec-rs->s.lsr_tm.tv_usec)*1e-6);
  276. delay= (delay*65536);
  277. delay_since_lsr=(unsigned int) delay;
  278. }
  279. loss_fraction = (unsigned char)(256 * packet_loss_since_last_sr / expected);
  280. report->ssrc = rs->s.peer_ssrc;
  281. report->fl_cnpl = htonl((loss_fraction << 24) | (rs->s.total_packet_lost&0xffffff));
  282. report->last_seq = htonl(ext_seq);
  283. report->jitter = htonl(rs->s.inter_jitter);
  284. report->lsr = htonl(rs->s.lsr);
  285. report->dlsr = htonl(delay_since_lsr);
  286. return 0;
  287. }
  288. TOOLKIT_API int rtp_state_fill_rtcp_sdes_item_raw(rtp_state *rs
  289. , rtcp_sdes_type_t type
  290. , const char *str, rtcp_sdes_item_t *item, int *fill_n)
  291. {
  292. if (!rs || !item || !fill_n)
  293. return -1;
  294. *fill_n = 0;
  295. if (type == RTCP_SDES_END) {
  296. char *t = (char*)item;
  297. do {
  298. *t++ = 0;
  299. *fill_n += 1;
  300. } while (((unsigned int)t&3) != 0); /* force 32-bit alignment */
  301. } else {
  302. int n = str ? (int)strlen(str) : 0;
  303. if (n) {
  304. n = min(n, 255);
  305. memcpy(&item->data[0], str, n);
  306. }
  307. item->type = type;
  308. item->length = (unsigned char)n;
  309. *fill_n = 2 + n;
  310. }
  311. return 0;
  312. }
  313. TOOLKIT_API int rtp_state_fill_rtcp_sdes_item(rtp_state *rs, rtcp_sdes_type_t type, rtcp_sdes_item_t *item, int *fill_n)
  314. {
  315. if (!rs || !item || !fill_n)
  316. return -1;
  317. *fill_n = 0;
  318. if (type == RTCP_SDES_END) {
  319. char *t = (char*)item;
  320. do {
  321. *t++ = 0;
  322. *fill_n += 1;
  323. } while (((unsigned int)t&3) != 0); /* force 32-bit alignment */
  324. } else if (rs->sdes_str[type] == NULL) {
  325. return -1; /* null */
  326. } else {
  327. int n = (int)strlen(rs->sdes_str[type]);
  328. if (n) {
  329. memcpy(&item->data[0], rs->sdes_str[type], n);
  330. }
  331. item->type = type;
  332. item->length = (unsigned char)n;
  333. *fill_n = 2 + n;
  334. }
  335. return 0;
  336. }
  337. TOOLKIT_API int rtp_state_fill_rtcp_bye(rtp_state *rs, rtcp_bye_t* bye)
  338. {
  339. if (!rs || !bye)
  340. return -1;
  341. bye->ssrc[0] = rs->ssrc;
  342. bye->common.pt = RTCP_BYE;
  343. bye->common.count = 1;
  344. bye->common.p = 0;
  345. bye->common.version = 2;
  346. bye->common.length = htons(1);
  347. return 0;
  348. }
  349. TOOLKIT_API int rtp_state_rtcp_make_sr(rtp_state *rs, char *buf, size_t buflen)
  350. {
  351. rtcp_common_t *common;
  352. rtcp_sdes_t *sdes;
  353. int n, t, m;
  354. int reception_report_result;
  355. if (!buf)
  356. return -1;
  357. /* sr block */
  358. n = 0;
  359. common = (rtcp_common_t*)&buf[n];
  360. n += sizeof(rtcp_common_t);
  361. rtp_state_fill_rtcp_sender_info(rs, (rtcp_sender_info_t *)&buf[n]);
  362. n += sizeof(rtcp_sender_info_t);
  363. reception_report_result = rtp_state_fill_rtcp_reception_report(rs, (rtcp_rr_t *)&buf[n]);
  364. if (reception_report_result < 0) {
  365. //have not recv any peer's data, not fill_reception_report.
  366. } else {
  367. n += sizeof(rtcp_rr_t);
  368. }
  369. common->p = 0;
  370. common->version = 2;
  371. common->pt = RTCP_SR;
  372. common->count = 1;
  373. common->length = htons(n / 4 - 1);
  374. /* sdes block */
  375. m = n;
  376. common = (rtcp_common_t*)&buf[m];
  377. m += sizeof(rtcp_common_t);
  378. sdes = (rtcp_sdes_t *)&buf[m];
  379. sdes->ssrc = rs->ssrc;
  380. m += sizeof(sdes->ssrc);
  381. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_CNAME, (rtcp_sdes_item_t*)&buf[m], &t);
  382. m += t;
  383. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_END, (rtcp_sdes_item_t*)&buf[m], &t);
  384. m += t;
  385. common->p = 0;
  386. common->version = 2;
  387. common->pt = RTCP_SDES;
  388. common->count = 1;
  389. common->length = htons((m - n) / 4 - 1);
  390. return m;
  391. }
  392. TOOLKIT_API int rtp_state_rtcp_make_rr(rtp_state *rs, char *buf, size_t buflen)
  393. {
  394. rtcp_common_t *common;
  395. rtcp_sdes_t *sdes;
  396. int n, t, m;
  397. unsigned int *sender_ssrc;
  398. int reception_report_result;
  399. if (!buf)
  400. return -1;
  401. /* sr block */
  402. n = 0;
  403. common = (rtcp_common_t*)&buf[n];
  404. n += sizeof(rtcp_common_t);
  405. sender_ssrc = (unsigned int *)&buf[n];
  406. *sender_ssrc = rs->ssrc; /* sender's own ssrc */
  407. n += sizeof(*sender_ssrc);
  408. reception_report_result = rtp_state_fill_rtcp_reception_report(rs, (rtcp_rr_t *)&buf[n]);
  409. if (reception_report_result < 0){
  410. return reception_report_result;
  411. }
  412. n += sizeof(rtcp_rr_t);
  413. common->p = 0;
  414. common->version = 2;
  415. common->pt = RTCP_RR;
  416. common->count = 1;
  417. common->length = htons(n / 4 - 1);
  418. /* sdes block */
  419. m = n;
  420. common = (rtcp_common_t*)&buf[m];
  421. m += sizeof(rtcp_common_t);
  422. sdes = (rtcp_sdes_t *)&buf[m];
  423. sdes->ssrc = rs->ssrc;
  424. m += sizeof(sdes->ssrc);
  425. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_CNAME, (rtcp_sdes_item_t*)&buf[m], &t);
  426. m += t;
  427. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_END, (rtcp_sdes_item_t*)&buf[m], &t);
  428. m += t;
  429. common->p = 0;
  430. common->version = 2;
  431. common->pt = RTCP_SDES;
  432. common->count = 1;
  433. common->length = htons((m - n) / 4 - 1);
  434. return m;
  435. }
  436. TOOLKIT_API int rtp_state_rtcp_make_bye(rtp_state *rs, char *buf, size_t buflen)
  437. {
  438. rtcp_bye_t* bye;
  439. rtcp_common_t *common;
  440. int n, t, m;
  441. if (!buf)
  442. return -1;
  443. /* bye block, already contains rtcp_common_t */
  444. n = 0;
  445. bye = (rtcp_bye_t*)&buf[n];
  446. n += sizeof(rtcp_bye_t);
  447. bye->common.p = 0;
  448. bye->common.version = 2;
  449. bye->common.pt = RTCP_BYE;
  450. bye->common.count = 1;
  451. bye->ssrc[0] = rs->ssrc;
  452. bye->common.length = htons(n / 4 - 1);
  453. /* sdes block */
  454. m = n;
  455. common = (rtcp_common_t*)&buf[m];
  456. m += sizeof(rtcp_common_t);
  457. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_CNAME, (rtcp_sdes_item_t*)&buf[m], &t);
  458. m += t;
  459. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_END, (rtcp_sdes_item_t*)&buf[m], &t);
  460. m += t;
  461. common->p = 1;
  462. common->version = 2;
  463. common->pt = RTCP_SDES;
  464. common->count = 1;
  465. common->length = htons((m - n) / 4 - 1);
  466. return m;
  467. }
  468. TOOLKIT_API int rtp_state_rtcp_make_h261_fir(rtp_state *rs, char *buf, size_t buflen)
  469. {
  470. rtcp_fir_t *fir;
  471. rtcp_common_t *common;
  472. rtcp_sdes_t *sdes;
  473. int n, t, m;
  474. int reception_report_result;
  475. /* sr block */
  476. n = 0;
  477. common = (rtcp_common_t*)&buf[n];
  478. n += sizeof(rtcp_common_t);
  479. rtp_state_fill_rtcp_sender_info(rs, (rtcp_sender_info_t *)&buf[n]);
  480. n += sizeof(rtcp_sender_info_t);
  481. reception_report_result = rtp_state_fill_rtcp_reception_report(rs, (rtcp_rr_t *)&buf[n]);
  482. if (reception_report_result < 0){
  483. //have not recv any peer's data, not fill_reception_report.
  484. } else {
  485. n += sizeof(rtcp_rr_t);
  486. }
  487. common->p = 0;
  488. common->version = 2;
  489. common->pt = RTCP_SR;
  490. common->count = 1;
  491. common->length = htons(n / 4 - 1);
  492. m = n;
  493. common = (rtcp_common_t*)&buf[n];
  494. n += sizeof(rtcp_common_t);
  495. sdes = (rtcp_sdes_t *)&buf[n];
  496. sdes->ssrc = rs->ssrc;
  497. n += sizeof(sdes->ssrc);
  498. //rtp_state_fill_rtcp_sdes_item_raw(rs, RTCP_SDES_CNAME, "fast_media_video_2b227aa1@huawei.com", (rtcp_sdes_item_t*)&buf[n], &t);
  499. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_CNAME, (rtcp_sdes_item_t*)&buf[n], &t);
  500. n += t;
  501. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_END, (rtcp_sdes_item_t*)&buf[n], &t);
  502. n += t;
  503. common->p = 0;
  504. common->version = 2;
  505. common->pt = RTCP_SDES;
  506. common->count = 1;
  507. common->length = htons((n-m) / 4 - 1);
  508. m = n;
  509. fir = (rtcp_fir_t *)&buf[n];
  510. n += sizeof(rtcp_fir_t);
  511. fir->common.p = 0;
  512. fir->common.pt = RTCP_FIR;
  513. fir->common.version = 2;
  514. fir->common.count = 1;
  515. fir->ssrc = rs->ssrc;
  516. fir->common.length = htons((n-m)/4 - 1);
  517. return n;
  518. }
  519. TOOLKIT_API int rtp_state_rtcp_make_h261_nack(rtp_state *rs, char *buf, size_t buflen)
  520. {
  521. rtcp_common_t *common;
  522. int n, t, m;
  523. n = 0;
  524. common = (rtcp_common_t*)&buf[0];
  525. n += sizeof(rtcp_common_t);
  526. common->count = 0;
  527. common->version = 2;
  528. common->p = 0;
  529. common->pt = RTCP_NACK;
  530. common->length = htons(n / 4 - 1);
  531. /* sdes block */
  532. m = n;
  533. common = (rtcp_common_t*)&buf[m];
  534. m += sizeof(rtcp_common_t);
  535. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_CNAME, (rtcp_sdes_item_t*)&buf[m], &t);
  536. m += t;
  537. rtp_state_fill_rtcp_sdes_item(rs, RTCP_SDES_END, (rtcp_sdes_item_t*)&buf[m], &t);
  538. m += t;
  539. common->p = 1;
  540. common->version = 2;
  541. common->pt = RTCP_SDES;
  542. common->count = 1;
  543. common->length = htons((m - n) / 4 - 1);
  544. return m;
  545. }
  546. TOOLKIT_API int rtp_state_rtcp_make_rtcp_fb_tmmbr(rtp_state *rs, char *buf, size_t buflen
  547. , u__int64_t mxtbr, unsigned short measured_overhead) {
  548. rtcp_common_t *ch;
  549. rtcp_fb_header_t *fbh;
  550. rtcp_fb_tmmbr_fci_t *fci;
  551. unsigned char mxtbr_exp = 0;
  552. unsigned int mxtbr_mantissa = 0;
  553. int length = 0;
  554. /* Compute mxtbr exp and mantissa */
  555. while (mxtbr >= (1 << 17)) {
  556. mxtbr >>= 1;
  557. mxtbr_exp++;
  558. }
  559. mxtbr_mantissa = mxtbr & 0x0001FFFF;
  560. /* Fill TMMBR */
  561. ch = (rtcp_common_t *)&buf[length];
  562. length += sizeof(rtcp_common_t);
  563. fbh = (rtcp_fb_header_t *)&buf[length];
  564. length += sizeof(rtcp_fb_header_t);
  565. fci = (rtcp_fb_tmmbr_fci_t *)&buf[length];
  566. length += sizeof(rtcp_fb_tmmbr_fci_t);
  567. fbh->packet_sender_ssrc = rs->ssrc;
  568. fbh->media_source_ssrc = htonl(0);
  569. fci->ssrc = rs->s.peer_ssrc;
  570. rtcp_fb_tmmbr_fci_set_mxtbr_exp(fci, mxtbr_exp);
  571. rtcp_fb_tmmbr_fci_set_mxtbr_mantissa(fci, mxtbr_mantissa);
  572. rtcp_fb_tmmbr_fci_set_measured_overhead(fci, measured_overhead);
  573. /* Fill common header */
  574. ch->p = 0;
  575. ch->version = 2;
  576. ch->pt = RTCP_RTPFB;
  577. ch->count = RTCP_RTPFB_TMMBR;
  578. ch->length = htons(length / 4 - 1);
  579. /* Store packet to be able to retransmit. */
  580. if (rs->tmmbr_info.sent) freemsg(rs->tmmbr_info.sent);
  581. rs->tmmbr_info.sent = copymsg(buf, length);
  582. return length;
  583. }
  584. TOOLKIT_API int rtp_state_rtcp_make_rtcp_fb_tmmbn(rtp_state *rs, char *buf, size_t buflen, unsigned int ssrc) {
  585. rtcp_common_t *ch;
  586. rtcp_fb_header_t *fbh;
  587. rtcp_fb_tmmbr_fci_t *fci;
  588. int length = 0;
  589. if (!rs->tmmbr_info.received) return 0;
  590. /* Fill TMMBN */
  591. ch = (rtcp_common_t *)&buf[length];
  592. length += sizeof(rtcp_common_t);
  593. fbh = (rtcp_fb_header_t *)&buf[length];
  594. length += sizeof(rtcp_fb_header_t);
  595. fci = (rtcp_fb_tmmbr_fci_t *)&buf[length];
  596. length += sizeof(rtcp_fb_tmmbr_fci_t);
  597. fbh->packet_sender_ssrc = rs->ssrc;
  598. fbh->media_source_ssrc = htonl(0);
  599. memcpy(fci, rtcp_rtpfb_tmmbr_get_fci(rs->tmmbr_info.received), sizeof(rtcp_fb_tmmbr_fci_t));
  600. fci->ssrc = htonl(ssrc);
  601. /* Fill common header */
  602. ch->p = 0;
  603. ch->version = 2;
  604. ch->pt = RTCP_RTPFB;
  605. ch->count = RTCP_RTPFB_TMMBN;
  606. ch->length = htons(length / 4 - 1);
  607. return length;
  608. }
  609. int rtp_state_get_tmmbr_wait_send_maxbitrate(rtp_state *rs, u__int64_t *mxtbr){
  610. if (rs->tmmbr_info.sent) {
  611. *mxtbr = rtcp_rtpfb_tmmbr_get_max_bitrate(rs->tmmbr_info.sent);
  612. return 0;
  613. }
  614. return -1;
  615. }
  616. static void handle_rtcp_rtpfb_packet(rtp_state *rs, const char *buf, int len) {
  617. rtcp_common_t *ch = (rtcp_common_t *)&buf[0];
  618. switch ((rtcp_rtpfb_type_t)ch->count) {
  619. case RTCP_RTPFB_TMMBR:
  620. if (rs->tmmbr_info.received) freemsg((char *)(rs->tmmbr_info.received));
  621. rs->tmmbr_info.received = copymsg(buf, len);
  622. rs->s.tmmbr_max_bitrate = rtcp_rtpfb_tmmbr_get_max_bitrate(buf);
  623. break;
  624. case RTCP_RTPFB_TMMBN:
  625. if (rs->tmmbr_info.sent) {
  626. rtcp_fb_tmmbr_fci_t *tmmbn_fci = rtcp_rtpfb_tmmbr_get_fci((char *)buf);
  627. rtcp_fb_tmmbr_fci_t *tmmbr_fci = rtcp_rtpfb_tmmbr_get_fci((char *)(rs->tmmbr_info.sent));
  628. if ((tmmbn_fci->ssrc == rs->ssrc) && (tmmbn_fci->value == tmmbr_fci->value)) {
  629. freemsg((char *)(rs->tmmbr_info.sent));
  630. rs->tmmbr_info.sent = NULL;
  631. }
  632. }
  633. break;
  634. default:
  635. break;
  636. }
  637. }
  638. static unsigned int report_block_get_fraction_lost(const rtcp_rr_t * rr) {
  639. return (ntohl(rr->fl_cnpl)>>24);
  640. }
  641. static unsigned int report_block_get_cum_packet_lost(const rtcp_rr_t * rr){
  642. unsigned int cum_loss = (unsigned int)ntohl(rr->fl_cnpl);
  643. if (((cum_loss>>23)&1)==0)
  644. return (unsigned int) (0x00FFFFFF & cum_loss);
  645. else
  646. return (unsigned int)(0xFF000000 | (cum_loss-0xFFFFFF-1));
  647. }
  648. static void compute_rtt_from_report_block(rtp_state *rs, const struct timeval *now, rtcp_rr_t *rr) {
  649. unsigned int last_sr_time;
  650. unsigned int sr_delay;
  651. u__int64_t curntp;
  652. unsigned int approx_ntp;
  653. last_sr_time = ntohl(rr->lsr);
  654. sr_delay = ntohl(rr->dlsr);
  655. curntp=rtp_timeval_to_ntp(now);
  656. approx_ntp=(curntp>>16) & 0xFFFFFFFF;
  657. //printf("compute_rtt_from_report_block, last_sr_time:%u sr_delay:%u, approx_ntp:%u", last_sr_time, sr_delay, approx_ntp);
  658. if (last_sr_time!=0 && sr_delay!=0){
  659. /*we cast to int32_t to check for crazy RTT time (negative)*/
  660. double rtt_frac=(unsigned int)(approx_ntp-last_sr_time-sr_delay);
  661. //printf("compute_rtt_from_report_block, rtt_frac:%lf", rtt_frac);
  662. if (rtt_frac>=0){
  663. rtt_frac/=65536.0;
  664. rs->s.rtt=(float)rtt_frac;
  665. }
  666. }
  667. rs->s.cum_loss = report_block_get_cum_packet_lost(rr);
  668. rs->s.fraction_lost = report_block_get_fraction_lost(rr);
  669. }
  670. /**
  671. * called when receive a peer's rtp data packet
  672. */
  673. TOOLKIT_API int rtp_state_on_recv_rtcp(rtp_state *rs, const void *buf, int len)
  674. {
  675. if (rs && buf && len >= sizeof(rtcp_common_t)) {
  676. int n = 0;
  677. while( n < len) {
  678. const rtcp_common_t *common = (rtcp_common_t *)((const char*)buf + n);
  679. if (common->version != 2)
  680. return -1;
  681. n += sizeof(rtcp_common_t);
  682. if (common->pt == RTCP_SR) {
  683. rtcp_sender_info_t *si;
  684. si = (rtcp_sender_info_t *)((const char*)buf + n);
  685. rs->s.lsr = ( ntohl( si->ntp_sec ) << 16 ) | ( ntohl( si->ntp_frac ) >> 16 );
  686. gettimeofday(&rs->s.lsr_tm, NULL);
  687. }
  688. if ((common->pt == RTCP_SR || common->pt == RTCP_RR) && common->count) {
  689. rtcp_rr_t *rr;
  690. struct timeval now;
  691. gettimeofday(&now, NULL);
  692. if (common->pt == RTCP_SR)
  693. rr = rtcp_SR_get_report_block((const char*)buf);
  694. else {
  695. rr = rtcp_RR_get_report_block((const char*)buf);
  696. }
  697. if (rr != NULL){
  698. compute_rtt_from_report_block(rs, &now, rr);
  699. rs->s.report_block_last_number_of_packets = ntohl(rr->last_seq) - rs->s.report_block_last_seq;
  700. rs->s.report_block_last_seq = ntohl(rr->last_seq);
  701. }
  702. }
  703. if (rtcp_is_rtpfb((char *)common), rtcp_get_size((char *)common)) {
  704. handle_rtcp_rtpfb_packet(rs, (char *)common, rtcp_get_size((char *)common));
  705. }
  706. n += ntohs(common->length) * 4;
  707. }
  708. return 0;
  709. }
  710. return -1;
  711. }
  712. #define MAX_DROPOUT 3000
  713. #define MAX_MISORDER 100
  714. #define MIN_SEQUENTIAL 2
  715. /**
  716. * called when receive a peer's rtp data packet
  717. */
  718. TOOLKIT_API int rtp_state_on_recv_rtp(rtp_state *rs, const void *buf, int len)
  719. {
  720. if (rs && buf && len >= sizeof(rtp_hdr)) {
  721. rtp_hdr *hdr = (rtp_hdr*)buf;
  722. unsigned short seq = ntohs(hdr->seq);
  723. if (rs->s.first_seq == 0 && rs->s.seq_circles == 0) {
  724. rs->s.first_seq = seq;
  725. rs->s.max_seq = seq;
  726. rs->s.peer_ssrc = hdr->ssrc;
  727. //rs->s.last_seq = seq;
  728. } else {
  729. unsigned short delta = seq - rs->s.max_seq;
  730. if (delta < MAX_DROPOUT) {
  731. if (seq < rs->s.max_seq)
  732. rs->s.seq_circles ++;
  733. rs->s.max_seq = seq;
  734. } else {
  735. /* duplicated */
  736. }
  737. }
  738. //len -= sizeof(rtp_hdr);
  739. rs->s.total_rx_packets ++;
  740. rs->s.total_rx_bytes += len;
  741. rs->s.last_seq = seq;
  742. rs->s.rx_packets_since_last_sr++;
  743. return 0;
  744. }
  745. return -1;
  746. }
  747. /**
  748. * called when send rtp data packet out
  749. */
  750. TOOLKIT_API int rtp_state_on_send_rtp(rtp_state *rs, int len)
  751. {
  752. if (rs) {
  753. len -= sizeof(rtp_hdr);
  754. rs->s.total_tx_packets ++;
  755. rs->s.total_tx_bytes += len;
  756. return 0;
  757. }
  758. return -1;
  759. }
  760. /**
  761. * set sdes string, only ascii string less than 255 accepted
  762. */
  763. TOOLKIT_API int rtp_state_set_sdes_str(rtp_state *rs, rtcp_sdes_type_t type, const char *str)
  764. {
  765. char *t;
  766. if (!rs)
  767. return -1;
  768. if (str == NULL) {
  769. if (rs->sdes_str[type]) {
  770. free(rs->sdes_str[type]);
  771. rs->sdes_str[type] = NULL;
  772. }
  773. return 0;
  774. }
  775. t = (char*)malloc(RTP_MAX_SDES);
  776. if (!t)
  777. return -1;
  778. strncpy(t, str, RTP_MAX_SDES);
  779. t[RTP_MAX_SDES-1] = 0;
  780. if (rs->sdes_str[type])
  781. free(rs->sdes_str[type]);
  782. rs->sdes_str[type] = t;
  783. return 0;
  784. }
  785. // rtp_state_set_params();
  786. TOOLKIT_API int rtp_state_reset(rtp_state *rs,
  787. unsigned int ssrc,
  788. unsigned int padding,
  789. unsigned int extension)
  790. {
  791. if (!rs)
  792. return -1;
  793. if (ssrc == 0)
  794. ssrc = (unsigned int)rand();
  795. #if defined(_MSC_VER)
  796. rs->ssrc = htonl(ssrc);
  797. #else
  798. rs->ssrc = _htonl(ssrc);
  799. #endif //_MSC_VER
  800. rs->p = !!padding;
  801. rs->x = !!extension;
  802. rs->ts = 0;
  803. rs->seq = 0;
  804. //.
  805. return 0;
  806. }
  807. TOOLKIT_API rtp_state *rtp_state_create(int transmit_interval)
  808. {
  809. rtp_state *state;
  810. if (transmit_interval <= 0)
  811. transmit_interval = DEFAULT_RTP_STATE_TRANSMIT_INTERVAL;
  812. else if (transmit_interval > 5000)
  813. transmit_interval = 5000;
  814. state = malloc(sizeof(rtp_state));
  815. if (state) {
  816. memset(state, 0, sizeof(rtp_state));
  817. //..
  818. state->transmit_interval = (DWORD)transmit_interval;
  819. state->last_transmit_tick = 0;
  820. }
  821. return state;
  822. }
  823. TOOLKIT_API void rtp_state_destroy(rtp_state *rs)
  824. {
  825. if (rs) {
  826. int i;
  827. for (i = 0; i < RTCP_SDES_COUNT; ++i) {
  828. if (rs->sdes_str[i])
  829. free(rs->sdes_str[i]);
  830. }
  831. free(rs);
  832. }
  833. }
  834. TOOLKIT_API int rtp_state_get_stat(rtp_state *rs, rtcp_statistics *stat)
  835. {
  836. if (rs && stat) {
  837. memcpy(stat, &rs->s, sizeof(rtcp_statistics));
  838. return 0;
  839. }
  840. return -1;
  841. }
  842. TOOLKIT_API int rtp_state_need_send_rtcp(rtp_state *state, int update_ticks)
  843. {
  844. DWORD now;
  845. DWORD diff;
  846. TOOLKIT_ASSERT(state);
  847. now = GetTickCount();
  848. diff = now - state->last_transmit_tick;
  849. if (diff >= state->transmit_interval) {
  850. if (update_ticks)
  851. state->last_transmit_tick = now;
  852. return 1;
  853. } else {
  854. return 0;
  855. }
  856. }
  857. TOOLKIT_API void rtp_state_update_send_rtcp_ticks(rtp_state *state)
  858. {
  859. TOOLKIT_ASSERT(state);
  860. state->last_transmit_tick = GetTickCount();
  861. }