In video4linux2, in the case the timebase value in ap is 0/0, read the

timebase value already set in the driver, and set it back in the codec
stream, rather than leaving the invalid value of 0/0.

In particular, fix ffmpeg grabbing timestamps when the timebase value
is not set through the CLI.

Originally committed as revision 26224 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Stefano Sabatini 2011-01-05 14:15:11 +00:00
parent 2d777bb7a2
commit 8621a37d9f
3 changed files with 21 additions and 3 deletions

View File

@ -146,6 +146,8 @@ devices and the command @file{v4l-info} for Video4Linux2 devices.
If the size for the device is set to 0x0, the input device will
try to autodetect the size to use.
Only for the video4linux2 device, if the frame rate is set to 0/0 the
input device will use the frame rate value already set in the driver.
Video4Linux support is deprecated since Linux 2.6.30, and will be
dropped in later versions.
@ -153,13 +155,16 @@ dropped in later versions.
Follow some usage examples of the video4linux devices with the ff*
tools.
@example
# Grab and show the input of a video4linux device.
# Grab and show the input of a video4linux device, frame rate is set
# to the default of 25/1.
ffplay -s 320x240 -f video4linux /dev/video0
# Grab and show the input of a video4linux2 device, autoadjust size.
ffplay -f video4linux2 /dev/video0
# Grab and record the input of a video4linux2 device, autoadjust size.
# Grab and record the input of a video4linux2 device, autoadjust size,
# frame rate value defaults to 0/0 so it is read from the video4linux2
# driver.
ffmpeg -f video4linux2 -i /dev/video0 out.mpeg
@end example

View File

@ -23,7 +23,7 @@
#define LIBAVDEVICE_VERSION_MAJOR 52
#define LIBAVDEVICE_VERSION_MINOR 2
#define LIBAVDEVICE_VERSION_MICRO 2
#define LIBAVDEVICE_VERSION_MICRO 3
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \

View File

@ -514,6 +514,19 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap)
ap->time_base.num = tpf->numerator;
ap->time_base.den = tpf->denominator;
}
} else {
/* if timebase value is not set in ap, read the timebase value
* from the driver and set it in ap */
struct v4l2_streamparm streamparm = { 0 };
struct v4l2_fract *tpf = &streamparm.parm.capture.timeperframe;
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(s->fd, VIDIOC_G_PARM, &streamparm) != 0) {
av_log(s1, AV_LOG_ERROR, "ioctl(VIDIOC_G_PARM): %s\n", strerror(errno));
return AVERROR(errno);
}
ap->time_base.num = tpf->numerator;
ap->time_base.den = tpf->denominator;
}
return 0;