On 02/09/2014 07:05 AM, Antti Palosaari wrote: > Add support for FMT IOCTL operations used for SDR receivers. > > Cc: Hans Verkuil <hverkuil@xxxxxxxxx> > Signed-off-by: Antti Palosaari <crope@xxxxxx> Acked-by: Hans Verkuil <hans.verkuil@xxxxxxxxx> Thanks! Hans > --- > utils/v4l2-ctl/Makefile.am | 2 +- > utils/v4l2-ctl/v4l2-ctl-common.cpp | 1 + > utils/v4l2-ctl/v4l2-ctl-sdr.cpp | 104 +++++++++++++++++++++++++++++++++++++ > utils/v4l2-ctl/v4l2-ctl.cpp | 22 ++++++++ > utils/v4l2-ctl/v4l2-ctl.h | 12 +++++ > 5 files changed, 140 insertions(+), 1 deletion(-) > create mode 100644 utils/v4l2-ctl/v4l2-ctl-sdr.cpp > > diff --git a/utils/v4l2-ctl/Makefile.am b/utils/v4l2-ctl/Makefile.am > index b5744e7..becaa15 100644 > --- a/utils/v4l2-ctl/Makefile.am > +++ b/utils/v4l2-ctl/Makefile.am > @@ -8,5 +8,5 @@ ivtv_ctl_LDFLAGS = -lm > v4l2_ctl_SOURCES = v4l2-ctl.cpp v4l2-ctl.h v4l2-ctl-common.cpp v4l2-ctl-tuner.cpp \ > v4l2-ctl-io.cpp v4l2-ctl-stds.cpp v4l2-ctl-vidcap.cpp v4l2-ctl-vidout.cpp \ > v4l2-ctl-overlay.cpp v4l2-ctl-vbi.cpp v4l2-ctl-selection.cpp v4l2-ctl-misc.cpp \ > - v4l2-ctl-streaming.cpp v4l2-ctl-test-patterns.cpp > + v4l2-ctl-streaming.cpp v4l2-ctl-test-patterns.cpp v4l2-ctl-sdr.cpp > v4l2_ctl_LDADD = ../../lib/libv4l2/libv4l2.la ../../lib/libv4lconvert/libv4lconvert.la > diff --git a/utils/v4l2-ctl/v4l2-ctl-common.cpp b/utils/v4l2-ctl/v4l2-ctl-common.cpp > index fe570b0..37099cd 100644 > --- a/utils/v4l2-ctl/v4l2-ctl-common.cpp > +++ b/utils/v4l2-ctl/v4l2-ctl-common.cpp > @@ -64,6 +64,7 @@ void common_usage(void) > " --help-io input/output options\n" > " --help-misc miscellaneous options\n" > " --help-overlay overlay format options\n" > + " --help-sdr SDR format options\n" > " --help-selection crop/selection options\n" > " --help-stds standards and other video timings options\n" > " --help-streaming streaming options\n" > diff --git a/utils/v4l2-ctl/v4l2-ctl-sdr.cpp b/utils/v4l2-ctl/v4l2-ctl-sdr.cpp > new file mode 100644 > index 0000000..9c9a6c4 > --- /dev/null > +++ b/utils/v4l2-ctl/v4l2-ctl-sdr.cpp > @@ -0,0 +1,104 @@ > +#include <unistd.h> > +#include <stdlib.h> > +#include <stdio.h> > +#include <string.h> > +#include <inttypes.h> > +#include <getopt.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <fcntl.h> > +#include <ctype.h> > +#include <errno.h> > +#include <sys/ioctl.h> > +#include <sys/time.h> > +#include <dirent.h> > +#include <math.h> > +#include <config.h> > + > +#include <linux/videodev2.h> > +#include <libv4l2.h> > +#include <string> > + > +#include "v4l2-ctl.h" > + > +static struct v4l2_format vfmt; /* set_format/get_format */ > + > +void sdr_usage(void) > +{ > + printf("\nSDR Formats options:\n" > + " --list-formats-sdr display supported SDR 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, 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, or the fourcc value as a string\n" > + ); > +} > + > +void sdr_cmd(int ch, char *optarg) > +{ > + switch (ch) { > + case OptSetSdrFormat: > + case OptTrySdrFormat: > + if (strlen(optarg) == 0) { > + sdr_usage(); > + exit(1); > + } 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, 0L, 0); > + } > + break; > + } > +} > + > +void sdr_set(int 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(in_vfmt); > + } > +} > + > +void sdr_get(int fd) > +{ > + if (options[OptGetSdrFormat]) { > + vfmt.type = V4L2_BUF_TYPE_SDR_CAPTURE; > + if (doioctl(fd, VIDIOC_G_FMT, &vfmt) == 0) > + printfmt(vfmt); > + } > +} > + > +void sdr_list(int fd) > +{ > + if (options[OptListSdrFormats]) { > + printf("ioctl: VIDIOC_ENUM_FMT\n"); > + print_video_formats(fd, V4L2_BUF_TYPE_SDR_CAPTURE); > + } > +} > diff --git a/utils/v4l2-ctl/v4l2-ctl.cpp b/utils/v4l2-ctl/v4l2-ctl.cpp > index c64c2fe..855613c 100644 > --- a/utils/v4l2-ctl/v4l2-ctl.cpp > +++ b/utils/v4l2-ctl/v4l2-ctl.cpp > @@ -85,6 +85,7 @@ static struct option long_options[] = { > {"help-vidout", no_argument, 0, OptHelpVidOut}, > {"help-overlay", no_argument, 0, OptHelpOverlay}, > {"help-vbi", no_argument, 0, OptHelpVbi}, > + {"help-sdr", no_argument, 0, OptHelpSdr}, > {"help-selection", no_argument, 0, OptHelpSelection}, > {"help-misc", no_argument, 0, OptHelpMisc}, > {"help-streaming", no_argument, 0, OptHelpStreaming}, > @@ -111,6 +112,7 @@ static struct option long_options[] = { > {"list-framesizes", required_argument, 0, OptListFrameSizes}, > {"list-frameintervals", required_argument, 0, OptListFrameIntervals}, > {"list-formats-overlay", no_argument, 0, OptListOverlayFormats}, > + {"list-formats-sdr", no_argument, 0, OptListSdrFormats}, > {"list-formats-out", no_argument, 0, OptListOutFormats}, > {"list-formats-out-mplane", no_argument, 0, OptListOutMplaneFormats}, > {"get-standard", no_argument, 0, OptGetStandard}, > @@ -145,6 +147,9 @@ static struct option long_options[] = { > {"try-fmt-sliced-vbi-out", required_argument, 0, OptTrySlicedVbiOutFormat}, > {"get-fmt-vbi", no_argument, 0, OptGetVbiFormat}, > {"get-fmt-vbi-out", no_argument, 0, OptGetVbiOutFormat}, > + {"get-fmt-sdr", no_argument, 0, OptGetSdrFormat}, > + {"set-fmt-sdr", required_argument, 0, OptSetSdrFormat}, > + {"try-fmt-sdr", required_argument, 0, OptTrySdrFormat}, > {"get-sliced-vbi-cap", no_argument, 0, OptGetSlicedVbiCap}, > {"get-sliced-vbi-out-cap", no_argument, 0, OptGetSlicedVbiOutCap}, > {"get-fbuf", no_argument, 0, OptGetFBuf}, > @@ -217,6 +222,7 @@ static void usage_all(void) > vidout_usage(); > overlay_usage(); > vbi_usage(); > + sdr_usage(); > selection_usage(); > misc_usage(); > streaming_usage(); > @@ -285,6 +291,8 @@ std::string buftype2s(int type) > return "Sliced VBI Output"; > case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: > return "Video Output Overlay"; > + case V4L2_BUF_TYPE_SDR_CAPTURE: > + return "SDR Capture"; > default: > return "Unknown (" + num2s(type) + ")"; > } > @@ -458,6 +466,9 @@ void printfmt(const struct v4l2_format &vfmt) > } > printf("\tI/O Size : %u\n", vfmt.fmt.sliced.io_size); > break; > + case V4L2_BUF_TYPE_SDR_CAPTURE: > + printf("\tSample Format : %s\n", fcc2s(vfmt.fmt.sdr.pixelformat).c_str()); > + break; > } > } > > @@ -519,6 +530,8 @@ static std::string cap2s(unsigned cap) > s += "\t\tSliced VBI Capture\n"; > if (cap & V4L2_CAP_SLICED_VBI_OUTPUT) > s += "\t\tSliced VBI Output\n"; > + if (cap & V4L2_CAP_SDR_CAPTURE) > + s += "\t\tSDR Capture\n"; > if (cap & V4L2_CAP_RDS_CAPTURE) > s += "\t\tRDS Capture\n"; > if (cap & V4L2_CAP_RDS_OUTPUT) > @@ -736,6 +749,7 @@ __u32 find_pixel_format(int fd, unsigned index, bool output, bool mplane) > else > fmt.type = mplane ? V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : > V4L2_BUF_TYPE_VIDEO_CAPTURE; > + > if (doioctl(fd, VIDIOC_ENUM_FMT, &fmt)) > return 0; > return fmt.pixelformat; > @@ -807,6 +821,9 @@ int main(int argc, char **argv) > case OptHelpVbi: > vbi_usage(); > return 0; > + case OptHelpSdr: > + sdr_usage(); > + return 0; > case OptHelpSelection: > selection_usage(); > return 0; > @@ -860,6 +877,7 @@ int main(int argc, char **argv) > vidout_cmd(ch, optarg); > overlay_cmd(ch, optarg); > vbi_cmd(ch, optarg); > + sdr_cmd(ch, optarg); > selection_cmd(ch, optarg); > misc_cmd(ch, optarg); > streaming_cmd(ch, optarg); > @@ -921,6 +939,7 @@ int main(int argc, char **argv) > options[OptGetVbiOutFormat] = 1; > options[OptGetSlicedVbiFormat] = 1; > options[OptGetSlicedVbiOutFormat] = 1; > + options[OptGetSdrFormat] = 1; > options[OptGetFBuf] = 1; > options[OptGetCropCap] = 1; > options[OptGetOutputCropCap] = 1; > @@ -964,6 +983,7 @@ int main(int argc, char **argv) > vidout_set(fd); > overlay_set(fd); > vbi_set(fd); > + sdr_set(fd); > selection_set(fd); > streaming_set(fd); > misc_set(fd); > @@ -978,6 +998,7 @@ int main(int argc, char **argv) > vidout_get(fd); > overlay_get(fd); > vbi_get(fd); > + sdr_get(fd); > selection_get(fd); > misc_get(fd); > > @@ -990,6 +1011,7 @@ int main(int argc, char **argv) > vidout_list(fd); > overlay_list(fd); > vbi_list(fd); > + sdr_list(fd); > streaming_list(fd); > > if (options[OptWaitForEvent]) { > diff --git a/utils/v4l2-ctl/v4l2-ctl.h b/utils/v4l2-ctl/v4l2-ctl.h > index 03c45b7..108198d 100644 > --- a/utils/v4l2-ctl/v4l2-ctl.h > +++ b/utils/v4l2-ctl/v4l2-ctl.h > @@ -44,6 +44,7 @@ enum Option { > OptGetOutputOverlayFormat, > OptGetVbiFormat, > OptGetVbiOutFormat, > + OptGetSdrFormat, > OptGetVideoOutFormat, > OptGetVideoOutMplaneFormat, > OptSetSlicedVbiOutFormat, > @@ -51,6 +52,7 @@ enum Option { > OptSetOverlayFormat, > //OptSetVbiFormat, TODO > //OptSetVbiOutFormat, TODO > + OptSetSdrFormat, > OptSetVideoOutFormat, > OptSetVideoOutMplaneFormat, > OptTryVideoOutFormat, > @@ -63,6 +65,7 @@ enum Option { > OptTryOverlayFormat, > //OptTryVbiFormat, TODO > //OptTryVbiOutFormat, TODO > + OptTrySdrFormat, > OptAll, > OptListStandards, > OptListFormats, > @@ -72,6 +75,7 @@ enum Option { > OptListFrameSizes, > OptListFrameIntervals, > OptListOverlayFormats, > + OptListSdrFormats, > OptListOutFormats, > OptListOutMplaneFormats, > OptLogStatus, > @@ -153,6 +157,7 @@ enum Option { > OptHelpVidOut, > OptHelpOverlay, > OptHelpVbi, > + OptHelpSdr, > OptHelpSelection, > OptHelpMisc, > OptHelpStreaming, > @@ -257,6 +262,13 @@ void vbi_set(int fd); > void vbi_get(int fd); > void vbi_list(int fd); > > +// v4l2-ctl-sdr.cpp > +void sdr_usage(void); > +void sdr_cmd(int ch, char *optarg); > +void sdr_set(int fd); > +void sdr_get(int fd); > +void sdr_list(int fd); > + > // v4l2-ctl-selection.cpp > void selection_usage(void); > void selection_cmd(int ch, char *optarg); > -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html