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.

143 lines
3.3KB

  1. #include "rtmp-server.h"
  2. #include "sys/thread.h"
  3. #include "sys/system.h"
  4. #include "sys/path.h"
  5. #include <string.h>
  6. #include <assert.h>
  7. #include <vector>
  8. #define N 5000
  9. #define M 8
  10. struct rtmp_server_publish_benchmark_t
  11. {
  12. rtmp_server_t* rtmp;
  13. size_t i;
  14. };
  15. struct rtmp_raw_packet_t
  16. {
  17. const uint8_t* data;
  18. uint32_t size;
  19. uint32_t timestamp;
  20. };
  21. static uint64_t s_clock;
  22. static std::vector<rtmp_raw_packet_t> s_pkts;
  23. static rtmp_server_publish_benchmark_t s_servers[N];
  24. static void load_file(const char* filename, void** p, int64_t* n)
  25. {
  26. *n = path_filesize(filename);
  27. *p = malloc(*n);
  28. FILE* fp = fopen(filename, "rb");
  29. fread(*p, 1, *n, fp);
  30. fclose(fp);
  31. }
  32. static void init_packets(const char* filename)
  33. {
  34. // TODO: free(p)
  35. int64_t n;
  36. uint8_t* p;
  37. load_file(filename, (void**)&p, &n);
  38. for (int64_t i = 0; i < n; i += 8)
  39. {
  40. struct rtmp_raw_packet_t pkt;
  41. pkt.size = *(uint32_t*)(p + i);
  42. pkt.timestamp = *(uint32_t*)(p + i + 4);
  43. pkt.data = p + i + 8;
  44. i += pkt.size;
  45. s_pkts.push_back(pkt);
  46. }
  47. }
  48. static void rtmp_server_publish_input(rtmp_server_publish_benchmark_t* rtmp, uint64_t now)
  49. {
  50. if (rtmp->i >= s_pkts.size())
  51. return;
  52. for(int i = 0; 1; i++)
  53. {
  54. rtmp_raw_packet_t& pkt = s_pkts[rtmp->i];
  55. if (s_clock + pkt.timestamp > now)
  56. {
  57. if (i > 50) printf("cycle %d\n", i);
  58. return;
  59. }
  60. rtmp_server_input(rtmp->rtmp, pkt.data, pkt.size);
  61. ++rtmp->i;
  62. }
  63. }
  64. static int STDCALL rtmp_server_onthread(void* param)
  65. {
  66. int idx = (int)(intptr_t)param;
  67. while (1)
  68. {
  69. uint64_t now = system_clock();
  70. for (int i = idx; i < N; i += M)
  71. {
  72. rtmp_server_publish_input(s_servers + i, now);
  73. }
  74. system_sleep(10);
  75. }
  76. return 0;
  77. }
  78. static int rtmp_server_send(void* param, const void* header, size_t len, const void* data, size_t bytes)
  79. {
  80. return len + bytes;
  81. }
  82. static int rtmp_server_onpublish(void* param, const char* app, const char* stream, const char* type)
  83. {
  84. return 0;
  85. }
  86. static int rtmp_server_onscript(void* param, const void* script, size_t bytes, uint32_t timestamp)
  87. {
  88. return 0;
  89. }
  90. static int rtmp_server_onvideo(void* param, const void* data, size_t bytes, uint32_t timestamp)
  91. {
  92. return 0;
  93. }
  94. static int rtmp_server_onaudio(void* param, const void* data, size_t bytes, uint32_t timestamp)
  95. {
  96. return 0;
  97. }
  98. void rtmp_server_publish_benchmark_test(const char* bin)
  99. {
  100. init_packets(bin);
  101. for (int i = 0; i < N; i++)
  102. {
  103. struct rtmp_server_handler_t handler;
  104. memset(&handler, 0, sizeof(handler));
  105. handler.send = rtmp_server_send;
  106. handler.onpublish = rtmp_server_onpublish;
  107. handler.onscript = rtmp_server_onscript;
  108. handler.onvideo = rtmp_server_onvideo;
  109. handler.onaudio = rtmp_server_onaudio;
  110. s_servers[i].rtmp = rtmp_server_create(NULL, &handler);
  111. s_servers[i].i = 0;
  112. }
  113. s_clock = system_clock();
  114. for (int i = 0; i < M; i++)
  115. {
  116. // TODO destroy thread
  117. pthread_t thread;
  118. thread_create(&thread, rtmp_server_onthread, (void*)i);
  119. }
  120. assert(s_pkts.size() > 0);
  121. uint32_t duration = s_pkts.rbegin()->timestamp;
  122. system_sleep(duration + 100);
  123. for (int i = 0; i < N; i++)
  124. {
  125. rtmp_server_destroy(s_servers[i].rtmp);
  126. }
  127. }