Re: [PATCH 4/5] v4l2-ctl: add support for SDR FMT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux