11#include " web_video_server/image_streamer.h"
22#include < cv_bridge/cv_bridge.h>
3+ #include < iostream>
34
45namespace web_video_server
56{
@@ -11,6 +12,10 @@ ImageStreamer::ImageStreamer(const async_web_server_cpp::HttpRequest &request,
1112 topic_ = request.get_query_param_value_or_default (" topic" , " " );
1213}
1314
15+ ImageStreamer::~ImageStreamer ()
16+ {
17+ }
18+
1419ImageTransportImageStreamer::ImageTransportImageStreamer (const async_web_server_cpp::HttpRequest &request,
1520 async_web_server_cpp::HttpConnectionPtr connection, ros::NodeHandle& nh) :
1621 ImageStreamer (request, connection, nh), it_(nh), initialized_(false )
@@ -21,6 +26,10 @@ ImageTransportImageStreamer::ImageTransportImageStreamer(const async_web_server_
2126 default_transport_ = request.get_query_param_value_or_default (" default_transport" , " raw" );
2227}
2328
29+ ImageTransportImageStreamer::~ImageTransportImageStreamer ()
30+ {
31+ }
32+
2433void ImageTransportImageStreamer::start ()
2534{
2635 image_transport::TransportHints hints (default_transport_);
@@ -41,6 +50,37 @@ void ImageTransportImageStreamer::initialize(const cv::Mat &)
4150{
4251}
4352
53+ void ImageTransportImageStreamer::restreamFrame (double max_age)
54+ {
55+ if (inactive_ || !initialized_ )
56+ return ;
57+ try {
58+ if ( last_frame + ros::Duration (max_age) < ros::Time::now () ) {
59+ boost::mutex::scoped_lock lock (send_mutex_);
60+ sendImage (output_size_image, ros::Time::now () ); // don't update last_frame, it may remain an old value.
61+ }
62+ }
63+ catch (boost::system::system_error &e)
64+ {
65+ // happens when client disconnects
66+ ROS_DEBUG (" system_error exception: %s" , e.what ());
67+ inactive_ = true ;
68+ return ;
69+ }
70+ catch (std::exception &e)
71+ {
72+ ROS_ERROR_THROTTLE (30 , " exception: %s" , e.what ());
73+ inactive_ = true ;
74+ return ;
75+ }
76+ catch (...)
77+ {
78+ ROS_ERROR_THROTTLE (30 , " exception" );
79+ inactive_ = true ;
80+ return ;
81+ }
82+ }
83+
4484void ImageTransportImageStreamer::imageCallback (const sensor_msgs::ImageConstPtr &msg)
4585{
4686 if (inactive_)
@@ -84,7 +124,7 @@ void ImageTransportImageStreamer::imageCallback(const sensor_msgs::ImageConstPtr
84124 cv::flip (img, img, true );
85125 }
86126
87- cv::Mat output_size_image;
127+ boost::mutex::scoped_lock lock (send_mutex_); // protects output_size_image
88128 if (output_width_ != input_width || output_height_ != input_height)
89129 {
90130 cv::Mat img_resized;
@@ -102,7 +142,9 @@ void ImageTransportImageStreamer::imageCallback(const sensor_msgs::ImageConstPtr
102142 initialize (output_size_image);
103143 initialized_ = true ;
104144 }
105- sendImage (output_size_image, msg->header .stamp );
145+
146+ last_frame = ros::Time::now ();
147+ sendImage (output_size_image, last_frame );
106148
107149 }
108150 catch (cv_bridge::Exception &e)
0 commit comments