diff options
author | rogerdpack <rogerpack2005@gmail.com> | 2013-01-15 19:09:15 -0700 |
---|---|---|
committer | rogerdpack <rogerpack2005@gmail.com> | 2013-01-15 19:09:15 -0700 |
commit | c540312ac3b58e0bbd751844fc2c47c6e3713cf5 (patch) | |
tree | fcf92b1c0f1772b379828125c2555a47d1c81c6b /libavdevice | |
parent | 47e88486b4b3b3de992b07f89dfaedf410a8bd5e (diff) | |
parent | 2b20397e1fbe52db800ef5deb810f7bc2602f248 (diff) | |
download | ffmpeg-c540312ac3b58e0bbd751844fc2c47c6e3713cf5.tar.gz |
Merge remote-tracking branch 'origin/master' into combined
Diffstat (limited to 'libavdevice')
-rw-r--r-- | libavdevice/alsa-audio-common.c | 73 | ||||
-rw-r--r-- | libavdevice/v4l2.c | 149 | ||||
-rw-r--r-- | libavdevice/version.h | 2 |
3 files changed, 133 insertions, 91 deletions
diff --git a/libavdevice/alsa-audio-common.c b/libavdevice/alsa-audio-common.c index afe67510d7..4e63397380 100644 --- a/libavdevice/alsa-audio-common.c +++ b/libavdevice/alsa-audio-common.c @@ -62,48 +62,45 @@ static av_cold snd_pcm_format_t codec_id_to_pcm_format(int codec_id) } } -#define REORDER_OUT_50(NAME, TYPE) \ -static void alsa_reorder_ ## NAME ## _out_50(const void *in_v, void *out_v, int n) \ -{ \ - const TYPE *in = in_v; \ - TYPE *out = out_v; \ -\ - while (n-- > 0) { \ +#define MAKE_REORDER_FUNC(NAME, TYPE, CHANNELS, LAYOUT, MAP) \ +static void alsa_reorder_ ## NAME ## _ ## LAYOUT(const void *in_v, \ + void *out_v, \ + int n) \ +{ \ + const TYPE *in = in_v; \ + TYPE *out = out_v; \ + \ + while (n-- > 0) { \ + MAP \ + in += CHANNELS; \ + out += CHANNELS; \ + } \ +} + +#define MAKE_REORDER_FUNCS(CHANNELS, LAYOUT, MAP) \ + MAKE_REORDER_FUNC(int8, int8_t, CHANNELS, LAYOUT, MAP) \ + MAKE_REORDER_FUNC(int16, int16_t, CHANNELS, LAYOUT, MAP) \ + MAKE_REORDER_FUNC(int32, int32_t, CHANNELS, LAYOUT, MAP) \ + MAKE_REORDER_FUNC(f32, float, CHANNELS, LAYOUT, MAP) + +MAKE_REORDER_FUNCS(5, out_50, \ out[0] = in[0]; \ out[1] = in[1]; \ out[2] = in[3]; \ out[3] = in[4]; \ out[4] = in[2]; \ - in += 5; \ - out += 5; \ - } \ -} + ); -#define REORDER_OUT_51(NAME, TYPE) \ -static void alsa_reorder_ ## NAME ## _out_51(const void *in_v, void *out_v, int n) \ -{ \ - const TYPE *in = in_v; \ - TYPE *out = out_v; \ -\ - while (n-- > 0) { \ +MAKE_REORDER_FUNCS(6, out_51, \ out[0] = in[0]; \ out[1] = in[1]; \ out[2] = in[4]; \ out[3] = in[5]; \ out[4] = in[2]; \ out[5] = in[3]; \ - in += 6; \ - out += 6; \ - } \ -} + ); -#define REORDER_OUT_71(NAME, TYPE) \ -static void alsa_reorder_ ## NAME ## _out_71(const void *in_v, void *out_v, int n) \ -{ \ - const TYPE *in = in_v; \ - TYPE *out = out_v; \ -\ - while (n-- > 0) { \ +MAKE_REORDER_FUNCS(8, out_71, \ out[0] = in[0]; \ out[1] = in[1]; \ out[2] = in[4]; \ @@ -112,23 +109,7 @@ static void alsa_reorder_ ## NAME ## _out_71(const void *in_v, void *out_v, int out[5] = in[3]; \ out[6] = in[6]; \ out[7] = in[7]; \ - in += 8; \ - out += 8; \ - } \ -} - -REORDER_OUT_50(int8, int8_t) -REORDER_OUT_51(int8, int8_t) -REORDER_OUT_71(int8, int8_t) -REORDER_OUT_50(int16, int16_t) -REORDER_OUT_51(int16, int16_t) -REORDER_OUT_71(int16, int16_t) -REORDER_OUT_50(int32, int32_t) -REORDER_OUT_51(int32, int32_t) -REORDER_OUT_71(int32, int32_t) -REORDER_OUT_50(f32, float) -REORDER_OUT_51(f32, float) -REORDER_OUT_71(f32, float) + ); #define FORMAT_I8 0 #define FORMAT_I16 1 diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c index 5f0102746d..2e4b395505 100644 --- a/libavdevice/v4l2.c +++ b/libavdevice/v4l2.c @@ -116,6 +116,7 @@ struct video_data { int channel; char *pixel_format; /**< Set by a private option. */ int list_format; /**< Set by a private option. */ + int list_standard; /**< Set by a private option. */ char *framerate; /**< Set by a private option. */ }; @@ -381,6 +382,30 @@ static void list_formats(AVFormatContext *ctx, int fd, int type) } } +static void list_standards(AVFormatContext *ctx) +{ + int ret; + struct video_data *s = ctx->priv_data; + struct v4l2_standard standard; + + if (s->std_id == 0) + return; + + for (standard.index = 0; ; standard.index++) { + ret = v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard); + if (ret < 0) { + if (errno == EINVAL) + break; + else { + av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMSTD): %s\n", strerror(errno)); + return; + } + } + av_log(ctx, AV_LOG_INFO, "%2d, %16llx, %s\n", + standard.index, standard.id, standard.name); + } +} + static int mmap_init(AVFormatContext *ctx) { int i, res; @@ -658,12 +683,10 @@ static int v4l2_set_parameters(AVFormatContext *s1) struct video_data *s = s1->priv_data; struct v4l2_standard standard = { 0 }; struct v4l2_streamparm streamparm = { 0 }; - struct v4l2_fract *tpf = &streamparm.parm.capture.timeperframe; + struct v4l2_fract *tpf; AVRational framerate_q = { 0 }; int i, ret; - streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; - if (s->framerate && (ret = av_parse_video_rate(&framerate_q, s->framerate)) < 0) { av_log(s1, AV_LOG_ERROR, "Could not parse framerate '%s'.\n", @@ -672,57 +695,87 @@ static int v4l2_set_parameters(AVFormatContext *s1) } if (s->standard) { - av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set standard: %s\n", - s->standard); - /* set tv standard */ - for(i=0;;i++) { + if (s->std_id) { + av_log(s1, AV_LOG_DEBUG, "Setting standard: %s\n", s->standard); + /* set tv standard */ + for (i = 0; ; i++) { + standard.index = i; + ret = v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard); + if (ret < 0 || !av_strcasecmp(standard.name, s->standard)) + break; + } + if (ret < 0) { + ret = errno; + av_log(s1, AV_LOG_ERROR, "Unknown or unsupported standard '%s'\n", s->standard); + return AVERROR(ret); + } + + if (v4l2_ioctl(s->fd, VIDIOC_S_STD, &standard.id) < 0) { + ret = errno; + av_log(s1, AV_LOG_ERROR, "ioctl(VIDIOC_S_STD): %s\n", strerror(errno)); + return AVERROR(ret); + } + } else { + av_log(s1, AV_LOG_WARNING, + "This device does not support any standard\n"); + } + } + + /* get standard */ + if (v4l2_ioctl(s->fd, VIDIOC_G_STD, &s->std_id) == 0) { + tpf = &standard.frameperiod; + for (i = 0; ; i++) { standard.index = i; ret = v4l2_ioctl(s->fd, VIDIOC_ENUMSTD, &standard); - if (ret < 0 || !av_strcasecmp(standard.name, s->standard)) + if (ret < 0) { + ret = errno; + av_log(s1, AV_LOG_ERROR, "ioctl(VIDIOC_ENUMSTD): %s\n", strerror(errno)); + return AVERROR(ret); + } + if (standard.id == s->std_id) { + av_log(s1, AV_LOG_DEBUG, + "Current standard: %s, id: %"PRIu64", frameperiod: %d/%d\n", + standard.name, (uint64_t)standard.id, tpf->numerator, tpf->denominator); break; + } } - if (ret < 0) { - av_log(s1, AV_LOG_ERROR, "Unknown standard '%s'\n", s->standard); - return ret; - } + } else { + tpf = &streamparm.parm.capture.timeperframe; + } - av_log(s1, AV_LOG_DEBUG, - "The V4L2 driver set standard: %s, id: %"PRIu64"\n", - s->standard, (uint64_t)standard.id); - if (v4l2_ioctl(s->fd, VIDIOC_S_STD, &standard.id) < 0) { - av_log(s1, AV_LOG_ERROR, - "The V4L2 driver ioctl set standard(%s) failed\n", - s->standard); - return AVERROR(EIO); - } + streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (v4l2_ioctl(s->fd, VIDIOC_G_PARM, &streamparm) < 0) { + ret = errno; + av_log(s1, AV_LOG_ERROR, "ioctl(VIDIOC_G_PARM): %s\n", strerror(errno)); + return AVERROR(ret); } if (framerate_q.num && framerate_q.den) { - av_log(s1, AV_LOG_DEBUG, "Setting time per frame to %d/%d\n", - framerate_q.den, framerate_q.num); - tpf->numerator = framerate_q.den; - tpf->denominator = framerate_q.num; - - if (v4l2_ioctl(s->fd, VIDIOC_S_PARM, &streamparm) != 0) { - av_log(s1, AV_LOG_ERROR, - "ioctl set time per frame(%d/%d) failed\n", + if (streamparm.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) { + tpf = &streamparm.parm.capture.timeperframe; + + av_log(s1, AV_LOG_DEBUG, "Setting time per frame to %d/%d\n", framerate_q.den, framerate_q.num); - return AVERROR(EIO); - } + tpf->numerator = framerate_q.den; + tpf->denominator = framerate_q.num; - if (framerate_q.num != tpf->denominator || - framerate_q.den != tpf->numerator) { - av_log(s1, AV_LOG_INFO, - "The driver changed the time per frame from " - "%d/%d to %d/%d\n", - framerate_q.den, framerate_q.num, - tpf->numerator, tpf->denominator); - } - } else { - if (v4l2_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); + if (v4l2_ioctl(s->fd, VIDIOC_S_PARM, &streamparm) < 0) { + ret = errno; + av_log(s1, AV_LOG_ERROR, "ioctl(VIDIOC_S_PARM): %s\n", strerror(errno)); + return AVERROR(ret); + } + + if (framerate_q.num != tpf->denominator || + framerate_q.den != tpf->numerator) { + av_log(s1, AV_LOG_INFO, + "The driver changed the time per frame from " + "%d/%d to %d/%d\n", + framerate_q.den, framerate_q.num, + tpf->numerator, tpf->denominator); + } + } else { + av_log(s1, AV_LOG_WARNING, + "The driver does not allow to change time per frame\n"); } } s1->streams[0]->avg_frame_rate.num = tpf->denominator; @@ -824,6 +877,11 @@ static int v4l2_read_header(AVFormatContext *s1) return AVERROR_EXIT; } + if (s->list_standard) { + list_standards(s1); + return AVERROR_EXIT; + } + avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */ if (s->pixel_format) { @@ -952,6 +1010,9 @@ static const AVOption options[] = { { "raw", "show only non-compressed formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_RAWFORMATS }, 0, INT_MAX, DEC, "list_formats" }, { "compressed", "show only compressed formats", OFFSET(list_format), AV_OPT_TYPE_CONST, {.i64 = V4L_COMPFORMATS }, 0, INT_MAX, DEC, "list_formats" }, + { "list_standards", "list supported standards and exit", OFFSET(list_standard), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, DEC, "list_standards" }, + { "all", "show all supported standards", OFFSET(list_standard), AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, DEC, "list_standards" }, + { "timestamps", "set type of timestamps for grabbed frames", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, DEC, "timestamps" }, { "ts", "set type of timestamps for grabbed frames", OFFSET(ts_mode), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, DEC, "timestamps" }, { "default", "use timestamps from the kernel", OFFSET(ts_mode), AV_OPT_TYPE_CONST, {.i64 = V4L_TS_DEFAULT }, 0, 2, DEC, "timestamps" }, diff --git a/libavdevice/version.h b/libavdevice/version.h index 5eed4f5e1a..9e0c0ae940 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -29,7 +29,7 @@ #define LIBAVDEVICE_VERSION_MAJOR 54 #define LIBAVDEVICE_VERSION_MINOR 3 -#define LIBAVDEVICE_VERSION_MICRO 102 +#define LIBAVDEVICE_VERSION_MICRO 103 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ |