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.

297 lines
9.5KB

  1. #include "aio-rtmp-server.h"
  2. #include "aio-rtmp-transport.h"
  3. #include "sockutil.h"
  4. #include "sys/atomic.h"
  5. #include "sys/locker.h"
  6. #include "rtmp-server.h"
  7. #include "aio-accept.h"
  8. #include <stdlib.h>
  9. #include <assert.h>
  10. #include <stdio.h>
  11. #include <errno.h>
  12. #define TIMEOUT_RECV 20000
  13. #define TIMEOUT_SEND 20000
  14. struct aio_rtmp_server_t
  15. {
  16. void* listen; // listen aio socket
  17. struct aio_rtmp_server_handler_t handle;
  18. void* param;
  19. };
  20. struct aio_rtmp_session_t
  21. {
  22. locker_t locker;
  23. socklen_t salen;
  24. struct sockaddr_storage sa;
  25. aio_rtmp_transport_t* aio; // aio rtmp transport
  26. aio_rtmp_userptr_t usr; // user-defined parameter(return by oncreate)
  27. rtmp_server_t* rtmp; // create by rtmp_server_create
  28. struct aio_rtmp_server_t* server;
  29. };
  30. static void aio_rtmp_server_onaccept(void* param, int code, socket_t socket, const struct sockaddr* sa, socklen_t salen);
  31. static void rtmp_session_ondestroy(void* param);
  32. static void rtmp_session_onsend(void* param, int code, size_t bytes);
  33. static void rtmp_session_onrecv(void* param, int code, const void* data, size_t bytes);
  34. static int rtmp_handler_send(void* param, const void* header, size_t len, const void* payload, size_t bytes);
  35. static int rtmp_handler_onpublish(void* param, const char* app, const char* stream, const char* type);
  36. static int rtmp_handler_onscript(void* param, const void* data, size_t bytes, uint32_t timestamp);
  37. static int rtmp_handler_onaudio(void* param, const void* data, size_t bytes, uint32_t timestamp);
  38. static int rtmp_handler_onvideo(void* param, const void* data, size_t bytes, uint32_t timestamp);
  39. static int rtmp_handler_onplay(void* param, const char* app, const char* stream, double start, double duration, uint8_t reset);
  40. static int rtmp_handler_onpause(void* param, int pause, uint32_t ms);
  41. static int rtmp_handler_onseek(void* param, uint32_t ms);
  42. static int rtmp_handler_ongetduration(void* param, const char* app, const char* stream, double* duration);
  43. static void aio_rtmp_server_ondestroy(void* param)
  44. {
  45. struct aio_rtmp_server_t *server;
  46. server = (struct aio_rtmp_server_t*)param;
  47. free(server);
  48. }
  49. struct aio_rtmp_server_t* aio_rtmp_server_create(const char* ip, int port, struct aio_rtmp_server_handler_t* handler, void* param)
  50. {
  51. socket_t socket;
  52. struct aio_rtmp_server_t *ctx;
  53. // create server socket
  54. socket = socket_tcp_listen(0 /*AF_UNSPEC*/, ip, (u_short)port, SOMAXCONN, 0, 1);
  55. if (socket_invalid == socket)
  56. {
  57. printf("%s(%s, %d): create socket error: %d\n", __FUNCTION__, ip, port, socket_geterror());
  58. return NULL;
  59. }
  60. ctx = (struct aio_rtmp_server_t*)malloc(sizeof(*ctx));
  61. ctx->param = param;
  62. memcpy(&ctx->handle, handler, sizeof(ctx->handle));
  63. ctx->listen = aio_accept_start(socket, aio_rtmp_server_onaccept, ctx);
  64. if (!ctx->listen)
  65. {
  66. printf("%s(%s, %d) create aio transport error.\n", __FUNCTION__, ip, port);
  67. aio_rtmp_server_destroy(ctx);
  68. socket_close(socket);
  69. return NULL;
  70. }
  71. return ctx;
  72. }
  73. int aio_rtmp_server_destroy(struct aio_rtmp_server_t *server)
  74. {
  75. if (server->listen)
  76. {
  77. return aio_accept_stop(server->listen, aio_rtmp_server_ondestroy, server);
  78. }
  79. else
  80. {
  81. aio_rtmp_server_ondestroy(server);
  82. return 0;
  83. }
  84. }
  85. int aio_rtmp_server_send_audio(struct aio_rtmp_session_t* session, const void* data, size_t bytes, uint32_t timestamp)
  86. {
  87. return rtmp_server_send_audio(session->rtmp, data, bytes, timestamp);
  88. }
  89. int aio_rtmp_server_send_video(struct aio_rtmp_session_t* session, const void* data, size_t bytes, uint32_t timestamp)
  90. {
  91. return rtmp_server_send_video(session->rtmp, data, bytes, timestamp);
  92. }
  93. int aio_rtmp_server_send_script(struct aio_rtmp_session_t* session, const void* data, size_t bytes, uint32_t timestamp)
  94. {
  95. return rtmp_server_send_script(session->rtmp, data, bytes, timestamp);
  96. }
  97. size_t aio_rtmp_server_get_unsend(struct aio_rtmp_session_t* session)
  98. {
  99. return aio_rtmp_transport_get_unsend(session->aio);
  100. }
  101. int aio_rtmp_server_get_addr(struct aio_rtmp_session_t* session, char ip[65], unsigned short* port)
  102. {
  103. return socket_addr_to((struct sockaddr*)&session->sa, session->salen, ip, port);
  104. }
  105. static void aio_rtmp_server_onaccept(void* param, int code, socket_t socket, const struct sockaddr* sa, socklen_t salen)
  106. {
  107. struct aio_rtmp_server_t* server;
  108. struct aio_rtmp_session_t* session;
  109. struct aio_rtmp_handler_t aiohandler;
  110. struct rtmp_server_handler_t handler;
  111. server = (struct aio_rtmp_server_t*)param;
  112. if (0 != code)
  113. {
  114. printf("aio_rtmp_server_onaccept code: %d\n", code);
  115. return;
  116. }
  117. socket_setnonblock(socket, 1);
  118. socket_setnondelay(socket, 1);
  119. session = (struct aio_rtmp_session_t*)malloc(sizeof(*session));
  120. if (session)
  121. {
  122. session->usr = NULL;
  123. session->server = server;
  124. locker_create(&session->locker);
  125. session->salen = salen < sizeof(session->sa) ? salen : sizeof(session->sa);
  126. memcpy(&session->sa, sa, session->salen);
  127. handler.send = rtmp_handler_send;
  128. handler.onplay = rtmp_handler_onplay;
  129. handler.onseek = rtmp_handler_onseek;
  130. handler.onpause = rtmp_handler_onpause;
  131. handler.onaudio = rtmp_handler_onaudio;
  132. handler.onvideo = rtmp_handler_onvideo;
  133. handler.onscript = rtmp_handler_onscript;
  134. handler.onpublish = rtmp_handler_onpublish;
  135. handler.ongetduration = server->handle.ongetduration ? rtmp_handler_ongetduration : NULL;
  136. session->rtmp = rtmp_server_create(session, &handler);
  137. aiohandler.onrecv = rtmp_session_onrecv;
  138. aiohandler.onsend = rtmp_session_onsend;
  139. aiohandler.ondestroy = rtmp_session_ondestroy;
  140. session->aio = aio_rtmp_transport_create(aio_socket_create(socket, 1), &aiohandler, session);
  141. aio_rtmp_transport_set_timeout(session->aio, TIMEOUT_RECV, TIMEOUT_SEND);
  142. aio_rtmp_transport_start(session->aio);
  143. }
  144. }
  145. static void rtmp_session_ondestroy(void* param)
  146. {
  147. struct aio_rtmp_session_t* session;
  148. session = (struct aio_rtmp_session_t*)param;
  149. // notify session stop
  150. if(session->server->handle.onclose && session->usr)
  151. session->server->handle.onclose(session->usr);
  152. if (session->rtmp)
  153. {
  154. rtmp_server_destroy(session->rtmp);
  155. session->rtmp = NULL;
  156. }
  157. locker_destroy(&session->locker);
  158. session->aio = NULL;
  159. #if defined(DEBUG) || defined(_DEBUG)
  160. memset(session, 0xCC, sizeof(*session));
  161. #endif
  162. free(session);
  163. }
  164. static void rtmp_session_onrecv(void* param, int code, const void* data, size_t bytes)
  165. {
  166. struct aio_rtmp_session_t* session;
  167. session = (struct aio_rtmp_session_t*)param;
  168. if(0 == code)
  169. code = rtmp_server_input(session->rtmp, data, bytes);
  170. if (0 != code)
  171. aio_rtmp_transport_destroy(session->aio);
  172. }
  173. static void rtmp_session_onsend(void* param, int code, size_t bytes)
  174. {
  175. struct aio_rtmp_session_t* session;
  176. session = (struct aio_rtmp_session_t*)param;
  177. if (0 == code)
  178. {
  179. if (session->server->handle.onsend && session->usr)
  180. session->server->handle.onsend(session->usr, bytes);
  181. }
  182. else
  183. {
  184. aio_rtmp_transport_destroy(session->aio);
  185. }
  186. }
  187. static int rtmp_handler_send(void* param, const void* header, size_t len, const void* payload, size_t bytes)
  188. {
  189. struct aio_rtmp_session_t* session;
  190. session = (struct aio_rtmp_session_t*)param;
  191. return aio_rtmp_transport_send(session->aio, header, len, payload, bytes);
  192. }
  193. static int rtmp_handler_onplay(void* param, const char* app, const char* stream, double start, double duration, uint8_t reset)
  194. {
  195. struct aio_rtmp_session_t* session;
  196. session = (struct aio_rtmp_session_t*)param;
  197. session->usr = session->server->handle.onplay(session->server->param, session, app, stream, start, duration, reset);
  198. return session->usr ? 0 : -1;
  199. }
  200. static int rtmp_handler_onpause(void* param, int pause, uint32_t ms)
  201. {
  202. struct aio_rtmp_session_t* session;
  203. session = (struct aio_rtmp_session_t*)param;
  204. if(session->server->handle.onpause && session->usr)
  205. return session->server->handle.onpause(session->usr, pause, ms);
  206. return 0;
  207. }
  208. static int rtmp_handler_onseek(void* param, uint32_t ms)
  209. {
  210. struct aio_rtmp_session_t* session;
  211. session = (struct aio_rtmp_session_t*)param;
  212. if(session->server->handle.onseek && session->usr)
  213. return session->server->handle.onseek(session->usr, ms);
  214. return 0;
  215. }
  216. static int rtmp_handler_onpublish(void* param, const char* app, const char* stream, const char* type)
  217. {
  218. struct aio_rtmp_session_t* session;
  219. session = (struct aio_rtmp_session_t*)param;
  220. session->usr = session->server->handle.onpublish(session->server->param, session, app, stream, type);
  221. return session->usr ? 0 : -1;
  222. }
  223. static int rtmp_handler_onscript(void* param, const void* data, size_t bytes, uint32_t timestamp)
  224. {
  225. struct aio_rtmp_session_t* session;
  226. session = (struct aio_rtmp_session_t*)param;
  227. if (session->server->handle.onscript && session->usr)
  228. return session->server->handle.onscript(session->usr, data, bytes, timestamp);
  229. return 0;
  230. }
  231. static int rtmp_handler_onvideo(void* param, const void* data, size_t bytes, uint32_t timestamp)
  232. {
  233. struct aio_rtmp_session_t* session;
  234. session = (struct aio_rtmp_session_t*)param;
  235. if(session->server->handle.onvideo && session->usr)
  236. return session->server->handle.onvideo(session->usr, data, bytes, timestamp);
  237. return 0;
  238. }
  239. static int rtmp_handler_onaudio(void* param, const void* data, size_t bytes, uint32_t timestamp)
  240. {
  241. struct aio_rtmp_session_t* session;
  242. session = (struct aio_rtmp_session_t*)param;
  243. if(session->server->handle.onaudio && session->usr)
  244. return session->server->handle.onaudio(session->usr, data, bytes, timestamp);
  245. return 0;
  246. }
  247. static int rtmp_handler_ongetduration(void* param, const char* app, const char* stream, double* duration)
  248. {
  249. struct aio_rtmp_session_t* session;
  250. session = (struct aio_rtmp_session_t*)param;
  251. if (session->server->handle.ongetduration)
  252. return session->server->handle.ongetduration(session->server->param, app, stream, duration);
  253. return -EINVAL;
  254. }