[vlc-commits] v4l2: fix step-wise and continuous frame sizes enumeration
Rémi Denis-Courmont
git at videolan.org
Mon Oct 31 17:59:09 CET 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Oct 31 18:55:46 2011 +0200| [8853c7521d3c7e2ebe762a5024fae0edea937f46] | committer: Rémi Denis-Courmont
v4l2: fix step-wise and continuous frame sizes enumeration
Width and height are independent for step-wise frame sizes (yes,
enumerating is slow). Continuous frame sizes are step-size with one
pixel steps for both dimensions (yes, enumerationg is very slow).
A few device drivers use either of those two types, though the discrete
type is much more common.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8853c7521d3c7e2ebe762a5024fae0edea937f46
---
modules/access/v4l2/demux.c | 133 ++++++++++++++++++++-----------------------
1 files changed, 62 insertions(+), 71 deletions(-)
diff --git a/modules/access/v4l2/demux.c b/modules/access/v4l2/demux.c
index f1541ee..bdbeb95 100644
--- a/modules/access/v4l2/demux.c
+++ b/modules/access/v4l2/demux.c
@@ -235,7 +235,7 @@ static float GetMaxFPS( vlc_object_t *obj, int fd, uint32_t pixel_format,
/ (float)fie.discrete.numerator;
if( fps > max )
max = fps;
- msg_Dbg( obj, " discrete frame interval %"PRIu32"/%"PRIu32
+ msg_Dbg( obj, " discrete frame interval %"PRIu32"/%"PRIu32
" supported",
fie.discrete.numerator, fie.discrete.denominator );
fie.index++;
@@ -245,7 +245,7 @@ static float GetMaxFPS( vlc_object_t *obj, int fd, uint32_t pixel_format,
case V4L2_FRMIVAL_TYPE_STEPWISE:
case V4L2_FRMIVAL_TYPE_CONTINUOUS:
- msg_Dbg( obj, " frame intervals from %"PRIu32"/%"PRIu32
+ msg_Dbg( obj, " frame intervals from %"PRIu32"/%"PRIu32
"to %"PRIu32"/%"PRIu32" supported",
fie.stepwise.min.numerator, fie.stepwise.min.denominator,
fie.stepwise.max.numerator, fie.stepwise.max.denominator );
@@ -277,48 +277,39 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd,
float max = -1.;
switch( fse.type )
{
- case V4L2_FRMSIZE_TYPE_DISCRETE:
- do
- {
- float fps = GetMaxFPS( obj, fd, pixel_format,
- fse.discrete.width, fse.discrete.height );
- if( fps > max )
- max = fps;
- msg_Dbg( obj, " discrete size %"PRIu32"x%"PRIu32" supported",
- fse.discrete.width, fse.discrete.height );
- fse.index++;
- } while( v4l2_ioctl( fd, VIDIOC_ENUM_FRAMESIZES, &fse ) >= 0 );
- break;
+ case V4L2_FRMSIZE_TYPE_DISCRETE:
+ do
+ {
+ float fps = GetMaxFPS( obj, fd, pixel_format,
+ fse.discrete.width, fse.discrete.height );
+ if( fps > max )
+ max = fps;
+ fse.index++;
+ } while( v4l2_ioctl( fd, VIDIOC_ENUM_FRAMESIZES, &fse ) >= 0 );
+ break;
+
+ case V4L2_FRMSIZE_TYPE_STEPWISE:
+ case V4L2_FRMSIZE_TYPE_CONTINUOUS:
+ msg_Dbg( obj, " sizes from %"PRIu32"x%"PRIu32" "
+ "to %"PRIu32"x%"PRIu32" supported",
+ fse.stepwise.min_width, fse.stepwise.min_height,
+ fse.stepwise.max_width, fse.stepwise.max_height );
+ if( fse.type == V4L2_FRMSIZE_TYPE_STEPWISE )
+ msg_Dbg( obj, " with %"PRIu32"x%"PRIu32" steps",
+ fse.stepwise.step_width, fse.stepwise.step_height );
- case V4L2_FRMSIZE_TYPE_STEPWISE:
- for( uint32_t width = fse.stepwise.min_width,
- height = fse.stepwise.min_height;
- width <= fse.stepwise.max_width
- && height <= fse.stepwise.max_width;
- width += fse.stepwise.step_width,
- height += fse.stepwise.step_height )
+ for( uint32_t width = fse.stepwise.min_width;
+ width <= fse.stepwise.max_width;
+ width += fse.stepwise.step_width )
+ for( uint32_t height = fse.stepwise.min_height;
+ height <= fse.stepwise.max_width;
+ height += fse.stepwise.step_height )
{
float fps = GetMaxFPS( obj, fd, pixel_format, width, height );
if( fps > max )
max = fps;
}
- msg_Dbg( obj, " sizes from %"PRIu32"x%"PRIu32" to %"PRIu32
- "x%"PRIu32" supported with %"PRIu32"x%"PRIu32" steps",
- fse.stepwise.min_width, fse.stepwise.min_height,
- fse.stepwise.max_width, fse.stepwise.max_height,
- fse.stepwise.step_width, fse.stepwise.step_height );
- break;
-
- case V4L2_FRMSIZE_TYPE_CONTINUOUS:
- /* FIXME */
- msg_Err( obj, "V4L2_FRMSIZE_TYPE_CONTINUOUS support incorrect" );
- max = GetMaxFPS( obj, fd, pixel_format, fse.stepwise.max_width,
- fse.stepwise.max_height );
- msg_Dbg( obj, " sizes from %"PRIu32"x%"PRIu32" to %"PRIu32
- "x%"PRIu32" all supported",
- fse.stepwise.min_width, fse.stepwise.min_height,
- fse.stepwise.max_width, fse.stepwise.max_height );
- break;
+ break;
}
return max;
#else
@@ -343,27 +334,40 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format,
switch( fse.type )
{
- case V4L2_FRMSIZE_TYPE_DISCRETE:
- do
+ case V4L2_FRMSIZE_TYPE_DISCRETE:
+ do
+ {
+ msg_Dbg( obj, " discrete size %"PRIu32"x%"PRIu32" supported",
+ fse.discrete.width, fse.discrete.height );
+
+ float fps = GetMaxFPS( obj, fd, pixel_format,
+ fse.discrete.width, fse.discrete.height );
+ if( fps >= fps_min && fse.discrete.width > *pwidth )
{
- float fps = GetMaxFPS( obj, fd, pixel_format,
- fse.discrete.width, fse.discrete.height );
- if( fps >= fps_min && fse.discrete.width > *pwidth )
- {
- *pwidth = fse.discrete.width;
- *pheight = fse.discrete.height;
- }
- fse.index++;
- } while( v4l2_ioctl( fd, VIDIOC_ENUM_FRAMESIZES, &fse ) >= 0 );
- break;
+ *pwidth = fse.discrete.width;
+ *pheight = fse.discrete.height;
+ }
+ fse.index++;
+ }
+ while( v4l2_ioctl( fd, VIDIOC_ENUM_FRAMESIZES, &fse ) >= 0 );
+ break;
+
+ case V4L2_FRMSIZE_TYPE_STEPWISE:
+ case V4L2_FRMSIZE_TYPE_CONTINUOUS:
+ msg_Dbg( obj, " sizes from %"PRIu32"x%"PRIu32" "
+ "to %"PRIu32"x%"PRIu32" supported",
+ fse.stepwise.min_width, fse.stepwise.min_height,
+ fse.stepwise.max_width, fse.stepwise.max_height );
+ if( fse.type == V4L2_FRMSIZE_TYPE_STEPWISE )
+ msg_Dbg( obj, " with %"PRIu32"x%"PRIu32" steps",
+ fse.stepwise.step_width, fse.stepwise.step_height );
- case V4L2_FRMSIZE_TYPE_STEPWISE:
- for( uint32_t width = fse.stepwise.min_width,
- height = fse.stepwise.min_height;
- width <= fse.stepwise.max_width
- && height <= fse.stepwise.max_width;
- width += fse.stepwise.step_width,
- height += fse.stepwise.step_height )
+ for( uint32_t width = fse.stepwise.min_width;
+ width <= fse.stepwise.max_width;
+ width += fse.stepwise.step_width )
+ for( uint32_t height = fse.stepwise.min_height;
+ height <= fse.stepwise.max_width;
+ height += fse.stepwise.step_height )
{
float fps = GetMaxFPS( obj, fd, pixel_format, width, height );
if( fps >= fps_min && width > *pwidth )
@@ -372,20 +376,7 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format,
*pheight = height;
}
}
- break;
-
- case V4L2_FRMSIZE_TYPE_CONTINUOUS:
- {
- float fps = GetMaxFPS( obj, fd, pixel_format,
- fse.stepwise.max_width, fse.stepwise.max_height );
- msg_Err( obj, "V4L2_FRMSIZE_TYPE_CONTINUOUS support incorrect" );
- if( fps >= fps_min && fse.stepwise.max_width > *pwidth )
- {
- *pwidth = fse.stepwise.max_width;
- *pheight = fse.stepwise.max_height;
- }
- break;
- }
+ break;
}
#endif
}
More information about the vlc-commits
mailing list