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
f5081712
Commit
f5081712
authored
Oct 24, 2015
by
Pavel Rojtberg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
v4l: remove needless CvCaptureCAM_V4L_CPP wrapper
possible source of memory leaks and unneeded complexity
parent
93d6e800
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
49 additions
and
77 deletions
+49
-77
cap_v4l.cpp
modules/videoio/src/cap_v4l.cpp
+49
-77
No files found.
modules/videoio/src/cap_v4l.cpp
View file @
f5081712
...
...
@@ -265,7 +265,7 @@ struct buffer
static
unsigned
int
n_buffers
=
0
;
struct
CvCaptureCAM_V4L
struct
CvCaptureCAM_V4L
:
public
CvCapture
{
int
deviceHandle
;
int
bufferIndex
;
...
...
@@ -297,6 +297,13 @@ struct CvCaptureCAM_V4L
/* V4L2 control variables */
Range
focus
,
brightness
,
contrast
,
saturation
,
hue
,
gain
,
exposure
;
bool
open
(
int
_index
);
virtual
double
getProperty
(
int
)
const
;
virtual
bool
setProperty
(
int
,
double
);
virtual
bool
grabFrame
();
virtual
IplImage
*
retrieveFrame
(
int
);
Range
getRange
(
int
property_id
)
const
{
switch
(
property_id
)
{
case
CV_CAP_PROP_BRIGHTNESS
:
...
...
@@ -320,7 +327,7 @@ struct CvCaptureCAM_V4L
}
}
~
CvCaptureCAM_V4L
();
virtual
~
CvCaptureCAM_V4L
();
};
static
void
icvCloseCAM_V4L
(
CvCaptureCAM_V4L
*
capture
);
...
...
@@ -743,53 +750,50 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture)
* this also causes buffers to be reallocated if the frame size was changed.
*/
static
bool
v4l2_reset
(
CvCaptureCAM_V4L
*
capture
)
{
int
index
=
capture
->
index
;
icvCloseCAM_V4L
(
capture
);
capture
->
index
=
index
;
return
_capture_V4L2
(
capture
)
==
1
;
}
static
CvCaptureCAM_V4L
*
icvCaptureFromCAM_V4L
(
int
index
)
bool
CvCaptureCAM_V4L
::
open
(
int
_
index
)
{
int
autoindex
=
0
;
index
=
-
1
;
// set the capture to closed state
if
(
!
numCameras
)
icvInitCapture_V4L
();
/* Havent called icvInitCapture yet - do it now! */
if
(
!
numCameras
)
return
NULL
;
/* Are there any /dev/video input sources? */
return
false
;
/* Are there any /dev/video input sources? */
//search index in indexList
if
(
(
index
>-
1
)
&&
!
((
1
<<
index
)
&
indexList
)
)
if
(
(
_index
>-
1
)
&&
!
((
1
<<
_
index
)
&
indexList
)
)
{
fprintf
(
stderr
,
"VIDEOIO ERROR: V4L: index %d is not correct!
\n
"
,
index
);
return
NULL
;
/* Did someone ask for not correct video source number? */
fprintf
(
stderr
,
"VIDEOIO ERROR: V4L: index %d is not correct!
\n
"
,
_
index
);
return
false
;
/* Did someone ask for not correct video source number? */
}
/* Select camera, or rather, V4L video source */
if
(
index
<
0
)
{
// Asking for the first device available
if
(
_
index
<
0
)
{
// Asking for the first device available
for
(;
autoindex
<
MAX_CAMERAS
;
autoindex
++
)
if
(
indexList
&
(
1
<<
autoindex
))
break
;
if
(
autoindex
==
MAX_CAMERAS
)
return
NULL
;
index
=
autoindex
;
return
false
;
_
index
=
autoindex
;
autoindex
++
;
// i can recall icvOpenCAM_V4l with index=-1 for next camera
}
CvCaptureCAM_V4L
*
capture
=
new
CvCaptureCAM_V4L
();
// will throw on OOM
capture
->
index
=
index
;
capture
->
FirstCapture
=
1
;
capture
->
width
=
DEFAULT_V4L_WIDTH
;
capture
->
height
=
DEFAULT_V4L_HEIGHT
;
capture
->
fps
=
DEFAULT_V4L_FPS
;
capture
->
convert_rgb
=
true
;
if
(
_capture_V4L2
(
capture
)
==
-
1
)
{
icvCloseCAM_V4L
(
capture
);
delete
capture
;
return
NULL
;
}
index
=
_index
;
FirstCapture
=
1
;
width
=
DEFAULT_V4L_WIDTH
;
height
=
DEFAULT_V4L_HEIGHT
;
fps
=
DEFAULT_V4L_FPS
;
convert_rgb
=
true
;
return
capture
;
}
;
/* End icvOpenCAM_V4L */
return
_capture_V4L2
(
this
)
==
1
;
}
static
int
read_frame_v4l2
(
CvCaptureCAM_V4L
*
capture
)
{
v4l2_buffer
buf
=
v4l2_buffer
();
...
...
@@ -1863,12 +1867,13 @@ static int icvSetPropertyCAM_V4L( CvCaptureCAM_V4L* capture,
static
void
icvCloseCAM_V4L
(
CvCaptureCAM_V4L
*
capture
){
/* Deallocate space - Hopefully, no leaks */
if
(
capture
)
if
(
capture
->
index
>
-
1
)
{
if
(
capture
->
deviceHandle
!=
-
1
)
{
capture
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
-
1
==
ioctl
(
capture
->
deviceHandle
,
VIDIOC_STREAMOFF
,
&
capture
->
type
))
{
perror
(
"Unable to stop the stream.
"
);
capture
->
type
=
V4L2_BUF_TYPE_VIDEO_CAPTURE
;
if
(
-
1
==
ioctl
(
capture
->
deviceHandle
,
VIDIOC_STREAMOFF
,
&
capture
->
type
))
{
perror
(
"Unable to stop the stream
"
);
}
for
(
unsigned
int
n_buffers_
=
0
;
n_buffers_
<
capture
->
req
.
count
;
++
n_buffers_
)
...
...
@@ -1888,77 +1893,44 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){
if
(
capture
->
deviceHandle
!=
-
1
)
close
(
capture
->
deviceHandle
);
if
(
capture
->
frame
.
imageData
)
cvFree
(
&
capture
->
frame
.
imageData
);
//cvFree((void **)capture);
}
};
class
CvCaptureCAM_V4L_CPP
:
public
CvCapture
{
public
:
CvCaptureCAM_V4L_CPP
()
{
captureV4L
=
0
;
}
virtual
~
CvCaptureCAM_V4L_CPP
()
{
close
();
}
if
(
capture
->
frame
.
imageData
)
cvFree
(
&
capture
->
frame
.
imageData
);
bool
open
(
int
index
);
void
close
();
virtual
double
getProperty
(
int
)
const
;
virtual
bool
setProperty
(
int
,
double
);
virtual
bool
grabFrame
();
virtual
IplImage
*
retrieveFrame
(
int
);
protected
:
CvCaptureCAM_V4L
*
captureV4L
;
capture
->
index
=
-
1
;
// flag that the capture is closed
}
};
bool
CvCaptureCAM_V4L
_CPP
::
open
(
int
index
)
bool
CvCaptureCAM_V4L
::
grabFrame
(
)
{
close
();
captureV4L
=
icvCaptureFromCAM_V4L
(
index
);
return
captureV4L
!=
0
;
return
icvGrabFrameCAM_V4L
(
this
);
}
void
CvCaptureCAM_V4L_CPP
::
close
(
)
IplImage
*
CvCaptureCAM_V4L
::
retrieveFrame
(
int
)
{
if
(
captureV4L
)
{
delete
captureV4L
;
captureV4L
=
NULL
;
}
return
icvRetrieveFrameCAM_V4L
(
this
,
0
);
}
bool
CvCaptureCAM_V4L_CPP
::
grabFrame
()
double
CvCaptureCAM_V4L
::
getProperty
(
int
propId
)
const
{
return
captureV4L
?
icvGrabFrameCAM_V4L
(
captureV4L
)
:
false
;
return
icvGetPropertyCAM_V4L
(
this
,
propId
)
;
}
IplImage
*
CvCaptureCAM_V4L_CPP
::
retrieveFrame
(
int
)
bool
CvCaptureCAM_V4L
::
setProperty
(
int
propId
,
double
value
)
{
return
captureV4L
?
icvRetrieveFrameCAM_V4L
(
captureV4L
,
0
)
:
0
;
}
double
CvCaptureCAM_V4L_CPP
::
getProperty
(
int
propId
)
const
{
return
captureV4L
?
icvGetPropertyCAM_V4L
(
captureV4L
,
propId
)
:
0.0
;
}
bool
CvCaptureCAM_V4L_CPP
::
setProperty
(
int
propId
,
double
value
)
{
return
captureV4L
?
icvSetPropertyCAM_V4L
(
captureV4L
,
propId
,
value
)
:
false
;
return
icvSetPropertyCAM_V4L
(
this
,
propId
,
value
);
}
}
// end namespace cv
CvCapture
*
cvCreateCameraCapture_V4L
(
int
index
)
{
cv
::
CvCaptureCAM_V4L
_CPP
*
capture
=
new
cv
::
CvCaptureCAM_V4L_CPP
;
cv
::
CvCaptureCAM_V4L
*
capture
=
new
cv
::
CvCaptureCAM_V4L
()
;
if
(
capture
->
open
(
index
))
if
(
capture
->
open
(
index
))
return
capture
;
delete
capture
;
return
0
;
return
NULL
;
}
#endif
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