From: Leszek Swirski Date: Thu, 14 Aug 2014 14:05:30 +0000 (+0100) Subject: Fix reallocation of D buffer in gemm X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~1314^2~416^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=341c3d59336c4ce77fdcc2e44149fda6929a666f;p=platform%2Fupstream%2Fopencv.git Fix reallocation of D buffer in gemm Conflicts: modules/core/src/matmul.cpp --- diff --git a/modules/core/src/matmul.cpp b/modules/core/src/matmul.cpp index 19443cb..d537b7d 100644 --- a/modules/core/src/matmul.cpp +++ b/modules/core/src/matmul.cpp @@ -1013,6 +1013,7 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, GEMMBlockMulFunc blockMulFunc; GEMMStoreFunc storeFunc; Mat *matD = &D, tmat; + int tmat_size = 0; const uchar* Cdata = C.data; size_t Cstep = C.data ? (size_t)C.step : 0; AutoBuffer buf; @@ -1045,8 +1046,8 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, if( D.data == A.data || D.data == B.data ) { - buf.allocate(d_size.width*d_size.height*CV_ELEM_SIZE(type)); - tmat = Mat(d_size.height, d_size.width, type, (uchar*)buf ); + tmat_size = d_size.width*d_size.height*CV_ELEM_SIZE(type); + // Allocate tmat later, once the size of buf is known matD = &tmat; } @@ -1123,6 +1124,10 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, (d_size.width <= block_lin_size && d_size.height <= block_lin_size && len <= block_lin_size) ) { + if( tmat_size > 0 ) { + buf.allocate(tmat_size); + tmat = Mat(d_size.height, d_size.width, type, (uchar*)buf ); + } singleMulFunc( A.data, A.step, B.data, b_step, Cdata, Cstep, matD->data, matD->step, a_size, d_size, alpha, beta, flags ); } @@ -1182,12 +1187,14 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha, flags &= ~GEMM_1_T; } - buf.allocate(a_buf_size + b_buf_size + d_buf_size); + buf.allocate(d_buf_size + b_buf_size + a_buf_size + tmat_size); d_buf = (uchar*)buf; b_buf = d_buf + d_buf_size; if( is_a_t ) a_buf = b_buf + b_buf_size; + if( tmat_size > 0 ) + tmat = Mat(d_size.height, d_size.width, type, b_buf + b_buf_size + a_buf_size ); for( i = 0; i < d_size.height; i += di ) {