diff --git a/apps/annotation/CMakeLists.txt b/apps/annotation/CMakeLists.txt index 57b133df12..9288e86b42 100644 --- a/apps/annotation/CMakeLists.txt +++ b/apps/annotation/CMakeLists.txt @@ -21,7 +21,6 @@ set_target_properties(${the_target} PROPERTIES DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} - INSTALL_NAME_DIR lib OUTPUT_NAME "opencv_annotation") if(ENABLE_SOLUTION_FOLDERS) diff --git a/apps/createsamples/CMakeLists.txt b/apps/createsamples/CMakeLists.txt index 24506231e0..a285c69e41 100644 --- a/apps/createsamples/CMakeLists.txt +++ b/apps/createsamples/CMakeLists.txt @@ -23,7 +23,6 @@ set_target_properties(${the_target} PROPERTIES DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} - INSTALL_NAME_DIR lib OUTPUT_NAME "opencv_createsamples") if(ENABLE_SOLUTION_FOLDERS) diff --git a/apps/traincascade/CMakeLists.txt b/apps/traincascade/CMakeLists.txt index b21fb87367..b36d0bed60 100644 --- a/apps/traincascade/CMakeLists.txt +++ b/apps/traincascade/CMakeLists.txt @@ -23,7 +23,6 @@ set_target_properties(${the_target} PROPERTIES DEBUG_POSTFIX "${OPENCV_DEBUG_POSTFIX}" ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} - INSTALL_NAME_DIR lib OUTPUT_NAME "opencv_traincascade") if(ENABLE_SOLUTION_FOLDERS) diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index 23a637a25a..bd3286c2a2 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -833,7 +833,6 @@ macro(_ocv_create_module) COMPILE_PDB_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} - INSTALL_NAME_DIR lib ) # For dynamic link numbering convenions diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index c722165102..29172e72d1 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -1216,13 +1216,33 @@ static void icvDeleteWindow( CvWindow* window ) } cvFree( &window ); + + // if last window... + if( hg_windows == 0 ) + { #ifdef HAVE_GTHREAD - // if last window, send key press signal - // to jump out of any waiting cvWaitKey's - if(hg_windows==0 && thread_started){ - g_cond_broadcast(cond_have_key); - } + if( thread_started ) + { + // send key press signal to jump out of any waiting cvWaitKey's + g_cond_broadcast( cond_have_key ); + } + else + { +#endif + // Some GTK+ modules (like the Unity module) use GDBusConnection, + // which has a habit of postponing cleanup by performing it via + // idle sources added to the main loop. Since this was the last window, + // we can assume that no event processing is going to happen in the + // nearest future, so we should force that cleanup (by handling all pending + // events) while we still have the chance. + // This is not needed if thread_started is true, because the background + // thread will process events continuously. + while( gtk_events_pending() ) + gtk_main_iteration(); +#ifdef HAVE_GTHREAD + } #endif + } } diff --git a/modules/imgcodecs/src/grfmt_png.cpp b/modules/imgcodecs/src/grfmt_png.cpp index 2f4a62baee..d5d175f89e 100644 --- a/modules/imgcodecs/src/grfmt_png.cpp +++ b/modules/imgcodecs/src/grfmt_png.cpp @@ -228,8 +228,6 @@ bool PngDecoder::readData( Mat& img ) AutoBuffer _buffer(m_height); uchar** buffer = _buffer; int color = img.channels() > 1; - uchar* data = img.ptr(); - int step = (int)img.step; if( m_png_ptr && m_info_ptr && m_end_info && m_width && m_height ) { @@ -281,7 +279,7 @@ bool PngDecoder::readData( Mat& img ) png_read_update_info( png_ptr, info_ptr ); for( y = 0; y < m_height; y++ ) - buffer[y] = data + y*step; + buffer[y] = img.data + y*img.step; png_read_image( png_ptr, buffer ); png_read_end( png_ptr, end_info ); diff --git a/modules/imgproc/src/pyramids.cpp b/modules/imgproc/src/pyramids.cpp index 0d311e22fa..f7ff60d532 100644 --- a/modules/imgproc/src/pyramids.cpp +++ b/modules/imgproc/src/pyramids.cpp @@ -1010,7 +1010,7 @@ pyrUp_( const Mat& _src, Mat& _dst, int) for( ; sy <= y + 1; sy++ ) { WT* row = buf + ((sy - sy0) % PU_SZ)*bufstep; - int _sy = borderInterpolate(sy*2, dsize.height, BORDER_REFLECT_101)/2; + int _sy = borderInterpolate(sy*2, ssize.height*2, BORDER_REFLECT_101)/2; const T* src = _src.ptr(_sy); if( ssize.width == cn ) @@ -1031,6 +1031,11 @@ pyrUp_( const Mat& _src, Mat& _dst, int) t0 = src[sx - cn] + src[sx]*7; t1 = src[sx]*8; row[dx] = t0; row[dx + cn] = t1; + + if (dsize.width > ssize.width*2) + { + row[(_dst.cols-1) + x] = row[dx + cn]; + } } for( x = cn; x < ssize.width - cn; x++ ) @@ -1057,6 +1062,17 @@ pyrUp_( const Mat& _src, Mat& _dst, int) dst1[x] = t1; dst0[x] = t0; } } + + if (dsize.height > ssize.height*2) + { + T* dst0 = _dst.ptr(ssize.height*2-2); + T* dst2 = _dst.ptr(ssize.height*2); + + for(x = 0; x < dsize.width ; x++ ) + { + dst2[x] = dst0[x]; + } + } } typedef void (*PyrFunc)(const Mat&, Mat&, int); diff --git a/modules/java/CMakeLists.txt b/modules/java/CMakeLists.txt index bb3240bfdf..7b383c5491 100644 --- a/modules/java/CMakeLists.txt +++ b/modules/java/CMakeLists.txt @@ -386,7 +386,6 @@ set_target_properties(${the_module} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH} RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} - INSTALL_NAME_DIR ${OPENCV_LIB_INSTALL_PATH} LINK_INTERFACE_LIBRARIES "" ) diff --git a/modules/videoio/src/cap_ffmpeg_impl.hpp b/modules/videoio/src/cap_ffmpeg_impl.hpp index dbb7cf9ee8..8ac33d749d 100644 --- a/modules/videoio/src/cap_ffmpeg_impl.hpp +++ b/modules/videoio/src/cap_ffmpeg_impl.hpp @@ -1319,7 +1319,7 @@ struct CvVideoWriter_FFMPEG uint8_t * picbuf; AVStream * video_st; int input_pix_fmt; - Image_FFMPEG temp_image; + unsigned char * aligned_input; int frame_width, frame_height; int frame_idx; bool ok; @@ -1396,7 +1396,7 @@ void CvVideoWriter_FFMPEG::init() picbuf = 0; video_st = 0; input_pix_fmt = 0; - memset(&temp_image, 0, sizeof(temp_image)); + aligned_input = NULL; img_convert_ctx = 0; frame_width = frame_height = 0; frame_idx = 0; @@ -1665,7 +1665,20 @@ static int icv_av_write_frame_FFMPEG( AVFormatContext * oc, AVStream * video_st, /// write a frame with FFMPEG bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int width, int height, int cn, int origin ) { - bool ret = false; + // check parameters + if (input_pix_fmt == AV_PIX_FMT_BGR24) { + if (cn != 3) { + return false; + } + } + else if (input_pix_fmt == AV_PIX_FMT_GRAY8) { + if (cn != 1) { + return false; + } + } + else { + assert(false); + } if( (width & -2) != frame_width || (height & -2) != frame_height || !data ) return false; @@ -1679,58 +1692,29 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int AVCodecContext *c = &(video_st->codec); #endif -#if LIBAVFORMAT_BUILD < 5231 - // It is not needed in the latest versions of the ffmpeg - if( c->codec_id == CV_CODEC(CODEC_ID_RAWVIDEO) && origin != 1 ) - { - if( !temp_image.data ) - { - temp_image.step = (width*cn + 3) & -4; - temp_image.width = width; - temp_image.height = height; - temp_image.cn = cn; - temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height); - } - for( int y = 0; y < height; y++ ) - memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, width*cn); - data = temp_image.data; - step = temp_image.step; - } -#else - if( width*cn != step ) + // FFmpeg contains SIMD optimizations which can sometimes read data past + // the supplied input buffer. To ensure that doesn't happen, we pad the + // step to a multiple of 32 (that's the minimal alignment for which Valgrind + // doesn't raise any warnings). + const int STEP_ALIGNMENT = 32; + if( step % STEP_ALIGNMENT != 0 ) { - if( !temp_image.data ) + int aligned_step = (step + STEP_ALIGNMENT - 1) & -STEP_ALIGNMENT; + + if( !aligned_input ) { - temp_image.step = width*cn; - temp_image.width = width; - temp_image.height = height; - temp_image.cn = cn; - temp_image.data = (unsigned char*)malloc(temp_image.step*temp_image.height); + aligned_input = (unsigned char*)av_mallocz(aligned_step * height); } + if (origin == 1) for( int y = 0; y < height; y++ ) - memcpy(temp_image.data + y*temp_image.step, data + (height-1-y)*step, temp_image.step); + memcpy(aligned_input + y*aligned_step, data + (height-1-y)*step, step); else for( int y = 0; y < height; y++ ) - memcpy(temp_image.data + y*temp_image.step, data + y*step, temp_image.step); - data = temp_image.data; - step = temp_image.step; - } -#endif + memcpy(aligned_input + y*aligned_step, data + y*step, step); - // check parameters - if (input_pix_fmt == AV_PIX_FMT_BGR24) { - if (cn != 3) { - return false; - } - } - else if (input_pix_fmt == AV_PIX_FMT_GRAY8) { - if (cn != 1) { - return false; - } - } - else { - assert(false); + data = aligned_input; + step = aligned_step; } if ( c->pix_fmt != input_pix_fmt ) { @@ -1738,6 +1722,7 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int // let input_picture point to the raw data buffer of 'image' _opencv_ffmpeg_av_image_fill_arrays(input_picture, (uint8_t *) data, (AVPixelFormat)input_pix_fmt, width, height); + input_picture->linesize[0] = step; if( !img_convert_ctx ) { @@ -1762,10 +1747,11 @@ bool CvVideoWriter_FFMPEG::writeFrame( const unsigned char* data, int step, int else{ _opencv_ffmpeg_av_image_fill_arrays(picture, (uint8_t *) data, (AVPixelFormat)input_pix_fmt, width, height); + picture->linesize[0] = step; } picture->pts = frame_idx; - ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, picture) >= 0; + bool ret = icv_av_write_frame_FFMPEG( oc, video_st, outbuf, outbuf_size, picture) >= 0; frame_idx++; return ret; @@ -1848,11 +1834,7 @@ void CvVideoWriter_FFMPEG::close() /* free the stream */ avformat_free_context(oc); - if( temp_image.data ) - { - free(temp_image.data); - temp_image.data = 0; - } + av_freep(&aligned_input); init(); } diff --git a/samples/data/tree.avi b/samples/data/tree.avi index 8c7ff14a30..ded3608a51 100644 Binary files a/samples/data/tree.avi and b/samples/data/tree.avi differ