diff options
author | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-11-01 07:13:05 +0000 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-11-01 07:30:43 +0000 |
commit | 2d8584dad450f4904f968e5bcbfd6351dd0b55ef (patch) | |
tree | 05eab472deb92db554213ee24c44ec4048c32df3 | |
parent | 76a4f5d3dfd0c229876804bbbf2d16efd4e3d3f2 (diff) | |
download | v4l-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.c | 80 |
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)) |