whip-output.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 Send(void *data, uintptr_t size, uint64_t duration,
  33. std::shared_ptr<rtc::Track> track,
  34. std::shared_ptr<rtc::RtcpSrReporter> rtcp_sr_reporter);
  35. obs_output_t *output;
  36. std::string endpoint_url;
  37. std::string bearer_token;
  38. std::string resource_url;
  39. std::atomic<bool> running;
  40. std::mutex start_stop_mutex;
  41. std::thread start_stop_thread;
  42. uint32_t base_ssrc;
  43. std::shared_ptr<rtc::PeerConnection> peer_connection;
  44. std::shared_ptr<rtc::Track> audio_track;
  45. std::shared_ptr<rtc::Track> video_track;
  46. std::shared_ptr<rtc::RtcpSrReporter> audio_sr_reporter;
  47. std::shared_ptr<rtc::RtcpSrReporter> video_sr_reporter;
  48. std::atomic<size_t> total_bytes_sent;
  49. std::atomic<int> connect_time_ms;
  50. int64_t start_time_ns;
  51. int64_t last_audio_timestamp;
  52. int64_t last_video_timestamp;
  53. };
  54. void register_whip_output();