Commit 30ae318e authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Enumerate V4L2 frame intervals once fewer

They are still enumerated many times though...
parent 2f4f8cef
...@@ -208,7 +208,7 @@ static int Demux( demux_t *demux ) ...@@ -208,7 +208,7 @@ static int Demux( demux_t *demux )
return 1; return 1;
} }
static float GetMaxFPS( int fd, uint32_t pixel_format, static float GetMaxFPS( vlc_object_t *obj, int fd, uint32_t pixel_format,
uint32_t width, uint32_t height ) uint32_t width, uint32_t height )
{ {
#ifdef VIDIOC_ENUM_FRAMEINTERVALS #ifdef VIDIOC_ENUM_FRAMEINTERVALS
...@@ -233,6 +233,9 @@ static float GetMaxFPS( int fd, uint32_t pixel_format, ...@@ -233,6 +233,9 @@ static float GetMaxFPS( int fd, uint32_t pixel_format,
/ (float)fie.discrete.numerator; / (float)fie.discrete.numerator;
if( fps > max ) if( fps > max )
max = fps; max = fps;
msg_Dbg( obj, " discrete frame interval %"PRIu32"/%"PRIu32
" supported",
fie.discrete.numerator, fie.discrete.denominator );
fie.index++; fie.index++;
} while( v4l2_ioctl( fd, VIDIOC_ENUM_FRAMEINTERVALS, &fie ) >= 0 ); } while( v4l2_ioctl( fd, VIDIOC_ENUM_FRAMEINTERVALS, &fie ) >= 0 );
return max; return max;
...@@ -240,6 +243,14 @@ static float GetMaxFPS( int fd, uint32_t pixel_format, ...@@ -240,6 +243,14 @@ static float GetMaxFPS( int fd, uint32_t pixel_format,
case V4L2_FRMIVAL_TYPE_STEPWISE: case V4L2_FRMIVAL_TYPE_STEPWISE:
case V4L2_FRMIVAL_TYPE_CONTINUOUS: case V4L2_FRMIVAL_TYPE_CONTINUOUS:
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 );
if( fie.type == V4L2_FRMIVAL_TYPE_STEPWISE )
msg_Dbg( obj, " with %"PRIu32"/%"PRIu32" step",
fie.stepwise.step.numerator,
fie.stepwise.step.denominator );
return __MAX( (float)fie.stepwise.max.denominator return __MAX( (float)fie.stepwise.max.denominator
/ (float)fie.stepwise.max.numerator, / (float)fie.stepwise.max.numerator,
(float)fie.stepwise.min.denominator (float)fie.stepwise.min.denominator
...@@ -267,8 +278,8 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd, ...@@ -267,8 +278,8 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd,
case V4L2_FRMSIZE_TYPE_DISCRETE: case V4L2_FRMSIZE_TYPE_DISCRETE:
do do
{ {
float fps = GetMaxFPS( fd, pixel_format, fse.discrete.width, float fps = GetMaxFPS( obj, fd, pixel_format,
fse.discrete.height ); fse.discrete.width, fse.discrete.height );
if( fps > max ) if( fps > max )
max = fps; max = fps;
msg_Dbg( obj, " discrete size %"PRIu32"x%"PRIu32" supported", msg_Dbg( obj, " discrete size %"PRIu32"x%"PRIu32" supported",
...@@ -285,7 +296,7 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd, ...@@ -285,7 +296,7 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd,
width += fse.stepwise.step_width, width += fse.stepwise.step_width,
height += fse.stepwise.step_height ) height += fse.stepwise.step_height )
{ {
float fps = GetMaxFPS( fd, pixel_format, width, height ); float fps = GetMaxFPS( obj, fd, pixel_format, width, height );
if( fps > max ) if( fps > max )
max = fps; max = fps;
} }
...@@ -299,7 +310,7 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd, ...@@ -299,7 +310,7 @@ float GetAbsoluteMaxFrameRate( vlc_object_t *obj, int fd,
case V4L2_FRMSIZE_TYPE_CONTINUOUS: case V4L2_FRMSIZE_TYPE_CONTINUOUS:
/* FIXME */ /* FIXME */
msg_Err( obj, "V4L2_FRMSIZE_TYPE_CONTINUOUS support incorrect" ); msg_Err( obj, "V4L2_FRMSIZE_TYPE_CONTINUOUS support incorrect" );
max = GetMaxFPS( fd, pixel_format, fse.stepwise.max_width, max = GetMaxFPS( obj, fd, pixel_format, fse.stepwise.max_width,
fse.stepwise.max_height ); fse.stepwise.max_height );
msg_Dbg( obj, " sizes from %"PRIu32"x%"PRIu32" to %"PRIu32 msg_Dbg( obj, " sizes from %"PRIu32"x%"PRIu32" to %"PRIu32
"x%"PRIu32" all supported", "x%"PRIu32" all supported",
...@@ -333,8 +344,8 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format, ...@@ -333,8 +344,8 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format,
case V4L2_FRMSIZE_TYPE_DISCRETE: case V4L2_FRMSIZE_TYPE_DISCRETE:
do do
{ {
float fps = GetMaxFPS( fd, pixel_format, fse.discrete.width, float fps = GetMaxFPS( obj, fd, pixel_format,
fse.discrete.height ); fse.discrete.width, fse.discrete.height );
if( fps >= fps_min && fse.discrete.width > *pwidth ) if( fps >= fps_min && fse.discrete.width > *pwidth )
{ {
*pwidth = fse.discrete.width; *pwidth = fse.discrete.width;
...@@ -352,7 +363,7 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format, ...@@ -352,7 +363,7 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format,
width += fse.stepwise.step_width, width += fse.stepwise.step_width,
height += fse.stepwise.step_height ) height += fse.stepwise.step_height )
{ {
float fps = GetMaxFPS( fd, pixel_format, width, height ); float fps = GetMaxFPS( obj, fd, pixel_format, width, height );
if( fps >= fps_min && width > *pwidth ) if( fps >= fps_min && width > *pwidth )
{ {
*pwidth = width; *pwidth = width;
...@@ -363,8 +374,8 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format, ...@@ -363,8 +374,8 @@ void GetMaxDimensions( vlc_object_t *obj, int fd, uint32_t pixel_format,
case V4L2_FRMSIZE_TYPE_CONTINUOUS: case V4L2_FRMSIZE_TYPE_CONTINUOUS:
{ {
float fps = GetMaxFPS( fd, pixel_format, fse.stepwise.max_width, float fps = GetMaxFPS( obj, fd, pixel_format,
fse.stepwise.max_height ); fse.stepwise.max_width, fse.stepwise.max_height );
msg_Err( obj, "V4L2_FRMSIZE_TYPE_CONTINUOUS support incorrect" ); msg_Err( obj, "V4L2_FRMSIZE_TYPE_CONTINUOUS support incorrect" );
if( fps >= fps_min && fse.stepwise.max_width > *pwidth ) if( fps >= fps_min && fse.stepwise.max_width > *pwidth )
{ {
......
...@@ -1273,53 +1273,6 @@ static int InitVideo( vlc_object_t *p_obj, int i_fd, demux_sys_t *p_sys, ...@@ -1273,53 +1273,6 @@ static int InitVideo( vlc_object_t *p_obj, int i_fd, demux_sys_t *p_sys,
if( fmt.fmt.pix.sizeimage < i_min ) if( fmt.fmt.pix.sizeimage < i_min )
fmt.fmt.pix.sizeimage = i_min; fmt.fmt.pix.sizeimage = i_min;
#ifdef VIDIOC_ENUM_FRAMEINTERVALS
/* This is new in Linux 2.6.19 */
/* List supported frame rates */
struct v4l2_frmivalenum frmival;
memset( &frmival, 0, sizeof(frmival) );
frmival.pixel_format = fmt.fmt.pix.pixelformat;
frmival.width = width;
frmival.height = height;
if( v4l2_ioctl( i_fd, VIDIOC_ENUM_FRAMEINTERVALS, &frmival ) >= 0 )
{
char psz_fourcc[5];
memset( &psz_fourcc, 0, sizeof( psz_fourcc ) );
vlc_fourcc_to_char( p_sys->i_fourcc, &psz_fourcc );
msg_Dbg( p_obj, "supported frame intervals for %4.4s, %dx%d:",
psz_fourcc, frmival.width, frmival.height );
switch( frmival.type )
{
case V4L2_FRMIVAL_TYPE_DISCRETE:
do
{
msg_Dbg( p_obj, " supported frame interval: %d/%d",
frmival.discrete.numerator,
frmival.discrete.denominator );
frmival.index++;
} while( v4l2_ioctl( i_fd, VIDIOC_ENUM_FRAMEINTERVALS, &frmival ) >= 0 );
break;
case V4L2_FRMIVAL_TYPE_STEPWISE:
msg_Dbg( p_obj, " supported frame intervals: %d/%d to "
"%d/%d using %d/%d increments",
frmival.stepwise.min.numerator,
frmival.stepwise.min.denominator,
frmival.stepwise.max.numerator,
frmival.stepwise.max.denominator,
frmival.stepwise.step.numerator,
frmival.stepwise.step.denominator );
break;
case V4L2_FRMIVAL_TYPE_CONTINUOUS:
msg_Dbg( p_obj, " supported frame intervals: %d/%d to %d/%d",
frmival.stepwise.min.numerator,
frmival.stepwise.min.denominator,
frmival.stepwise.max.numerator,
frmival.stepwise.max.denominator );
break;
}
}
#endif
/* Init I/O method */ /* Init I/O method */
switch( p_sys->io ) switch( p_sys->io )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment