Skip to content

Commit d59472b

Browse files
committed
Merge pull request opencv#10144 from mshabunin:fix-videocapture-open-order
2 parents e4aa2cc + 7628c14 commit d59472b

File tree

2 files changed

+25
-39
lines changed

2 files changed

+25
-39
lines changed

modules/videoio/src/cap.cpp

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -527,49 +527,35 @@ static Ptr<IVideoCapture> IVideoCapture_create(int index)
527527
}
528528

529529

530-
static Ptr<IVideoCapture> IVideoCapture_create(const String& filename)
530+
static Ptr<IVideoCapture> IVideoCapture_create(const String& filename, int apiPreference)
531531
{
532-
int domains[] =
533-
{
534-
CAP_ANY,
532+
bool useAny = (apiPreference == CAP_ANY);
533+
Ptr<IVideoCapture> capture;
535534
#ifdef HAVE_GPHOTO2
536-
CAP_GPHOTO2,
537-
#endif
538-
#ifdef HAVE_MFX
539-
CAP_INTEL_MFX,
540-
#endif
541-
-1, -1
542-
};
543-
544-
// try every possibly installed camera API
545-
for (int i = 0; domains[i] >= 0; i++)
535+
if (useAny || apiPreference == CAP_GPHOTO2)
546536
{
547-
Ptr<IVideoCapture> capture;
548-
549-
switch (domains[i])
550-
{
551-
case CAP_ANY:
552-
capture = createMotionJpegCapture(filename);
553-
break;
554-
#ifdef HAVE_GPHOTO2
555-
case CAP_GPHOTO2:
556-
capture = createGPhoto2Capture(filename);
557-
break;
537+
capture = createGPhoto2Capture(filename);
538+
if (capture && capture->isOpened())
539+
return capture;
540+
}
558541
#endif
559542
#ifdef HAVE_MFX
560-
case CAP_INTEL_MFX:
561-
capture = makePtr<VideoCapture_IntelMFX>(filename);
562-
break;
543+
if (useAny || apiPreference == CAP_INTEL_MFX)
544+
{
545+
capture = makePtr<VideoCapture_IntelMFX>(filename);
546+
if (capture && capture->isOpened())
547+
return capture;
548+
}
563549
#endif
564-
}
565-
550+
if (useAny || apiPreference == CAP_OPENCV_MJPEG)
551+
{
552+
capture = createMotionJpegCapture(filename);
566553
if (capture && capture->isOpened())
567-
{
568554
return capture;
569-
}
570555
}
571-
// failed open a camera
572-
return Ptr<IVideoCapture>();
556+
if (capture && !capture->isOpened())
557+
capture.release();
558+
return capture;
573559
}
574560

575561
static Ptr<IVideoWriter> 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)
625611
CV_TRACE_FUNCTION();
626612

627613
if (isOpened()) release();
628-
icap = IVideoCapture_create(filename);
614+
icap = IVideoCapture_create(filename, apiPreference);
629615
if (!icap.empty())
630616
return true;
631617

modules/videoio/test/test_ffmpeg.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class CV_FFmpegWriteBigVideoTest : public cvtest::BaseTest
131131
fps = 25;
132132
}
133133

134-
VideoWriter writer(filename, tag, fps, frame_s);
134+
VideoWriter writer(filename, CAP_FFMPEG, tag, fps, frame_s);
135135

136136
if (writer.isOpened() == false)
137137
{
@@ -194,7 +194,7 @@ class CV_FFmpegReadImageTest : public cvtest::BaseTest
194194
try
195195
{
196196
string filename = ts->get_data_path() + "readwrite/ordinary.bmp";
197-
VideoCapture cap(filename);
197+
VideoCapture cap(filename, CAP_FFMPEG);
198198
Mat img0 = imread(filename, 1);
199199
Mat img, img_next;
200200
cap >> img;
@@ -242,7 +242,7 @@ class CreateVideoWriterInvoker :
242242
std::string fileName = tempfile(stream.str().c_str());
243243

244244
files->operator[](i) = fileName;
245-
writers->operator[](i) = new VideoWriter(fileName, VideoWriter::fourcc('X','V','I','D'), 25.0f, FrameSize);
245+
writers->operator[](i) = new VideoWriter(fileName, CAP_FFMPEG, VideoWriter::fourcc('X','V','I','D'), 25.0f, FrameSize);
246246

247247
CV_Assert(writers->operator[](i)->isOpened());
248248
}
@@ -325,7 +325,7 @@ class CreateVideoCaptureInvoker :
325325
{
326326
for (int i = range.start; i != range.end; ++i)
327327
{
328-
readers->operator[](i) = new VideoCapture(files->operator[](i));
328+
readers->operator[](i) = new VideoCapture(files->operator[](i), CAP_FFMPEG);
329329
CV_Assert(readers->operator[](i)->isOpened());
330330
}
331331
}

0 commit comments

Comments
 (0)