您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

183 行
4.9KB

  1. #include "rtp-sender.h"
  2. #include "rtp-profile.h"
  3. #include "rtp-payload.h"
  4. #include "sdp-payload.h"
  5. #include "rtsp-payloads.h"
  6. #include "rtp.h"
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10. #include <errno.h>
  11. #if defined(OS_WINDOWS)
  12. #if !defined(strcasecmp)
  13. #define strcasecmp _stricmp
  14. #endif
  15. #endif
  16. uint32_t rtp_ssrc(void);
  17. static void* rtp_alloc(void* param, int bytes)
  18. {
  19. struct rtp_sender_t* s = (struct rtp_sender_t*)param;
  20. assert(bytes <= sizeof(s->buffer));
  21. return s->buffer;
  22. }
  23. static void rtp_free(void* param, void *packet)
  24. {
  25. struct rtp_sender_t* s = (struct rtp_sender_t*)param;
  26. assert(s->buffer == packet);
  27. }
  28. static int rtp_packet(void* param, const void *packet, int bytes, uint32_t timestamp, int flags)
  29. {
  30. struct rtp_sender_t* s = (struct rtp_sender_t*)param;
  31. assert(s->buffer == packet);
  32. int r = s->onpacket(s->param, packet, bytes, timestamp, flags);
  33. if(0 == r)
  34. rtp_onsend(s->rtp, packet, bytes/*, time*/);
  35. return r;
  36. }
  37. static void rtp_onrtcp(void* param, const struct rtcp_msg_t* msg)
  38. {
  39. struct rtp_sender_t* s = (struct rtp_sender_t*)param;
  40. if(RTCP_BYE == msg->type && s->onbye)
  41. s->onbye(param);
  42. }
  43. int rtp_sender_init_video(struct rtp_sender_t* s, const char* proto, unsigned short port, int payload, const char* encoding, int frequence, const void* extra, size_t bytes)
  44. {
  45. int avp, r;
  46. struct rtp_event_t event;
  47. struct rtp_payload_t handler = {
  48. rtp_alloc,
  49. rtp_free,
  50. rtp_packet,
  51. };
  52. //memset(s, 0, sizeof(*s));
  53. s->seq = s->seq ? s->seq : (uint16_t)rtp_ssrc();
  54. s->ssrc = s->ssrc ? s->ssrc : rtp_ssrc();
  55. s->timestamp = s->timestamp ? s->timestamp : rtp_ssrc();
  56. s->bandwidth = s->bandwidth ? s->bandwidth : 2 * 1024 * 1024; // default 2Mb
  57. s->frequency = 0 == frequence ? 90000 : frequence; // default 90MHz
  58. s->payload = payload;
  59. snprintf(s->encoding, sizeof(s->encoding)-1, "%s", encoding);
  60. avp = avpayload_find_by_rtp((uint8_t)payload, encoding);
  61. if (avp < 0)
  62. {
  63. assert(0);
  64. return -EPROTONOSUPPORT;
  65. }
  66. r = sdp_payload_video(s->buffer, sizeof(s->buffer), s_payloads[avp].payload, proto, port, payload, s->frequency, extra, (int)bytes);
  67. if (r < 0)
  68. {
  69. assert(0);
  70. return -EPROTONOSUPPORT;
  71. }
  72. s->encoder = rtp_payload_encode_create(payload, s->encoding, s->seq, s->ssrc, &handler, s);
  73. event.on_rtcp = rtp_onrtcp;
  74. s->rtp = rtp_create(&event, s, s->ssrc, s->timestamp, s->frequency, s->bandwidth, 1);
  75. if (r < 0 || r >= sizeof(s->buffer) || !s->rtp || !s->encoder)
  76. {
  77. rtp_sender_destroy(s);
  78. return -ENOMEM;
  79. }
  80. return r;
  81. }
  82. int rtp_sender_init_audio(struct rtp_sender_t* s, const char* proto, unsigned short port, int payload, const char* encoding, int sample_rate, int channel_count, const void* extra, size_t bytes)
  83. {
  84. int avp, r;
  85. struct rtp_event_t event;
  86. struct rtp_payload_t handler = {
  87. rtp_alloc,
  88. rtp_free,
  89. rtp_packet,
  90. };
  91. r = 0;
  92. // memset(s, 0, sizeof(*s));
  93. s->seq = s->seq ? s->seq : (uint16_t)rtp_ssrc();
  94. s->ssrc = s->ssrc ? s->ssrc : rtp_ssrc();
  95. s->timestamp = s->timestamp ? s->timestamp : rtp_ssrc();
  96. s->bandwidth = s->bandwidth ? s->bandwidth : 128 * 1024; // default 128Kb
  97. s->frequency = sample_rate;
  98. s->payload = payload;
  99. snprintf(s->encoding, sizeof(s->encoding)-1, "%s", encoding);
  100. avp = avpayload_find_by_rtp((uint8_t)payload, encoding);
  101. if (avp < 0)
  102. {
  103. assert(0);
  104. return -EPROTONOSUPPORT;
  105. }
  106. r = sdp_payload_audio(s->buffer, sizeof(s->buffer), s_payloads[avp].payload, proto, port, payload, sample_rate, channel_count, extra, (int)bytes);
  107. if (r < 0)
  108. {
  109. assert(0);
  110. return -EPROTONOSUPPORT;
  111. }
  112. switch(s_payloads[avp].payload)
  113. {
  114. case RTP_PAYLOAD_MP4A: // RFC 3640 3.3.1. General (p21)
  115. case RTP_PAYLOAD_LATM: // RFC 6416
  116. s->bandwidth = 128 * 1024;
  117. break;
  118. case RTP_PAYLOAD_OPUS: // RFC7587 RTP Payload Format for the Opus Speech and Audio Codec
  119. s->bandwidth = 32000;
  120. break;
  121. case RTP_PAYLOAD_PCMU:
  122. s->bandwidth = 64000; // 8000 * 8 * 1
  123. break;
  124. case RTP_PAYLOAD_PCMA:
  125. s->bandwidth = 64000; // 8000 * 8 * 1
  126. break;
  127. default:
  128. s->bandwidth = 128 * 1024; // default 128Kb
  129. }
  130. s->encoder = rtp_payload_encode_create(payload, s->encoding, s->seq, s->ssrc, &handler, s);
  131. event.on_rtcp = rtp_onrtcp;
  132. s->rtp = rtp_create(&event, s, s->ssrc, s->timestamp, s->frequency, s->bandwidth, 1);
  133. if (r < 0 || !s->rtp || !s->encoder)
  134. {
  135. rtp_sender_destroy(s);
  136. return -ENOMEM;
  137. }
  138. return r;
  139. }
  140. int rtp_sender_destroy(struct rtp_sender_t* s)
  141. {
  142. if (s->rtp)
  143. {
  144. rtp_destroy(s->rtp);
  145. s->rtp = NULL;
  146. }
  147. if (s->encoder)
  148. {
  149. rtp_payload_encode_destroy(s->encoder);
  150. s->encoder = NULL;
  151. }
  152. return 0;
  153. }