Skip to content

Commit 4d58229

Browse files
Viktor Kunovskijihoonl
authored andcommitted
Add PngStreamer (#74)
1 parent 7a45912 commit 4d58229

File tree

4 files changed

+129
-1
lines changed

4 files changed

+129
-1
lines changed

CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ add_executable(${PROJECT_NAME}
4747
src/vp9_streamer.cpp
4848
src/multipart_stream.cpp
4949
src/ros_compressed_streamer.cpp
50-
src/jpeg_streamers.cpp)
50+
src/jpeg_streamers.cpp
51+
src/png_streamers.cpp
52+
)
5153

5254
## Specify libraries to link a library or executable target against
5355
target_link_libraries(${PROJECT_NAME}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#ifndef PNG_STREAMERS_H_
2+
#define PNG_STREAMERS_H_
3+
4+
#include <image_transport/image_transport.h>
5+
#include "web_video_server/image_streamer.h"
6+
#include "async_web_server_cpp/http_request.hpp"
7+
#include "async_web_server_cpp/http_connection.hpp"
8+
#include "web_video_server/multipart_stream.h"
9+
10+
namespace web_video_server
11+
{
12+
13+
class PngStreamer : public ImageTransportImageStreamer
14+
{
15+
public:
16+
PngStreamer(const async_web_server_cpp::HttpRequest &request, async_web_server_cpp::HttpConnectionPtr connection,
17+
ros::NodeHandle& nh);
18+
19+
protected:
20+
virtual void sendImage(const cv::Mat &, const ros::Time &time);
21+
22+
private:
23+
MultipartStream stream_;
24+
int quality_;
25+
};
26+
27+
class PngStreamerType : public ImageStreamerType
28+
{
29+
public:
30+
boost::shared_ptr<ImageStreamer> create_streamer(const async_web_server_cpp::HttpRequest &request,
31+
async_web_server_cpp::HttpConnectionPtr connection,
32+
ros::NodeHandle& nh);
33+
std::string create_viewer(const async_web_server_cpp::HttpRequest &request);
34+
};
35+
36+
class PngSnapshotStreamer : public ImageTransportImageStreamer
37+
{
38+
public:
39+
PngSnapshotStreamer(const async_web_server_cpp::HttpRequest &request,
40+
async_web_server_cpp::HttpConnectionPtr connection, ros::NodeHandle& nh);
41+
42+
protected:
43+
virtual void sendImage(const cv::Mat &, const ros::Time &time);
44+
45+
private:
46+
int quality_;
47+
};
48+
49+
}
50+
51+
#endif

src/png_streamers.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include "web_video_server/png_streamers.h"
2+
#include "async_web_server_cpp/http_reply.hpp"
3+
4+
namespace web_video_server
5+
{
6+
7+
PngStreamer::PngStreamer(const async_web_server_cpp::HttpRequest &request,
8+
async_web_server_cpp::HttpConnectionPtr connection, ros::NodeHandle& nh) :
9+
ImageTransportImageStreamer(request, connection, nh), stream_(connection)
10+
{
11+
quality_ = request.get_query_param_value_or_default<int>("quality", 3);
12+
stream_.sendInitialHeader();
13+
}
14+
15+
void PngStreamer::sendImage(const cv::Mat &img, const ros::Time &time)
16+
{
17+
std::vector<int> encode_params;
18+
encode_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
19+
encode_params.push_back(quality_);
20+
21+
std::vector<uchar> encoded_buffer;
22+
cv::imencode(".png", img, encoded_buffer, encode_params);
23+
24+
stream_.sendPartAndClear(time, "image/png", encoded_buffer);
25+
}
26+
27+
boost::shared_ptr<ImageStreamer> PngStreamerType::create_streamer(const async_web_server_cpp::HttpRequest &request,
28+
async_web_server_cpp::HttpConnectionPtr connection,
29+
ros::NodeHandle& nh)
30+
{
31+
return boost::shared_ptr<ImageStreamer>(new PngStreamer(request, connection, nh));
32+
}
33+
34+
std::string PngStreamerType::create_viewer(const async_web_server_cpp::HttpRequest &request)
35+
{
36+
std::stringstream ss;
37+
ss << "<img src=\"/stream?";
38+
ss << request.query;
39+
ss << "\"></img>";
40+
return ss.str();
41+
}
42+
43+
PngSnapshotStreamer::PngSnapshotStreamer(const async_web_server_cpp::HttpRequest &request,
44+
async_web_server_cpp::HttpConnectionPtr connection,
45+
ros::NodeHandle& nh) :
46+
ImageTransportImageStreamer(request, connection, nh)
47+
{
48+
quality_ = request.get_query_param_value_or_default<int>("quality", 3);
49+
}
50+
51+
void PngSnapshotStreamer::sendImage(const cv::Mat &img, const ros::Time &time)
52+
{
53+
std::vector<int> encode_params;
54+
encode_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
55+
encode_params.push_back(quality_);
56+
57+
std::vector<uchar> encoded_buffer;
58+
cv::imencode(".png", img, encoded_buffer, encode_params);
59+
60+
char stamp[20];
61+
sprintf(stamp, "%.06lf", time.toSec());
62+
async_web_server_cpp::HttpReply::builder(async_web_server_cpp::HttpReply::ok).header("Connection", "close").header(
63+
"Server", "web_video_server").header("Cache-Control",
64+
"no-cache, no-store, must-revalidate, pre-check=0, post-check=0, max-age=0").header(
65+
"X-Timestamp", stamp).header("Pragma", "no-cache").header("Content-type", "image/png").header(
66+
"Access-Control-Allow-Origin", "*").header("Content-Length",
67+
boost::lexical_cast<std::string>(encoded_buffer.size())).write(
68+
connection_);
69+
connection_->write_and_clear(encoded_buffer);
70+
inactive_ = true;
71+
}
72+
73+
}

src/web_video_server.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "web_video_server/web_video_server.h"
99
#include "web_video_server/ros_compressed_streamer.h"
1010
#include "web_video_server/jpeg_streamers.h"
11+
#include "web_video_server/png_streamers.h"
1112
#include "web_video_server/vp8_streamer.h"
1213
#include "web_video_server/h264_streamer.h"
1314
#include "web_video_server/vp9_streamer.h"
@@ -61,6 +62,7 @@ WebVideoServer::WebVideoServer(ros::NodeHandle &nh, ros::NodeHandle &private_nh)
6162
private_nh.param("ros_threads", ros_threads_, 2);
6263

6364
stream_types_["mjpeg"] = boost::shared_ptr<ImageStreamerType>(new MjpegStreamerType());
65+
stream_types_["png"] = boost::shared_ptr<ImageStreamerType>(new PngStreamerType());
6466
stream_types_["ros_compressed"] = boost::shared_ptr<ImageStreamerType>(new RosCompressedStreamerType());
6567
stream_types_["vp8"] = boost::shared_ptr<ImageStreamerType>(new Vp8StreamerType());
6668
stream_types_["h264"] = boost::shared_ptr<ImageStreamerType>(new H264StreamerType());

0 commit comments

Comments
 (0)