v4l2-common.c

来自「omap3 linux 2.6 用nocc去除了冗余代码」· C语言 代码 · 共 733 行 · 第 1/2 页

C
733
字号
/* *	Video for Linux Two * *	A generic video device interface for the LINUX operating system *	using a set of device structures/vectors for low level operations. * *	This file replaces the videodev.c file that comes with the *	regular kernel distribution. * *	This program is free software; you can redistribute it and/or *	modify it under the terms of the GNU General Public License *	as published by the Free Software Foundation; either version *	2 of the License, or (at your option) any later version. * * Author:	Bill Dirks <bill@thedirks.org> *		based on code by Alan Cox, <alan@cymru.net> * *//* * Video capture interface for Linux * *	A generic video device interface for the LINUX operating system *	using a set of device structures/vectors for low level operations. * *		This program is free software; you can redistribute it and/or *		modify it under the terms of the GNU General Public License *		as published by the Free Software Foundation; either version *		2 of the License, or (at your option) any later version. * * Author:	Alan Cox, <alan@redhat.com> * * Fixes: *//* * Video4linux 1/2 integration by Justin Schoeman * <justin@suntiger.ee.up.ac.za> * 2.4 PROCFS support ported from 2.4 kernels by *  Iñaki García Etxebarria <garetxe@euskalnet.net> * Makefile fix by "W. Michael Petullo" <mike@flyn.org> * 2.4 devfs support ported from 2.4 kernels by *  Dan Merillat <dan@merillat.org> * Added Gerd Knorrs v4l1 enhancements (Justin Schoeman) */#include <linux/module.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/string.h>#include <linux/errno.h>#include <linux/i2c.h>#include <asm/uaccess.h>#include <asm/system.h>#include <asm/pgtable.h>#include <asm/io.h>#include <asm/div64.h>#define __OLD_VIDIOC_ /* To allow fixing old calls*/#include <media/v4l2-common.h>#include <media/v4l2-chip-ident.h>#include <linux/kmod.h>#include <linux/videodev.h>MODULE_AUTHOR("Bill Dirks, Justin Schoeman, Gerd Knorr");MODULE_DESCRIPTION("misc helper functions for v4l2 device drivers");MODULE_LICENSE("GPL");/* * *	V 4 L 2   D R I V E R   H E L P E R   A P I * *//* *  Video Standard Operations (contributed by Michael Schimek) *//* ----------------------------------------------------------------- *//* priority handling                                                 */#define V4L2_PRIO_VALID(val) (val == V4L2_PRIORITY_BACKGROUND   || \			      val == V4L2_PRIORITY_INTERACTIVE  || \			      val == V4L2_PRIORITY_RECORD)int v4l2_prio_init(struct v4l2_prio_state *global){	memset(global,0,sizeof(*global));	return 0;}EXPORT_SYMBOL(v4l2_prio_init);int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,		     enum v4l2_priority new){	if (!V4L2_PRIO_VALID(new))		return -EINVAL;	if (*local == new)		return 0;	atomic_inc(&global->prios[new]);	if (V4L2_PRIO_VALID(*local))		atomic_dec(&global->prios[*local]);	*local = new;	return 0;}EXPORT_SYMBOL(v4l2_prio_change);int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local){	return v4l2_prio_change(global,local,V4L2_PRIORITY_DEFAULT);}EXPORT_SYMBOL(v4l2_prio_open);int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local){	if (V4L2_PRIO_VALID(*local))		atomic_dec(&global->prios[*local]);	return 0;}EXPORT_SYMBOL(v4l2_prio_close);enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global){	if (atomic_read(&global->prios[V4L2_PRIORITY_RECORD]) > 0)		return V4L2_PRIORITY_RECORD;	if (atomic_read(&global->prios[V4L2_PRIORITY_INTERACTIVE]) > 0)		return V4L2_PRIORITY_INTERACTIVE;	if (atomic_read(&global->prios[V4L2_PRIORITY_BACKGROUND]) > 0)		return V4L2_PRIORITY_BACKGROUND;	return V4L2_PRIORITY_UNSET;}EXPORT_SYMBOL(v4l2_prio_max);int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local){	if (*local < v4l2_prio_max(global))		return -EBUSY;	return 0;}EXPORT_SYMBOL(v4l2_prio_check);/* ----------------------------------------------------------------- *//* 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;}EXPORT_SYMBOL(v4l2_ctrl_check);/* 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;	}}EXPORT_SYMBOL(v4l2_ctrl_get_menu);/* 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;

⌨️ 快捷键说明

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