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