#pragma once #include #include #include #include #include #include #include #include #include #include class WHIPOutput { public: WHIPOutput(obs_data_t *settings, obs_output_t *output); ~WHIPOutput(); bool Start(); void Stop(bool signal = true); void Data(struct encoder_packet *packet); inline size_t GetTotalBytes() { return total_bytes_sent; } inline int GetConnectTime() { return connect_time_ms; } private: void ConfigureAudioTrack(std::string media_stream_id, std::string cname); void ConfigureVideoTrack(std::string media_stream_id, std::string cname); bool Init(); bool Setup(); bool Connect(); void StartThread(); void SendDelete(); void StopThread(bool signal); void Send(void *data, uintptr_t size, uint64_t duration, std::shared_ptr track, std::shared_ptr rtcp_sr_reporter); obs_output_t *output; bool is_av1; std::string endpoint_url; std::string bearer_token; std::string resource_url; std::atomic running; std::mutex start_stop_mutex; std::thread start_stop_thread; uint32_t base_ssrc; std::shared_ptr peer_connection; std::shared_ptr audio_track; std::shared_ptr video_track; std::shared_ptr audio_sr_reporter; std::shared_ptr video_sr_reporter; std::atomic total_bytes_sent; std::atomic connect_time_ms; int64_t start_time_ns; int64_t last_audio_timestamp; int64_t last_video_timestamp; }; void register_whip_output();