未验证 提交 7d332100 编写于 作者: A Alexander Alekhin 提交者: GitHub

Merge pull request #10901 from alalek:backport_imgcodecs_fixes

(2.4) backport imgcodecs fixes
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include "precomp.hpp" #include "precomp.hpp"
#include "bitstrm.hpp" #include "bitstrm.hpp"
#include "utils.hpp"
namespace cv namespace cv
{ {
...@@ -164,7 +165,7 @@ void RBaseStream::release() ...@@ -164,7 +165,7 @@ void RBaseStream::release()
void RBaseStream::setPos( int pos ) void RBaseStream::setPos( int pos )
{ {
assert( isOpened() && pos >= 0 ); CV_Assert(isOpened() && pos >= 0);
if( !m_file ) if( !m_file )
{ {
...@@ -181,14 +182,19 @@ void RBaseStream::setPos( int pos ) ...@@ -181,14 +182,19 @@ void RBaseStream::setPos( int pos )
int RBaseStream::getPos() int RBaseStream::getPos()
{ {
assert( isOpened() ); CV_Assert(isOpened());
return m_block_pos + (int)(m_current - m_start); int pos = validateToInt((m_current - m_start) + m_block_pos);
CV_Assert(pos >= m_block_pos); // overflow check
CV_Assert(pos >= 0); // overflow check
return pos;
} }
void RBaseStream::skip( int bytes ) void RBaseStream::skip( int bytes )
{ {
assert( bytes >= 0 ); CV_Assert(bytes >= 0);
uchar* old = m_current;
m_current += bytes; m_current += bytes;
CV_Assert(m_current >= old); // overflow check
} }
///////////////////////// RLByteStream //////////////////////////// ///////////////////////// RLByteStream ////////////////////////////
...@@ -220,7 +226,7 @@ int RLByteStream::getBytes( void* buffer, int count ) ...@@ -220,7 +226,7 @@ int RLByteStream::getBytes( void* buffer, int count )
{ {
uchar* data = (uchar*)buffer; uchar* data = (uchar*)buffer;
int readed = 0; int readed = 0;
assert( count >= 0 ); CV_Assert(count >= 0);
while( count > 0 ) while( count > 0 )
{ {
...@@ -371,7 +377,7 @@ void WBaseStream::writeBlock() ...@@ -371,7 +377,7 @@ void WBaseStream::writeBlock()
{ {
int size = (int)(m_current - m_start); int size = (int)(m_current - m_start);
assert( isOpened() ); CV_Assert(isOpened());
if( size == 0 ) if( size == 0 )
return; return;
...@@ -442,7 +448,7 @@ void WBaseStream::release() ...@@ -442,7 +448,7 @@ void WBaseStream::release()
int WBaseStream::getPos() int WBaseStream::getPos()
{ {
assert( isOpened() ); CV_Assert(isOpened());
return m_block_pos + (int)(m_current - m_start); return m_block_pos + (int)(m_current - m_start);
} }
...@@ -465,7 +471,7 @@ void WLByteStream::putBytes( const void* buffer, int count ) ...@@ -465,7 +471,7 @@ void WLByteStream::putBytes( const void* buffer, int count )
{ {
uchar* data = (uchar*)buffer; uchar* data = (uchar*)buffer;
assert( data && m_current && count >= 0 ); CV_Assert(data && m_current && count >= 0);
while( count ) while( count )
{ {
......
...@@ -92,6 +92,7 @@ bool BmpDecoder::readHeader() ...@@ -92,6 +92,7 @@ bool BmpDecoder::readHeader()
m_offset = m_strm.getDWord(); m_offset = m_strm.getDWord();
int size = m_strm.getDWord(); int size = m_strm.getDWord();
CV_Assert(size > 0); // overflow, 2Gb limit
if( size >= 36 ) if( size >= 36 )
{ {
......
...@@ -77,7 +77,8 @@ static JasperInitializer initialize_jasper; ...@@ -77,7 +77,8 @@ static JasperInitializer initialize_jasper;
Jpeg2KDecoder::Jpeg2KDecoder() Jpeg2KDecoder::Jpeg2KDecoder()
{ {
m_signature = '\0' + string() + '\0' + string() + '\0' + string("\x0cjP \r\n\x87\n"); static const unsigned char signature_[12] = { 0, 0, 0, 0x0c, 'j', 'P', ' ', ' ', 13, 10, 0x87, 10};
m_signature = string((const char*)signature_, (const char*)signature_ + sizeof(signature_));
m_stream = 0; m_stream = 0;
m_image = 0; m_image = 0;
} }
...@@ -121,6 +122,8 @@ bool Jpeg2KDecoder::readHeader() ...@@ -121,6 +122,8 @@ bool Jpeg2KDecoder::readHeader()
jas_image_t* image = jas_image_decode( stream, -1, 0 ); jas_image_t* image = jas_image_decode( stream, -1, 0 );
m_image = image; m_image = image;
if( image ) { if( image ) {
CV_Assert(0 == (jas_image_tlx(image)) && "not supported");
CV_Assert(0 == (jas_image_tly(image)) && "not supported");
m_width = jas_image_width( image ); m_width = jas_image_width( image );
m_height = jas_image_height( image ); m_height = jas_image_height( image );
...@@ -130,14 +133,31 @@ bool Jpeg2KDecoder::readHeader() ...@@ -130,14 +133,31 @@ bool Jpeg2KDecoder::readHeader()
for( int i = 0; i < numcmpts; i++ ) for( int i = 0; i < numcmpts; i++ )
{ {
int depth_i = jas_image_cmptprec( image, i ); int depth_i = jas_image_cmptprec( image, i );
CV_Assert(depth == 0 || depth == depth_i); // component data type mismatch
depth = MAX(depth, depth_i); depth = MAX(depth, depth_i);
if( jas_image_cmpttype( image, i ) > 2 ) if( jas_image_cmpttype( image, i ) > 2 )
continue; continue;
int sgnd = jas_image_cmptsgnd(image, i);
int xstart = jas_image_cmpttlx(image, i);
int xend = jas_image_cmptbrx(image, i);
int xstep = jas_image_cmpthstep(image, i);
int ystart = jas_image_cmpttly(image, i);
int yend = jas_image_cmptbry(image, i);
int ystep = jas_image_cmptvstep(image, i);
CV_Assert(sgnd == 0 && "not supported");
CV_Assert(xstart == 0 && "not supported");
CV_Assert(ystart == 0 && "not supported");
CV_Assert(xstep == 1 && "not supported");
CV_Assert(ystep == 1 && "not supported");
CV_Assert(xend == m_width);
CV_Assert(yend == m_height);
cntcmpts++; cntcmpts++;
} }
if( cntcmpts ) if( cntcmpts )
{ {
CV_Assert(depth == 8 || depth == 16);
CV_Assert(cntcmpts == 1 || cntcmpts == 3);
m_type = CV_MAKETYPE(depth <= 8 ? CV_8U : CV_16U, cntcmpts > 1 ? 3 : 1); m_type = CV_MAKETYPE(depth <= 8 ? CV_8U : CV_16U, cntcmpts > 1 ? 3 : 1);
result = true; result = true;
} }
...@@ -150,9 +170,15 @@ bool Jpeg2KDecoder::readHeader() ...@@ -150,9 +170,15 @@ bool Jpeg2KDecoder::readHeader()
return result; return result;
} }
static void Jpeg2KDecoder_close(Jpeg2KDecoder* ptr)
{
ptr->close();
}
template<> void Ptr<Jpeg2KDecoder>::delete_obj() { Jpeg2KDecoder_close(obj); }
bool Jpeg2KDecoder::readData( Mat& img ) bool Jpeg2KDecoder::readData( Mat& img )
{ {
Ptr<Jpeg2KDecoder> close_this(this); // auto cleanup: Jpeg2KDecoder_close
bool result = false; bool result = false;
int color = img.channels() > 1; int color = img.channels() > 1;
uchar* data = img.data; uchar* data = img.data;
...@@ -204,11 +230,16 @@ bool Jpeg2KDecoder::readData( Mat& img ) ...@@ -204,11 +230,16 @@ bool Jpeg2KDecoder::readData( Mat& img )
result = true; result = true;
} }
else else
fprintf(stderr, "JPEG 2000 LOADER ERROR: cannot convert colorspace\n"); {
jas_cmprof_destroy(clrprof);
CV_Error(CV_StsError, "JPEG 2000 LOADER ERROR: cannot convert colorspace");
}
jas_cmprof_destroy( clrprof ); jas_cmprof_destroy( clrprof );
} }
else else
fprintf(stderr, "JPEG 2000 LOADER ERROR: unable to create colorspace\n"); {
CV_Error(CV_StsError, "JPEG 2000 LOADER ERROR: unable to create colorspace");
}
} }
else else
result = true; result = true;
...@@ -257,8 +288,8 @@ bool Jpeg2KDecoder::readData( Mat& img ) ...@@ -257,8 +288,8 @@ bool Jpeg2KDecoder::readData( Mat& img )
result = readComponent16u( ((unsigned short *)data) + i, buffer, validateToInt(step / 2), cmptlut[i], maxval, offset, ncmpts ); result = readComponent16u( ((unsigned short *)data) + i, buffer, validateToInt(step / 2), cmptlut[i], maxval, offset, ncmpts );
if( !result ) if( !result )
{ {
i = ncmpts; jas_matrix_destroy( buffer );
result = false; CV_Error(CV_StsError, "JPEG2000 LOADER ERROR: failed to read component");
} }
} }
jas_matrix_destroy( buffer ); jas_matrix_destroy( buffer );
...@@ -267,10 +298,12 @@ bool Jpeg2KDecoder::readData( Mat& img ) ...@@ -267,10 +298,12 @@ bool Jpeg2KDecoder::readData( Mat& img )
} }
} }
else else
fprintf(stderr, "JPEG2000 LOADER ERROR: colorspace conversion failed\n" ); {
CV_Error(CV_StsError, "JPEG2000 LOADER ERROR: colorspace conversion failed");
}
} }
close(); CV_Assert(result == true);
#ifndef WIN32 #ifndef WIN32
if (!clr.empty()) if (!clr.empty())
......
...@@ -331,7 +331,7 @@ bool PxMDecoder::readData( Mat& img ) ...@@ -331,7 +331,7 @@ bool PxMDecoder::readData( Mat& img )
} }
} }
else else
memcpy( data, src, m_width*(bit_depth/8) ); memcpy(data, src, img.elemSize1()*m_width);
} }
else else
{ {
......
...@@ -120,7 +120,7 @@ bool SunRasterDecoder::readHeader() ...@@ -120,7 +120,7 @@ bool SunRasterDecoder::readHeader()
m_type = IsColorPalette( m_palette, m_bpp ) ? CV_8UC3 : CV_8UC1; m_type = IsColorPalette( m_palette, m_bpp ) ? CV_8UC3 : CV_8UC1;
m_offset = m_strm.getPos(); m_offset = m_strm.getPos();
assert( m_offset == 32 + m_maplength ); CV_Assert(m_offset == 32 + m_maplength);
result = true; result = true;
} }
} }
...@@ -133,7 +133,7 @@ bool SunRasterDecoder::readHeader() ...@@ -133,7 +133,7 @@ bool SunRasterDecoder::readHeader()
m_offset = m_strm.getPos(); m_offset = m_strm.getPos();
assert( m_offset == 32 + m_maplength ); CV_Assert(m_offset == 32 + m_maplength);
result = true; result = true;
} }
} }
...@@ -226,7 +226,7 @@ bool SunRasterDecoder::readData( Mat& img ) ...@@ -226,7 +226,7 @@ bool SunRasterDecoder::readData( Mat& img )
code = m_strm.getByte(); code = m_strm.getByte();
if( len > line_end - tsrc ) if( len > line_end - tsrc )
{ {
assert(0); CV_Error(CV_StsInternal, "");
goto bad_decoding_1bpp; goto bad_decoding_1bpp;
} }
...@@ -367,7 +367,7 @@ bad_decoding_end: ...@@ -367,7 +367,7 @@ bad_decoding_end:
result = true; result = true;
break; break;
default: default:
assert(0); CV_Error(CV_StsInternal, "");
} }
} }
catch( ... ) catch( ... )
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <ctype.h> #include <ctype.h>
#include <assert.h> #include <assert.h> // FIX IT: remove this
#if defined WIN32 || defined WINCE #if defined WIN32 || defined WINCE
#if !defined _WIN32_WINNT #if !defined _WIN32_WINNT
......
...@@ -670,7 +670,7 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags ) ...@@ -670,7 +670,7 @@ cvConvertImage( const CvArr* srcarr, CvArr* dstarr, int flags )
icvCvt_BGR2Gray_8u_C3C1R( s, s_step, d, d_step, size, swap_rb ); icvCvt_BGR2Gray_8u_C3C1R( s, s_step, d, d_step, size, swap_rb );
break; break;
case 33: case 33:
assert( swap_rb ); CV_Assert(swap_rb);
icvCvt_RGB2BGR_8u_C3R( s, s_step, d, d_step, size ); icvCvt_RGB2BGR_8u_C3R( s, s_step, d, d_step, size );
break; break;
case 41: case 41:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册