30 static void init_destination(j_compress_ptr cinfo)
36 static boolean empty_output_buffer(j_compress_ptr cinfo)
43 static void term_destination(j_compress_ptr cinfo)
62 const char *MJPEGEncoder::getDeviceName()
72 LOG_ERROR(
"Compression is not supported in MJPEG stream.");
78 if (bufsize != jpegBufferSize)
81 jpegBuffer =
new uint8_t[bufsize];
82 jpegBufferSize = bufsize;
87 int scale =
std::max(1,
static_cast<int>(std::floor(
rawWidth / SCALE_WIDTH)));
122 int MJPEGEncoder::jpeg_compress_8u_gray (
const uint8_t * src, uint16_t width, uint16_t height,
int stride,
int scale,
124 int * destsize,
int quality)
126 struct jpeg_compress_struct cinfo;
127 struct jpeg_error_mgr jerr;
128 struct jpeg_destination_mgr jdest;
129 int out_size = *destsize;
131 cinfo.err = jpeg_std_error (&jerr);
132 jpeg_create_compress (&cinfo);
133 jdest.next_output_byte = dest;
134 jdest.free_in_buffer = out_size;
135 jdest.init_destination = init_destination;
136 jdest.empty_output_buffer = empty_output_buffer;
137 jdest.term_destination = term_destination;
140 cinfo.image_width = width;
141 cinfo.image_height = height;
142 #if JPEG_LIB_VERSION >= 70
143 cinfo.scale_denom = scale;
147 cinfo.input_components = 1;
148 cinfo.in_color_space = JCS_GRAYSCALE;
149 jpeg_set_defaults (&cinfo);
150 jpeg_set_quality (&cinfo, quality,
TRUE);
152 jpeg_start_compress (&cinfo,
TRUE);
153 while (cinfo.next_scanline < height)
155 JSAMPROW row = (JSAMPROW)(src + cinfo.next_scanline * stride);
156 jpeg_write_scanlines (&cinfo, &row, 1);
159 jpeg_finish_compress (&cinfo);
160 *destsize = out_size - jdest.free_in_buffer;
161 jpeg_destroy_compress (&cinfo);
165 int MJPEGEncoder::jpeg_compress_8u_rgb (
const uint8_t * src, uint16_t width, uint16_t height,
int stride,
int scale,
166 uint8_t * dest,
int * destsize,
int quality)
168 struct jpeg_compress_struct cinfo;
169 struct jpeg_error_mgr jerr;
170 struct jpeg_destination_mgr jdest;
171 int out_size = *destsize;
173 cinfo.err = jpeg_std_error (&jerr);
174 jpeg_create_compress (&cinfo);
175 jdest.next_output_byte = dest;
176 jdest.free_in_buffer = out_size;
177 jdest.init_destination = init_destination;
178 jdest.empty_output_buffer = empty_output_buffer;
179 jdest.term_destination = term_destination;
182 cinfo.image_width = width;
183 cinfo.image_height = height;
184 #if JPEG_LIB_VERSION >= 70
185 cinfo.scale_denom = scale;
189 cinfo.input_components = 3;
190 cinfo.in_color_space = JCS_RGB;
191 jpeg_set_defaults (&cinfo);
192 jpeg_set_quality (&cinfo, quality,
TRUE);
194 jpeg_start_compress (&cinfo,
TRUE);
195 while (cinfo.next_scanline < height)
197 JSAMPROW row = (JSAMPROW)(src + cinfo.next_scanline * stride);
198 jpeg_write_scanlines (&cinfo, &row, 1);
200 jpeg_finish_compress (&cinfo);
201 *destsize = out_size - jdest.free_in_buffer;
202 jpeg_destroy_compress (&cinfo);
const char * getDeviceName() const
INDI::DefaultDevice * currentDevice
INDI_PIXEL_FORMAT pixelFormat
virtual bool upload(INDI::WidgetViewBlob *bp, const uint8_t *buffer, uint32_t nbytes, bool isCompressed=false) override
#define LOG_ERROR(txt)
Shorter logging macros. In order to use these macros, the function (or method) "getDeviceName()" must...
std::vector< uint8_t > buffer
Namespace to encapsulate INDI client, drivers, and mediator classes.