whip-output.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #pragma once
  2. #include <obs-module.h>
  3. #include <util/curl/curl-helper.h>
  4. #include <util/platform.h>
  5. #include <util/base.h>
  6. #include <util/dstr.h>
  7. #include <string>
  8. #include <atomic>
  9. #include <mutex>
  10. #include <thread>
  11. #include <rtc/rtc.hpp>
  12. class WHIPOutput {
  13. public:
  14. WHIPOutput(obs_data_t *settings, obs_output_t *output);
  15. ~WHIPOutput();
  16. bool Start();
  17. void Stop(bool signal = true);
  18. void Data(struct encoder_packet *packet);
  19. inline size_t GetTotalBytes() { return total_bytes_sent; }
  20. inline int GetConnectTime() { return connect_time_ms; }
  21. private:
  22. void ConfigureAudioTrack(std::string media_stream_id,
  23. std::string cname);
  24. void ConfigureVideoTrack(std::string media_stream_id,
  25. std::string cname);
  26. bool Init();
  27. bool Setup();
  28. bool Connect();
  29. void StartThread();
  30. void SendDelete();
  31. void StopThread(bool signal);
  32. void ParseLinkHeader(std::string linkHeader,
  33. std::vector<rtc::IceServer> &iceServers);
  34. void Send(void *data, uintptr_t size, uint64_t duration,
  35. std::shared_ptr<rtc::Track> track,
  36. std::shared_ptr<rtc::RtcpSrReporter> rtcp_sr_reporter);
  37. obs_output_t *output;
  38. std::string endpoint_url;
  39. std::string bearer_token;
  40. std::string resource_url;
  41. std::atomic<bool> running;
  42. std::mutex start_stop_mutex;
  43. std::thread start_stop_thread;
  44. uint32_t base_ssrc;
  45. std::shared_ptr<rtc::PeerConnection> peer_connection;
  46. std::shared_ptr<rtc::Track> audio_track;
  47. std::shared_ptr<rtc::Track> video_track;
  48. std::shared_ptr<rtc::RtcpSrReporter> audio_sr_reporter;
  49. std::shared_ptr<rtc::RtcpSrReporter> video_sr_reporter;
  50. std::atomic<size_t> total_bytes_sent;
  51. std::atomic<int> connect_time_ms;
  52. int64_t start_time_ns;
  53. int64_t last_audio_timestamp;
  54. int64_t last_video_timestamp;
  55. };
  56. void register_whip_output();