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.

144 lines
2.7KB

  1. #include "rtp-member-list.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <errno.h>
  6. #define N_SOURCE 2 // unicast(1S + 1R)
  7. struct rtp_member_list
  8. {
  9. struct rtp_member *members[N_SOURCE];
  10. struct rtp_member **ptr;
  11. int count;
  12. int capacity;
  13. };
  14. void* rtp_member_list_create()
  15. {
  16. return (struct rtp_member_list *)calloc(1, sizeof(struct rtp_member_list));
  17. }
  18. void rtp_member_list_destroy(void* members)
  19. {
  20. int i;
  21. struct rtp_member_list *p;
  22. p = (struct rtp_member_list *)members;
  23. for(i = 0; i < p->count; i++)
  24. {
  25. rtp_member_release(i >= N_SOURCE ? p->ptr[i-N_SOURCE] : p->members[i]);
  26. }
  27. if(p->ptr)
  28. {
  29. assert(p->capacity > 0);
  30. free(p->ptr);
  31. }
  32. free(p);
  33. }
  34. int rtp_member_list_count(void* members)
  35. {
  36. struct rtp_member_list *p;
  37. p = (struct rtp_member_list *)members;
  38. return p->count;
  39. }
  40. struct rtp_member* rtp_member_list_get(void* members, int index)
  41. {
  42. struct rtp_member_list *p;
  43. p = (struct rtp_member_list *)members;
  44. if(index >= p->count || index < 0)
  45. return NULL;
  46. return index >= N_SOURCE ? p->ptr[index-N_SOURCE] : p->members[index];
  47. }
  48. struct rtp_member* rtp_member_list_find(void* members, uint32_t ssrc)
  49. {
  50. int i;
  51. struct rtp_member *s;
  52. struct rtp_member_list *p;
  53. p = (struct rtp_member_list *)members;
  54. for(i = 0; i < p->count; i++)
  55. {
  56. s = i < N_SOURCE ? p->members[i] : p->ptr[i-N_SOURCE];
  57. if(s->ssrc == ssrc)
  58. return s;
  59. }
  60. return NULL;
  61. }
  62. int rtp_member_list_add(void* members, struct rtp_member* s)
  63. {
  64. struct rtp_member_list *p;
  65. p = (struct rtp_member_list *)members;
  66. if(p->count >= N_SOURCE)
  67. {
  68. if(p->count - N_SOURCE >= p->capacity)
  69. {
  70. void* ptr;
  71. ptr = (struct rtp_member **)realloc(p->ptr, (p->capacity+8)*sizeof(struct rtp_member*));
  72. if(!ptr)
  73. return -ENOMEM;
  74. p->ptr = ptr;
  75. p->capacity += 8;
  76. }
  77. p->ptr[p->count - N_SOURCE] = s;
  78. }
  79. else
  80. {
  81. p->members[p->count] = s;
  82. }
  83. rtp_member_addref(s);
  84. p->count++;
  85. return 0;
  86. }
  87. int rtp_member_list_delete(void* members, uint32_t ssrc)
  88. {
  89. int i;
  90. struct rtp_member *s;
  91. struct rtp_member_list *p;
  92. p = (struct rtp_member_list *)members;
  93. for(i = 0; i < p->count; i++)
  94. {
  95. s = i < N_SOURCE ? p->members[i] : p->ptr[i-N_SOURCE];
  96. if(s->ssrc != ssrc)
  97. continue;
  98. if(i < N_SOURCE)
  99. {
  100. if(i+1 < N_SOURCE)
  101. {
  102. memmove(p->members + i, p->members+i+1, (N_SOURCE-i-1) * sizeof(struct rtp_member*));
  103. }
  104. if(p->count > N_SOURCE)
  105. {
  106. p->members[N_SOURCE-1] = p->ptr[0];
  107. memmove(p->ptr, p->ptr + 1, (p->count-N_SOURCE-1) * sizeof(struct rtp_member*));
  108. }
  109. }
  110. else
  111. {
  112. if(i + 1 < p->count)
  113. {
  114. memmove(p->ptr + i - N_SOURCE, p->ptr + i + 1 - N_SOURCE, (p->count-i-1) * sizeof(struct rtp_member*));
  115. }
  116. }
  117. rtp_member_release(s);
  118. p->count--;
  119. return 0;
  120. }
  121. return -1; // NOT_FOUND
  122. }