rtp.c 25 KB

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