22 #include "mjpeg_reply.h"
24 #include <core/exceptions/system.h>
25 #include <core/threading/mutex.h>
26 #include <core/threading/wait_condition.h>
27 #include <fvcams/shmem.h>
28 #include <fvutils/compression/jpeg_compressor.h>
34 using namespace firevision;
48 DynamicMJPEGStreamWebReply::DynamicMJPEGStreamWebReply(
49 std::shared_ptr<WebviewJpegStreamProducer> stream_producer)
56 add_header(
"Content-type",
"multipart/x-mixed-replace;boundary=MJPEG-next-frame");
57 stream_producer_ = stream_producer;
58 stream_producer_->add_subscriber(
this);
69 next_frame_ = other.next_frame_;
71 add_header(
"Content-type",
"multipart/x-mixed-replace;boundary=MJPEG-next-frame");
72 stream_producer_ = other.stream_producer_;
73 stream_producer_->add_subscriber(
this);
79 stream_producer_->remove_subscriber(
this);
80 delete next_buffer_mutex_;
81 delete next_buffer_waitcond_;
91 stream_producer_->remove_subscriber(
this);
92 next_frame_ = other.next_frame_;
94 add_header(
"Content-type",
"multipart/x-mixed-replace;boundary=MJPEG-next-frame");
95 stream_producer_ = other.stream_producer_;
96 stream_producer_->add_subscriber(
this);
110 next_buffer_mutex_->
lock();
111 next_buffer_ = buffer;
113 next_buffer_mutex_->
unlock();
119 if (buf_max_size == 0)
125 next_buffer_mutex_->
lock();
126 while (!next_buffer_) {
127 next_buffer_waitcond_->
wait();
129 buffer_ = next_buffer_;
130 next_buffer_.reset();
131 next_buffer_mutex_->
unlock();
134 if (asprintf(&header,
135 "--MJPEG-next-frame\r\n"
136 "Content-type: image/jpeg\r\n"
137 "Content-length: %zu\r\n"
143 size_t header_len = strlen(header);
144 memcpy(buffer, header, header_len);
145 buffer += header_len;
146 buf_max_size -= header_len;
147 written += header_len;
149 buffer_bytes_written_ = 0;
153 size_t remaining = buffer_->size() - buffer_bytes_written_;
154 if (remaining <= buf_max_size) {
155 memcpy(buffer, buffer_->data() + buffer_bytes_written_, remaining);
157 written += remaining;
159 memcpy(buffer, buffer_->data() + buffer_bytes_written_, buf_max_size);
160 buffer_bytes_written_ += buf_max_size;
161 written += buf_max_size;