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