From: Alexander Alekhin Date: Mon, 4 Apr 2016 11:09:04 +0000 (+0300) Subject: videoio: give chance for all enabled backends X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~1904^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9744073b95cda4ea75d0078a341906f9729b7937;p=platform%2Fupstream%2Fopencv.git videoio: give chance for all enabled backends "Eat" unexpected backend exceptions --- diff --git a/modules/videoio/src/cap.cpp b/modules/videoio/src/cap.cpp index 40682ab..46cbf42 100644 --- a/modules/videoio/src/cap.cpp +++ b/modules/videoio/src/cap.cpp @@ -117,6 +117,36 @@ CV_IMPL int cvGetCaptureDomain( CvCapture* capture) return capture ? capture->getCaptureDomain() : 0; } +static bool get_capture_debug_flag() +{ + static bool initialized = false; + static bool flag = false; + if (!initialized) + { +#ifndef NO_GETENV + flag = getenv("OPENCV_VIDEOCAPTURE_DEBUG") ? true : false; // TODO Use getBoolParameter +#endif + initialized = true; + } + return flag; +} + +#define TRY_OPEN(capture, backend_func) \ +{ \ + if (!capture) \ + try { \ + if (get_capture_debug_flag()) fprintf(stderr, "VIDEOIO(%s): trying ...\n", #backend_func); \ + capture = backend_func; \ + if (get_capture_debug_flag()) fprintf(stderr, "VIDEOIO(%s): result=%p ...\n", #backend_func, capture); \ + } catch (const cv::Exception& e) { \ + fprintf(stderr, "VIDEOIO(%s): raised OpenCV exception:\n\n%s\n", #backend_func, e.what()); \ + } catch (const std::exception& e) { \ + fprintf(stderr, "VIDEOIO(%s): raised C++ exception:\n\n%s\n", #backend_func, e.what()); \ + } catch (...) { \ + fprintf(stderr, "VIDEOIO(%s): raised unknown C++ exception!\n\n", #backend_func); \ + } \ +} + /** * Camera dispatching method: index is the camera number. @@ -144,120 +174,101 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index) #ifdef HAVE_MSMF case CV_CAP_MSMF: - if (!capture) - capture = cvCreateCameraCapture_MSMF(index); + TRY_OPEN(capture, cvCreateCameraCapture_MSMF(index)) if (pref) break; #endif #ifdef HAVE_TYZX case CV_CAP_STEREO: - if (!capture) - capture = cvCreateCameraCapture_TYZX(index); + TRY_OPEN(capture, cvCreateCameraCapture_TYZX(index)) if (pref) break; #endif case CV_CAP_VFW: #ifdef HAVE_VFW - if (!capture) - capture = cvCreateCameraCapture_VFW(index); + TRY_OPEN(capture, cvCreateCameraCapture_VFW(index)) #endif + if (pref) break; // CV_CAP_VFW + #if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO - if (!capture) - capture = cvCreateCameraCapture_V4L(index); + TRY_OPEN(capture, cvCreateCameraCapture_V4L(index)) #endif #ifdef HAVE_GSTREAMER - if (!capture) - capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, - reinterpret_cast(index)); + TRY_OPEN(capture, cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast(index))) - if (!capture) - capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, - reinterpret_cast(index)); + TRY_OPEN(capture, cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L, reinterpret_cast(index))) #endif - if (pref) break; // CV_CAP_VFW case CV_CAP_FIREWIRE: #ifdef HAVE_DC1394_2 - if (!capture) - capture = cvCreateCameraCapture_DC1394_2(index); + TRY_OPEN(capture, cvCreateCameraCapture_DC1394_2(index)) #endif #ifdef HAVE_DC1394 - if (!capture) - capture = cvCreateCameraCapture_DC1394(index); + TRY_OPEN(capture, cvCreateCameraCapture_DC1394(index)) #endif #ifdef HAVE_CMU1394 - if (!capture) - capture = cvCreateCameraCapture_CMU(index); + TRY_OPEN(capture, cvCreateCameraCapture_CMU(index)) #endif #if defined(HAVE_GSTREAMER) && 0 // Re-enable again when gstreamer 1394 support will land in the backend code - if (!capture) - capture = cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_1394, 0); + TRY_OPEN(capture, cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_1394, 0)) #endif + if (pref) break; // CV_CAP_FIREWIRE #ifdef HAVE_MIL case CV_CAP_MIL: - if (!capture) - capture = cvCreateCameraCapture_MIL(index); + TRY_OPEN(capture, cvCreateCameraCapture_MIL(index)) if (pref) break; #endif #if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT) case CV_CAP_QT: - if (!capture) - capture = cvCreateCameraCapture_QT(index); + TRY_OPEN(capture, cvCreateCameraCapture_QT(index)) if (pref) break; #endif #ifdef HAVE_UNICAP case CV_CAP_UNICAP: - if (!capture) - capture = cvCreateCameraCapture_Unicap(index); + TRY_OPEN(capture, cvCreateCameraCapture_Unicap(index)) if (pref) break; #endif #ifdef HAVE_PVAPI case CV_CAP_PVAPI: - if (!capture) - capture = cvCreateCameraCapture_PvAPI(index); + TRY_OPEN(capture, cvCreateCameraCapture_PvAPI(index)) if (pref) break; #endif #ifdef HAVE_OPENNI case CV_CAP_OPENNI: - if (!capture) - capture = cvCreateCameraCapture_OpenNI(index); + TRY_OPEN(capture, cvCreateCameraCapture_OpenNI(index)) if (pref) break; #endif #ifdef HAVE_OPENNI2 case CV_CAP_OPENNI2: - if (!capture) - capture = cvCreateCameraCapture_OpenNI2(index); + TRY_OPEN(capture, cvCreateCameraCapture_OpenNI2(index)) if (pref) break; #endif #ifdef HAVE_XIMEA case CV_CAP_XIAPI: - if (!capture) - capture = cvCreateCameraCapture_XIMEA(index); + TRY_OPEN(capture, cvCreateCameraCapture_XIMEA(index)) if (pref) break; #endif #ifdef HAVE_AVFOUNDATION case CV_CAP_AVFOUNDATION: - if (!capture) - capture = cvCreateCameraCapture_AVFoundation(index); + TRY_OPEN(capture, cvCreateCameraCapture_AVFoundation(index)) if (pref) break; #endif #ifdef HAVE_GIGE_API case CV_CAP_GIGANETIX: - if (!capture) - capture = cvCreateCameraCapture_Giganetix(index); + TRY_OPEN(capture, cvCreateCameraCapture_Giganetix(index)) if (pref) break; // CV_CAP_GIGANETIX #endif } @@ -281,66 +292,56 @@ CV_IMPL CvCapture * cvCreateFileCaptureWithPreference (const char * filename, in #ifdef HAVE_FFMPEG case CV_CAP_FFMPEG: - if (! result) - result = cvCreateFileCapture_FFMPEG_proxy (filename); + TRY_OPEN(result, cvCreateFileCapture_FFMPEG_proxy (filename)) if (apiPreference) break; #endif #ifdef HAVE_VFW case CV_CAP_VFW: - if (! result) - result = cvCreateFileCapture_VFW (filename); + TRY_OPEN(result, cvCreateFileCapture_VFW (filename)) if (apiPreference) break; #endif #if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO - if (!result) - result = cvCreateCameraCapture_V4L(filename); + TRY_OPEN(result, cvCreateCameraCapture_V4L(filename)) if (apiPreference) break; #endif case CV_CAP_MSMF: #ifdef HAVE_MSMF - if (! result) - result = cvCreateFileCapture_MSMF (filename); + TRY_OPEN(result, cvCreateFileCapture_MSMF (filename)) #endif #ifdef HAVE_XINE - if (! result) - result = cvCreateFileCapture_XINE (filename); + TRY_OPEN(result, cvCreateFileCapture_XINE (filename)) #endif if (apiPreference) break; #ifdef HAVE_GSTREAMER case CV_CAP_GSTREAMER: - if (! result) - result = cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename); + TRY_OPEN(result, cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename)) if (apiPreference) break; #endif #if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT) case CV_CAP_QT: - if (! result) - result = cvCreateFileCapture_QT (filename); + TRY_OPEN(result, cvCreateFileCapture_QT (filename)) if (apiPreference) break; #endif #ifdef HAVE_AVFOUNDATION case CV_CAP_AVFOUNDATION: - if (! result) - result = cvCreateFileCapture_AVFoundation (filename); + TRY_OPEN(result, cvCreateFileCapture_AVFoundation (filename)) if (apiPreference) break; #endif #ifdef HAVE_OPENNI case CV_CAP_OPENNI: - if (! result) - result = cvCreateFileCapture_OpenNI (filename); + TRY_OPEN(result, cvCreateFileCapture_OpenNI (filename)) if (apiPreference) break; #endif case CV_CAP_IMAGES: - if (! result) - result = cvCreateFileCapture_Images (filename); + TRY_OPEN(result, cvCreateFileCapture_Images (filename)) } return result; @@ -358,63 +359,47 @@ CV_IMPL CvCapture * cvCreateFileCapture (const char * filename) CV_IMPL CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frameSize, int is_color ) { + // If none of the writers is used + // these statements suppress 'unused parameter' warnings. + CV_UNUSED(frameSize); + CV_UNUSED(is_color); + //CV_FUNCNAME( "cvCreateVideoWriter" ); CvVideoWriter *result = 0; if(!fourcc || !fps) - result = cvCreateVideoWriter_Images(filename); + TRY_OPEN(result, cvCreateVideoWriter_Images(filename)) #ifdef HAVE_FFMPEG - if(!result) - result = cvCreateVideoWriter_FFMPEG_proxy (filename, fourcc, fps, frameSize, is_color); + TRY_OPEN(result, cvCreateVideoWriter_FFMPEG_proxy (filename, fourcc, fps, frameSize, is_color)) #endif #ifdef HAVE_VFW - if(!result) - result = cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, is_color); + TRY_OPEN(result, cvCreateVideoWriter_VFW(filename, fourcc, fps, frameSize, is_color)) #endif #ifdef HAVE_MSMF - if (!result) - result = cvCreateVideoWriter_MSMF(filename, fourcc, fps, frameSize, is_color); + TRY_OPEN(result, cvCreateVideoWriter_MSMF(filename, fourcc, fps, frameSize, is_color)) #endif /* #ifdef HAVE_XINE - if(!result) - result = cvCreateVideoWriter_XINE(filename, fourcc, fps, frameSize, is_color); + TRY_OPEN(result, cvCreateVideoWriter_XINE(filename, fourcc, fps, frameSize, is_color)) #endif */ #ifdef HAVE_AVFOUNDATION - if (! result) - result = cvCreateVideoWriter_AVFoundation(filename, fourcc, fps, frameSize, is_color); + TRY_OPEN(result, cvCreateVideoWriter_AVFoundation(filename, fourcc, fps, frameSize, is_color)) #endif #if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT) - if(!result) - result = cvCreateVideoWriter_QT(filename, fourcc, fps, frameSize, is_color); + TRY_OPEN(result, cvCreateVideoWriter_QT(filename, fourcc, fps, frameSize, is_color)) #endif #ifdef HAVE_GSTREAMER - if (! result) - result = cvCreateVideoWriter_GStreamer(filename, fourcc, fps, frameSize, is_color); -#endif - -#if !defined(HAVE_FFMPEG) && \ - !defined(HAVE_VFW) && \ - !defined(HAVE_MSMF) && \ - !defined(HAVE_AVFOUNDATION) && \ - !defined(HAVE_QUICKTIME) && \ - !defined(HAVE_QTKIT) && \ - !defined(HAVE_GSTREAMER) -// If none of the writers is used -// these statements suppress 'unused parameter' warnings. - (void)frameSize; - (void)is_color; + TRY_OPEN(result, cvCreateVideoWriter_GStreamer(filename, fourcc, fps, frameSize, is_color)) #endif - if(!result) - result = cvCreateVideoWriter_Images(filename); + TRY_OPEN(result, cvCreateVideoWriter_Images(filename)) return result; }