Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
c90e65ce
Commit
c90e65ce
authored
May 29, 2018
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #11596 from alalek:videoio_priority_list
parents
06c18906
cd9e4370
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
944 additions
and
587 deletions
+944
-587
CMakeLists.txt
modules/videoio/CMakeLists.txt
+2
-0
cap.cpp
modules/videoio/src/cap.cpp
+95
-578
cap_mjpeg_encoder.cpp
modules/videoio/src/cap_mjpeg_encoder.cpp
+4
-1
precomp.hpp
modules/videoio/src/precomp.hpp
+5
-2
videoio_c.cpp
modules/videoio/src/videoio_c.cpp
+152
-0
videoio_registry.cpp
modules/videoio/src/videoio_registry.cpp
+637
-0
videoio_registry.hpp
modules/videoio/src/videoio_registry.hpp
+43
-0
test_ffmpeg.cpp
modules/videoio/test/test_ffmpeg.cpp
+6
-6
No files found.
modules/videoio/CMakeLists.txt
View file @
c90e65ce
...
@@ -20,6 +20,8 @@ set(videoio_hdrs
...
@@ -20,6 +20,8 @@ set(videoio_hdrs
${
CMAKE_CURRENT_LIST_DIR
}
/src/precomp.hpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/precomp.hpp
)
)
set
(
videoio_srcs
set
(
videoio_srcs
${
CMAKE_CURRENT_LIST_DIR
}
/src/videoio_registry.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/videoio_c.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/cap.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/cap.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/cap_images.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/cap_images.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/cap_mjpeg_encoder.cpp
${
CMAKE_CURRENT_LIST_DIR
}
/src/cap_mjpeg_encoder.cpp
...
...
modules/videoio/src/cap.cpp
View file @
c90e65ce
...
@@ -40,39 +40,10 @@
...
@@ -40,39 +40,10 @@
//M*/
//M*/
#include "precomp.hpp"
#include "precomp.hpp"
#include <iostream>
using
namespace
std
;
#include "cap_intelperc.hpp"
#include "cap_dshow.hpp"
#ifdef HAVE_MFX
#include "cap_mfx_reader.hpp"
#include "cap_mfx_writer.hpp"
#endif
// All WinRT versions older than 8.0 should provide classes used for video support
#if defined(WINRT) && !defined(WINRT_8_0) && defined(__cplusplus_winrt)
# include "cap_winrt_capture.hpp"
# include "cap_winrt_bridge.hpp"
# define WINRT_VIDEO
#endif
#if defined _M_X64 && defined _MSC_VER && !defined CV_ICC
#pragma optimize("",off)
#pragma warning(disable: 4748)
#endif
#if defined(__clang__)
#include "videoio_registry.hpp"
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
#endif
#if defined(__GNUC__) && __GNUC__ >= 7
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
#endif
using
namespace
cv
;
namespace
cv
{
namespace
cv
{
template
<>
void
DefaultDeleter
<
CvCapture
>::
operator
()(
CvCapture
*
obj
)
const
template
<>
void
DefaultDeleter
<
CvCapture
>::
operator
()(
CvCapture
*
obj
)
const
{
cvReleaseCapture
(
&
obj
);
}
{
cvReleaseCapture
(
&
obj
);
}
...
@@ -80,531 +51,7 @@ template<> void DefaultDeleter<CvCapture>::operator ()(CvCapture* obj) const
...
@@ -80,531 +51,7 @@ template<> void DefaultDeleter<CvCapture>::operator ()(CvCapture* obj) const
template
<>
void
DefaultDeleter
<
CvVideoWriter
>::
operator
()(
CvVideoWriter
*
obj
)
const
template
<>
void
DefaultDeleter
<
CvVideoWriter
>::
operator
()(
CvVideoWriter
*
obj
)
const
{
cvReleaseVideoWriter
(
&
obj
);
}
{
cvReleaseVideoWriter
(
&
obj
);
}
}
/************************* Reading AVIs & Camera data **************************/
static
inline
double
icvGetCaptureProperty
(
const
CvCapture
*
capture
,
int
id
)
{
return
capture
?
capture
->
getProperty
(
id
)
:
0
;
}
CV_IMPL
void
cvReleaseCapture
(
CvCapture
**
pcapture
)
{
if
(
pcapture
&&
*
pcapture
)
{
delete
*
pcapture
;
*
pcapture
=
0
;
}
}
CV_IMPL
IplImage
*
cvQueryFrame
(
CvCapture
*
capture
)
{
if
(
!
capture
)
return
0
;
if
(
!
capture
->
grabFrame
())
return
0
;
return
capture
->
retrieveFrame
(
0
);
}
CV_IMPL
int
cvGrabFrame
(
CvCapture
*
capture
)
{
return
capture
?
capture
->
grabFrame
()
:
0
;
}
CV_IMPL
IplImage
*
cvRetrieveFrame
(
CvCapture
*
capture
,
int
idx
)
{
return
capture
?
capture
->
retrieveFrame
(
idx
)
:
0
;
}
CV_IMPL
double
cvGetCaptureProperty
(
CvCapture
*
capture
,
int
id
)
{
return
icvGetCaptureProperty
(
capture
,
id
);
}
CV_IMPL
int
cvSetCaptureProperty
(
CvCapture
*
capture
,
int
id
,
double
value
)
{
return
capture
?
capture
->
setProperty
(
id
,
value
)
:
0
;
}
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) \
CV_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); \
} CV_CATCH (cv::Exception, e) { \
fprintf(stderr, "VIDEOIO(%s): raised OpenCV exception:\n\n%s\n", #backend_func, e.what()); \
} CV_CATCH (std::exception, e) { \
fprintf(stderr, "VIDEOIO(%s): raised C++ exception:\n\n%s\n", #backend_func, e.what()); \
} CV_CATCH_ALL { \
fprintf(stderr, "VIDEOIO(%s): raised unknown C++ exception!\n\n", #backend_func); \
} \
}
/**
* Camera dispatching method: index is the camera number.
* If given an index from 0 to 99, it tries to find the first
* API that can access a given camera index.
* Add multiples of 100 to select an API.
*/
CV_IMPL
CvCapture
*
cvCreateCameraCapture
(
int
index
)
{
// interpret preferred interface (0 = autodetect)
int
pref
=
(
index
/
100
)
*
100
;
// remove pref from index
index
-=
pref
;
// local variable to memorize the captured device
CvCapture
*
capture
=
0
;
switch
(
pref
)
{
default
:
// user specified an API we do not know
// bail out to let the user know that it is not available
if
(
pref
)
break
;
case
CAP_VFW
:
// or CAP_V4L or CAP_V4L2
#ifdef HAVE_VFW
TRY_OPEN
(
capture
,
cvCreateCameraCapture_VFW
(
index
))
#endif
#if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
TRY_OPEN
(
capture
,
cvCreateCameraCapture_V4L
(
index
))
#endif
if
(
pref
)
break
;
// CAP_VFW or CAP_V4L or CAP_V4L2
case
CAP_FIREWIRE
:
#ifdef HAVE_DC1394_2
TRY_OPEN
(
capture
,
cvCreateCameraCapture_DC1394_2
(
index
))
#endif
#ifdef HAVE_DC1394
TRY_OPEN
(
capture
,
cvCreateCameraCapture_DC1394
(
index
))
#endif
#ifdef HAVE_CMU1394
TRY_OPEN
(
capture
,
cvCreateCameraCapture_CMU
(
index
))
#endif
if
(
pref
)
break
;
// CAP_FIREWIRE
#ifdef HAVE_MIL
case
CAP_MIL
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_MIL
(
index
))
if
(
pref
)
break
;
#endif
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
case
CAP_QT
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_QT
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_UNICAP
case
CAP_UNICAP
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_Unicap
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_PVAPI
case
CAP_PVAPI
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_PvAPI
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_OPENNI
case
CAP_OPENNI
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_OpenNI
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_OPENNI2
case
CAP_OPENNI2
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_OpenNI2
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_XIMEA
case
CAP_XIAPI
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_XIMEA
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_AVFOUNDATION
case
CAP_AVFOUNDATION
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_AVFoundation
(
index
))
if
(
pref
)
break
;
#endif
#ifdef HAVE_GIGE_API
case
CAP_GIGANETIX
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_Giganetix
(
index
))
if
(
pref
)
break
;
// CAP_GIGANETIX
#endif
#ifdef HAVE_ARAVIS_API
case
CAP_ARAVIS
:
TRY_OPEN
(
capture
,
cvCreateCameraCapture_Aravis
(
index
))
if
(
pref
)
break
;
#endif
}
return
capture
;
}
/**
* Videoreader dispatching method: it tries to find the first
* API that can access a given filename.
*/
CV_IMPL
CvCapture
*
cvCreateFileCaptureWithPreference
(
const
char
*
filename
,
int
apiPreference
)
{
CvCapture
*
result
=
0
;
switch
(
apiPreference
)
{
default
:
// user specified an API we do not know
// bail out to let the user know that it is not available
if
(
apiPreference
)
break
;
#if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
case
CAP_V4L
:
TRY_OPEN
(
result
,
cvCreateCameraCapture_V4L
(
filename
))
if
(
apiPreference
)
break
;
#endif
#ifdef HAVE_VFW
case
CAP_VFW
:
TRY_OPEN
(
result
,
cvCreateFileCapture_VFW
(
filename
))
if
(
apiPreference
)
break
;
#endif
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
case
CAP_QT
:
TRY_OPEN
(
result
,
cvCreateFileCapture_QT
(
filename
))
if
(
apiPreference
)
break
;
#endif
#ifdef HAVE_AVFOUNDATION
case
CAP_AVFOUNDATION
:
TRY_OPEN
(
result
,
cvCreateFileCapture_AVFoundation
(
filename
))
if
(
apiPreference
)
break
;
#endif
#ifdef HAVE_OPENNI
case
CAP_OPENNI
:
TRY_OPEN
(
result
,
cvCreateFileCapture_OpenNI
(
filename
))
if
(
apiPreference
)
break
;
#endif
#ifdef HAVE_OPENNI2
case
CAP_OPENNI2
:
TRY_OPEN
(
result
,
cvCreateFileCapture_OpenNI2
(
filename
))
if
(
apiPreference
)
break
;
#endif
#ifdef HAVE_XIMEA
case
CAP_XIAPI
:
TRY_OPEN
(
result
,
cvCreateCameraCapture_XIMEA
(
filename
))
if
(
apiPreference
)
break
;
#endif
case
CAP_IMAGES
:
TRY_OPEN
(
result
,
cvCreateFileCapture_Images
(
filename
))
}
return
result
;
}
CV_IMPL
CvCapture
*
cvCreateFileCapture
(
const
char
*
filename
)
{
return
cvCreateFileCaptureWithPreference
(
filename
,
CAP_ANY
);
}
/**
* Videowriter dispatching method: it tries to find the first
* API that can write a given stream.
*/
static
CvVideoWriter
*
cvCreateVideoWriterWithPreference
(
const
char
*
filename
,
int
apiPreference
,
int
fourcc
,
double
fps
,
CvSize
frameSize
,
int
is_color
)
{
CV_UNUSED
(
frameSize
);
CV_UNUSED
(
is_color
);
CvVideoWriter
*
result
=
0
;
if
(
!
fourcc
||
!
fps
)
TRY_OPEN
(
result
,
cvCreateVideoWriter_Images
(
filename
))
CV_Assert
(
result
||
fps
!=
0
);
switch
(
apiPreference
)
{
default
:
//exit if the specified API is unavaliable
if
(
apiPreference
!=
CAP_ANY
)
break
;
#ifdef HAVE_VFW
case
CAP_VFW
:
TRY_OPEN
(
result
,
cvCreateVideoWriter_VFW
(
filename
,
fourcc
,
fps
,
frameSize
,
is_color
))
if
(
apiPreference
!=
CAP_ANY
)
break
;
#endif
#ifdef HAVE_AVFOUNDATION
case
CAP_AVFOUNDATION
:
TRY_OPEN
(
result
,
cvCreateVideoWriter_AVFoundation
(
filename
,
fourcc
,
fps
,
frameSize
,
is_color
))
if
(
apiPreference
!=
CAP_ANY
)
break
;
#endif
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
case
(
CAP_QT
):
TRY_OPEN
(
result
,
cvCreateVideoWriter_QT
(
filename
,
fourcc
,
fps
,
frameSize
,
is_color
))
if
(
apiPreference
!=
CAP_ANY
)
break
;
#endif
#ifdef HAVE_GSTREAMER
case
CAP_GSTREAMER
:
TRY_OPEN
(
result
,
cvCreateVideoWriter_GStreamer
(
filename
,
fourcc
,
fps
,
frameSize
,
is_color
))
if
(
apiPreference
!=
CAP_ANY
)
break
;
#endif
case
CAP_IMAGES
:
TRY_OPEN
(
result
,
cvCreateVideoWriter_Images
(
filename
))
if
(
apiPreference
!=
CAP_ANY
)
break
;
}
return
result
;
}
CV_IMPL
CvVideoWriter
*
cvCreateVideoWriter
(
const
char
*
filename
,
int
fourcc
,
double
fps
,
CvSize
frameSize
,
int
is_color
)
{
return
cvCreateVideoWriterWithPreference
(
filename
,
CAP_ANY
,
fourcc
,
fps
,
frameSize
,
is_color
);
}
CV_IMPL
int
cvWriteFrame
(
CvVideoWriter
*
writer
,
const
IplImage
*
image
)
{
return
writer
?
writer
->
writeFrame
(
image
)
:
0
;
}
CV_IMPL
void
cvReleaseVideoWriter
(
CvVideoWriter
**
pwriter
)
{
if
(
pwriter
&&
*
pwriter
)
{
delete
*
pwriter
;
*
pwriter
=
0
;
}
}
namespace
cv
{
static
Ptr
<
IVideoCapture
>
IVideoCapture_create
(
int
index
)
{
int
domains
[]
=
{
#ifdef HAVE_GSTREAMER
CAP_GSTREAMER
,
#endif
#ifdef HAVE_MSMF
CAP_MSMF
,
#endif
#ifdef HAVE_DSHOW
CAP_DSHOW
,
#endif
#ifdef HAVE_INTELPERC
CAP_INTELPERC
,
#endif
#ifdef WINRT_VIDEO
CAP_WINRT
,
#endif
#ifdef HAVE_GPHOTO2
CAP_GPHOTO2
,
#endif
-
1
,
-
1
};
// interpret preferred interface (0 = autodetect)
int
pref
=
(
index
/
100
)
*
100
;
if
(
pref
)
{
domains
[
0
]
=
pref
;
index
%=
100
;
domains
[
1
]
=-
1
;
}
// try every possibly installed camera API
for
(
int
i
=
0
;
domains
[
i
]
>=
0
;
i
++
)
{
#if defined(HAVE_GSTREAMER) || \
defined(HAVE_MSMF) || \
defined(HAVE_DSHOW) || \
defined(HAVE_INTELPERC) || \
defined(WINRT_VIDEO) || \
defined(HAVE_GPHOTO2) || \
(0)
Ptr
<
IVideoCapture
>
capture
;
switch
(
domains
[
i
])
{
#ifdef HAVE_GSTREAMER
case
CAP_GSTREAMER
:
capture
=
createGStreamerCapture
(
index
);
break
;
#endif
#ifdef HAVE_MSMF
case
CAP_MSMF
:
capture
=
cvCreateCapture_MSMF
(
index
);
break
;
// CAP_MSMF
#endif
#ifdef HAVE_DSHOW
case
CAP_DSHOW
:
capture
=
makePtr
<
VideoCapture_DShow
>
(
index
);
break
;
// CAP_DSHOW
#endif
#ifdef HAVE_INTELPERC
case
CAP_INTELPERC
:
capture
=
makePtr
<
VideoCapture_IntelPerC
>
();
break
;
// CAP_INTEL_PERC
#endif
#ifdef WINRT_VIDEO
case
CAP_WINRT
:
capture
=
Ptr
<
IVideoCapture
>
(
new
cv
::
VideoCapture_WinRT
(
index
));
if
(
capture
)
return
capture
;
break
;
// CAP_WINRT
#endif
#ifdef HAVE_GPHOTO2
case
CAP_GPHOTO2
:
capture
=
createGPhoto2Capture
(
index
);
break
;
#endif
}
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
#endif
}
// failed open a camera
return
Ptr
<
IVideoCapture
>
();
}
static
Ptr
<
IVideoCapture
>
IVideoCapture_create
(
const
String
&
filename
,
int
apiPreference
)
{
bool
useAny
=
(
apiPreference
==
CAP_ANY
);
Ptr
<
IVideoCapture
>
capture
;
#ifdef HAVE_FFMPEG
if
(
useAny
||
apiPreference
==
CAP_FFMPEG
)
{
capture
=
cvCreateFileCapture_FFMPEG_proxy
(
filename
);
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
#endif
#ifdef HAVE_GSTREAMER
if
(
useAny
||
apiPreference
==
CAP_GSTREAMER
)
{
capture
=
createGStreamerCapture
(
filename
);
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
#endif
#ifdef HAVE_XINE
if
(
useAny
||
apiPreference
==
CAP_XINE
)
{
capture
=
createXINECapture
(
filename
.
c_str
());
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
#endif
#ifdef HAVE_MSMF
if
(
useAny
||
apiPreference
==
CAP_MSMF
)
{
capture
=
cvCreateCapture_MSMF
(
filename
);
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
#endif
#ifdef HAVE_GPHOTO2
if
(
useAny
||
apiPreference
==
CAP_GPHOTO2
)
{
capture
=
createGPhoto2Capture
(
filename
);
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
#endif
#ifdef HAVE_MFX
if
(
useAny
||
apiPreference
==
CAP_INTEL_MFX
)
{
capture
=
makePtr
<
VideoCapture_IntelMFX
>
(
filename
);
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
#endif
if
(
useAny
||
apiPreference
==
CAP_OPENCV_MJPEG
)
{
capture
=
createMotionJpegCapture
(
filename
);
if
(
capture
&&
capture
->
isOpened
())
return
capture
;
}
if
(
capture
&&
!
capture
->
isOpened
())
capture
.
release
();
return
capture
;
}
static
Ptr
<
IVideoWriter
>
IVideoWriter_create
(
const
String
&
filename
,
int
apiPreference
,
int
_fourcc
,
double
fps
,
Size
frameSize
,
bool
isColor
)
{
Ptr
<
IVideoWriter
>
iwriter
;
#ifdef HAVE_FFMPEG
if
(
apiPreference
==
CAP_FFMPEG
||
apiPreference
==
CAP_ANY
)
{
iwriter
=
cvCreateVideoWriter_FFMPEG_proxy
(
filename
,
_fourcc
,
fps
,
frameSize
,
isColor
);
if
(
!
iwriter
.
empty
())
return
iwriter
;
}
#endif
#ifdef HAVE_MSMF
if
(
apiPreference
==
CAP_MSMF
||
apiPreference
==
CAP_ANY
)
{
iwriter
=
cvCreateVideoWriter_MSMF
(
filename
,
_fourcc
,
fps
,
frameSize
,
isColor
);
if
(
!
iwriter
.
empty
())
return
iwriter
;
}
#endif
#ifdef HAVE_MFX
if
(
apiPreference
==
CAP_INTEL_MFX
||
apiPreference
==
CAP_ANY
)
{
iwriter
=
VideoWriter_IntelMFX
::
create
(
filename
,
_fourcc
,
fps
,
frameSize
,
isColor
);
if
(
!
iwriter
.
empty
())
return
iwriter
;
}
#endif
if
(
(
apiPreference
==
CAP_OPENCV_MJPEG
||
apiPreference
==
CAP_ANY
)
&&
_fourcc
==
CV_FOURCC
(
'M'
,
'J'
,
'P'
,
'G'
)
)
iwriter
=
createMotionJpegWriter
(
filename
,
fps
,
frameSize
,
isColor
);
return
iwriter
;
}
VideoCapture
::
VideoCapture
()
VideoCapture
::
VideoCapture
()
{}
{}
...
@@ -640,12 +87,30 @@ bool VideoCapture::open(const String& filename, int apiPreference)
...
@@ -640,12 +87,30 @@ bool VideoCapture::open(const String& filename, int apiPreference)
CV_TRACE_FUNCTION
();
CV_TRACE_FUNCTION
();
if
(
isOpened
())
release
();
if
(
isOpened
())
release
();
icap
=
IVideoCapture_create
(
filename
,
apiPreference
);
if
(
!
icap
.
empty
())
return
true
;
cap
.
reset
(
cvCreateFileCaptureWithPreference
(
filename
.
c_str
(),
apiPreference
));
const
std
::
vector
<
VideoBackendInfo
>
backends
=
cv
::
videoio_registry
::
getAvailableBackends_CaptureByFilename
();
return
isOpened
();
for
(
size_t
i
=
0
;
i
<
backends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
backends
[
i
];
if
(
apiPreference
==
CAP_ANY
||
apiPreference
==
info
.
id
)
{
CvCapture
*
capture
=
NULL
;
VideoCapture_create
(
capture
,
icap
,
info
.
id
,
filename
);
if
(
!
icap
.
empty
())
{
if
(
icap
->
isOpened
())
return
true
;
icap
.
release
();
}
if
(
capture
)
{
cap
.
reset
(
capture
);
// assume it is opened
return
true
;
}
}
}
return
false
;
}
}
bool
VideoCapture
::
open
(
const
String
&
filename
)
bool
VideoCapture
::
open
(
const
String
&
filename
)
...
@@ -655,28 +120,56 @@ bool VideoCapture::open(const String& filename)
...
@@ -655,28 +120,56 @@ bool VideoCapture::open(const String& filename)
return
open
(
filename
,
CAP_ANY
);
return
open
(
filename
,
CAP_ANY
);
}
}
bool
VideoCapture
::
open
(
int
index
)
bool
VideoCapture
::
open
(
int
cameraNum
,
int
apiPreference
)
{
{
CV_TRACE_FUNCTION
();
CV_TRACE_FUNCTION
();
if
(
isOpened
())
release
();
if
(
isOpened
())
release
();
icap
=
IVideoCapture_create
(
index
);
if
(
!
icap
.
empty
())
const
std
::
vector
<
VideoBackendInfo
>
backends
=
cv
::
videoio_registry
::
getAvailableBackends_CaptureByIndex
();
return
true
;
for
(
size_t
i
=
0
;
i
<
backends
.
size
();
i
++
)
cap
.
reset
(
cvCreateCameraCapture
(
index
));
{
return
isOpened
();
const
VideoBackendInfo
&
info
=
backends
[
i
];
if
(
apiPreference
==
CAP_ANY
||
apiPreference
==
info
.
id
)
{
CvCapture
*
capture
=
NULL
;
VideoCapture_create
(
capture
,
icap
,
info
.
id
,
cameraNum
);
if
(
!
icap
.
empty
())
{
if
(
icap
->
isOpened
())
return
true
;
icap
.
release
();
}
if
(
capture
)
{
cap
.
reset
(
capture
);
// assume it is opened
return
true
;
}
}
}
return
false
;
}
}
bool
VideoCapture
::
open
(
int
cameraNum
,
int
apiPreference
)
bool
VideoCapture
::
open
(
int
index
)
{
{
CV_TRACE_FUNCTION
();
CV_TRACE_FUNCTION
();
cameraNum
=
cameraNum
+
apiPreference
;
// interpret preferred interface (0 = autodetect)
return
open
(
cameraNum
);
int
backendID
=
(
index
/
100
)
*
100
;
if
(
backendID
)
{
index
%=
100
;
}
return
open
(
index
,
backendID
);
}
}
bool
VideoCapture
::
isOpened
()
const
bool
VideoCapture
::
isOpened
()
const
{
{
return
(
!
cap
.
empty
()
||
!
icap
.
empty
());
if
(
!
icap
.
empty
())
return
icap
->
isOpened
();
return
!
icap
.
empty
();
// legacy interface doesn't support closed files
}
}
void
VideoCapture
::
release
()
void
VideoCapture
::
release
()
...
@@ -732,6 +225,7 @@ bool VideoCapture::read(OutputArray image)
...
@@ -732,6 +225,7 @@ bool VideoCapture::read(OutputArray image)
VideoCapture
&
VideoCapture
::
operator
>>
(
Mat
&
image
)
VideoCapture
&
VideoCapture
::
operator
>>
(
Mat
&
image
)
{
{
#ifdef WINRT_VIDEO
#ifdef WINRT_VIDEO
// FIXIT grab/retrieve methods() should work too
if
(
grab
())
if
(
grab
())
{
{
if
(
retrieve
(
image
))
if
(
retrieve
(
image
))
...
@@ -753,7 +247,6 @@ VideoCapture& VideoCapture::operator >> (Mat& image)
...
@@ -753,7 +247,6 @@ VideoCapture& VideoCapture::operator >> (Mat& image)
#else
#else
read
(
image
);
read
(
image
);
#endif
#endif
return
*
this
;
return
*
this
;
}
}
...
@@ -776,10 +269,14 @@ double VideoCapture::get(int propId) const
...
@@ -776,10 +269,14 @@ double VideoCapture::get(int propId) const
{
{
if
(
!
icap
.
empty
())
if
(
!
icap
.
empty
())
return
icap
->
getProperty
(
propId
);
return
icap
->
getProperty
(
propId
);
return
icvGetCaptureProperty
(
cap
,
propId
)
;
return
cap
?
cap
->
getProperty
(
propId
)
:
0
;
}
}
//=================================================================================================
VideoWriter
::
VideoWriter
()
VideoWriter
::
VideoWriter
()
{}
{}
...
@@ -815,11 +312,30 @@ bool VideoWriter::open(const String& filename, int apiPreference, int _fourcc, d
...
@@ -815,11 +312,30 @@ bool VideoWriter::open(const String& filename, int apiPreference, int _fourcc, d
CV_INSTRUMENT_REGION
()
CV_INSTRUMENT_REGION
()
if
(
isOpened
())
release
();
if
(
isOpened
())
release
();
iwriter
=
IVideoWriter_create
(
filename
,
apiPreference
,
_fourcc
,
fps
,
frameSize
,
isColor
);
if
(
!
iwriter
.
empty
())
const
std
::
vector
<
VideoBackendInfo
>
backends
=
cv
::
videoio_registry
::
getAvailableBackends_Writer
();
return
true
;
for
(
size_t
i
=
0
;
i
<
backends
.
size
();
i
++
)
writer
.
reset
(
cvCreateVideoWriterWithPreference
(
filename
.
c_str
(),
apiPreference
,
_fourcc
,
fps
,
frameSize
,
isColor
));
{
return
isOpened
();
const
VideoBackendInfo
&
info
=
backends
[
i
];
if
(
apiPreference
==
CAP_ANY
||
apiPreference
==
info
.
id
)
{
CvVideoWriter
*
writer_
=
NULL
;
VideoWriter_create
(
writer_
,
iwriter
,
info
.
id
,
filename
,
_fourcc
,
fps
,
frameSize
,
isColor
);
if
(
!
iwriter
.
empty
())
{
if
(
iwriter
->
isOpened
())
return
true
;
iwriter
.
release
();
}
if
(
writer_
)
{
// assume it is opened
writer
.
reset
(
writer_
);
return
true
;
}
}
}
return
false
;
}
}
bool
VideoWriter
::
isOpened
()
const
bool
VideoWriter
::
isOpened
()
const
...
@@ -863,9 +379,10 @@ VideoWriter& VideoWriter::operator << (const Mat& image)
...
@@ -863,9 +379,10 @@ VideoWriter& VideoWriter::operator << (const Mat& image)
return
*
this
;
return
*
this
;
}
}
// FIXIT OpenCV 4.0: make inline
int
VideoWriter
::
fourcc
(
char
c1
,
char
c2
,
char
c3
,
char
c4
)
int
VideoWriter
::
fourcc
(
char
c1
,
char
c2
,
char
c3
,
char
c4
)
{
{
return
(
c1
&
255
)
+
((
c2
&
255
)
<<
8
)
+
((
c3
&
255
)
<<
16
)
+
((
c4
&
255
)
<<
24
);
return
(
c1
&
255
)
+
((
c2
&
255
)
<<
8
)
+
((
c3
&
255
)
<<
16
)
+
((
c4
&
255
)
<<
24
);
}
}
}
}
// namespace
modules/videoio/src/cap_mjpeg_encoder.cpp
View file @
c90e65ce
...
@@ -1530,8 +1530,11 @@ void MotionJpegWriter::writeFrameData( const uchar* data, int step, int colorspa
...
@@ -1530,8 +1530,11 @@ void MotionJpegWriter::writeFrameData( const uchar* data, int step, int colorspa
}
}
Ptr
<
IVideoWriter
>
createMotionJpegWriter
(
const
String
&
filename
,
double
fps
,
Size
frameSize
,
bool
iscolor
)
Ptr
<
IVideoWriter
>
createMotionJpegWriter
(
const
String
&
filename
,
int
fourcc
,
double
fps
,
Size
frameSize
,
bool
iscolor
)
{
{
if
(
fourcc
!=
CV_FOURCC
(
'M'
,
'J'
,
'P'
,
'G'
))
return
Ptr
<
IVideoWriter
>
();
Ptr
<
IVideoWriter
>
iwriter
=
makePtr
<
mjpeg
::
MotionJpegWriter
>
(
filename
,
fps
,
frameSize
,
iscolor
);
Ptr
<
IVideoWriter
>
iwriter
=
makePtr
<
mjpeg
::
MotionJpegWriter
>
(
filename
,
fps
,
frameSize
,
iscolor
);
if
(
!
iwriter
->
isOpened
()
)
if
(
!
iwriter
->
isOpened
()
)
iwriter
.
release
();
iwriter
.
release
();
...
...
modules/videoio/src/precomp.hpp
View file @
c90e65ce
...
@@ -47,6 +47,9 @@
...
@@ -47,6 +47,9 @@
#include "opencv2/core/utility.hpp"
#include "opencv2/core/utility.hpp"
#include "opencv2/core/private.hpp"
#include "opencv2/core/private.hpp"
#include <opencv2/core/utils/configuration.private.hpp>
#include <opencv2/core/utils/logger.hpp>
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgproc.hpp"
...
@@ -59,7 +62,7 @@
...
@@ -59,7 +62,7 @@
#include <string.h>
#include <string.h>
#include <limits.h>
#include <limits.h>
#include <ctype.h>
#include <ctype.h>
#include <assert.h>
#include <assert.h>
// FIXIT remove this
#if defined _WIN32 || defined WINCE
#if defined _WIN32 || defined WINCE
#if !defined _WIN32_WINNT
#if !defined _WIN32_WINNT
...
@@ -178,7 +181,7 @@ namespace cv
...
@@ -178,7 +181,7 @@ namespace cv
};
};
Ptr
<
IVideoCapture
>
createMotionJpegCapture
(
const
String
&
filename
);
Ptr
<
IVideoCapture
>
createMotionJpegCapture
(
const
String
&
filename
);
Ptr
<
IVideoWriter
>
createMotionJpegWriter
(
const
String
&
filename
,
double
fps
,
Size
frameSize
,
bool
iscolor
);
Ptr
<
IVideoWriter
>
createMotionJpegWriter
(
const
String
&
filename
,
int
fourcc
,
double
fps
,
Size
frameSize
,
bool
iscolor
);
Ptr
<
IVideoCapture
>
createGPhoto2Capture
(
int
index
);
Ptr
<
IVideoCapture
>
createGPhoto2Capture
(
int
index
);
Ptr
<
IVideoCapture
>
createGPhoto2Capture
(
const
String
&
deviceName
);
Ptr
<
IVideoCapture
>
createGPhoto2Capture
(
const
String
&
deviceName
);
...
...
modules/videoio/src/videoio_c.cpp
0 → 100644
View file @
c90e65ce
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
#include "precomp.hpp"
#include "videoio_registry.hpp"
using
namespace
cv
;
// Legacy C-like API
CV_IMPL
CvCapture
*
cvCreateCameraCapture
(
int
index
)
{
// interpret preferred interface (0 = autodetect)
int
apiPreference
=
(
index
/
100
)
*
100
;
if
(
apiPreference
)
{
index
%=
100
;
}
const
std
::
vector
<
VideoBackendInfo
>
backends
=
cv
::
videoio_registry
::
getAvailableBackends_CaptureByIndex
();
for
(
size_t
i
=
0
;
i
<
backends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
backends
[
i
];
if
(
apiPreference
==
CAP_ANY
||
apiPreference
==
info
.
id
)
{
CvCapture
*
capture
=
NULL
;
Ptr
<
IVideoCapture
>
icap
;
// unused
VideoCapture_create
(
capture
,
icap
,
info
.
id
,
index
);
if
(
capture
)
{
return
capture
;
}
if
(
!
icap
.
empty
())
{
CV_LOG_WARNING
(
NULL
,
"cvCreateFileCaptureWithPreference: backend "
<<
info
.
name
<<
" doesn't support legacy API anymore."
)
}
}
}
return
NULL
;
}
CV_IMPL
CvCapture
*
cvCreateFileCaptureWithPreference
(
const
char
*
filename
,
int
apiPreference
)
{
const
std
::
vector
<
VideoBackendInfo
>
backends
=
cv
::
videoio_registry
::
getAvailableBackends_CaptureByFilename
();
for
(
size_t
i
=
0
;
i
<
backends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
backends
[
i
];
if
(
apiPreference
==
CAP_ANY
||
apiPreference
==
info
.
id
)
{
CvCapture
*
capture
=
NULL
;
Ptr
<
IVideoCapture
>
icap
;
// unused
VideoCapture_create
(
capture
,
icap
,
info
.
id
,
filename
);
if
(
capture
)
{
return
capture
;
}
if
(
!
icap
.
empty
())
{
CV_LOG_WARNING
(
NULL
,
"cvCreateFileCaptureWithPreference: backend "
<<
info
.
name
<<
" doesn't support legacy API anymore."
)
}
}
}
return
NULL
;
}
CV_IMPL
CvCapture
*
cvCreateFileCapture
(
const
char
*
filename
)
{
return
cvCreateFileCaptureWithPreference
(
filename
,
CAP_ANY
);
}
CV_IMPL
CvVideoWriter
*
cvCreateVideoWriter
(
const
char
*
filename
,
int
fourcc
,
double
fps
,
CvSize
frameSize
,
int
is_color
)
{
const
std
::
vector
<
VideoBackendInfo
>
backends
=
cv
::
videoio_registry
::
getAvailableBackends_Writer
();
for
(
size_t
i
=
0
;
i
<
backends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
backends
[
i
];
{
CvVideoWriter
*
writer_
=
NULL
;
Ptr
<
IVideoWriter
>
iwriter
;
// unused
VideoWriter_create
(
writer_
,
iwriter
,
info
.
id
,
filename
,
fourcc
,
fps
,
frameSize
,
is_color
!=
0
);
if
(
writer_
)
{
return
writer_
;
}
if
(
!
iwriter
.
empty
())
{
CV_LOG_WARNING
(
NULL
,
"cvCreateVideoWriter: backend "
<<
info
.
name
<<
" doesn't support legacy API anymore."
)
}
}
}
return
NULL
;
}
CV_IMPL
int
cvWriteFrame
(
CvVideoWriter
*
writer
,
const
IplImage
*
image
)
{
return
writer
?
writer
->
writeFrame
(
image
)
:
0
;
}
CV_IMPL
void
cvReleaseVideoWriter
(
CvVideoWriter
**
pwriter
)
{
if
(
pwriter
&&
*
pwriter
)
{
delete
*
pwriter
;
*
pwriter
=
0
;
}
}
CV_IMPL
void
cvReleaseCapture
(
CvCapture
**
pcapture
)
{
if
(
pcapture
&&
*
pcapture
)
{
delete
*
pcapture
;
*
pcapture
=
0
;
}
}
CV_IMPL
IplImage
*
cvQueryFrame
(
CvCapture
*
capture
)
{
if
(
!
capture
)
return
0
;
if
(
!
capture
->
grabFrame
())
return
0
;
return
capture
->
retrieveFrame
(
0
);
}
CV_IMPL
int
cvGrabFrame
(
CvCapture
*
capture
)
{
return
capture
?
capture
->
grabFrame
()
:
0
;
}
CV_IMPL
IplImage
*
cvRetrieveFrame
(
CvCapture
*
capture
,
int
idx
)
{
return
capture
?
capture
->
retrieveFrame
(
idx
)
:
0
;
}
CV_IMPL
double
cvGetCaptureProperty
(
CvCapture
*
capture
,
int
id
)
{
return
capture
?
capture
->
getProperty
(
id
)
:
0
;
}
CV_IMPL
int
cvSetCaptureProperty
(
CvCapture
*
capture
,
int
id
,
double
value
)
{
return
capture
?
capture
->
setProperty
(
id
,
value
)
:
0
;
}
CV_IMPL
int
cvGetCaptureDomain
(
CvCapture
*
capture
)
{
return
capture
?
capture
->
getCaptureDomain
()
:
0
;
}
modules/videoio/src/videoio_registry.cpp
0 → 100644
View file @
c90e65ce
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
#include "precomp.hpp"
#include "videoio_registry.hpp"
#include "cap_intelperc.hpp"
#include "cap_dshow.hpp"
#ifdef HAVE_MFX
#include "cap_mfx_reader.hpp"
#include "cap_mfx_writer.hpp"
#endif
// All WinRT versions older than 8.0 should provide classes used for video support
#if defined(WINRT) && !defined(WINRT_8_0) && defined(__cplusplus_winrt)
# include "cap_winrt_capture.hpp"
# include "cap_winrt_bridge.hpp"
# define WINRT_VIDEO
#endif
#if defined _M_X64 && defined _MSC_VER && !defined CV_ICC
#pragma optimize("",off)
#pragma warning(disable: 4748)
#endif
using
namespace
cv
;
namespace
cv
{
static
bool
param_VIDEOIO_DEBUG
=
utils
::
getConfigurationParameterBool
(
"OPENCV_VIDEOIO_DEBUG"
,
false
);
static
bool
param_VIDEOCAPTURE_DEBUG
=
utils
::
getConfigurationParameterBool
(
"OPENCV_VIDEOCAPTURE_DEBUG"
,
false
);
static
bool
param_VIDEOWRITER_DEBUG
=
utils
::
getConfigurationParameterBool
(
"OPENCV_VIDEOWRITER_DEBUG"
,
false
);
namespace
{
#define DECLARE_BACKEND(cap, name, mode) { cap, (BackendMode)(mode), 1000, name }
/** Ordering guidelines:
- modern optimized, multi-platform libraries: ffmpeg, gstreamer, Media SDK
- platform specific universal SDK: WINRT, QTKIT/AVFOUNDATION, MSMF/VFW/DSHOW, V4L/V4L2
- RGB-D: OpenNI/OpenNI2, INTELPERC/REALSENSE
- special OpenCV (file-based): "images", "mjpeg"
- special camera SDKs, including stereo: other special SDKs: FIREWIRE/1394, XIMEA/ARAVIS/GIGANETIX/PVAPI(GigE), UNICAP
- other: XINE, gphoto2, etc
*/
static
const
struct
VideoBackendInfo
builtin_backends
[]
=
{
#ifdef HAVE_FFMPEG
DECLARE_BACKEND
(
CAP_FFMPEG
,
"FFMPEG"
,
MODE_CAPTURE_BY_FILENAME
|
MODE_WRITER
),
#endif
#ifdef HAVE_GSTREAMER
DECLARE_BACKEND
(
CAP_GSTREAMER
,
"GSTREAMER"
,
MODE_CAPTURE_ALL
|
MODE_WRITER
),
#endif
#ifdef HAVE_MFX // Media SDK
DECLARE_BACKEND
(
CAP_INTEL_MFX
,
"INTEL_MFX"
,
MODE_CAPTURE_BY_FILENAME
|
MODE_WRITER
),
#endif
// Apple platform
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
DECLARE_BACKEND
(
CAP_QT
,
"QUICKTIME"
,
MODE_CAPTURE_ALL
|
MODE_WRITER
),
#endif
#ifdef HAVE_AVFOUNDATION
DECLARE_BACKEND
(
CAP_AVFOUNDATION
,
"AVFOUNDATION"
,
MODE_CAPTURE_ALL
|
MODE_WRITER
),
#endif
// Windows
#ifdef WINRT_VIDEO
DECLARE_BACKEND
(
CAP_WINRT
,
"WINRT"
,
MODE_CAPTURE_BY_FILENAME
),
#endif
#ifdef HAVE_MSMF
DECLARE_BACKEND
(
CAP_MSMF
,
"MSMF"
,
MODE_CAPTURE_ALL
|
MODE_WRITER
),
#endif
#ifdef HAVE_VFW
DECLARE_BACKEND
(
CAP_VFW
,
"VFW"
,
MODE_CAPTURE_ALL
|
MODE_WRITER
),
#endif
#ifdef HAVE_DSHOW
DECLARE_BACKEND
(
CAP_DSHOW
,
"DSHOW"
,
MODE_CAPTURE_ALL
),
#endif
// Linux, some Unix
#if defined HAVE_CAMV4L2
DECLARE_BACKEND
(
CAP_V4L2
,
"V4L2"
,
MODE_CAPTURE_ALL
),
#elif defined HAVE_LIBV4L || defined HAVE_CAMV4L
DECLARE_BACKEND
(
CAP_V4L
,
"V4L"
,
MODE_CAPTURE_ALL
),
#endif
// RGB-D universal
#ifdef HAVE_OPENNI
DECLARE_BACKEND
(
CAP_OPENNI
,
"OPENNI"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_OPENNI2
DECLARE_BACKEND
(
CAP_OPENNI2
,
"OPENNI2"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_INTELPERC
DECLARE_BACKEND
(
CAP_INTELPERC
,
"INTEL_PERC"
,
MODE_CAPTURE_ALL
),
#endif
// OpenCV file-based only
DECLARE_BACKEND
(
CAP_IMAGES
,
"CV_IMAGES"
,
MODE_CAPTURE_BY_FILENAME
|
MODE_WRITER
),
DECLARE_BACKEND
(
CAP_OPENCV_MJPEG
,
"CV_MJPEG"
,
MODE_CAPTURE_BY_FILENAME
|
MODE_WRITER
),
// special interfaces / stereo cameras / other SDKs
#if defined(HAVE_DC1394_2) || defined(HAVE_DC1394) || defined(HAVE_CMU1394)
DECLARE_BACKEND
(
CAP_FIREWIRE
,
"FIREWIRE"
,
MODE_CAPTURE_ALL
),
#endif
// GigE
#ifdef HAVE_PVAPI
DECLARE_BACKEND
(
CAP_PVAPI
,
"PVAPI"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_XIMEA
DECLARE_BACKEND
(
CAP_XIAPI
,
"XIMEA"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_GIGE_API
DECLARE_BACKEND
(
CAP_GIGANETIX
,
"GIGANETIX"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_ARAVIS_API
DECLARE_BACKEND
(
CAP_ARAVIS
,
"ARAVIS"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_UNICAP
DECLARE_BACKEND
(
CAP_UNICAP
,
"UNICAP"
,
MODE_CAPTURE_BY_FILENAME
),
#endif
#ifdef HAVE_GPHOTO2
DECLARE_BACKEND
(
CAP_GPHOTO2
,
"GPHOTO2"
,
MODE_CAPTURE_ALL
),
#endif
#ifdef HAVE_XINE
DECLARE_BACKEND
(
CAP_XINE
,
"XINE"
,
MODE_CAPTURE_BY_FILENAME
),
#endif
// dropped backends: MIL, TYZX, Android
};
bool
sortByPriority
(
const
VideoBackendInfo
&
lhs
,
const
VideoBackendInfo
&
rhs
)
{
return
lhs
.
priority
>
rhs
.
priority
;
}
/** @brief Manages list of enabled backends
*/
class
VideoBackendRegistry
{
protected
:
std
::
vector
<
VideoBackendInfo
>
enabledBackends
;
VideoBackendRegistry
()
{
const
int
N
=
sizeof
(
builtin_backends
)
/
sizeof
(
builtin_backends
[
0
]);
enabledBackends
.
assign
(
builtin_backends
,
builtin_backends
+
N
);
for
(
int
i
=
0
;
i
<
N
;
i
++
)
{
VideoBackendInfo
&
info
=
enabledBackends
[
i
];
info
.
priority
=
1000
-
i
*
10
;
}
CV_LOG_DEBUG
(
NULL
,
"VIDEOIO: Builtin backends("
<<
N
<<
"): "
<<
dumpBackends
());
if
(
readPrioritySettings
())
{
CV_LOG_INFO
(
NULL
,
"VIDEOIO: Updated backends priorities: "
<<
dumpBackends
());
}
int
enabled
=
0
;
for
(
int
i
=
0
;
i
<
N
;
i
++
)
{
VideoBackendInfo
&
info
=
enabledBackends
[
enabled
];
if
(
enabled
!=
i
)
info
=
enabledBackends
[
i
];
size_t
param_priority
=
utils
::
getConfigurationParameterSizeT
(
cv
::
format
(
"OPENCV_VIDEOIO_PRIORITY_%s"
,
info
.
name
).
c_str
(),
(
size_t
)
info
.
priority
);
CV_Assert
(
param_priority
==
(
size_t
)(
int
)
param_priority
);
// overflow check
if
(
param_priority
>
0
)
{
info
.
priority
=
(
int
)
param_priority
;
enabled
++
;
}
else
{
CV_LOG_INFO
(
NULL
,
"VIDEOIO: Disable backend: "
<<
info
.
name
);
}
}
enabledBackends
.
resize
(
enabled
);
CV_LOG_DEBUG
(
NULL
,
"VIDEOIO: Available backends("
<<
enabled
<<
"): "
<<
dumpBackends
());
std
::
sort
(
enabledBackends
.
begin
(),
enabledBackends
.
end
(),
sortByPriority
);
CV_LOG_INFO
(
NULL
,
"VIDEOIO: Enabled backends("
<<
enabled
<<
", sorted by priority): "
<<
dumpBackends
());
}
static
std
::
vector
<
std
::
string
>
tokenize_string
(
const
std
::
string
&
input
,
char
token
)
{
std
::
vector
<
std
::
string
>
result
;
std
::
string
::
size_type
prev_pos
=
0
,
pos
=
0
;
while
((
pos
=
input
.
find
(
token
,
pos
))
!=
std
::
string
::
npos
)
{
result
.
push_back
(
input
.
substr
(
prev_pos
,
pos
-
prev_pos
));
prev_pos
=
++
pos
;
}
result
.
push_back
(
input
.
substr
(
prev_pos
));
return
result
;
}
bool
readPrioritySettings
()
{
bool
hasChanges
=
false
;
cv
::
String
prioritized_backends
=
utils
::
getConfigurationParameterString
(
"OPENCV_VIDEOIO_PRIORITY_LIST"
,
NULL
);
if
(
prioritized_backends
.
empty
())
return
hasChanges
;
CV_LOG_INFO
(
NULL
,
"VIDEOIO: Configured priority list (OPENCV_VIDEOIO_PRIORITY_LIST): "
<<
prioritized_backends
);
const
std
::
vector
<
std
::
string
>
names
=
tokenize_string
(
prioritized_backends
,
','
);
for
(
size_t
i
=
0
;
i
<
names
.
size
();
i
++
)
{
const
std
::
string
&
name
=
names
[
i
];
bool
found
=
false
;
for
(
size_t
k
=
0
;
k
<
enabledBackends
.
size
();
k
++
)
{
VideoBackendInfo
&
info
=
enabledBackends
[
k
];
if
(
name
==
info
.
name
)
{
info
.
priority
=
(
int
)(
100000
+
(
names
.
size
()
-
i
)
*
1000
);
CV_LOG_DEBUG
(
NULL
,
"VIDEOIO: New backend priority: '"
<<
name
<<
"' => "
<<
info
.
priority
);
found
=
true
;
hasChanges
=
true
;
break
;
}
}
if
(
!
found
)
{
CV_LOG_WARNING
(
NULL
,
"VIDEOIO: Can't prioritize unknown/unavailable backend: '"
<<
name
<<
"'"
);
}
}
return
hasChanges
;
}
public
:
std
::
string
dumpBackends
()
const
{
std
::
ostringstream
os
;
for
(
size_t
i
=
0
;
i
<
enabledBackends
.
size
();
i
++
)
{
if
(
i
>
0
)
os
<<
"; "
;
const
VideoBackendInfo
&
info
=
enabledBackends
[
i
];
os
<<
info
.
name
<<
'('
<<
info
.
priority
<<
')'
;
}
return
os
.
str
();
}
static
VideoBackendRegistry
&
getInstance
()
{
static
VideoBackendRegistry
g_instance
;
return
g_instance
;
}
inline
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_CaptureByIndex
()
const
{
std
::
vector
<
VideoBackendInfo
>
result
;
for
(
size_t
i
=
0
;
i
<
enabledBackends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
enabledBackends
[
i
];
if
(
info
.
mode
&
MODE_CAPTURE_BY_INDEX
)
result
.
push_back
(
info
);
}
return
result
;
}
inline
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_CaptureByFilename
()
const
{
std
::
vector
<
VideoBackendInfo
>
result
;
for
(
size_t
i
=
0
;
i
<
enabledBackends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
enabledBackends
[
i
];
if
(
info
.
mode
&
MODE_CAPTURE_BY_FILENAME
)
result
.
push_back
(
info
);
}
return
result
;
}
inline
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_Writer
()
const
{
std
::
vector
<
VideoBackendInfo
>
result
;
for
(
size_t
i
=
0
;
i
<
enabledBackends
.
size
();
i
++
)
{
const
VideoBackendInfo
&
info
=
enabledBackends
[
i
];
if
(
info
.
mode
&
MODE_WRITER
)
result
.
push_back
(
info
);
}
return
result
;
}
};
}
// namespace
namespace
videoio_registry
{
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_CaptureByIndex
()
{
const
std
::
vector
<
VideoBackendInfo
>
result
=
VideoBackendRegistry
::
getInstance
().
getAvailableBackends_CaptureByFilename
();
return
result
;
}
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_CaptureByFilename
()
{
const
std
::
vector
<
VideoBackendInfo
>
result
=
VideoBackendRegistry
::
getInstance
().
getAvailableBackends_CaptureByFilename
();
return
result
;
}
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_Writer
()
{
const
std
::
vector
<
VideoBackendInfo
>
result
=
VideoBackendRegistry
::
getInstance
().
getAvailableBackends_Writer
();
return
result
;
}
}
// namespace registry
#define TRY_OPEN(backend_func) \
{ \
try { \
if (param_VIDEOIO_DEBUG || param_VIDEOCAPTURE_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): trying ...\n", #backend_func)); \
icap = backend_func; \
if (param_VIDEOIO_DEBUG ||param_VIDEOCAPTURE_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): result=%p isOpened=%d ...\n", \
#backend_func, icap.empty() ? NULL : icap.get(), icap.empty() ? -1: icap->isOpened())); \
} catch(const cv::Exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised OpenCV exception:\n\n%s\n", #backend_func, e.what())); \
} catch (const std::exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised C++ exception:\n\n%s\n", #backend_func, e.what())); \
} catch(...) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised unknown C++ exception!\n\n", #backend_func)); \
} \
break; \
}
#define TRY_OPEN_LEGACY(backend_func) \
{ \
try { \
if (param_VIDEOIO_DEBUG || param_VIDEOCAPTURE_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): trying ...\n", #backend_func)); \
capture = backend_func; \
if (param_VIDEOIO_DEBUG || param_VIDEOCAPTURE_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): result=%p ...\n", #backend_func, capture)); \
} catch(const cv::Exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised OpenCV exception:\n\n%s\n", #backend_func, e.what())); \
} catch (const std::exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised C++ exception:\n\n%s\n", #backend_func, e.what())); \
} catch(...) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised unknown C++ exception!\n\n", #backend_func)); \
} \
break; \
}
void
VideoCapture_create
(
CvCapture
*&
capture
,
Ptr
<
IVideoCapture
>&
icap
,
VideoCaptureAPIs
api
,
int
index
)
{
CV_UNUSED
(
capture
);
CV_UNUSED
(
icap
);
switch
(
api
)
{
default
:
CV_LOG_WARNING
(
NULL
,
"VideoCapture(index="
<<
index
<<
") was built without support of requested backendID="
<<
(
int
)
api
);
break
;
#ifdef HAVE_GSTREAMER
case
CAP_GSTREAMER
:
TRY_OPEN
(
createGStreamerCapture
(
index
));
break
;
#endif
#ifdef HAVE_MSMF
case
CAP_MSMF
:
TRY_OPEN
(
cvCreateCapture_MSMF
(
index
));
break
;
#endif
#ifdef HAVE_DSHOW
case
CAP_DSHOW
:
TRY_OPEN
(
makePtr
<
VideoCapture_DShow
>
(
index
));
break
;
#endif
#ifdef HAVE_INTELPERC
case
CAP_INTELPERC
:
TRY_OPEN
(
makePtr
<
VideoCapture_IntelPerC
>
());
break
;
#endif
#ifdef WINRT_VIDEO
case
CAP_WINRT
:
TRY_OPEN
(
makePtr
<
cv
::
VideoCapture_WinRT
>
(
index
));
break
;
#endif
#ifdef HAVE_GPHOTO2
case
CAP_GPHOTO2
:
TRY_OPEN
(
createGPhoto2Capture
(
index
));
break
;
#endif
case
CAP_VFW
:
// or CAP_V4L or CAP_V4L2
#ifdef HAVE_VFW
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_VFW
(
index
))
#endif
#if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_V4L
(
index
))
#endif
break
;
case
CAP_FIREWIRE
:
#ifdef HAVE_DC1394_2
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_DC1394_2
(
index
))
#endif
#ifdef HAVE_DC1394
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_DC1394
(
index
))
#endif
#ifdef HAVE_CMU1394
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_CMU
(
index
))
#endif
break
;
// CAP_FIREWIRE
#ifdef HAVE_MIL
case
CAP_MIL
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_MIL
(
index
))
break
;
#endif
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
case
CAP_QT
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_QT
(
index
))
break
;
#endif
#ifdef HAVE_UNICAP
case
CAP_UNICAP
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_Unicap
(
index
))
break
;
#endif
#ifdef HAVE_PVAPI
case
CAP_PVAPI
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_PvAPI
(
index
))
break
;
#endif
#ifdef HAVE_OPENNI
case
CAP_OPENNI
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_OpenNI
(
index
))
break
;
#endif
#ifdef HAVE_OPENNI2
case
CAP_OPENNI2
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_OpenNI2
(
index
))
break
;
#endif
#ifdef HAVE_XIMEA
case
CAP_XIAPI
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_XIMEA
(
index
))
break
;
#endif
#ifdef HAVE_AVFOUNDATION
case
CAP_AVFOUNDATION
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_AVFoundation
(
index
))
break
;
#endif
#ifdef HAVE_GIGE_API
case
CAP_GIGANETIX
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_Giganetix
(
index
))
break
;
#endif
#ifdef HAVE_ARAVIS_API
case
CAP_ARAVIS
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_Aravis
(
index
))
break
;
#endif
}
// switch (api)
}
void
VideoCapture_create
(
CvCapture
*&
capture
,
Ptr
<
IVideoCapture
>&
icap
,
VideoCaptureAPIs
api
,
const
cv
::
String
&
filename
)
{
switch
(
api
)
{
default
:
CV_LOG_WARNING
(
NULL
,
"VideoCapture(filename="
<<
filename
<<
") was built without support of requested backendID="
<<
(
int
)
api
);
break
;
#if defined HAVE_LIBV4L || defined HAVE_CAMV4L || defined HAVE_CAMV4L2 || defined HAVE_VIDEOIO
case
CAP_V4L
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_V4L
(
filename
.
c_str
()))
break
;
#endif
#ifdef HAVE_VFW
case
CAP_VFW
:
TRY_OPEN_LEGACY
(
cvCreateFileCapture_VFW
(
filename
.
c_str
()))
break
;
#endif
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
case
CAP_QT
:
TRY_OPEN_LEGACY
(
cvCreateFileCapture_QT
(
filename
.
c_str
()))
break
;
#endif
#ifdef HAVE_AVFOUNDATION
case
CAP_AVFOUNDATION
:
TRY_OPEN_LEGACY
(
cvCreateFileCapture_AVFoundation
(
filename
.
c_str
()))
break
;
#endif
#ifdef HAVE_OPENNI
case
CAP_OPENNI
:
TRY_OPEN_LEGACY
(
cvCreateFileCapture_OpenNI
(
filename
.
c_str
()))
break
;
#endif
#ifdef HAVE_OPENNI2
case
CAP_OPENNI2
:
TRY_OPEN_LEGACY
(
cvCreateFileCapture_OpenNI2
(
filename
.
c_str
()))
break
;
#endif
#ifdef HAVE_XIMEA
case
CAP_XIAPI
:
TRY_OPEN_LEGACY
(
cvCreateCameraCapture_XIMEA
(
filename
.
c_str
()))
break
;
#endif
case
CAP_IMAGES
:
TRY_OPEN_LEGACY
(
cvCreateFileCapture_Images
(
filename
.
c_str
()))
break
;
#ifdef HAVE_FFMPEG
case
CAP_FFMPEG
:
TRY_OPEN
(
cvCreateFileCapture_FFMPEG_proxy
(
filename
))
break
;
#endif
#ifdef HAVE_GSTREAMER
case
CAP_GSTREAMER
:
TRY_OPEN
(
createGStreamerCapture
(
filename
))
break
;
#endif
#ifdef HAVE_XINE
case
CAP_XINE
:
TRY_OPEN
(
createXINECapture
(
filename
.
c_str
()))
break
;
#endif
#ifdef HAVE_MSMF
case
CAP_MSMF
:
TRY_OPEN
(
cvCreateCapture_MSMF
(
filename
))
break
;
#endif
#ifdef HAVE_GPHOTO2
case
CAP_GPHOTO2
:
TRY_OPEN
(
createGPhoto2Capture
(
filename
))
break
;
#endif
#ifdef HAVE_MFX
case
CAP_INTEL_MFX
:
TRY_OPEN
(
makePtr
<
VideoCapture_IntelMFX
>
(
filename
))
break
;
#endif
case
CAP_OPENCV_MJPEG
:
TRY_OPEN
(
createMotionJpegCapture
(
filename
))
break
;
}
// switch
}
void
VideoWriter_create
(
CvVideoWriter
*&
writer
,
Ptr
<
IVideoWriter
>&
iwriter
,
VideoCaptureAPIs
api
,
const
String
&
filename
,
int
fourcc
,
double
fps
,
const
Size
&
frameSize
,
bool
isColor
)
{
#define CREATE_WRITER(backend_func) \
{ \
try { \
if (param_VIDEOIO_DEBUG || param_VIDEOWRITER_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): trying ...\n", #backend_func)); \
iwriter = backend_func; \
if (param_VIDEOIO_DEBUG || param_VIDEOWRITER_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): result=%p isOpened=%d...\n", #backend_func, iwriter.empty() ? NULL : iwriter.get(), iwriter.empty() ? iwriter->isOpened() : -1)); \
} catch(const cv::Exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised OpenCV exception:\n\n%s\n", #backend_func, e.what())); \
} catch (const std::exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised C++ exception:\n\n%s\n", #backend_func, e.what())); \
} catch(...) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised unknown C++ exception!\n\n", #backend_func)); \
} \
break; \
}
#define CREATE_WRITER_LEGACY(backend_func) \
{ \
try { \
if (param_VIDEOIO_DEBUG || param_VIDEOWRITER_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): trying ...\n", #backend_func)); \
writer = backend_func; \
if (param_VIDEOIO_DEBUG || param_VIDEOWRITER_DEBUG) \
CV_LOG_WARNING(NULL, cv::format("VIDEOIO(%s): result=%p...\n", #backend_func, writer)); \
} catch(const cv::Exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised OpenCV exception:\n\n%s\n", #backend_func, e.what())); \
} catch (const std::exception& e) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised C++ exception:\n\n%s\n", #backend_func, e.what())); \
} catch(...) { \
CV_LOG_ERROR(NULL, cv::format("VIDEOIO(%s): raised unknown C++ exception!\n\n", #backend_func)); \
} \
break; \
}
switch
(
api
)
{
default
:
CV_LOG_ERROR
(
NULL
,
"Unknown VideoWriter backend (check getBuildInformation()): "
<<
(
int
)
api
);
break
;
#ifdef HAVE_FFMPEG
case
CAP_FFMPEG
:
CREATE_WRITER
(
cvCreateVideoWriter_FFMPEG_proxy
(
filename
,
fourcc
,
fps
,
frameSize
,
isColor
));
break
;
#endif
#ifdef HAVE_MSMF
case
CAP_MSMF
:
CREATE_WRITER
(
cvCreateVideoWriter_MSMF
(
filename
,
fourcc
,
fps
,
frameSize
,
isColor
));
break
;
#endif
#ifdef HAVE_MFX
case
CAP_INTEL_MFX
:
CREATE_WRITER
(
VideoWriter_IntelMFX
::
create
(
filename
,
fourcc
,
fps
,
frameSize
,
isColor
));
break
;
#endif
#ifdef HAVE_VFW
case
CAP_VFW
:
CREATE_WRITER_LEGACY
(
cvCreateVideoWriter_VFW
(
filename
.
c_str
(),
fourcc
,
fps
,
frameSize
,
isColor
))
break
;
#endif
#ifdef HAVE_AVFOUNDATION
case
CAP_AVFOUNDATION
:
CREATE_WRITER_LEGACY
(
cvCreateVideoWriter_AVFoundation
(
filename
.
c_str
(),
fourcc
,
fps
,
frameSize
,
isColor
))
break
;
#endif
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
case
(
CAP_QT
):
CREATE_WRITER_LEGACY
(
cvCreateVideoWriter_QT
(
filename
.
c_str
(),
fourcc
,
fps
,
frameSize
,
isColor
))
break
;
#endif
#ifdef HAVE_GSTREAMER
case
CAP_GSTREAMER
:
CREATE_WRITER_LEGACY
(
cvCreateVideoWriter_GStreamer
(
filename
.
c_str
(),
fourcc
,
fps
,
frameSize
,
isColor
))
break
;
#endif
case
CAP_OPENCV_MJPEG
:
CREATE_WRITER
(
createMotionJpegWriter
(
filename
,
fourcc
,
fps
,
frameSize
,
isColor
));
break
;
case
CAP_IMAGES
:
if
(
!
fourcc
||
!
fps
)
{
CREATE_WRITER_LEGACY
(
cvCreateVideoWriter_Images
(
filename
.
c_str
()));
}
break
;
}
// switch(api)
}
}
// namespace
modules/videoio/src/videoio_registry.hpp
0 → 100644
View file @
c90e65ce
// This file is part of OpenCV project.
// It is subject to the license terms in the LICENSE file found in the top-level directory
// of this distribution and at http://opencv.org/license.html.
#ifndef __OPENCV_VIDEOIO_VIDEOIO_REGISTRY_HPP__
#define __OPENCV_VIDEOIO_VIDEOIO_REGISTRY_HPP__
namespace
cv
{
/** Capabilities bitmask */
enum
BackendMode
{
MODE_CAPTURE_BY_INDEX
=
1
<<
0
,
//!< device index
MODE_CAPTURE_BY_FILENAME
=
1
<<
1
,
//!< filename or device path (v4l2)
MODE_WRITER
=
1
<<
4
,
//!< writer
MODE_CAPTURE_ALL
=
MODE_CAPTURE_BY_INDEX
+
MODE_CAPTURE_BY_FILENAME
,
};
struct
VideoBackendInfo
{
VideoCaptureAPIs
id
;
BackendMode
mode
;
int
priority
;
// 1000-<index*10> - default builtin priority
// 0 - disabled (OPENCV_VIDEOIO_PRIORITY_<name> = 0)
// >10000 - prioritized list (OPENCV_VIDEOIO_PRIORITY_LIST)
const
char
*
name
;
};
namespace
videoio_registry
{
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_CaptureByIndex
();
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_CaptureByFilename
();
std
::
vector
<
VideoBackendInfo
>
getAvailableBackends_Writer
();
}
// namespace
void
VideoCapture_create
(
CvCapture
*&
capture
,
Ptr
<
IVideoCapture
>&
icap
,
VideoCaptureAPIs
api
,
int
index
);
void
VideoCapture_create
(
CvCapture
*&
capture
,
Ptr
<
IVideoCapture
>&
icap
,
VideoCaptureAPIs
api
,
const
cv
::
String
&
filename
);
void
VideoWriter_create
(
CvVideoWriter
*&
writer
,
Ptr
<
IVideoWriter
>&
iwriter
,
VideoCaptureAPIs
api
,
const
String
&
filename
,
int
fourcc
,
double
fps
,
const
Size
&
frameSize
,
bool
isColor
);
}
// namespace
#endif // __OPENCV_VIDEOIO_VIDEOIO_REGISTRY_HPP__
modules/videoio/test/test_ffmpeg.cpp
View file @
c90e65ce
...
@@ -228,7 +228,7 @@ public:
...
@@ -228,7 +228,7 @@ public:
static
std
::
string
TmpDirectory
;
static
std
::
string
TmpDirectory
;
CreateVideoWriterInvoker
(
std
::
vector
<
VideoWriter
*>&
_writers
,
std
::
vector
<
std
::
string
>&
_files
)
:
CreateVideoWriterInvoker
(
std
::
vector
<
VideoWriter
*>&
_writers
,
std
::
vector
<
std
::
string
>&
_files
)
:
ParallelLoopBody
(),
writers
(
&
_writers
),
files
(
&
_files
)
writers
(
_writers
),
files
(
_files
)
{
{
}
}
...
@@ -240,16 +240,16 @@ public:
...
@@ -240,16 +240,16 @@ public:
stream
<<
i
<<
".avi"
;
stream
<<
i
<<
".avi"
;
std
::
string
fileName
=
tempfile
(
stream
.
str
().
c_str
());
std
::
string
fileName
=
tempfile
(
stream
.
str
().
c_str
());
files
->
operator
[](
i
)
=
fileName
;
files
[
i
]
=
fileName
;
writers
->
operator
[](
i
)
=
new
VideoWriter
(
fileName
,
CAP_FFMPEG
,
VideoWriter
::
fourcc
(
'X'
,
'V'
,
'I'
,
'D'
),
25.0
f
,
FrameSize
);
writers
[
i
]
=
new
VideoWriter
(
fileName
,
CAP_FFMPEG
,
VideoWriter
::
fourcc
(
'X'
,
'V'
,
'I'
,
'D'
),
25.0
f
,
FrameSize
);
CV_Assert
(
writers
->
operator
[](
i
)
->
isOpened
());
CV_Assert
(
writers
[
i
]
->
isOpened
());
}
}
}
}
private
:
private
:
std
::
vector
<
VideoWriter
*>
*
writers
;
std
::
vector
<
VideoWriter
*>
&
writers
;
std
::
vector
<
std
::
string
>
*
files
;
std
::
vector
<
std
::
string
>
&
files
;
};
};
std
::
string
CreateVideoWriterInvoker
::
TmpDirectory
;
std
::
string
CreateVideoWriterInvoker
::
TmpDirectory
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment