v4l2-common.c

来自「linux 内核源代码」· C语言 代码 · 共 1,046 行 · 第 1/3 页

C
1,046
字号
	[_IOC_NR(VIDIOC_G_MODULATOR)]      = "VIDIOC_G_MODULATOR",	[_IOC_NR(VIDIOC_S_MODULATOR)]      = "VIDIOC_S_MODULATOR",	[_IOC_NR(VIDIOC_G_FREQUENCY)]      = "VIDIOC_G_FREQUENCY",	[_IOC_NR(VIDIOC_S_FREQUENCY)]      = "VIDIOC_S_FREQUENCY",	[_IOC_NR(VIDIOC_CROPCAP)]          = "VIDIOC_CROPCAP",	[_IOC_NR(VIDIOC_G_CROP)]           = "VIDIOC_G_CROP",	[_IOC_NR(VIDIOC_S_CROP)]           = "VIDIOC_S_CROP",	[_IOC_NR(VIDIOC_G_JPEGCOMP)]       = "VIDIOC_G_JPEGCOMP",	[_IOC_NR(VIDIOC_S_JPEGCOMP)]       = "VIDIOC_S_JPEGCOMP",	[_IOC_NR(VIDIOC_QUERYSTD)]         = "VIDIOC_QUERYSTD",	[_IOC_NR(VIDIOC_TRY_FMT)]          = "VIDIOC_TRY_FMT",	[_IOC_NR(VIDIOC_ENUMAUDIO)]        = "VIDIOC_ENUMAUDIO",	[_IOC_NR(VIDIOC_ENUMAUDOUT)]       = "VIDIOC_ENUMAUDOUT",	[_IOC_NR(VIDIOC_G_PRIORITY)]       = "VIDIOC_G_PRIORITY",	[_IOC_NR(VIDIOC_S_PRIORITY)]       = "VIDIOC_S_PRIORITY",	[_IOC_NR(VIDIOC_G_SLICED_VBI_CAP)] = "VIDIOC_G_SLICED_VBI_CAP",	[_IOC_NR(VIDIOC_LOG_STATUS)]       = "VIDIOC_LOG_STATUS",	[_IOC_NR(VIDIOC_G_EXT_CTRLS)]      = "VIDIOC_G_EXT_CTRLS",	[_IOC_NR(VIDIOC_S_EXT_CTRLS)]      = "VIDIOC_S_EXT_CTRLS",	[_IOC_NR(VIDIOC_TRY_EXT_CTRLS)]    = "VIDIOC_TRY_EXT_CTRLS",#if 1	[_IOC_NR(VIDIOC_ENUM_FRAMESIZES)]  = "VIDIOC_ENUM_FRAMESIZES",	[_IOC_NR(VIDIOC_ENUM_FRAMEINTERVALS)] = "VIDIOC_ENUM_FRAMEINTERVALS",	[_IOC_NR(VIDIOC_G_ENC_INDEX)] 	   = "VIDIOC_G_ENC_INDEX",	[_IOC_NR(VIDIOC_ENCODER_CMD)] 	   = "VIDIOC_ENCODER_CMD",	[_IOC_NR(VIDIOC_TRY_ENCODER_CMD)]  = "VIDIOC_TRY_ENCODER_CMD",	[_IOC_NR(VIDIOC_DBG_S_REGISTER)]   = "VIDIOC_DBG_S_REGISTER",	[_IOC_NR(VIDIOC_DBG_G_REGISTER)]   = "VIDIOC_DBG_G_REGISTER",	[_IOC_NR(VIDIOC_G_CHIP_IDENT)]     = "VIDIOC_G_CHIP_IDENT",#endif};#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)static const char *v4l2_int_ioctls[] = {#ifdef CONFIG_VIDEO_V4L1_COMPAT	[_IOC_NR(DECODER_GET_CAPABILITIES)]    = "DECODER_GET_CAPABILITIES",	[_IOC_NR(DECODER_GET_STATUS)]          = "DECODER_GET_STATUS",	[_IOC_NR(DECODER_SET_NORM)]            = "DECODER_SET_NORM",	[_IOC_NR(DECODER_SET_INPUT)]           = "DECODER_SET_INPUT",	[_IOC_NR(DECODER_SET_OUTPUT)]          = "DECODER_SET_OUTPUT",	[_IOC_NR(DECODER_ENABLE_OUTPUT)]       = "DECODER_ENABLE_OUTPUT",	[_IOC_NR(DECODER_SET_PICTURE)]         = "DECODER_SET_PICTURE",	[_IOC_NR(DECODER_SET_GPIO)]            = "DECODER_SET_GPIO",	[_IOC_NR(DECODER_INIT)]                = "DECODER_INIT",	[_IOC_NR(DECODER_SET_VBI_BYPASS)]      = "DECODER_SET_VBI_BYPASS",	[_IOC_NR(DECODER_DUMP)]                = "DECODER_DUMP",#endif	[_IOC_NR(AUDC_SET_RADIO)]              = "AUDC_SET_RADIO",	[_IOC_NR(TUNER_SET_TYPE_ADDR)]         = "TUNER_SET_TYPE_ADDR",	[_IOC_NR(TUNER_SET_STANDBY)]           = "TUNER_SET_STANDBY",	[_IOC_NR(TDA9887_SET_CONFIG)]          = "TDA9887_SET_CONFIG",	[_IOC_NR(VIDIOC_INT_S_TUNER_MODE)]     = "VIDIOC_INT_S_TUNER_MODE",	[_IOC_NR(VIDIOC_INT_RESET)]            = "VIDIOC_INT_RESET",	[_IOC_NR(VIDIOC_INT_AUDIO_CLOCK_FREQ)] = "VIDIOC_INT_AUDIO_CLOCK_FREQ",	[_IOC_NR(VIDIOC_INT_DECODE_VBI_LINE)]  = "VIDIOC_INT_DECODE_VBI_LINE",	[_IOC_NR(VIDIOC_INT_S_VBI_DATA)]       = "VIDIOC_INT_S_VBI_DATA",	[_IOC_NR(VIDIOC_INT_G_VBI_DATA)]       = "VIDIOC_INT_G_VBI_DATA",	[_IOC_NR(VIDIOC_INT_I2S_CLOCK_FREQ)]   = "VIDIOC_INT_I2S_CLOCK_FREQ",	[_IOC_NR(VIDIOC_INT_S_STANDBY)]        = "VIDIOC_INT_S_STANDBY",	[_IOC_NR(VIDIOC_INT_S_AUDIO_ROUTING)]  = "VIDIOC_INT_S_AUDIO_ROUTING",	[_IOC_NR(VIDIOC_INT_G_AUDIO_ROUTING)]  = "VIDIOC_INT_G_AUDIO_ROUTING",	[_IOC_NR(VIDIOC_INT_S_VIDEO_ROUTING)]  = "VIDIOC_INT_S_VIDEO_ROUTING",	[_IOC_NR(VIDIOC_INT_G_VIDEO_ROUTING)]  = "VIDIOC_INT_G_VIDEO_ROUTING",	[_IOC_NR(VIDIOC_INT_S_CRYSTAL_FREQ)]   = "VIDIOC_INT_S_CRYSTAL_FREQ",	[_IOC_NR(VIDIOC_INT_INIT)]   	       = "VIDIOC_INT_INIT",	[_IOC_NR(VIDIOC_INT_G_STD_OUTPUT)]     = "VIDIOC_INT_G_STD_OUTPUT",	[_IOC_NR(VIDIOC_INT_S_STD_OUTPUT)]     = "VIDIOC_INT_S_STD_OUTPUT",};#define V4L2_INT_IOCTLS ARRAY_SIZE(v4l2_int_ioctls)/* Common ioctl debug function. This function can be used by   external ioctl messages as well as internal V4L ioctl */void v4l_printk_ioctl(unsigned int cmd){	char *dir;	switch (_IOC_DIR(cmd)) {	case _IOC_NONE:              dir = "--"; break;	case _IOC_READ:              dir = "r-"; break;	case _IOC_WRITE:             dir = "-w"; break;	case _IOC_READ | _IOC_WRITE: dir = "rw"; break;	default:                     dir = "*ERR*"; break;	}	switch (_IOC_TYPE(cmd)) {	case 'd':		printk("v4l2_int ioctl %s, dir=%s (0x%08x)\n",		       (_IOC_NR(cmd) < V4L2_INT_IOCTLS) ?		       v4l2_int_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);		break;#ifdef CONFIG_VIDEO_V4L1_COMPAT	case 'v':		printk("v4l1 ioctl %s, dir=%s (0x%08x)\n",		       (_IOC_NR(cmd) < V4L1_IOCTLS) ?		       v4l1_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);		break;#endif	case 'V':		printk("v4l2 ioctl %s, dir=%s (0x%08x)\n",		       (_IOC_NR(cmd) < V4L2_IOCTLS) ?		       v4l2_ioctls[_IOC_NR(cmd)] : "UNKNOWN", dir, cmd);		break;	default:		printk("unknown ioctl '%c', dir=%s, #%d (0x%08x)\n",		       _IOC_TYPE(cmd), dir, _IOC_NR(cmd), cmd);	}}/* ----------------------------------------------------------------- *//* Helper functions for control handling			     *//* Check for correctness of the ctrl's value based on the data from   struct v4l2_queryctrl and the available menu items. Note that   menu_items may be NULL, in that case it is ignored. */int v4l2_ctrl_check(struct v4l2_ext_control *ctrl, struct v4l2_queryctrl *qctrl,		const char **menu_items){	if (qctrl->flags & V4L2_CTRL_FLAG_DISABLED)		return -EINVAL;	if (qctrl->flags & V4L2_CTRL_FLAG_GRABBED)		return -EBUSY;	if (qctrl->type == V4L2_CTRL_TYPE_BUTTON ||	    qctrl->type == V4L2_CTRL_TYPE_INTEGER64 ||	    qctrl->type == V4L2_CTRL_TYPE_CTRL_CLASS)		return 0;	if (ctrl->value < qctrl->minimum || ctrl->value > qctrl->maximum)		return -ERANGE;	if (qctrl->type == V4L2_CTRL_TYPE_MENU && menu_items != NULL) {		if (menu_items[ctrl->value] == NULL ||		    menu_items[ctrl->value][0] == '\0')			return -EINVAL;	}	return 0;}/* Returns NULL or a character pointer array containing the menu for   the given control ID. The pointer array ends with a NULL pointer.   An empty string signifies a menu entry that is invalid. This allows   drivers to disable certain options if it is not supported. */const char **v4l2_ctrl_get_menu(u32 id){	static const char *mpeg_audio_sampling_freq[] = {		"44.1 kHz",		"48 kHz",		"32 kHz",		NULL	};	static const char *mpeg_audio_encoding[] = {		"Layer I",		"Layer II",		"Layer III",		NULL	};	static const char *mpeg_audio_l1_bitrate[] = {		"32 kbps",		"64 kbps",		"96 kbps",		"128 kbps",		"160 kbps",		"192 kbps",		"224 kbps",		"256 kbps",		"288 kbps",		"320 kbps",		"352 kbps",		"384 kbps",		"416 kbps",		"448 kbps",		NULL	};	static const char *mpeg_audio_l2_bitrate[] = {		"32 kbps",		"48 kbps",		"56 kbps",		"64 kbps",		"80 kbps",		"96 kbps",		"112 kbps",		"128 kbps",		"160 kbps",		"192 kbps",		"224 kbps",		"256 kbps",		"320 kbps",		"384 kbps",		NULL	};	static const char *mpeg_audio_l3_bitrate[] = {		"32 kbps",		"40 kbps",		"48 kbps",		"56 kbps",		"64 kbps",		"80 kbps",		"96 kbps",		"112 kbps",		"128 kbps",		"160 kbps",		"192 kbps",		"224 kbps",		"256 kbps",		"320 kbps",		NULL	};	static const char *mpeg_audio_mode[] = {		"Stereo",		"Joint Stereo",		"Dual",		"Mono",		NULL	};	static const char *mpeg_audio_mode_extension[] = {		"Bound 4",		"Bound 8",		"Bound 12",		"Bound 16",		NULL	};	static const char *mpeg_audio_emphasis[] = {		"No Emphasis",		"50/15 us",		"CCITT J17",		NULL	};	static const char *mpeg_audio_crc[] = {		"No CRC",		"16-bit CRC",		NULL	};	static const char *mpeg_video_encoding[] = {		"MPEG-1",		"MPEG-2",		NULL	};	static const char *mpeg_video_aspect[] = {		"1x1",		"4x3",		"16x9",		"2.21x1",		NULL	};	static const char *mpeg_video_bitrate_mode[] = {		"Variable Bitrate",		"Constant Bitrate",		NULL	};	static const char *mpeg_stream_type[] = {		"MPEG-2 Program Stream",		"MPEG-2 Transport Stream",		"MPEG-1 System Stream",		"MPEG-2 DVD-compatible Stream",		"MPEG-1 VCD-compatible Stream",		"MPEG-2 SVCD-compatible Stream",		NULL	};	static const char *mpeg_stream_vbi_fmt[] = {		"No VBI",		"Private packet, IVTV format",		NULL	};	switch (id) {		case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:			return mpeg_audio_sampling_freq;		case V4L2_CID_MPEG_AUDIO_ENCODING:			return mpeg_audio_encoding;		case V4L2_CID_MPEG_AUDIO_L1_BITRATE:			return mpeg_audio_l1_bitrate;		case V4L2_CID_MPEG_AUDIO_L2_BITRATE:			return mpeg_audio_l2_bitrate;		case V4L2_CID_MPEG_AUDIO_L3_BITRATE:			return mpeg_audio_l3_bitrate;		case V4L2_CID_MPEG_AUDIO_MODE:			return mpeg_audio_mode;		case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:			return mpeg_audio_mode_extension;		case V4L2_CID_MPEG_AUDIO_EMPHASIS:			return mpeg_audio_emphasis;		case V4L2_CID_MPEG_AUDIO_CRC:			return mpeg_audio_crc;		case V4L2_CID_MPEG_VIDEO_ENCODING:			return mpeg_video_encoding;		case V4L2_CID_MPEG_VIDEO_ASPECT:			return mpeg_video_aspect;		case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:			return mpeg_video_bitrate_mode;		case V4L2_CID_MPEG_STREAM_TYPE:			return mpeg_stream_type;		case V4L2_CID_MPEG_STREAM_VBI_FMT:			return mpeg_stream_vbi_fmt;		default:			return NULL;	}}/* Fill in a struct v4l2_queryctrl */int v4l2_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def){	const char *name;	qctrl->flags = 0;	switch (qctrl->id) {	/* USER controls */	case V4L2_CID_USER_CLASS: 	name = "User Controls"; break;	case V4L2_CID_AUDIO_VOLUME: 	name = "Volume"; break;	case V4L2_CID_AUDIO_MUTE: 	name = "Mute"; break;	case V4L2_CID_AUDIO_BALANCE: 	name = "Balance"; break;	case V4L2_CID_AUDIO_BASS: 	name = "Bass"; break;	case V4L2_CID_AUDIO_TREBLE: 	name = "Treble"; break;	case V4L2_CID_AUDIO_LOUDNESS: 	name = "Loudness"; break;	case V4L2_CID_BRIGHTNESS: 	name = "Brightness"; break;	case V4L2_CID_CONTRAST: 	name = "Contrast"; break;	case V4L2_CID_SATURATION: 	name = "Saturation"; break;	case V4L2_CID_HUE: 		name = "Hue"; break;	/* MPEG controls */	case V4L2_CID_MPEG_CLASS: 		name = "MPEG Encoder Controls"; break;	case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: name = "Audio Sampling Frequency"; break;	case V4L2_CID_MPEG_AUDIO_ENCODING: 	name = "Audio Encoding Layer"; break;	case V4L2_CID_MPEG_AUDIO_L1_BITRATE: 	name = "Audio Layer I Bitrate"; break;	case V4L2_CID_MPEG_AUDIO_L2_BITRATE: 	name = "Audio Layer II Bitrate"; break;	case V4L2_CID_MPEG_AUDIO_L3_BITRATE: 	name = "Audio Layer III Bitrate"; break;	case V4L2_CID_MPEG_AUDIO_MODE: 		name = "Audio Stereo Mode"; break;	case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: name = "Audio Stereo Mode Extension"; break;	case V4L2_CID_MPEG_AUDIO_EMPHASIS: 	name = "Audio Emphasis"; break;	case V4L2_CID_MPEG_AUDIO_CRC: 		name = "Audio CRC"; break;	case V4L2_CID_MPEG_AUDIO_MUTE: 		name = "Audio Mute"; break;	case V4L2_CID_MPEG_VIDEO_ENCODING: 	name = "Video Encoding"; break;	case V4L2_CID_MPEG_VIDEO_ASPECT: 	name = "Video Aspect"; break;	case V4L2_CID_MPEG_VIDEO_B_FRAMES: 	name = "Video B Frames"; break;	case V4L2_CID_MPEG_VIDEO_GOP_SIZE: 	name = "Video GOP Size"; break;	case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE: 	name = "Video GOP Closure"; break;	case V4L2_CID_MPEG_VIDEO_PULLDOWN: 	name = "Video Pulldown"; break;	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: 	name = "Video Bitrate Mode"; break;	case V4L2_CID_MPEG_VIDEO_BITRATE: 	name = "Video Bitrate"; break;	case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: 	name = "Video Peak Bitrate"; break;	case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION: name = "Video Temporal Decimation"; break;	case V4L2_CID_MPEG_VIDEO_MUTE: 		name = "Video Mute"; break;	case V4L2_CID_MPEG_VIDEO_MUTE_YUV:	name = "Video Mute YUV"; break;	case V4L2_CID_MPEG_STREAM_TYPE: 	name = "Stream Type"; break;	case V4L2_CID_MPEG_STREAM_PID_PMT: 	name = "Stream PMT Program ID"; break;	case V4L2_CID_MPEG_STREAM_PID_AUDIO: 	name = "Stream Audio Program ID"; break;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?