aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab+huawei@kernel.org>2021-11-01 07:13:05 +0000
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>2021-11-01 07:30:43 +0000
commit2d8584dad450f4904f968e5bcbfd6351dd0b55ef (patch)
tree05eab472deb92db554213ee24c44ec4048c32df3
parent76a4f5d3dfd0c229876804bbbf2d16efd4e3d3f2 (diff)
downloadv4l-utils-2d8584dad450f4904f968e5bcbfd6351dd0b55ef.tar.gz
v4l2grab: add a way to explicitly enable raw mode
Sometimes, we just want to write files in raw mode, in order to let some other utility to decode it. So, add a new program option to force raw mode. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
-rw-r--r--contrib/test/v4l2grab.c80
1 files changed, 46 insertions, 34 deletions
diff --git a/contrib/test/v4l2grab.c b/contrib/test/v4l2grab.c
index 4d7e0c3c..899cfc85 100644
--- a/contrib/test/v4l2grab.c
+++ b/contrib/test/v4l2grab.c
@@ -947,6 +947,7 @@ static const struct argp_option options[] = {
{"yres", 'y', "YRES", 0, "vertical resolution", 0},
{"fourcc", 'f', "FOURCC", 0, "Linux fourcc code", 0},
{"userptr", 'u', NULL, 0, "Use user-defined memory capture method", 0},
+ {"raw", 'R', NULL, 0, "Save image in raw mode", 0},
{"read", 'r', NULL, 0, "Use read capture method", 0},
{"n-frames", 'n', "NFRAMES", 0, "number of frames to capture", 0},
{"thread-enable", 't', "THREADS", 0, "if different threads should capture and save", 0},
@@ -964,6 +965,7 @@ static int n_frames = 20;
static int threads = 0;
static int block = 0;
static int sleep_ms = 0;
+static int raw_mode = 0;
static uint32_t fourcc = V4L2_PIX_FMT_RGB24;
enum io_method method = IO_METHOD_MMAP;
@@ -1018,6 +1020,9 @@ static error_t parse_opt(int k, char *arg, struct argp_state *state)
case 'r':
method = IO_METHOD_READ;
break;
+ case 'R':
+ raw_mode = 1;
+ break;
case 's':
val = atoi(arg);
if (val)
@@ -1072,41 +1077,48 @@ int main(int argc, char **argv)
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
xioctl(fd, VIDIOC_S_FMT, &fmt);
- switch (fmt.fmt.pix.pixelformat) {
- case V4L2_PIX_FMT_RGB565:
- case V4L2_PIX_FMT_RGB565X:
- case V4L2_PIX_FMT_RGB24:
- case V4L2_PIX_FMT_RGB32:
- case V4L2_PIX_FMT_ARGB32:
- case V4L2_PIX_FMT_XRGB32:
- case V4L2_PIX_FMT_BGR32:
- case V4L2_PIX_FMT_ABGR32:
- case V4L2_PIX_FMT_XBGR32:
- case V4L2_PIX_FMT_YUYV:
- case V4L2_PIX_FMT_UYVY:
- case V4L2_PIX_FMT_YVYU:
- case V4L2_PIX_FMT_VYUY:
- case V4L2_PIX_FMT_NV12:
- case V4L2_PIX_FMT_NV21:
- case V4L2_PIX_FMT_YUV420:
- case V4L2_PIX_FMT_YVU420:
- out_buf = malloc(3 * x_res * y_res);
- if (!out_buf) {
- perror("Cannot allocate memory");
- exit(EXIT_FAILURE);
- }
+ if (raw_mode) {
+ printf("Raw mode: libv4l won't be used.\n");
- break;
- default:
- /* Unknown formats */
- if (libv4l) {
- char *p = (void *)&fmt.fmt.pix.pixelformat;
- printf("Doesn't know how to convert %c%c%c%c to PPM.\n",
- p[0], p[1], p[2], p[3]);
- exit(EXIT_FAILURE);
- } else {
- printf("File output won't be in PPM format.\n");
- ppm_output = 0;
+ libv4l = 0;
+ ppm_output = 0;
+ } else {
+ switch (fmt.fmt.pix.pixelformat) {
+ case V4L2_PIX_FMT_RGB565:
+ case V4L2_PIX_FMT_RGB565X:
+ case V4L2_PIX_FMT_RGB24:
+ case V4L2_PIX_FMT_RGB32:
+ case V4L2_PIX_FMT_ARGB32:
+ case V4L2_PIX_FMT_XRGB32:
+ case V4L2_PIX_FMT_BGR32:
+ case V4L2_PIX_FMT_ABGR32:
+ case V4L2_PIX_FMT_XBGR32:
+ case V4L2_PIX_FMT_YUYV:
+ case V4L2_PIX_FMT_UYVY:
+ case V4L2_PIX_FMT_YVYU:
+ case V4L2_PIX_FMT_VYUY:
+ case V4L2_PIX_FMT_NV12:
+ case V4L2_PIX_FMT_NV21:
+ case V4L2_PIX_FMT_YUV420:
+ case V4L2_PIX_FMT_YVU420:
+ out_buf = malloc(3 * x_res * y_res);
+ if (!out_buf) {
+ perror("Cannot allocate memory");
+ exit(EXIT_FAILURE);
+ }
+
+ break;
+ default:
+ /* Unknown formats */
+ if (libv4l) {
+ char *p = (void *)&fmt.fmt.pix.pixelformat;
+ printf("Doesn't know how to convert %c%c%c%c to PPM.\n",
+ p[0], p[1], p[2], p[3]);
+ exit(EXIT_FAILURE);
+ } else {
+ printf("File output won't be in PPM format.\n");
+ ppm_output = 0;
+ }
}
}
if ((fmt.fmt.pix.width != x_res) || (fmt.fmt.pix.height != y_res))