#ifndef IMAGE2RTSP_IMAGE2RTSP_HPP #define IMAGE2RTSP_IMAGE2RTSP_HPP #include #include #include #include #include #include "sensor_msgs/msg/image.hpp" #include "sensor_msgs/msg/compressed_image.hpp" #include using namespace std; struct Stream { std::string topic; std::string mountpoint; bool compressed = false; GstAppSrc* appsrc = nullptr; rclcpp::Subscription::SharedPtr sub; rclcpp::Subscription::SharedPtr sub_compressed; }; class Image2rtsp : public rclcpp::Node{ public: Image2rtsp(); GstRTSPServer *rtsp_server; private: vector streams_; vector topics = {"/topic1","/topic2","/topic3"}; vector mountpoints = {"/1","/2","/3"}; vector is_compressed = {false,false,false}; string port; string pipeline; string default_pipeline; string camera_pipeline; string username; string password; bool password_protect; uint framerate; bool local_only; bool camera; void video_mainloop_start(); void setup_auth(const char* username, const char* password); void rtsp_server_add_url(const char *url, const char *sPipeline, GstElement **appsrc); void topic_callback(const sensor_msgs::msg::Image::SharedPtr msg, Stream* stream); void compressed_topic_callback(const sensor_msgs::msg::CompressedImage::SharedPtr msg, Stream* stream); uint extract_framerate(const std::string& pipeline, uint default_framerate); GstRTSPServer *rtsp_server_create(const string &port, const bool local_only); GstCaps *gst_caps_new_from_image(const sensor_msgs::msg::Image::SharedPtr &msg); }; static void media_configure(GstRTSPMediaFactory *factory, GstRTSPMedia *media, GstElement **appsrc); static void *mainloop(void *arg); static gboolean session_cleanup(Image2rtsp *node, rclcpp::Logger logger, gboolean ignored); #endif // IMAGE2RTSP_IMAGE2RTSP_HPP