From: Dafna Hirschfeld <dafna3@gmail.com>
To: linux-media@vger.kernel.org
Cc: hverkuil@xs4all.nl, helen.koike@collabora.com,
Dafna Hirschfeld <dafna3@gmail.com>
Subject: [PATCH v2] v4l2-ctl: add function vidcap_get_and_update_fmt
Date: Wed, 30 Jan 2019 06:42:29 -0800 [thread overview]
Message-ID: <20190130144229.41942-1-dafna3@gmail.com> (raw)
add a function vidcap_get_and_update_fmt to set
the format from cmd params. Use it in capture_setup.
Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com>
---
Changes from v1:
change the order of vidcap_get_and_update_fmt and vidcap_set
utils/v4l2-ctl/v4l2-ctl-streaming.cpp | 13 +++
utils/v4l2-ctl/v4l2-ctl-vidcap.cpp | 134 ++++++++++++++------------
utils/v4l2-ctl/v4l2-ctl.h | 1 +
3 files changed, 88 insertions(+), 60 deletions(-)
diff --git a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
index d6c3f6a9..2f66e052 100644
--- a/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-streaming.cpp
@@ -1902,17 +1902,30 @@ static int capture_setup(cv4l_fd &fd, cv4l_queue &in, cv4l_fd *exp_fd)
return -1;
}
+ if (options[OptSetVideoFormat]) {
+ cv4l_fmt fmt;
+
+ if (vidcap_get_and_update_fmt(fd, fmt)) {
+ fprintf(stderr, "%s: vidcap_get_and_update_fmt error\n",
+ __func__);
+ return -1;
+ }
+ fd.s_fmt(fmt, in.g_type());
+ }
+
if (in.reqbufs(&fd, reqbufs_count_cap)) {
fprintf(stderr, "%s: in.reqbufs %u error\n", __func__,
reqbufs_count_cap);
return -1;
}
+
if (exp_fd && in.export_bufs(exp_fd, exp_fd->g_type()))
return -1;
if (in.obtain_bufs(&fd) || in.queue_all(&fd)) {
fprintf(stderr, "%s: in.obtain_bufs error\n", __func__);
return -1;
}
+
if (fd.streamon(in.g_type())) {
fprintf(stderr, "%s: fd.streamon error\n", __func__);
return -1;
diff --git a/utils/v4l2-ctl/v4l2-ctl-vidcap.cpp b/utils/v4l2-ctl/v4l2-ctl-vidcap.cpp
index dc17a868..1e32fd2a 100644
--- a/utils/v4l2-ctl/v4l2-ctl-vidcap.cpp
+++ b/utils/v4l2-ctl/v4l2-ctl-vidcap.cpp
@@ -153,74 +153,88 @@ void vidcap_cmd(int ch, char *optarg)
}
}
-void vidcap_set(cv4l_fd &_fd)
+int vidcap_get_and_update_fmt(cv4l_fd &_fd, struct v4l2_format &vfmt)
{
int fd = _fd.g_fd();
int ret;
- if (options[OptSetVideoFormat] || options[OptTryVideoFormat]) {
- struct v4l2_format vfmt;
+ memset(&vfmt, 0, sizeof(vfmt));
+ vfmt.fmt.pix.priv = priv_magic;
+ vfmt.type = vidcap_buftype;
- memset(&vfmt, 0, sizeof(vfmt));
- vfmt.fmt.pix.priv = priv_magic;
- vfmt.type = vidcap_buftype;
+ ret = doioctl(fd, VIDIOC_G_FMT, &vfmt);
+ if (ret)
+ return ret;
- if (doioctl(fd, VIDIOC_G_FMT, &vfmt) == 0) {
- if (is_multiplanar) {
- if (set_fmts & FmtWidth)
- vfmt.fmt.pix_mp.width = width;
- if (set_fmts & FmtHeight)
- vfmt.fmt.pix_mp.height = height;
- if (set_fmts & FmtPixelFormat) {
- vfmt.fmt.pix_mp.pixelformat = pixfmt;
- if (vfmt.fmt.pix_mp.pixelformat < 256) {
- vfmt.fmt.pix_mp.pixelformat =
- find_pixel_format(fd, vfmt.fmt.pix_mp.pixelformat,
- false, true);
- }
- }
- if (set_fmts & FmtField)
- vfmt.fmt.pix_mp.field = field;
- if (set_fmts & FmtFlags)
- vfmt.fmt.pix_mp.flags = flags;
- if (set_fmts & FmtBytesPerLine) {
- for (unsigned i = 0; i < VIDEO_MAX_PLANES; i++)
- vfmt.fmt.pix_mp.plane_fmt[i].bytesperline =
- bytesperline[i];
- } else {
- /* G_FMT might return bytesperline values > width,
- * reset them to 0 to force the driver to update them
- * to the closest value for the new width. */
- for (unsigned i = 0; i < vfmt.fmt.pix_mp.num_planes; i++)
- vfmt.fmt.pix_mp.plane_fmt[i].bytesperline = 0;
- }
- } else {
- if (set_fmts & FmtWidth)
- vfmt.fmt.pix.width = width;
- if (set_fmts & FmtHeight)
- vfmt.fmt.pix.height = height;
- if (set_fmts & FmtPixelFormat) {
- vfmt.fmt.pix.pixelformat = pixfmt;
- if (vfmt.fmt.pix.pixelformat < 256) {
- vfmt.fmt.pix.pixelformat =
- find_pixel_format(fd, vfmt.fmt.pix.pixelformat,
- false, false);
- }
- }
- if (set_fmts & FmtField)
- vfmt.fmt.pix.field = field;
- if (set_fmts & FmtFlags)
- vfmt.fmt.pix.flags = flags;
- if (set_fmts & FmtBytesPerLine) {
- vfmt.fmt.pix.bytesperline = bytesperline[0];
- } else {
- /* G_FMT might return a bytesperline value > width,
- * reset this to 0 to force the driver to update it
- * to the closest value for the new width. */
- vfmt.fmt.pix.bytesperline = 0;
- }
+ if (is_multiplanar) {
+ if (set_fmts & FmtWidth)
+ vfmt.fmt.pix_mp.width = width;
+ if (set_fmts & FmtHeight)
+ vfmt.fmt.pix_mp.height = height;
+ if (set_fmts & FmtPixelFormat) {
+ vfmt.fmt.pix_mp.pixelformat = pixfmt;
+ if (vfmt.fmt.pix_mp.pixelformat < 256) {
+ vfmt.fmt.pix_mp.pixelformat =
+ find_pixel_format(fd, vfmt.fmt.pix_mp.pixelformat,
+ false, true);
+ }
+ }
+ if (set_fmts & FmtField)
+ vfmt.fmt.pix_mp.field = field;
+ if (set_fmts & FmtFlags)
+ vfmt.fmt.pix_mp.flags = flags;
+ if (set_fmts & FmtBytesPerLine) {
+ for (unsigned i = 0; i < VIDEO_MAX_PLANES; i++)
+ vfmt.fmt.pix_mp.plane_fmt[i].bytesperline =
+ bytesperline[i];
+ } else {
+ /*
+ * G_FMT might return bytesperline values > width,
+ * reset them to 0 to force the driver to update them
+ * to the closest value for the new width.
+ */
+ for (unsigned i = 0; i < vfmt.fmt.pix_mp.num_planes; i++)
+ vfmt.fmt.pix_mp.plane_fmt[i].bytesperline = 0;
+ }
+ } else {
+ if (set_fmts & FmtWidth)
+ vfmt.fmt.pix.width = width;
+ if (set_fmts & FmtHeight)
+ vfmt.fmt.pix.height = height;
+ if (set_fmts & FmtPixelFormat) {
+ vfmt.fmt.pix.pixelformat = pixfmt;
+ if (vfmt.fmt.pix.pixelformat < 256) {
+ vfmt.fmt.pix.pixelformat =
+ find_pixel_format(fd, vfmt.fmt.pix.pixelformat,
+ false, false);
}
+ }
+ if (set_fmts & FmtField)
+ vfmt.fmt.pix.field = field;
+ if (set_fmts & FmtFlags)
+ vfmt.fmt.pix.flags = flags;
+ if (set_fmts & FmtBytesPerLine) {
+ vfmt.fmt.pix.bytesperline = bytesperline[0];
+ } else {
+ /*
+ * G_FMT might return a bytesperline value > width,
+ * reset this to 0 to force the driver to update it
+ * to the closest value for the new width.
+ */
+ vfmt.fmt.pix.bytesperline = 0;
+ }
+ }
+ return 0;
+}
+
+void vidcap_set(cv4l_fd &_fd)
+{
+ if (options[OptSetVideoFormat] || options[OptTryVideoFormat]) {
+ int fd = _fd.g_fd();
+ int ret;
+ struct v4l2_format vfmt;
+ if (vidcap_get_and_update_fmt(_fd, vfmt) == 0) {
if (options[OptSetVideoFormat])
ret = doioctl(fd, VIDIOC_S_FMT, &vfmt);
else
diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h
index dcc39b51..739dc5a9 100644
--- a/utils/v4l2-ctl/v4l2-ctl.h
+++ b/utils/v4l2-ctl/v4l2-ctl.h
@@ -348,6 +348,7 @@ void stds_list(cv4l_fd &fd);
// v4l2-ctl-vidcap.cpp
void vidcap_usage(void);
void vidcap_cmd(int ch, char *optarg);
+int vidcap_get_and_update_fmt(cv4l_fd &_fd, struct v4l2_format &vfmt);
void vidcap_set(cv4l_fd &fd);
void vidcap_get(cv4l_fd &fd);
void vidcap_list(cv4l_fd &fd);
--
2.17.1
next reply other threads:[~2019-01-30 14:42 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-30 14:42 Dafna Hirschfeld [this message]
2019-01-30 14:52 ` [PATCH v2] v4l2-ctl: add function vidcap_get_and_update_fmt Hans Verkuil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190130144229.41942-1-dafna3@gmail.com \
--to=dafna3@gmail.com \
--cc=helen.koike@collabora.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox