videodev.c

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

C
1,829
字号
				ret=vfd->vidioc_g_fmt_overlay(file, fh, f);			break;		case V4L2_BUF_TYPE_VBI_CAPTURE:			if (vfd->vidioc_g_fmt_vbi)				ret=vfd->vidioc_g_fmt_vbi(file, fh, f);			break;		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:			if (vfd->vidioc_g_fmt_vbi_output)				ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f);			break;		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:			if (vfd->vidioc_g_fmt_vbi_capture)				ret=vfd->vidioc_g_fmt_vbi_capture(file, fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OUTPUT:			if (vfd->vidioc_g_fmt_video_output)				ret=vfd->vidioc_g_fmt_video_output(file,								fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:			if (vfd->vidioc_g_fmt_output_overlay)				ret=vfd->vidioc_g_fmt_output_overlay(file, fh, f);			break;		case V4L2_BUF_TYPE_VBI_OUTPUT:			if (vfd->vidioc_g_fmt_vbi_output)				ret=vfd->vidioc_g_fmt_vbi_output(file, fh, f);			break;		case V4L2_BUF_TYPE_PRIVATE:			if (vfd->vidioc_g_fmt_type_private)				ret=vfd->vidioc_g_fmt_type_private(file,								fh, f);			break;		}		break;	}	case VIDIOC_S_FMT:	{		struct v4l2_format *f = (struct v4l2_format *)arg;		/* FIXME: Should be one dump per type */		dbgarg (cmd, "type=%s\n", prt_names(f->type,					v4l2_type_names_FIXME));		switch (f->type) {		case V4L2_BUF_TYPE_VIDEO_CAPTURE:			v4l_print_pix_fmt(vfd,&f->fmt.pix);			if (vfd->vidioc_s_fmt_cap)				ret=vfd->vidioc_s_fmt_cap(file, fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OVERLAY:			if (vfd->vidioc_s_fmt_overlay)				ret=vfd->vidioc_s_fmt_overlay(file, fh, f);			break;		case V4L2_BUF_TYPE_VBI_CAPTURE:			if (vfd->vidioc_s_fmt_vbi)				ret=vfd->vidioc_s_fmt_vbi(file, fh, f);			break;		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:			if (vfd->vidioc_s_fmt_vbi_output)				ret=vfd->vidioc_s_fmt_vbi_output(file, fh, f);			break;		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:			if (vfd->vidioc_s_fmt_vbi_capture)				ret=vfd->vidioc_s_fmt_vbi_capture(file, fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OUTPUT:			if (vfd->vidioc_s_fmt_video_output)				ret=vfd->vidioc_s_fmt_video_output(file,								fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:			if (vfd->vidioc_s_fmt_output_overlay)				ret=vfd->vidioc_s_fmt_output_overlay(file, fh, f);			break;		case V4L2_BUF_TYPE_VBI_OUTPUT:			if (vfd->vidioc_s_fmt_vbi_output)				ret=vfd->vidioc_s_fmt_vbi_output(file,								fh, f);			break;		case V4L2_BUF_TYPE_PRIVATE:			if (vfd->vidioc_s_fmt_type_private)				ret=vfd->vidioc_s_fmt_type_private(file,								fh, f);			break;		}		break;	}	case VIDIOC_TRY_FMT:	{		struct v4l2_format *f = (struct v4l2_format *)arg;		/* FIXME: Should be one dump per type */		dbgarg (cmd, "type=%s\n", prt_names(f->type,						v4l2_type_names_FIXME));		switch (f->type) {		case V4L2_BUF_TYPE_VIDEO_CAPTURE:			if (vfd->vidioc_try_fmt_cap)				ret=vfd->vidioc_try_fmt_cap(file, fh, f);			if (!ret)				v4l_print_pix_fmt(vfd,&f->fmt.pix);			break;		case V4L2_BUF_TYPE_VIDEO_OVERLAY:			if (vfd->vidioc_try_fmt_overlay)				ret=vfd->vidioc_try_fmt_overlay(file, fh, f);			break;		case V4L2_BUF_TYPE_VBI_CAPTURE:			if (vfd->vidioc_try_fmt_vbi)				ret=vfd->vidioc_try_fmt_vbi(file, fh, f);			break;		case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:			if (vfd->vidioc_try_fmt_vbi_output)				ret=vfd->vidioc_try_fmt_vbi_output(file,								fh, f);			break;		case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:			if (vfd->vidioc_try_fmt_vbi_capture)				ret=vfd->vidioc_try_fmt_vbi_capture(file,								fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OUTPUT:			if (vfd->vidioc_try_fmt_video_output)				ret=vfd->vidioc_try_fmt_video_output(file,								fh, f);			break;		case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:			if (vfd->vidioc_try_fmt_output_overlay)				ret=vfd->vidioc_try_fmt_output_overlay(file, fh, f);			break;		case V4L2_BUF_TYPE_VBI_OUTPUT:			if (vfd->vidioc_try_fmt_vbi_output)				ret=vfd->vidioc_try_fmt_vbi_output(file,								fh, f);			break;		case V4L2_BUF_TYPE_PRIVATE:			if (vfd->vidioc_try_fmt_type_private)				ret=vfd->vidioc_try_fmt_type_private(file,								fh, f);			break;		}		break;	}	/* FIXME: Those buf reqs could be handled here,	   with some changes on videobuf to allow its header to be included at	   videodev2.h or being merged at videodev2.	 */	case VIDIOC_REQBUFS:	{		struct v4l2_requestbuffers *p=arg;		if (!vfd->vidioc_reqbufs)			break;		ret = check_fmt (vfd, p->type);		if (ret)			break;		ret=vfd->vidioc_reqbufs(file, fh, p);		dbgarg (cmd, "count=%d, type=%s, memory=%s\n",				p->count,				prt_names(p->type,v4l2_type_names_FIXME),				prt_names(p->memory,v4l2_memory_names));		break;	}	case VIDIOC_QUERYBUF:	{		struct v4l2_buffer *p=arg;		if (!vfd->vidioc_querybuf)			break;		ret = check_fmt (vfd, p->type);		if (ret)			break;		ret=vfd->vidioc_querybuf(file, fh, p);		if (!ret)			dbgbuf(cmd,vfd,p);		break;	}	case VIDIOC_QBUF:	{		struct v4l2_buffer *p=arg;		if (!vfd->vidioc_qbuf)			break;		ret = check_fmt (vfd, p->type);		if (ret)			break;		ret=vfd->vidioc_qbuf(file, fh, p);		if (!ret)			dbgbuf(cmd,vfd,p);		break;	}	case VIDIOC_DQBUF:	{		struct v4l2_buffer *p=arg;		if (!vfd->vidioc_dqbuf)			break;		ret = check_fmt (vfd, p->type);		if (ret)			break;		ret=vfd->vidioc_dqbuf(file, fh, p);		if (!ret)			dbgbuf(cmd,vfd,p);		break;	}	case VIDIOC_OVERLAY:	{		int *i = arg;		if (!vfd->vidioc_overlay)			break;		dbgarg (cmd, "value=%d\n",*i);		ret=vfd->vidioc_overlay(file, fh, *i);		break;	}	case VIDIOC_G_FBUF:	{		struct v4l2_framebuffer *p=arg;		if (!vfd->vidioc_g_fbuf)			break;		ret=vfd->vidioc_g_fbuf(file, fh, arg);		if (!ret) {			dbgarg (cmd, "capability=%d, flags=%d, base=0x%08lx\n",					p->capability,p->flags,					(unsigned long)p->base);			v4l_print_pix_fmt (vfd, &p->fmt);		}		break;	}	case VIDIOC_S_FBUF:	{		struct v4l2_framebuffer *p=arg;		if (!vfd->vidioc_s_fbuf)			break;		dbgarg (cmd, "capability=%d, flags=%d, base=0x%08lx\n",				p->capability,p->flags,(unsigned long)p->base);		v4l_print_pix_fmt (vfd, &p->fmt);		ret=vfd->vidioc_s_fbuf(file, fh, arg);		break;	}	case VIDIOC_STREAMON:	{		enum v4l2_buf_type i = *(int *)arg;		if (!vfd->vidioc_streamon)			break;		dbgarg (cmd, "type=%s\n", prt_names(i,v4l2_type_names_FIXME));		ret=vfd->vidioc_streamon(file, fh,i);		break;	}	case VIDIOC_STREAMOFF:	{		enum v4l2_buf_type i = *(int *)arg;		if (!vfd->vidioc_streamoff)			break;		dbgarg (cmd, "type=%s\n", prt_names(i,v4l2_type_names_FIXME));		ret=vfd->vidioc_streamoff(file, fh, i);		break;	}	/* ---------- tv norms ---------- */	case VIDIOC_ENUMSTD:	{		struct v4l2_standard *p = arg;		v4l2_std_id id = vfd->tvnorms,curr_id=0;		unsigned int index = p->index,i;		if (index<0) {			ret=-EINVAL;			break;		}		/* Return norm array on a canonical way */		for (i=0;i<= index && id; i++) {			if ( (id & V4L2_STD_PAL) == V4L2_STD_PAL) {				curr_id = V4L2_STD_PAL;			} else if ( (id & V4L2_STD_PAL_BG) == V4L2_STD_PAL_BG) {				curr_id = V4L2_STD_PAL_BG;			} else if ( (id & V4L2_STD_PAL_DK) == V4L2_STD_PAL_DK) {				curr_id = V4L2_STD_PAL_DK;			} else if ( (id & V4L2_STD_PAL_B) == V4L2_STD_PAL_B) {				curr_id = V4L2_STD_PAL_B;			} else if ( (id & V4L2_STD_PAL_B1) == V4L2_STD_PAL_B1) {				curr_id = V4L2_STD_PAL_B1;			} else if ( (id & V4L2_STD_PAL_G) == V4L2_STD_PAL_G) {				curr_id = V4L2_STD_PAL_G;			} else if ( (id & V4L2_STD_PAL_H) == V4L2_STD_PAL_H) {				curr_id = V4L2_STD_PAL_H;			} else if ( (id & V4L2_STD_PAL_I) == V4L2_STD_PAL_I) {				curr_id = V4L2_STD_PAL_I;			} else if ( (id & V4L2_STD_PAL_D) == V4L2_STD_PAL_D) {				curr_id = V4L2_STD_PAL_D;			} else if ( (id & V4L2_STD_PAL_D1) == V4L2_STD_PAL_D1) {				curr_id = V4L2_STD_PAL_D1;			} else if ( (id & V4L2_STD_PAL_K) == V4L2_STD_PAL_K) {				curr_id = V4L2_STD_PAL_K;			} else if ( (id & V4L2_STD_PAL_M) == V4L2_STD_PAL_M) {				curr_id = V4L2_STD_PAL_M;			} else if ( (id & V4L2_STD_PAL_N) == V4L2_STD_PAL_N) {				curr_id = V4L2_STD_PAL_N;			} else if ( (id & V4L2_STD_PAL_Nc) == V4L2_STD_PAL_Nc) {				curr_id = V4L2_STD_PAL_Nc;			} else if ( (id & V4L2_STD_PAL_60) == V4L2_STD_PAL_60) {				curr_id = V4L2_STD_PAL_60;			} else if ( (id & V4L2_STD_NTSC) == V4L2_STD_NTSC) {				curr_id = V4L2_STD_NTSC;			} else if ( (id & V4L2_STD_NTSC_M) == V4L2_STD_NTSC_M) {				curr_id = V4L2_STD_NTSC_M;			} else if ( (id & V4L2_STD_NTSC_M_JP) == V4L2_STD_NTSC_M_JP) {				curr_id = V4L2_STD_NTSC_M_JP;			} else if ( (id & V4L2_STD_NTSC_443) == V4L2_STD_NTSC_443) {				curr_id = V4L2_STD_NTSC_443;			} else if ( (id & V4L2_STD_NTSC_M_KR) == V4L2_STD_NTSC_M_KR) {				curr_id = V4L2_STD_NTSC_M_KR;			} else if ( (id & V4L2_STD_SECAM) == V4L2_STD_SECAM) {				curr_id = V4L2_STD_SECAM;			} else if ( (id & V4L2_STD_SECAM_DK) == V4L2_STD_SECAM_DK) {				curr_id = V4L2_STD_SECAM_DK;			} else if ( (id & V4L2_STD_SECAM_B) == V4L2_STD_SECAM_B) {				curr_id = V4L2_STD_SECAM_B;			} else if ( (id & V4L2_STD_SECAM_D) == V4L2_STD_SECAM_D) {				curr_id = V4L2_STD_SECAM_D;			} else if ( (id & V4L2_STD_SECAM_G) == V4L2_STD_SECAM_G) {				curr_id = V4L2_STD_SECAM_G;			} else if ( (id & V4L2_STD_SECAM_H) == V4L2_STD_SECAM_H) {				curr_id = V4L2_STD_SECAM_H;			} else if ( (id & V4L2_STD_SECAM_K) == V4L2_STD_SECAM_K) {				curr_id = V4L2_STD_SECAM_K;			} else if ( (id & V4L2_STD_SECAM_K1) == V4L2_STD_SECAM_K1) {				curr_id = V4L2_STD_SECAM_K1;			} else if ( (id & V4L2_STD_SECAM_L) == V4L2_STD_SECAM_L) {				curr_id = V4L2_STD_SECAM_L;			} else if ( (id & V4L2_STD_SECAM_LC) == V4L2_STD_SECAM_LC) {				curr_id = V4L2_STD_SECAM_LC;			} else {				break;			}			id &= ~curr_id;		}		if (i<=index)			return -EINVAL;		v4l2_video_std_construct(p, curr_id,v4l2_norm_to_name(curr_id));		p->index = index;		dbgarg (cmd, "index=%d, id=%Ld, name=%s, fps=%d/%d, "				"framelines=%d\n", p->index,				(unsigned long long)p->id, p->name,				p->frameperiod.numerator,				p->frameperiod.denominator,				p->framelines);		ret=0;		break;	}	case VIDIOC_G_STD:	{		v4l2_std_id *id = arg;		*id = vfd->current_norm;		dbgarg (cmd, "value=%Lu\n", (long long unsigned) *id);		ret=0;		break;	}	case VIDIOC_S_STD:	{		v4l2_std_id *id = arg,norm;		dbgarg (cmd, "value=%Lu\n", (long long unsigned) *id);		norm = (*id) & vfd->tvnorms;		if ( vfd->tvnorms && !norm)	/* Check if std is supported */			break;		/* Calls the specific handler */		if (vfd->vidioc_s_std)			ret=vfd->vidioc_s_std(file, fh, &norm);		else			ret=-EINVAL;		/* Updates standard information */		if (ret>=0)			vfd->current_norm=norm;		break;	}	case VIDIOC_QUERYSTD:	{		v4l2_std_id *p=arg;		if (!vfd->vidioc_querystd)			break;		ret=vfd->vidioc_querystd(file, fh, arg);		if (!ret)			dbgarg (cmd, "detected std=%Lu\n",						(unsigned long long)*p);		break;	}	/* ------ input switching ---------- */	/* FIXME: Inputs can be handled inside videodev2 */	case VIDIOC_ENUMINPUT:	{		struct v4l2_input *p=arg;		int i=p->index;		if (!vfd->vidioc_enum_input)			break;		memset(p, 0, sizeof(*p));		p->index=i;		ret=vfd->vidioc_enum_input(file, fh, p);		if (!ret)			dbgarg (cmd, "index=%d, name=%s, type=%d, "					"audioset=%d, "					"tuner=%d, std=%Ld, status=%d\n",					p->index,p->name,p->type,p->audioset,					p->tuner,					(unsigned long long)p->std,					p->status);		break;	}	case VIDIOC_G_INPUT:	{		unsigned int *i = arg;		if (!vfd->vidioc_g_input)			break;		ret=vfd->vidioc_g_input(file, fh, i);		if (!ret)			dbgarg (cmd, "value=%d\n",*i);		break;	}	case VIDIOC_S_INPUT:	{		unsigned int *i = arg;		if (!vfd->vidioc_s_input)			break;		dbgarg (cmd, "value=%d\n",*i);		ret=vfd->vidioc_s_input(file, fh, *i);		break;	}	/* ------ output switching ---------- */	case VIDIOC_G_OUTPUT:	{		unsigned int *i = arg;		if (!vfd->vidioc_g_output)			break;		ret=vfd->vidioc_g_output(file, fh, i);		if (!ret)			dbgarg (cmd, "value=%d\n",*i);		break;	}	case VIDIOC_S_OUTPUT:	{		unsigned int *i = arg;		if (!vfd->vidioc_s_output)			break;		dbgarg (cmd, "value=%d\n",*i);		ret=vfd->vidioc_s_output(file, fh, *i);		break;	}	/* --- controls ---------------------------------------------- */	case VIDIOC_QUERYCTRL:	{		struct v4l2_queryctrl *p=arg;		if (!vfd->vidioc_queryctrl)			break;		ret=vfd->vidioc_queryctrl(file, fh, p);		if (!ret)			dbgarg (cmd, "id=%d, type=%d, name=%s, "					"min/max=%d/%d,"					" step=%d, default=%d, flags=0x%08x\n",					p->id,p->type,p->name,p->minimum,					p->maximum,p->step,p->default_value,					p->flags);		break;	}	case VIDIOC_G_CTRL:	{		struct v4l2_control *p = arg;		if (!vfd->vidioc_g_ctrl)			break;		dbgarg(cmd, "Enum for index=%d\n", p->id);		ret=vfd->vidioc_g_ctrl(file, fh, p);		if (!ret)			dbgarg2 ( "id=%d, value=%d\n", p->id, p->value);		break;	}	case VIDIOC_S_CTRL:	{		struct v4l2_control *p = arg;		if (!vfd->vidioc_s_ctrl)			break;		dbgarg (cmd, "id=%d, value=%d\n", p->id, p->value);		ret=vfd->vidioc_s_ctrl(file, fh, p);		break;	}	case VIDIOC_G_EXT_CTRLS:	{		struct v4l2_ext_controls *p = arg;		if (vfd->vidioc_g_ext_ctrls) {			dbgarg(cmd, "count=%d\n", p->count);			ret=vfd->vidioc_g_ext_ctrls(file, fh, p);		}		break;	}	case VIDIOC_S_EXT_CTRLS:	{		struct v4l2_ext_controls *p = arg;		if (vfd->vidioc_s_ext_ctrls) {			dbgarg(cmd, "count=%d\n", p->count);			ret=vfd->vidioc_s_ext_ctrls(file, fh, p);		}		break;	}	case VIDIOC_TRY_EXT_CTRLS:	{		struct v4l2_ext_controls *p = arg;		if (vfd->vidioc_try_ext_ctrls) {			dbgarg(cmd, "count=%d\n", p->count);			ret=vfd->vidioc_try_ext_ctrls(file, fh, p);		}		break;	}	case VIDIOC_QUERYMENU:	{		struct v4l2_querymenu *p=arg;		if (!vfd->vidioc_querymenu)			break;		ret=vfd->vidioc_querymenu(file, fh, p);		if (!ret)			dbgarg (cmd, "id=%d, index=%d, name=%s\n",						p->id,p->index,p->name);		break;	}	/* --- audio ---------------------------------------------- */	case VIDIOC_ENUMAUDIO:	{		struct v4l2_audio *p=arg;		if (!vfd->vidioc_enumaudio)			break;		dbgarg(cmd, "Enum for index=%d\n", p->index);		ret=vfd->vidioc_enumaudio(file, fh, p);		if (!ret)			dbgarg2("index=%d, name=%s, capability=%d, "					"mode=%d\n",p->index,p->name,					p->capability, p->mode);		break;	}	case VIDIOC_G_AUDIO:	{		struct v4l2_audio *p=arg;		__u32 index=p->index;		if (!vfd->vidioc_g_audio)			break;		memset(p,0,sizeof(*p));		p->index=index;		dbgarg(cmd, "Get for index=%d\n", p->index);		ret=vfd->vidioc_g_audio(file, fh, p);		if (!ret)			dbgarg2("index=%d, name=%s, capability=%d, "					"mode=%d\n",p->index,					p->name,p->capability, p->mode);		break;	}	case VIDIOC_S_AUDIO:	{		struct v4l2_audio *p=arg;		if (!vfd->vidioc_s_audio)			break;		dbgarg(cmd, "index=%d, name=%s, capability=%d, "					"mode=%d\n", p->index, p->name,					p->capability, p->mode);		ret=vfd->vidioc_s_audio(file, fh, p);		break;	}	case VIDIOC_ENUMAUDOUT:	{		struct v4l2_audioout *p=arg;		if (!vfd->vidioc_enumaudout)			break;		dbgarg(cmd, "Enum for index=%d\n", p->index);

⌨️ 快捷键说明

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