22 #include "image_processor.h" 23 #include "mjpeg_reply.h" 24 #include "jpeg_stream_producer.h" 25 #include <webview/file_reply.h> 26 #include <webview/error_reply.h> 28 #include <core/exception.h> 29 #include <core/threading/thread_collector.h> 30 #include <config/config.h> 31 #include <logging/logger.h> 32 #include <fvutils/ipc/shm_image.h> 61 thread_col_ = thread_col;
62 baseurl_ = strdup(baseurl);
63 baseurl_len_ = strlen(baseurl_);
70 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) > 40600 71 for (
auto &s : streams_) {
73 std::map<std::string, fawkes::WebviewJpegStreamProducer *>::iterator si;
74 for (si = streams_.begin(); si != streams_.end(); ++si) {
75 std::pair<const std::string, fawkes::WebviewJpegStreamProducer *> &s = *si;
77 thread_col_->remove(s.second);
83 WebviewImageRequestProcessor::get_stream(
const std::string &image_id)
85 if (streams_.find(image_id) == streams_.end()) {
87 std::string cfg_prefix =
"/webview/images/" + image_id +
"/";
88 unsigned int quality = 80;
93 quality = config_->get_uint(
"/webview/images/default/jpeg-quality");
96 fps = config_->get_float(
"/webview/images/default/mjpeg-fps");
99 vflip = config_->get_bool(
"/webview/images/default/jpeg-vflip");
103 quality = config_->get_uint((cfg_prefix +
"jpeg-quality").c_str());
106 fps = config_->get_float((cfg_prefix +
"mjpeg-fps").c_str());
109 vflip = config_->get_bool((cfg_prefix +
"jpeg-vflip").c_str());
115 thread_col_->add(stream);
117 streams_[image_id] = stream;
119 logger_->log_warn(
"WebImageReqProc",
"Failed to open buffer '%s'," 120 " exception follows", image_id.c_str());
121 logger_->log_warn(
"WebImageReqProc", e);
126 return streams_[image_id];
133 if ( strncmp(baseurl_, request->
url().c_str(), baseurl_len_) == 0 ) {
135 std::string subpath = request->
url().substr(baseurl_len_);
137 if (subpath.find(
"/view/") == 0) {
140 std::string::size_type last_dot = subpath.rfind(
".");
141 if (last_dot == std::string::npos) {
144 std::string image_id = subpath.substr(6, last_dot - 6);
145 std::string image_type = subpath.substr(last_dot + 1);
152 if (image_type ==
"jpeg" || image_type ==
"jpg") {
156 std::string body((
char *)buf->
data(), buf->
size());
158 reply->add_header(
"Content-type",
"image/jpeg");
159 reply->set_caching(
false);
161 }
else if (image_type ==
"mjpeg" || image_type ==
"mjpg") {
166 }
else if (subpath ==
"" || subpath ==
"/") {
170 std::list<SharedMemoryImageBufferMetaData> meta_data =
171 SharedMemoryImageBuffer::list_meta_data();
173 if (meta_data.empty()) {
174 *r +=
"<p><b>No image buffers found.</b></p>\n";
176 *r +=
"<h2>Image Buffers</h2>\n";
178 *r +=
"<tr><th>Buffer</th><th>Frame</th><th>Colorspace</th>" 179 "<th>Dimensions</th><th>Memory</th><th>View as</th></tr>\n";
180 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) > 40600 181 for (
auto &m : meta_data) {
183 std::list<SharedMemoryImageBufferMetaData>::iterator mi;
184 for (mi = meta_data.begin(); mi != meta_data.end(); ++mi) {
187 r->
append_body(
"<tr><td>%s</td><td>%s</td><td>%s</td>" 188 "<td>%ux%u</td><td>%zu B</td>" 189 "<td><div class=\"actionlist\"><ul><li><a href=\"%s/view/%s.jpg\">JPEG</a></li>" 190 "<li><a href=\"%s/view/%s.mjpeg\">Stream</a></li></ul></div></td>" 205 logger_->log_error(
"WebImageReqProc",
"Called for invalid base url " 206 "(url: %s, baseurl: %s)", request->
url().c_str(), baseurl_);
virtual ~WebviewImageRequestProcessor()
Destructor.
virtual fawkes::WebReply * process_request(const fawkes::WebRequest *request)
Process a request.
Fawkes library namespace.
const unsigned char * data() const
Get data buffer.
Base class for exceptions in Fawkes.
size_t size() const
Get buffer size.
Dynamic raw file transfer reply.
Web request meta data carrier.
RefPtr<> is a reference-counting shared smartpointer.
void append_body(const char *format,...)
Append to body.
const std::string & url() const
Get URL.
WebviewImageRequestProcessor(const char *baseurl, fawkes::Configuration *config, fawkes::Logger *logger, fawkes::ThreadCollector *thread_col)
Constructor.
Interface for configuration handling.
RefPtr< Buffer > wait_for_next_frame()
Blocks caller until new thread is available.