diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-06-03 05:19:30 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-06-03 05:19:30 +0200 |
commit | 99eb31e263a24bc6c5a7a3f455a2bcb04a60e70e (patch) | |
tree | 83aab2f083fd3d6923d4e76fe0cc0c41ef7aef35 /libavdevice/v4l2.c | |
parent | 9034001b17077e9da5205c4344eb1b88b9882f03 (diff) | |
parent | f190f676bc93a7e80344f2feeb3b9b44604d4717 (diff) | |
download | ffmpeg-99eb31e263a24bc6c5a7a3f455a2bcb04a60e70e.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master: (25 commits)
Replace custom DEBUG preprocessor trickery by the standard one.
vorbis: Remove non-compiling debug statement.
vorbis: Remove pointless DEBUG #ifdef around debug output macros.
cook: Remove non-compiling debug output.
Remove pointless #ifdefs around function declarations in a header.
Replace #ifdef + av_log() combinations by av_dlog().
Replace custom debug output functions by av_dlog().
cook: Remove unused debug functions.
Remove stray extra arguments from av_dlog() invocations.
targa: fix big-endian build
v4l2: remove one forgotten use of AVFormatParameters.pix_fmt.
vfwcap: add a framerate private option.
v4l2: add a framerate private option.
libdc1394: add a framerate private option.
fbdev: add a framerate private option.
bktr: add a framerate private option.
oma: check avio_read() return value
nutdec: remove unused variable
Remove unused variables
swscale: allocate larger buffer to handle altivec overreads.
...
Conflicts:
ffmpeg.c
libavcodec/dca.c
libavcodec/dirac.c
libavcodec/error_resilience.c
libavcodec/h264.c
libavcodec/mpeg12.c
libavcodec/mpeg4videodec.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo_enc.c
libavcodec/pthread.c
libavcodec/rv10.c
libavcodec/s302m.c
libavcodec/shorten.c
libavcodec/truemotion2.c
libavcodec/utils.c
libavdevice/dv1394.c
libavdevice/fbdev.c
libavdevice/libdc1394.c
libavdevice/v4l2.c
libavformat/4xm.c
libavformat/apetag.c
libavformat/asfdec.c
libavformat/avidec.c
libavformat/mmf.c
libavformat/mpeg.c
libavformat/mpegenc.c
libavformat/mpegts.c
libavformat/oggdec.c
libavformat/oggparseogm.c
libavformat/rl2.c
libavformat/rmdec.c
libavformat/rpl.c
libavformat/rtpdec_latm.c
libavformat/sauce.c
libavformat/sol.c
libswscale/utils.c
tests/ref/vsynth1/error
tests/ref/vsynth2/error
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavdevice/v4l2.c')
-rw-r--r-- | libavdevice/v4l2.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 605b7b748e..08cf0096f6 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -76,6 +76,7 @@ struct video_data { int channel; char *video_size; /**< String describing video size, set by a private option. */ char *pixel_format; /**< Set by a private option. */ + char *framerate; /**< Set by a private option. */ }; struct buff_data { @@ -438,12 +439,19 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap) struct v4l2_streamparm streamparm = {0}; struct v4l2_fract *tpf = &streamparm.parm.capture.timeperframe; int i, ret; + AVRational fps; streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (s->framerate && (ret = av_parse_video_rate(&fps, s->framerate)) < 0) { + av_log(s1, AV_LOG_ERROR, "Couldn't parse framerate.\n"); + return ret; + } #if FF_API_FORMAT_PARAMETERS if (ap->channel > 0) s->channel = ap->channel; + if (ap->time_base.num) + fps = (AVRational){ap->time_base.den, ap->time_base.num}; #endif /* set tv video input */ @@ -492,34 +500,32 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap) } } - if (ap->time_base.num && ap->time_base.den) { + if (fps.num && fps.den) { av_log(s1, AV_LOG_DEBUG, "Setting time per frame to %d/%d\n", - ap->time_base.num, ap->time_base.den); - tpf->numerator = ap->time_base.num; - tpf->denominator = ap->time_base.den; + fps.den, fps.num); + tpf->numerator = fps.den; + tpf->denominator = fps.num; if (ioctl(s->fd, VIDIOC_S_PARM, &streamparm) != 0) { av_log(s1, AV_LOG_ERROR, "ioctl set time per frame(%d/%d) failed\n", - ap->time_base.num, ap->time_base.den); + fps.den, fps.num); return AVERROR(EIO); } - if (ap->time_base.den != tpf->denominator || - ap->time_base.num != tpf->numerator) { + if (fps.num != tpf->denominator || + fps.den != tpf->numerator) { av_log(s1, AV_LOG_INFO, "The driver changed the time per frame from %d/%d to %d/%d\n", - ap->time_base.num, ap->time_base.den, + fps.den, fps.num, tpf->numerator, tpf->denominator); } } else { - /* if timebase value is not set in ap, read the timebase value from the driver */ + /* if timebase value is not set, read the timebase value from the driver */ 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; } @@ -616,7 +622,7 @@ static int v4l2_read_header(AVFormatContext *s1, AVFormatParameters *ap) desired_format = device_try_init(s1, pix_fmt, &s->width, &s->height, &codec_id); if (desired_format == 0) { av_log(s1, AV_LOG_ERROR, "Cannot find a proper format for " - "codec_id %d, pix_fmt %d.\n", s1->video_codec_id, ap->pix_fmt); + "codec_id %d, pix_fmt %d.\n", s1->video_codec_id, pix_fmt); close(s->fd); res = AVERROR(EIO); @@ -660,6 +666,7 @@ out: av_freep(&s->video_size); av_freep(&s->pixel_format); av_freep(&s->standard); + av_freep(&s->framerate); return res; } @@ -711,6 +718,7 @@ static const AVOption options[] = { { "channel", "", OFFSET(channel), FF_OPT_TYPE_INT, {.dbl = 0 }, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, + { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, { NULL }, }; |