25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

180 satır
5.3KB

  1. #include "aio-rtmp-client.h"
  2. #include "aio-rtmp-transport.h"
  3. #include "rtmp-client.h"
  4. #include "sockutil.h"
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <assert.h>
  8. #define TIMEOUT_RECV 5000
  9. #define TIMEOUT_SEND 5000
  10. struct aio_rtmp_client_t
  11. {
  12. int ready;
  13. int publish;
  14. aio_rtmp_transport_t* aio;
  15. rtmp_client_t* rtmp;
  16. void* param;
  17. struct aio_rtmp_client_handler_t handler;
  18. };
  19. static void aio_rtmp_transport_ondestroy(void* param);
  20. static void aio_rtmp_transport_onsend(void* param, int code, size_t bytes);
  21. static void aio_rtmp_transport_onrecv(void* param, int code, const void* data, size_t bytes);
  22. static int rtmp_client_send(void* param, const void* header, size_t len, const void* payload, size_t bytes);
  23. static int rtmp_client_onaudio(void* param, const void* audio, size_t bytes, uint32_t timestamp);
  24. static int rtmp_client_onvideo(void* param, const void* video, size_t bytes, uint32_t timestamp);
  25. static int rtmp_client_onscript(void* param, const void* script, size_t bytes, uint32_t timestamp);
  26. struct aio_rtmp_client_t* aio_rtmp_client_create(aio_socket_t aio, const char* app, const char* stream, const char* tcurl, struct aio_rtmp_client_handler_t* handler, void* param)
  27. {
  28. struct aio_rtmp_client_t* c;
  29. struct aio_rtmp_handler_t h;
  30. struct rtmp_client_handler_t h2;
  31. c = (struct aio_rtmp_client_t*)calloc(1, sizeof(*c));
  32. if (c)
  33. {
  34. memcpy(&c->handler, handler, sizeof(c->handler));
  35. c->param = param;
  36. h2.send = rtmp_client_send;
  37. h2.onaudio = rtmp_client_onaudio;
  38. h2.onvideo = rtmp_client_onvideo;
  39. h2.onscript = rtmp_client_onscript;
  40. c->rtmp = rtmp_client_create(app, stream, tcurl, c, &h2);
  41. h.onrecv = aio_rtmp_transport_onrecv;
  42. h.onsend = aio_rtmp_transport_onsend;
  43. h.ondestroy = aio_rtmp_transport_ondestroy;
  44. c->aio = aio_rtmp_transport_create(aio, &h, c);
  45. aio_rtmp_transport_set_timeout(c->aio, TIMEOUT_RECV, TIMEOUT_SEND);
  46. }
  47. return c;
  48. }
  49. void aio_rtmp_client_destroy(struct aio_rtmp_client_t* client)
  50. {
  51. aio_rtmp_transport_destroy(client->aio);
  52. }
  53. int aio_rtmp_client_start(struct aio_rtmp_client_t* client, int publish)
  54. {
  55. aio_rtmp_transport_start(client->aio);
  56. client->publish = publish;
  57. return rtmp_client_start(client->rtmp, publish);
  58. }
  59. int aio_rtmp_client_stop(struct aio_rtmp_client_t* client)
  60. {
  61. return rtmp_client_stop(client->rtmp);
  62. }
  63. int aio_rtmp_client_pause(struct aio_rtmp_client_t* client, int pause)
  64. {
  65. return rtmp_client_pause(client->rtmp, pause);
  66. }
  67. int aio_rtmp_client_seek(struct aio_rtmp_client_t* client, double timestamp)
  68. {
  69. return rtmp_client_seek(client->rtmp, timestamp);
  70. }
  71. int aio_rtmp_client_send_audio(struct aio_rtmp_client_t* client, const void* flv, size_t bytes, uint32_t timestamp)
  72. {
  73. return rtmp_client_push_audio(client->rtmp, flv, bytes, timestamp);
  74. }
  75. int aio_rtmp_client_send_video(struct aio_rtmp_client_t* client, const void* flv, size_t bytes, uint32_t timestamp)
  76. {
  77. return rtmp_client_push_video(client->rtmp, flv, bytes, timestamp);
  78. }
  79. int aio_rtmp_client_send_script(struct aio_rtmp_client_t* client, const void* flv, size_t bytes, uint32_t timestamp)
  80. {
  81. return rtmp_client_push_script(client->rtmp, flv, bytes, timestamp);
  82. }
  83. size_t aio_rtmp_client_get_unsend(aio_rtmp_client_t* client)
  84. {
  85. return aio_rtmp_transport_get_unsend(client->aio);
  86. }
  87. static int rtmp_client_send(void* param, const void* header, size_t len, const void* payload, size_t bytes)
  88. {
  89. struct aio_rtmp_client_t* client;
  90. client = (struct aio_rtmp_client_t*)param;
  91. return aio_rtmp_transport_send(client->aio, header, len, payload, bytes);
  92. }
  93. static int rtmp_client_onaudio(void* param, const void* audio, size_t bytes, uint32_t timestamp)
  94. {
  95. struct aio_rtmp_client_t* client;
  96. client = (struct aio_rtmp_client_t*)param;
  97. return client->handler.onaudio(client->param, audio, bytes, timestamp);
  98. }
  99. static int rtmp_client_onvideo(void* param, const void* video, size_t bytes, uint32_t timestamp)
  100. {
  101. struct aio_rtmp_client_t* client;
  102. client = (struct aio_rtmp_client_t*)param;
  103. return client->handler.onvideo(client->param, video, bytes, timestamp);
  104. }
  105. static int rtmp_client_onscript(void* param, const void* script, size_t bytes, uint32_t timestamp)
  106. {
  107. struct aio_rtmp_client_t* client;
  108. client = (struct aio_rtmp_client_t*)param;
  109. return client->handler.onscript(client->param, script, bytes, timestamp);
  110. }
  111. static void aio_rtmp_transport_onsend(void* param, int code, size_t bytes)
  112. {
  113. struct aio_rtmp_client_t* client;
  114. client = (struct aio_rtmp_client_t*)param;
  115. if (0 == code)
  116. {
  117. if (client->handler.onsend)
  118. client->handler.onsend(client->param, bytes);
  119. }
  120. else
  121. {
  122. client->handler.onerror(client->param, code);
  123. }
  124. }
  125. static void aio_rtmp_transport_onrecv(void* param, int code, const void* data, size_t bytes)
  126. {
  127. struct aio_rtmp_client_t* client;
  128. client = (struct aio_rtmp_client_t*)param;
  129. if (0 == code)
  130. {
  131. code = rtmp_client_input(client->rtmp, data, bytes);
  132. if (0 == client->publish && 0 == client->ready && 4/*RTMP_STATE_START*/ == rtmp_client_getstate(client->rtmp))
  133. {
  134. client->ready = 1;
  135. if (client->handler.onready)
  136. client->handler.onready(client->param);
  137. }
  138. }
  139. if (0 != code)
  140. client->handler.onerror(client->param, code);
  141. }
  142. static void aio_rtmp_transport_ondestroy(void* param)
  143. {
  144. struct aio_rtmp_client_t* client;
  145. client = (struct aio_rtmp_client_t*)param;
  146. if (client->handler.ondestroy)
  147. client->handler.ondestroy(client->param);
  148. if (client->rtmp)
  149. rtmp_client_destroy(client->rtmp);
  150. free(client);
  151. }