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;
DynamicMJPEGStreamWebReply(std::shared_ptr< WebviewJpegStreamProducer > stream_producer)
Constructor.
Wait until a given condition holds.
virtual ~DynamicMJPEGStreamWebReply()
Destructor.
Fawkes library namespace.
void unlock()
Unlock the mutex.
void wake_all()
Wake up all waiting threads.
virtual size_t size()
Total size of the web reply.
virtual void handle_buffer(std::shared_ptr< WebviewJpegStreamProducer::Buffer > buffer)
Notification if a new buffer is available.
Dynamic raw file transfer reply.
void wait()
Wait for the condition forever.
DynamicMJPEGStreamWebReply & operator=(const DynamicMJPEGStreamWebReply &other)
Assignment operator.
void add_header(const std::string &header, const std::string &content)
Add a HTTP header.
virtual size_t next_chunk(size_t pos, char *buffer, size_t buf_max_size)
Get data of next chunk.
void lock()
Lock this mutex.
Mutex mutual exclusion lock.