Skip to content

Commit ee4429e

Browse files
committed
Add thread safety fix for JPEG2000 decode (Issue #1007)
- Add mutex protection around OpenJPEG decode operations - Prevent segfault/deadlock when multiple threads call imdecode simultaneously - Apply mutex lock in readHeader, readData, and write methods
1 parent 4e4505a commit ee4429e

1 file changed

Lines changed: 49 additions & 0 deletions

File tree

patches/patchOpenJPEGThreadSafety

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
diff -ruN opencv/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp opencv_patched/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp
2+
--- opencv/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp 2024-01-01 00:00:00.000000000 +0000
3+
+++ opencv_patched/modules/imgcodecs/src/grfmt_jpeg2000_openjpeg.cpp 2026-05-09 00:00:00.000000000 +0000
4+
@@ -10,8 +10,18 @@
5+
#include "grfmt_jpeg2000_openjpeg.hpp"
6+
7+
#include "opencv2/core/utils/logger.hpp"
8+
+#include "opencv2/core/utility.hpp"
9+
10+
namespace cv {
11+
+namespace detail {
12+
+
13+
+static Mutex& getOpenJpegMutex()
14+
+{
15+
+ static Mutex mutex;
16+
+ return mutex;
17+
+}
18+
+
19+
+} // namespace detail
20+
21+
namespace {
22+
23+
@@ -516,6 +526,8 @@ Jpeg2KOpjDecoderBase::Jpeg2KOpjDecoderBase(OPJ_CODEC_FORMAT format)
24+
25+
bool Jpeg2KOpjDecoderBase::readHeader()
26+
{
27+
+ AutoLock lock(detail::getOpenJpegMutex());
28+
+
29+
if (!m_buf.empty()) {
30+
opjBuf_ = detail::OpjMemoryBuffer(m_buf);
31+
stream_ = opjCreateBufferInputStream(&opjBuf_);
32+
@@ -595,6 +607,8 @@ bool Jpeg2KOpjDecoderBase::readHeader()
33+
34+
bool Jpeg2KOpjDecoderBase::readData( Mat& img )
35+
{
36+
+ AutoLock lock(detail::getOpenJpegMutex());
37+
+
38+
using DecodeFunc = bool(*)(const opj_image_t&, cv::Mat&, uint8_t shift, bool use_rgb);
39+
40+
if (!opj_decode(codec_.get(), stream_.get(), image_.get()))
41+
@@ -706,6 +720,8 @@ bool Jpeg2KOpjEncoder::isFormatSupported(int depth) const
42+
43+
bool Jpeg2KOpjEncoder::write(const Mat& img, const std::vector<int>& params)
44+
{
45+
+ AutoLock lock(detail::getOpenJpegMutex());
46+
+
47+
CV_Assert(params.size() % 2 == 0);
48+
49+
const int channels = img.channels();

0 commit comments

Comments
 (0)