Skip to content

Commit 1c7502c

Browse files
committed
Pass weak node pointer to streamers to avoid cyclic dependency
1 parent 36cbb92 commit 1c7502c

19 files changed

+199
-109
lines changed

include/web_video_server/streamer.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
#include "async_web_server_cpp/http_connection.hpp"
3939
#include "async_web_server_cpp/http_request.hpp"
40+
#include "rclcpp/logger.hpp"
4041
#include "rclcpp/node.hpp"
4142

4243
namespace web_video_server
@@ -51,7 +52,8 @@ class StreamerInterface
5152
StreamerInterface(
5253
const async_web_server_cpp::HttpRequest & request,
5354
async_web_server_cpp::HttpConnectionPtr connection,
54-
rclcpp::Node::SharedPtr node);
55+
rclcpp::Node::WeakPtr node,
56+
std::string logger_name = "streamer");
5557
virtual ~StreamerInterface();
5658

5759
/**
@@ -84,9 +86,12 @@ class StreamerInterface
8486
}
8587

8688
protected:
89+
rclcpp::Node::SharedPtr lock_node() const;
90+
8791
async_web_server_cpp::HttpConnectionPtr connection_;
8892
async_web_server_cpp::HttpRequest request_;
89-
rclcpp::Node::SharedPtr node_;
93+
rclcpp::Node::WeakPtr node_;
94+
rclcpp::Logger logger_;
9095
bool inactive_;
9196
std::string topic_;
9297
};
@@ -116,7 +121,7 @@ class StreamerFactoryInterface
116121
virtual std::shared_ptr<StreamerInterface> create_streamer(
117122
const async_web_server_cpp::HttpRequest & request,
118123
async_web_server_cpp::HttpConnectionPtr connection,
119-
rclcpp::Node::SharedPtr node) = 0;
124+
rclcpp::Node::WeakPtr node) = 0;
120125

121126
/**
122127
* @brief Creates HTML code for embedding a viewer for this streamer.

include/web_video_server/streamers/h264_streamer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class H264Streamer : public LibavStreamerBase
5050
H264Streamer(
5151
const async_web_server_cpp::HttpRequest & request,
5252
async_web_server_cpp::HttpConnectionPtr connection,
53-
rclcpp::Node::SharedPtr node);
53+
rclcpp::Node::WeakPtr node);
5454
~H264Streamer();
5555

5656
protected:
@@ -65,7 +65,7 @@ class H264StreamerFactory : public LibavStreamerFactoryBase
6565
std::shared_ptr<StreamerInterface> create_streamer(
6666
const async_web_server_cpp::HttpRequest & request,
6767
async_web_server_cpp::HttpConnectionPtr connection,
68-
rclcpp::Node::SharedPtr node);
68+
rclcpp::Node::WeakPtr node);
6969
};
7070

7171
} // namespace streamers

include/web_video_server/streamers/image_transport_streamer.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#pragma once
3131

3232
#include <chrono>
33+
#include <memory>
3334
#include <mutex>
3435
#include <string>
3536
#include <vector>
@@ -60,7 +61,8 @@ class ImageTransportStreamerBase : public StreamerInterface
6061
ImageTransportStreamerBase(
6162
const async_web_server_cpp::HttpRequest & request,
6263
async_web_server_cpp::HttpConnectionPtr connection,
63-
rclcpp::Node::SharedPtr node);
64+
rclcpp::Node::WeakPtr node,
65+
std::string logger_name = "image_transport_streamer");
6466
virtual ~ImageTransportStreamerBase();
6567

6668
virtual void start();
@@ -86,7 +88,9 @@ class ImageTransportStreamerBase : public StreamerInterface
8688
bool initialized_;
8789

8890
void image_callback(const sensor_msgs::msg::Image::ConstSharedPtr & msg);
89-
void try_send_image(const cv::Mat & img, const std::chrono::steady_clock::time_point & time);
91+
void try_send_image(
92+
const cv::Mat & img, const std::chrono::steady_clock::time_point & time,
93+
rclcpp::Node & node);
9094
};
9195

9296
class ImageTransportStreamerFactoryBase : public StreamerFactoryInterface

include/web_video_server/streamers/jpeg_streamers.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class MjpegStreamer : public ImageTransportStreamerBase
5555
MjpegStreamer(
5656
const async_web_server_cpp::HttpRequest & request,
5757
async_web_server_cpp::HttpConnectionPtr connection,
58-
rclcpp::Node::SharedPtr node);
58+
rclcpp::Node::WeakPtr node);
5959
~MjpegStreamer();
6060

6161
protected:
@@ -73,15 +73,16 @@ class MjpegStreamerFactory : public ImageTransportStreamerFactoryBase
7373
std::shared_ptr<StreamerInterface> create_streamer(
7474
const async_web_server_cpp::HttpRequest & request,
7575
async_web_server_cpp::HttpConnectionPtr connection,
76-
rclcpp::Node::SharedPtr node);
76+
rclcpp::Node::WeakPtr node);
7777
};
7878

7979
class JpegSnapshotStreamer : public ImageTransportStreamerBase
8080
{
8181
public:
8282
JpegSnapshotStreamer(
8383
const async_web_server_cpp::HttpRequest & request,
84-
async_web_server_cpp::HttpConnectionPtr connection, rclcpp::Node::SharedPtr node);
84+
async_web_server_cpp::HttpConnectionPtr connection,
85+
rclcpp::Node::WeakPtr node);
8586
~JpegSnapshotStreamer();
8687

8788
protected:
@@ -99,7 +100,7 @@ class JpegSnapshotStreamerFactory : public ImageTransportSnapshotStreamerFactory
99100
std::shared_ptr<StreamerInterface> create_streamer(
100101
const async_web_server_cpp::HttpRequest & request,
101102
async_web_server_cpp::HttpConnectionPtr connection,
102-
rclcpp::Node::SharedPtr node);
103+
rclcpp::Node::WeakPtr node);
103104
};
104105

105106
} // namespace streamers

include/web_video_server/streamers/libav_streamer.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,10 @@ class LibavStreamerBase : public ImageTransportStreamerBase
6868
LibavStreamerBase(
6969
const async_web_server_cpp::HttpRequest & request,
7070
async_web_server_cpp::HttpConnectionPtr connection,
71-
rclcpp::Node::SharedPtr node, const std::string & format_name, const std::string & codec_name,
71+
rclcpp::Node::WeakPtr node,
72+
std::string logger_name,
73+
const std::string & format_name,
74+
const std::string & codec_name,
7275
const std::string & content_type);
7376

7477
~LibavStreamerBase();

include/web_video_server/streamers/png_streamers.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class PngStreamer : public ImageTransportStreamerBase
5555
PngStreamer(
5656
const async_web_server_cpp::HttpRequest & request,
5757
async_web_server_cpp::HttpConnectionPtr connection,
58-
rclcpp::Node::SharedPtr node);
58+
rclcpp::Node::WeakPtr node);
5959
~PngStreamer();
6060

6161
protected:
@@ -74,15 +74,16 @@ class PngStreamerFactory : public ImageTransportStreamerFactoryBase
7474
std::shared_ptr<StreamerInterface> create_streamer(
7575
const async_web_server_cpp::HttpRequest & request,
7676
async_web_server_cpp::HttpConnectionPtr connection,
77-
rclcpp::Node::SharedPtr node);
77+
rclcpp::Node::WeakPtr node);
7878
};
7979

8080
class PngSnapshotStreamer : public ImageTransportStreamerBase
8181
{
8282
public:
8383
PngSnapshotStreamer(
8484
const async_web_server_cpp::HttpRequest & request,
85-
async_web_server_cpp::HttpConnectionPtr connection, rclcpp::Node::SharedPtr node);
85+
async_web_server_cpp::HttpConnectionPtr connection,
86+
rclcpp::Node::WeakPtr node);
8687
~PngSnapshotStreamer();
8788

8889
protected:
@@ -101,7 +102,7 @@ class PngSnapshotStreamerFactory : public ImageTransportSnapshotStreamerFactoryB
101102
std::shared_ptr<StreamerInterface> create_streamer(
102103
const async_web_server_cpp::HttpRequest & request,
103104
async_web_server_cpp::HttpConnectionPtr connection,
104-
rclcpp::Node::SharedPtr node);
105+
rclcpp::Node::WeakPtr node);
105106
};
106107

107108
} // namespace streamers

include/web_video_server/streamers/ros_compressed_streamer.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class RosCompressedStreamer : public StreamerInterface
5656
RosCompressedStreamer(
5757
const async_web_server_cpp::HttpRequest & request,
5858
async_web_server_cpp::HttpConnectionPtr connection,
59-
rclcpp::Node::SharedPtr node);
59+
rclcpp::Node::WeakPtr node);
6060
~RosCompressedStreamer();
6161
virtual void start();
6262
virtual void restream_frame(std::chrono::duration<double> max_age);
@@ -83,7 +83,7 @@ class RosCompressedStreamerFactory : public StreamerFactoryInterface
8383
std::shared_ptr<StreamerInterface> create_streamer(
8484
const async_web_server_cpp::HttpRequest & request,
8585
async_web_server_cpp::HttpConnectionPtr connection,
86-
rclcpp::Node::SharedPtr node);
86+
rclcpp::Node::WeakPtr node);
8787
std::vector<std::string> get_available_topics(rclcpp::Node & node);
8888
};
8989

@@ -93,7 +93,7 @@ class RosCompressedSnapshotStreamer : public StreamerInterface
9393
RosCompressedSnapshotStreamer(
9494
const async_web_server_cpp::HttpRequest & request,
9595
async_web_server_cpp::HttpConnectionPtr connection,
96-
rclcpp::Node::SharedPtr node);
96+
rclcpp::Node::WeakPtr node);
9797
~RosCompressedSnapshotStreamer();
9898
virtual void start();
9999
virtual void restream_frame(std::chrono::duration<double> max_age);
@@ -117,7 +117,7 @@ class RosCompressedSnapshotStreamerFactory : public SnapshotStreamerFactoryInter
117117
std::shared_ptr<StreamerInterface> create_streamer(
118118
const async_web_server_cpp::HttpRequest & request,
119119
async_web_server_cpp::HttpConnectionPtr connection,
120-
rclcpp::Node::SharedPtr node);
120+
rclcpp::Node::WeakPtr node);
121121
std::vector<std::string> get_available_topics(rclcpp::Node & node);
122122
};
123123

include/web_video_server/streamers/vp8_streamer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class Vp8Streamer : public LibavStreamerBase
5151
Vp8Streamer(
5252
const async_web_server_cpp::HttpRequest & request,
5353
async_web_server_cpp::HttpConnectionPtr connection,
54-
rclcpp::Node::SharedPtr node);
54+
rclcpp::Node::WeakPtr node);
5555
~Vp8Streamer();
5656

5757
protected:
@@ -68,7 +68,7 @@ class Vp8StreamerFactory : public LibavStreamerFactoryBase
6868
std::shared_ptr<StreamerInterface> create_streamer(
6969
const async_web_server_cpp::HttpRequest & request,
7070
async_web_server_cpp::HttpConnectionPtr connection,
71-
rclcpp::Node::SharedPtr node);
71+
rclcpp::Node::WeakPtr node);
7272
};
7373

7474
} // namespace streamers

include/web_video_server/streamers/vp9_streamer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class Vp9Streamer : public LibavStreamerBase
5050
Vp9Streamer(
5151
const async_web_server_cpp::HttpRequest & request,
5252
async_web_server_cpp::HttpConnectionPtr connection,
53-
rclcpp::Node::SharedPtr node);
53+
rclcpp::Node::WeakPtr node);
5454
~Vp9Streamer();
5555

5656
protected:
@@ -64,7 +64,7 @@ class Vp9StreamerFactory : public LibavStreamerFactoryBase
6464
std::shared_ptr<StreamerInterface> create_streamer(
6565
const async_web_server_cpp::HttpRequest & request,
6666
async_web_server_cpp::HttpConnectionPtr connection,
67-
rclcpp::Node::SharedPtr node);
67+
rclcpp::Node::WeakPtr node);
6868
};
6969

7070
} // namespace streamers

src/streamer.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <sstream>
3535

3636
#include "rclcpp/node.hpp"
37+
#include "rclcpp/logging.hpp"
3738

3839
#include "async_web_server_cpp/http_connection.hpp"
3940
#include "async_web_server_cpp/http_request.hpp"
@@ -43,16 +44,28 @@ namespace web_video_server
4344

4445
StreamerInterface::StreamerInterface(
4546
const async_web_server_cpp::HttpRequest & request,
46-
async_web_server_cpp::HttpConnectionPtr connection, rclcpp::Node::SharedPtr node)
47-
: connection_(connection), request_(request), node_(node), inactive_(false)
47+
async_web_server_cpp::HttpConnectionPtr connection,
48+
rclcpp::Node::WeakPtr node,
49+
std::string logger_name)
50+
: connection_(connection), request_(request), node_(std::move(node)),
51+
logger_(node_.lock()->get_logger().get_child(logger_name)), inactive_(false),
52+
topic_(request.get_query_param_value_or_default("topic", ""))
4853
{
49-
topic_ = request.get_query_param_value_or_default("topic", "");
5054
}
5155

5256
StreamerInterface::~StreamerInterface()
5357
{
5458
}
5559

60+
rclcpp::Node::SharedPtr StreamerInterface::lock_node() const
61+
{
62+
auto node = node_.lock();
63+
if (!node) {
64+
RCLCPP_WARN(logger_, "Unable to access node because the owning node has been destroyed");
65+
}
66+
return node;
67+
}
68+
5669
std::string StreamerFactoryInterface::create_viewer(
5770
const async_web_server_cpp::HttpRequest & request)
5871
{

0 commit comments

Comments
 (0)