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.

119 lines
3.1KB

  1. #include "sdp-options.h"
  2. #include "sdp.h"
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #if defined(OS_WINDOWS)
  6. #define strcasecmp _stricmp
  7. #endif
  8. struct sdp_attr_value_t
  9. {
  10. int value;
  11. const char* name;
  12. };
  13. static struct sdp_attr_value_t s_setups[] = {
  14. { SDP_A_SETUP_ACTPASS, "actpass"},
  15. { SDP_A_SETUP_PASSIVE, "passive"},
  16. { SDP_A_SETUP_ACTIVE, "active"},
  17. { SDP_A_SETUP_HOLDCONN, "holdconn"},
  18. };
  19. static struct sdp_attr_value_t s_protos[] = {
  20. { SDP_M_PROTO_RTP_AVP, "RTP/AVP"},
  21. { SDP_M_PROTO_RTP_AVPF, "RTP/AVPF"},
  22. { SDP_M_PROTO_RTP_SAVP, "RTP/SAVP"},
  23. { SDP_M_PROTO_RTP_SAVPF, "RTP/SAVPF"},
  24. { SDP_M_PROTO_RTP_AVP_TCP, "TCP/RTP/AVP"},
  25. { SDP_M_PROTO_RTP_AVPF_TCP, "TCP/RTP/AVPF"},
  26. { SDP_M_PROTO_RTP_SAVP_TCP, "TCP/RTP/SAVP"},
  27. { SDP_M_PROTO_RTP_SAVPF_TCP, "TCP/RTP/SAVPF"},
  28. { SDP_M_PROTO_RTP_SAVP_DTLS_TCP, "TCP/DTLS/RTP/SAVP"},
  29. { SDP_M_PROTO_RTP_SAVPF_DTLS_TCP, "TCP/DTLS/RTP/SAVPF"},
  30. { SDP_M_PROTO_RTP_AVP_TCP_TLS, "TCP/TLS/RTP/AVP"},
  31. { SDP_M_PROTO_RTP_AVPF_TCP_TLS, "TCP/TLS/RTP/AVPF"},
  32. { SDP_M_PROTO_RTP_SAVP_TLS, "UDP/TLS/RTP/SAVP"},
  33. { SDP_M_PROTO_RTP_SAVPF_TLS, "UDP/TLS/RTP/SAVPF"},
  34. { SDP_M_PROTO_RTP_SAVP_TLS_DCCP, "DCCP/TLS/RTP/SAVP"},
  35. { SDP_M_PROTO_RTP_SAVPF_TLS_DCCP, "DCCP/TLS/RTP/SAVPF"},
  36. { SDP_M_PROTO_RAW, "raw"},
  37. { SDP_M_PROTO_UDP, "udp"},
  38. { SDP_M_PROTO_SCTP_DTLS, "UDP/DTLS/SCTP"},
  39. { SDP_M_PROTO_SCTP_DTLS_TCP, "TCP/DTLS/SCTP"},
  40. { SDP_M_PROTO_TCP, "TCP"},
  41. { SDP_M_PROTO_TLS_TCP, "TCP/TLS"},
  42. // other
  43. { SDP_M_PROTO_RTP_AVP, "RTP/AVP/UDP"},
  44. { SDP_M_PROTO_RTP_AVP_TCP, "RTP/TCP/AVP"},
  45. { SDP_M_PROTO_RTP_AVP_TCP, "RTP/AVP/TCP"},
  46. };
  47. static struct sdp_attr_value_t s_modes[] = {
  48. { SDP_A_SENDRECV, "sendrecv"},
  49. { SDP_A_SENDONLY, "sendonly"},
  50. { SDP_A_RECVONLY, "recvonly"},
  51. { SDP_A_INACTIVE, "inactive"},
  52. };
  53. static struct sdp_attr_value_t s_medias[] = {
  54. { SDP_M_MEDIA_UNKOWN, "<none>"},
  55. { SDP_M_MEDIA_AUDIO, "audio"},
  56. { SDP_M_MEDIA_VIDEO, "video"},
  57. { SDP_M_MEDIA_TEXT, "text"},
  58. { SDP_M_MEDIA_APPLICATION, "application"},
  59. { SDP_M_MEDIA_MESSAGE, "message"},
  60. };
  61. static int sdp_option_find_name(const struct sdp_attr_value_t* attrs, int count, const char* name)
  62. {
  63. int i;
  64. for (i = 0; i < count; i++)
  65. {
  66. if (name && 0 == strcasecmp(name, attrs[i].name))
  67. return i;
  68. }
  69. return -1;
  70. }
  71. static int sdp_option_find_value(const struct sdp_attr_value_t* attrs, int count, int value)
  72. {
  73. int i;
  74. for (i = 0; i < count; i++)
  75. {
  76. if (value == attrs[i].value)
  77. return i;
  78. }
  79. return -1;
  80. }
  81. #define SDP_UTIL_FROM(attr, none) \
  82. int sdp_option_##attr##_from(const char* s) \
  83. { \
  84. int r; \
  85. r = sdp_option_find_name(s_##attr##s, sizeof(s_##attr##s) / sizeof(s_##attr##s[0]), s); \
  86. return r>=0 ? s_##attr##s[r].value : none; \
  87. }
  88. #define SDP_UTIL_TO(attr) \
  89. const char* sdp_option_##attr##_to(int v) \
  90. { \
  91. int r; \
  92. r = sdp_option_find_value(s_##attr##s, sizeof(s_##attr##s) / sizeof(s_##attr##s[0]), v); \
  93. return r>=0 ? s_##attr##s[r].name : ""; \
  94. }
  95. SDP_UTIL_FROM(setup, SDP_A_SETUP_NONE)
  96. SDP_UTIL_TO(setup)
  97. SDP_UTIL_FROM(proto, SDP_M_PROTO_UKNOWN)
  98. SDP_UTIL_TO(proto)
  99. SDP_UTIL_FROM(mode, SDP_A_SENDRECV)
  100. SDP_UTIL_TO(mode)
  101. SDP_UTIL_FROM(media, SDP_M_MEDIA_UNKOWN)
  102. SDP_UTIL_TO(media)