From 7628c143f45f18b5608c6787d76ba035ecdd14c7 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Thu, 23 Nov 2017 13:31:07 +0300 Subject: [PATCH] videoio: fixed capture open order, added apiPrefernce to FFMPEG tests --- modules/videoio/src/cap.cpp | 56 ++++++++++++++---------------------- modules/videoio/test/test_ffmpeg.cpp | 8 +++--- 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/modules/videoio/src/cap.cpp b/modules/videoio/src/cap.cpp index ff239ce..93251e6 100644 --- a/modules/videoio/src/cap.cpp +++ b/modules/videoio/src/cap.cpp @@ -527,49 +527,35 @@ static Ptr IVideoCapture_create(int index) } -static Ptr IVideoCapture_create(const String& filename) +static Ptr IVideoCapture_create(const String& filename, int apiPreference) { - int domains[] = - { - CAP_ANY, + bool useAny = (apiPreference == CAP_ANY); + Ptr capture; #ifdef HAVE_GPHOTO2 - CAP_GPHOTO2, -#endif -#ifdef HAVE_MFX - CAP_INTEL_MFX, -#endif - -1, -1 - }; - - // try every possibly installed camera API - for (int i = 0; domains[i] >= 0; i++) + if (useAny || apiPreference == CAP_GPHOTO2) { - Ptr capture; - - switch (domains[i]) - { - case CAP_ANY: - capture = createMotionJpegCapture(filename); - break; -#ifdef HAVE_GPHOTO2 - case CAP_GPHOTO2: - capture = createGPhoto2Capture(filename); - break; + capture = createGPhoto2Capture(filename); + if (capture && capture->isOpened()) + return capture; + } #endif #ifdef HAVE_MFX - case CAP_INTEL_MFX: - capture = makePtr(filename); - break; + if (useAny || apiPreference == CAP_INTEL_MFX) + { + capture = makePtr(filename); + if (capture && capture->isOpened()) + return capture; + } #endif - } - + if (useAny || apiPreference == CAP_OPENCV_MJPEG) + { + capture = createMotionJpegCapture(filename); if (capture && capture->isOpened()) - { return capture; - } } - // failed open a camera - return Ptr(); + if (capture && !capture->isOpened()) + capture.release(); + return capture; } static Ptr IVideoWriter_create(const String& filename, int apiPreference, int _fourcc, double fps, Size frameSize, bool isColor) @@ -625,7 +611,7 @@ bool VideoCapture::open(const String& filename, int apiPreference) CV_TRACE_FUNCTION(); if (isOpened()) release(); - icap = IVideoCapture_create(filename); + icap = IVideoCapture_create(filename, apiPreference); if (!icap.empty()) return true; diff --git a/modules/videoio/test/test_ffmpeg.cpp b/modules/videoio/test/test_ffmpeg.cpp index 483ac43..df8127d 100644 --- a/modules/videoio/test/test_ffmpeg.cpp +++ b/modules/videoio/test/test_ffmpeg.cpp @@ -131,7 +131,7 @@ public: fps = 25; } - VideoWriter writer(filename, tag, fps, frame_s); + VideoWriter writer(filename, CAP_FFMPEG, tag, fps, frame_s); if (writer.isOpened() == false) { @@ -194,7 +194,7 @@ public: try { string filename = ts->get_data_path() + "readwrite/ordinary.bmp"; - VideoCapture cap(filename); + VideoCapture cap(filename, CAP_FFMPEG); Mat img0 = imread(filename, 1); Mat img, img_next; cap >> img; @@ -242,7 +242,7 @@ public: std::string fileName = tempfile(stream.str().c_str()); files->operator[](i) = fileName; - writers->operator[](i) = new VideoWriter(fileName, VideoWriter::fourcc('X','V','I','D'), 25.0f, FrameSize); + writers->operator[](i) = new VideoWriter(fileName, CAP_FFMPEG, VideoWriter::fourcc('X','V','I','D'), 25.0f, FrameSize); CV_Assert(writers->operator[](i)->isOpened()); } @@ -325,7 +325,7 @@ public: { for (int i = range.start; i != range.end; ++i) { - readers->operator[](i) = new VideoCapture(files->operator[](i)); + readers->operator[](i) = new VideoCapture(files->operator[](i), CAP_FFMPEG); CV_Assert(readers->operator[](i)->isOpened()); } } -- 2.7.4