whip-service.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "whip-service.h"
  2. const char *audio_codecs[] = {"opus", nullptr};
  3. const char *video_codecs[] = {"h264", "hevc", "av1", nullptr};
  4. WHIPService::WHIPService(obs_data_t *settings, obs_service_t *)
  5. : server(),
  6. bearer_token()
  7. {
  8. Update(settings);
  9. }
  10. void WHIPService::Update(obs_data_t *settings)
  11. {
  12. server = obs_data_get_string(settings, "server");
  13. bearer_token = obs_data_get_string(settings, "bearer_token");
  14. }
  15. obs_properties_t *WHIPService::Properties()
  16. {
  17. obs_properties_t *ppts = obs_properties_create();
  18. obs_properties_add_text(ppts, "server", "URL", OBS_TEXT_DEFAULT);
  19. obs_properties_add_text(ppts, "bearer_token",
  20. obs_module_text("Service.BearerToken"),
  21. OBS_TEXT_PASSWORD);
  22. return ppts;
  23. }
  24. void WHIPService::ApplyEncoderSettings(obs_data_t *video_settings, obs_data_t *)
  25. {
  26. // For now, ensure maximum compatibility with webrtc peers
  27. if (video_settings) {
  28. obs_data_set_int(video_settings, "bf", 0);
  29. obs_data_set_bool(video_settings, "repeat_headers", true);
  30. }
  31. }
  32. const char *WHIPService::GetConnectInfo(enum obs_service_connect_info type)
  33. {
  34. switch (type) {
  35. case OBS_SERVICE_CONNECT_INFO_SERVER_URL:
  36. return server.c_str();
  37. case OBS_SERVICE_CONNECT_INFO_BEARER_TOKEN:
  38. return bearer_token.c_str();
  39. default:
  40. return nullptr;
  41. }
  42. }
  43. bool WHIPService::CanTryToConnect()
  44. {
  45. return !server.empty();
  46. }
  47. void register_whip_service()
  48. {
  49. struct obs_service_info info = {};
  50. info.id = "whip_custom";
  51. info.get_name = [](void *) -> const char * {
  52. return obs_module_text("Service.Name");
  53. };
  54. info.create = [](obs_data_t *settings,
  55. obs_service_t *service) -> void * {
  56. return new WHIPService(settings, service);
  57. };
  58. info.destroy = [](void *priv_data) {
  59. delete static_cast<WHIPService *>(priv_data);
  60. };
  61. info.update = [](void *priv_data, obs_data_t *settings) {
  62. static_cast<WHIPService *>(priv_data)->Update(settings);
  63. };
  64. info.get_properties = [](void *) -> obs_properties_t * {
  65. return WHIPService::Properties();
  66. };
  67. info.get_protocol = [](void *) -> const char * {
  68. return "WHIP";
  69. };
  70. info.get_url = [](void *priv_data) -> const char * {
  71. return static_cast<WHIPService *>(priv_data)->server.c_str();
  72. };
  73. info.get_output_type = [](void *) -> const char * {
  74. return "whip_output";
  75. };
  76. info.apply_encoder_settings = [](void *, obs_data_t *video_settings,
  77. obs_data_t *audio_settings) {
  78. WHIPService::ApplyEncoderSettings(video_settings,
  79. audio_settings);
  80. };
  81. info.get_supported_video_codecs = [](void *) -> const char ** {
  82. return video_codecs;
  83. };
  84. info.get_supported_audio_codecs = [](void *) -> const char ** {
  85. return audio_codecs;
  86. };
  87. info.can_try_to_connect = [](void *priv_data) -> bool {
  88. return static_cast<WHIPService *>(priv_data)->CanTryToConnect();
  89. };
  90. info.get_connect_info = [](void *priv_data,
  91. uint32_t type) -> const char * {
  92. return static_cast<WHIPService *>(priv_data)->GetConnectInfo(
  93. (enum obs_service_connect_info)type);
  94. };
  95. obs_register_service(&info);
  96. }