whip-output.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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, std::string cname);
  23. void ConfigureVideoTrack(std::string media_stream_id, std::string cname);
  24. bool Init();
  25. bool Setup();
  26. bool Connect();
  27. void StartThread();
  28. void SendDelete();
  29. void StopThread(bool signal);
  30. void ParseLinkHeader(std::string linkHeader, std::vector<rtc::IceServer> &iceServers);
  31. void Send(void *data, uintptr_t size, uint64_t duration, std::shared_ptr<rtc::Track> track,
  32. std::shared_ptr<rtc::RtcpSrReporter> rtcp_sr_reporter);
  33. obs_output_t *output;
  34. std::string endpoint_url;
  35. std::string bearer_token;
  36. std::string resource_url;
  37. std::atomic<bool> running;
  38. std::mutex start_stop_mutex;
  39. std::thread start_stop_thread;
  40. uint32_t base_ssrc;
  41. std::shared_ptr<rtc::PeerConnection> peer_connection;
  42. std::shared_ptr<rtc::Track> audio_track;
  43. std::shared_ptr<rtc::Track> video_track;
  44. std::shared_ptr<rtc::RtcpSrReporter> audio_sr_reporter;
  45. std::shared_ptr<rtc::RtcpSrReporter> video_sr_reporter;
  46. std::atomic<size_t> total_bytes_sent;
  47. std::atomic<int> connect_time_ms;
  48. int64_t start_time_ns;
  49. int64_t last_audio_timestamp;
  50. int64_t last_video_timestamp;
  51. };
  52. void register_whip_output();