From f280e3cbd9ba07ab2d0464cb4aefc31bdbe47665 Mon Sep 17 00:00:00 2001 From: Alexander Lyulkov Date: Thu, 31 Aug 2023 23:35:38 +0800 Subject: [PATCH] Fixed bug with the last 4 bytes in MJPEG encoder. --- modules/videoio/src/cap_mjpeg_encoder.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/modules/videoio/src/cap_mjpeg_encoder.cpp b/modules/videoio/src/cap_mjpeg_encoder.cpp index efac4093ae..2e7452cf17 100644 --- a/modules/videoio/src/cap_mjpeg_encoder.cpp +++ b/modules/videoio/src/cap_mjpeg_encoder.cpp @@ -268,7 +268,7 @@ public: m_buffer_list[0].finish(); m_data_len = m_buffer_list[0].get_len(); - m_last_bit_len = m_buffer_list[0].get_bits_free() ? 32 - m_buffer_list[0].get_bits_free() : 0; + m_last_bit_len = 32 - m_buffer_list[0].get_bits_free(); return m_buffer_list[0].get_data(); } @@ -331,9 +331,14 @@ public: } //bits == 0 means that last element shouldn't be used. - m_output_buffer[m_data_len++] = currval; - - m_last_bit_len = -bits; + if (bits != 0) { + m_output_buffer[m_data_len++] = currval; + m_last_bit_len = -bits; + } + else + { + m_last_bit_len = 32; + } return &m_output_buffer[0]; } @@ -1167,8 +1172,6 @@ public: fdct_qtab(_fdct_qtab), cat_table(_cat_table) { -#if 0 // disable parallel processing due to buffer overrun bug: https://github.com/opencv/opencv/issues/19634 - //empirically found value. if number of pixels is less than that value there is no sense to parallelize it. const int min_pixels_count = 96*96; @@ -1194,12 +1197,6 @@ public: stripes_count = std::min(stripes_count, max_stripes); -#else - if (nstripes > 1) - CV_LOG_ONCE_WARNING(NULL, "VIDEOIO/MJPEG: parallel processing is disabled: https://github.com/opencv/opencv/issues/19634"); - stripes_count = 1; -#endif - m_buffer_list.allocate_buffers(stripes_count, (height*width*2)/stripes_count); }