Put a lock around jpeg writing. libjpeg is not thread safe
parent
c9557e21c3
commit
998ed3753a
|
@ -24,6 +24,7 @@
|
||||||
#include "zm_utils.h"
|
#include "zm_utils.h"
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <mutex>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
@ -80,6 +81,8 @@ imgbufcpy_fptr_t fptr_imgbufcpy;
|
||||||
/* Font */
|
/* Font */
|
||||||
static ZmFont font;
|
static ZmFont font;
|
||||||
|
|
||||||
|
std::mutex jpeg_mutex;
|
||||||
|
|
||||||
void Image::update_function_pointers() {
|
void Image::update_function_pointers() {
|
||||||
/* Because many loops are unrolled and work on 16 colours/time or 4 pixels/time, we have to meet requirements */
|
/* Because many loops are unrolled and work on 16 colours/time or 4 pixels/time, we have to meet requirements */
|
||||||
if ( pixels % 16 || pixels % 12 ) {
|
if ( pixels % 16 || pixels % 12 ) {
|
||||||
|
@ -1089,6 +1092,8 @@ bool Image::WriteJpeg(const char *filename, int quality_override, struct timeval
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Image::WriteJpeg(const char *filename, int quality_override, struct timeval timestamp, bool on_blocking_abort) const {
|
bool Image::WriteJpeg(const char *filename, int quality_override, struct timeval timestamp, bool on_blocking_abort) const {
|
||||||
|
// jpeg libs are not thread safe
|
||||||
|
std::unique_lock<std::mutex> lck(jpeg_mutex);
|
||||||
if ( config.colour_jpeg_files && (colours == ZM_COLOUR_GRAY8) ) {
|
if ( config.colour_jpeg_files && (colours == ZM_COLOUR_GRAY8) ) {
|
||||||
Image temp_image(*this);
|
Image temp_image(*this);
|
||||||
temp_image.Colourise(ZM_COLOUR_RGB24, ZM_SUBPIX_ORDER_RGB);
|
temp_image.Colourise(ZM_COLOUR_RGB24, ZM_SUBPIX_ORDER_RGB);
|
||||||
|
@ -1368,6 +1373,8 @@ bool Image::EncodeJpeg(JOCTET *outbuffer, int *outbuffer_size, int quality_overr
|
||||||
return temp_image.EncodeJpeg(outbuffer, outbuffer_size, quality_override);
|
return temp_image.EncodeJpeg(outbuffer, outbuffer_size, quality_override);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_lock<std::mutex> lck(jpeg_mutex);
|
||||||
|
|
||||||
int quality = quality_override ? quality_override : config.jpeg_stream_quality;
|
int quality = quality_override ? quality_override : config.jpeg_stream_quality;
|
||||||
|
|
||||||
struct jpeg_compress_struct *cinfo = encodejpg_ccinfo[quality];
|
struct jpeg_compress_struct *cinfo = encodejpg_ccinfo[quality];
|
||||||
|
|
Loading…
Reference in New Issue