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.

преди 10 месеца
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #if defined(_DEBUG) || defined(DEBUG)
  2. #include "sockutil.h"
  3. #include "rtsp-client.h"
  4. #include <assert.h>
  5. #include <stdlib.h>
  6. #include "sockpair.h"
  7. #include "cstringext.h"
  8. #include "sys/system.h"
  9. #include "cpm/unuse.h"
  10. #include "sdp.h"
  11. //#define UDP_MULTICAST_ADDR "239.0.0.2"
  12. void rtp_receiver_tcp_input(uint8_t channel, const void* data, uint16_t bytes);
  13. void rtp_receiver_test(socket_t rtp[2], const char* peer, int peerport[2], int payload, const char* encoding);
  14. void* rtp_receiver_tcp_test(uint8_t interleave1, uint8_t interleave2, int payload, const char* encoding);
  15. int rtsp_addr_is_multicast(const char* ip);
  16. struct rtsp_client_test_t
  17. {
  18. void* rtsp;
  19. socket_t socket;
  20. int transport;
  21. socket_t rtp[5][2];
  22. unsigned short port[5][2];
  23. };
  24. static int rtsp_client_send(void* param, const char* uri, const void* req, size_t bytes)
  25. {
  26. //TODO: check uri and make socket
  27. //1. uri != rtsp describe uri(user input)
  28. //2. multi-uri if media_count > 1
  29. struct rtsp_client_test_t *ctx = (struct rtsp_client_test_t *)param;
  30. return socket_send_all_by_time(ctx->socket, req, bytes, 0, 2000);
  31. }
  32. static int rtpport(void* param, int media, const char* source, unsigned short rtp[2], char* ip, int len)
  33. {
  34. struct rtsp_client_test_t *ctx = (struct rtsp_client_test_t *)param;
  35. int m = rtsp_client_get_media_type(ctx->rtsp, media);
  36. if (SDP_M_MEDIA_AUDIO != m && SDP_M_MEDIA_VIDEO != m)
  37. return 0; // ignore
  38. switch (ctx->transport)
  39. {
  40. case RTSP_TRANSPORT_RTP_UDP:
  41. // TODO: ipv6
  42. assert(0 == sockpair_create("0.0.0.0", ctx->rtp[media], ctx->port[media]));
  43. rtp[0] = ctx->port[media][0];
  44. rtp[1] = ctx->port[media][1];
  45. if(rtsp_addr_is_multicast(ip))
  46. {
  47. if(0 != socket_udp_multicast(ctx->rtp[media][0], ip, source, 16) || 0 != socket_udp_multicast(ctx->rtp[media][1], ip, source, 16))
  48. return -1;
  49. }
  50. #if defined(UDP_MULTICAST_ADDR)
  51. else
  52. {
  53. if(0 != socket_udp_multicast(ctx->rtp[media][0], UDP_MULTICAST_ADDR, source, 16) || 0 != socket_udp_multicast(ctx->rtp[media][1], UDP_MULTICAST_ADDR, source, 16))
  54. return -1;
  55. snprintf(ip, len, "%s", UDP_MULTICAST_ADDR);
  56. }
  57. #endif
  58. break;
  59. case RTSP_TRANSPORT_RTP_TCP:
  60. rtp[0] = 2 * media;
  61. rtp[1] = 2 * media + 1;
  62. break;
  63. default:
  64. assert(0);
  65. return -1;
  66. }
  67. return ctx->transport;
  68. }
  69. int rtsp_client_options(rtsp_client_t *rtsp, const char* commands);
  70. static void onrtp(void* param, uint8_t channel, const void* data, uint16_t bytes)
  71. {
  72. static int keepalive = 0;
  73. struct rtsp_client_test_t *ctx = (struct rtsp_client_test_t *)param;
  74. rtp_receiver_tcp_input(channel, data, bytes);
  75. if (++keepalive % 1000 == 0)
  76. {
  77. rtsp_client_play(ctx->rtsp, NULL, NULL);
  78. }
  79. }
  80. static int ondescribe(void* param, const char* sdp, int len)
  81. {
  82. struct rtsp_client_test_t *ctx = (struct rtsp_client_test_t *)param;
  83. return rtsp_client_setup(ctx->rtsp, sdp, len);
  84. }
  85. static int onsetup(void* param, int timeout, int64_t duration)
  86. {
  87. int i;
  88. uint64_t npt = 0;
  89. char ip[65];
  90. u_short rtspport;
  91. struct rtsp_client_test_t *ctx = (struct rtsp_client_test_t *)param;
  92. assert(0 == rtsp_client_play(ctx->rtsp, &npt, NULL));
  93. for (i = 0; i < rtsp_client_media_count(ctx->rtsp); i++)
  94. {
  95. int payload, port[2];
  96. const char* encoding;
  97. const struct rtsp_header_transport_t* transport;
  98. transport = rtsp_client_get_media_transport(ctx->rtsp, i);
  99. encoding = rtsp_client_get_media_encoding(ctx->rtsp, i);
  100. payload = rtsp_client_get_media_payload(ctx->rtsp, i);
  101. if (RTSP_TRANSPORT_RTP_UDP == transport->transport)
  102. {
  103. //assert(RTSP_TRANSPORT_RTP_UDP == transport->transport); // udp only
  104. assert(0 == transport->multicast); // unicast only
  105. assert(transport->rtp.u.client_port1 == ctx->port[i][0]);
  106. assert(transport->rtp.u.client_port2 == ctx->port[i][1]);
  107. port[0] = transport->rtp.u.server_port1;
  108. port[1] = transport->rtp.u.server_port2;
  109. if (*transport->source)
  110. {
  111. rtp_receiver_test(ctx->rtp[i], transport->source, port, payload, encoding);
  112. }
  113. else
  114. {
  115. socket_getpeername(ctx->socket, ip, &rtspport);
  116. rtp_receiver_test(ctx->rtp[i], ip, port, payload, encoding);
  117. }
  118. }
  119. else if (RTSP_TRANSPORT_RTP_TCP == transport->transport)
  120. {
  121. //assert(transport->rtp.u.client_port1 == transport->interleaved1);
  122. //assert(transport->rtp.u.client_port2 == transport->interleaved2);
  123. rtp_receiver_tcp_test(transport->interleaved1, transport->interleaved2, payload, encoding);
  124. }
  125. else
  126. {
  127. assert(0); // TODO
  128. }
  129. }
  130. return 0;
  131. }
  132. static int onteardown(void* param)
  133. {
  134. return 0;
  135. }
  136. static int onplay(void* param, int media, const uint64_t *nptbegin, const uint64_t *nptend, const double *scale, const struct rtsp_rtp_info_t* rtpinfo, int count)
  137. {
  138. return 0;
  139. }
  140. static int onpause(void* param)
  141. {
  142. return 0;
  143. }
  144. void rtsp_client_test(const char* host, const char* file)
  145. {
  146. int r;
  147. struct rtsp_client_test_t ctx;
  148. struct rtsp_client_handler_t handler;
  149. static char packet[2 * 1024 * 1024];
  150. memset(&ctx, 0, sizeof(ctx));
  151. handler.send = rtsp_client_send;
  152. handler.rtpport = rtpport;
  153. handler.ondescribe = ondescribe;
  154. handler.onsetup = onsetup;
  155. handler.onplay = onplay;
  156. handler.onpause = onpause;
  157. handler.onteardown = onteardown;
  158. handler.onrtp = onrtp;
  159. ctx.transport = RTSP_TRANSPORT_RTP_UDP; // RTSP_TRANSPORT_RTP_TCP
  160. snprintf(packet, sizeof(packet), "rtsp://%s/%s", host, file); // url
  161. socket_init();
  162. ctx.socket = socket_connect_host(host, 8554, 2000);
  163. assert(socket_invalid != ctx.socket);
  164. //ctx.rtsp = rtsp_client_create(NULL, NULL, &handler, &ctx);
  165. ctx.rtsp = rtsp_client_create(packet, "username1", "password1", &handler, &ctx);
  166. assert(ctx.rtsp);
  167. assert(0 == rtsp_client_describe(ctx.rtsp));
  168. socket_setnonblock(ctx.socket, 0);
  169. r = socket_recv(ctx.socket, packet, sizeof(packet), 0);
  170. while(r > 0)
  171. {
  172. assert(0 == rtsp_client_input(ctx.rtsp, packet, r));
  173. r = socket_recv(ctx.socket, packet, sizeof(packet), 0);
  174. }
  175. assert(0 == rtsp_client_teardown(ctx.rtsp));
  176. rtsp_client_destroy(ctx.rtsp);
  177. socket_close(ctx.socket);
  178. socket_cleanup();
  179. }
  180. #endif