blob: 4168eeb1b8b706393343e2d3438dd733805ae1c3 [file] [log] [blame]
#include "v4l2-ctl.h"
static struct v4l2_format vfmt; /* set_format/get_format */
void sdr_usage()
{
printf("\nSDR Formats options:\n"
" --list-formats-sdr display supported SDR capture formats [VIDIOC_ENUM_FMT]\n"
" --get-fmt-sdr query the SDR capture format [VIDIOC_G_FMT]\n"
" --set-fmt-sdr <f> set the SDR capture format [VIDIOC_S_FMT]\n"
" parameter is either the format index as reported by\n"
" --list-formats-sdr-cap, or the fourcc value as a string\n"
" --try-fmt-sdr <f> try the SDR capture format [VIDIOC_TRY_FMT]\n"
" parameter is either the format index as reported by\n"
" --list-formats-sdr-cap, or the fourcc value as a string\n"
" --list-formats-sdr-out\n"
" display supported SDR output formats [VIDIOC_ENUM_FMT]\n"
" --get-fmt-sdr-out query the SDR output format [VIDIOC_G_FMT]\n"
" --set-fmt-sdr-out <f>\n"
" set the SDR output format [VIDIOC_S_FMT]\n"
" parameter is either the format index as reported by\n"
" --list-formats-sdr-out, or the fourcc value as a string\n"
" --try-fmt-sdr-out <f>\n"
" try the SDR output format [VIDIOC_TRY_FMT]\n"
" parameter is either the format index as reported by\n"
" --list-formats-sdr-out, or the fourcc value as a string\n"
);
}
void sdr_cmd(int ch, char *optarg)
{
switch (ch) {
case OptSetSdrFormat:
case OptTrySdrFormat:
case OptSetSdrOutFormat:
case OptTrySdrOutFormat:
if (strlen(optarg) == 0) {
sdr_usage();
std::exit(EXIT_FAILURE);
} else if (strlen(optarg) == 4) {
vfmt.fmt.sdr.pixelformat = v4l2_fourcc(optarg[0],
optarg[1], optarg[2], optarg[3]);
} else {
vfmt.fmt.sdr.pixelformat = strtol(optarg, nullptr, 0);
}
break;
}
}
void sdr_set(cv4l_fd &_fd)
{
int fd = _fd.g_fd();
int ret;
if (options[OptSetSdrFormat] || options[OptTrySdrFormat]) {
struct v4l2_format in_vfmt;
in_vfmt.type = V4L2_BUF_TYPE_SDR_CAPTURE;
in_vfmt.fmt.sdr.pixelformat = vfmt.fmt.sdr.pixelformat;
if (in_vfmt.fmt.sdr.pixelformat < 256) {
struct v4l2_fmtdesc fmt = {};
fmt.index = in_vfmt.fmt.sdr.pixelformat;
fmt.type = V4L2_BUF_TYPE_SDR_CAPTURE;
if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt))
fmt.pixelformat = 0;
in_vfmt.fmt.sdr.pixelformat = fmt.pixelformat;
}
if (options[OptSetSdrFormat])
ret = doioctl(fd, VIDIOC_S_FMT, &in_vfmt);
else
ret = doioctl(fd, VIDIOC_TRY_FMT, &in_vfmt);
if (ret == 0 && (verbose || options[OptTrySdrFormat]))
printfmt(fd, in_vfmt);
}
if (options[OptSetSdrOutFormat] || options[OptTrySdrOutFormat]) {
struct v4l2_format in_vfmt;
in_vfmt.type = V4L2_BUF_TYPE_SDR_OUTPUT;
in_vfmt.fmt.sdr.pixelformat = vfmt.fmt.sdr.pixelformat;
if (in_vfmt.fmt.sdr.pixelformat < 256) {
struct v4l2_fmtdesc fmt = {};
fmt.index = in_vfmt.fmt.sdr.pixelformat;
fmt.type = V4L2_BUF_TYPE_SDR_OUTPUT;
if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt))
fmt.pixelformat = 0;
in_vfmt.fmt.sdr.pixelformat = fmt.pixelformat;
}
if (options[OptSetSdrOutFormat])
ret = doioctl(fd, VIDIOC_S_FMT, &in_vfmt);
else
ret = doioctl(fd, VIDIOC_TRY_FMT, &in_vfmt);
if (ret == 0 && (verbose || options[OptTrySdrOutFormat]))
printfmt(fd, in_vfmt);
}
}
void sdr_get(cv4l_fd &fd)
{
if (options[OptGetSdrFormat]) {
vfmt.type = V4L2_BUF_TYPE_SDR_CAPTURE;
if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0)
printfmt(fd.g_fd(), vfmt);
}
if (options[OptGetSdrOutFormat]) {
vfmt.type = V4L2_BUF_TYPE_SDR_OUTPUT;
if (doioctl(fd.g_fd(), VIDIOC_G_FMT, &vfmt) == 0)
printfmt(fd.g_fd(), vfmt);
}
}
void sdr_list(cv4l_fd &fd)
{
if (options[OptListSdrFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
print_video_formats(fd, V4L2_BUF_TYPE_SDR_CAPTURE, 0);
}
if (options[OptListSdrOutFormats]) {
printf("ioctl: VIDIOC_ENUM_FMT\n");
print_video_formats(fd, V4L2_BUF_TYPE_SDR_OUTPUT, 0);
}
}