cx2341x.c

来自「trident tm5600的linux驱动」· C语言 代码 · 共 1,073 行 · 第 1/3 页

C
1,073
字号
	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:		params->video_luma_spatial_filter_type = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:		params->video_chroma_spatial_filter_type = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:		params->video_temporal_filter_mode = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:		params->video_temporal_filter = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:		params->video_median_filter_type = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:		params->video_luma_median_filter_top = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:		params->video_luma_median_filter_bottom = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:		params->video_chroma_median_filter_top = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:		params->video_chroma_median_filter_bottom = ctrl->value;		break;	case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:		params->stream_insert_nav_packets = ctrl->value;		break;	default:		return -EINVAL;	}	return 0;}static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl,				   s32 min, s32 max, s32 step, s32 def){	const char *name;	qctrl->flags = 0;	switch (qctrl->id) {	/* MPEG controls */	case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:		name = "Spatial Filter Mode";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:		name = "Spatial Filter";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:		name = "Spatial Luma Filter Type";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:		name = "Spatial Chroma Filter Type";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:		name = "Temporal Filter Mode";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:		name = "Temporal Filter";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:		name = "Median Filter Type";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:		name = "Median Luma Filter Maximum";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:		name = "Median Luma Filter Minimum";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:		name = "Median Chroma Filter Maximum";		break;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:		name = "Median Chroma Filter Minimum";		break;	case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:		name = "Insert Navigation Packets";		break;	default:		return v4l2_ctrl_query_fill(qctrl, min, max, step, def);	}	switch (qctrl->id) {	case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:	case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:		qctrl->type = V4L2_CTRL_TYPE_MENU;		min = 0;		step = 1;		break;	case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:		qctrl->type = V4L2_CTRL_TYPE_BOOLEAN;		min = 0;		max = 1;		step = 1;		break;	default:		qctrl->type = V4L2_CTRL_TYPE_INTEGER;		break;	}	switch (qctrl->id) {	case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:	case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:		qctrl->flags |= V4L2_CTRL_FLAG_UPDATE;		break;	}	qctrl->minimum = min;	qctrl->maximum = max;	qctrl->step = step;	qctrl->default_value = def;	qctrl->reserved[0] = qctrl->reserved[1] = 0;	snprintf(qctrl->name, sizeof(qctrl->name), name);	return 0;}int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,		       struct v4l2_queryctrl *qctrl){	int err;	switch (qctrl->id) {	case V4L2_CID_MPEG_AUDIO_ENCODING:		return v4l2_ctrl_query_fill(qctrl,				V4L2_MPEG_AUDIO_ENCODING_LAYER_2,				V4L2_MPEG_AUDIO_ENCODING_LAYER_2, 1,				default_params.audio_encoding);	case V4L2_CID_MPEG_AUDIO_L2_BITRATE:		return v4l2_ctrl_query_fill(qctrl,				V4L2_MPEG_AUDIO_L2_BITRATE_192K,				V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,				default_params.audio_l2_bitrate);	case V4L2_CID_MPEG_AUDIO_L1_BITRATE:	case V4L2_CID_MPEG_AUDIO_L3_BITRATE:		return -EINVAL;	case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:		err = v4l2_ctrl_query_fill_std(qctrl);		if (err == 0 &&		    params->audio_mode != V4L2_MPEG_AUDIO_MODE_JOINT_STEREO)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return err;	case V4L2_CID_MPEG_VIDEO_ENCODING:		/* this setting is read-only for the cx2341x since the		   V4L2_CID_MPEG_STREAM_TYPE really determines the		   MPEG-1/2 setting */		err = v4l2_ctrl_query_fill(qctrl,					   V4L2_MPEG_VIDEO_ENCODING_MPEG_1,					   V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,					   V4L2_MPEG_VIDEO_ENCODING_MPEG_2);		if (err == 0)			qctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;		return err;	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:		err = v4l2_ctrl_query_fill_std(qctrl);		if (err == 0 &&		    params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return err;	case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:		err = v4l2_ctrl_query_fill_std(qctrl);		if (err == 0 &&		    params->video_bitrate_mode ==				V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return err;	case V4L2_CID_MPEG_STREAM_VBI_FMT:		if (params->capabilities & CX2341X_CAP_HAS_SLICED_VBI)			return v4l2_ctrl_query_fill_std(qctrl);		return cx2341x_ctrl_query_fill(qctrl,				V4L2_MPEG_STREAM_VBI_FMT_NONE,				V4L2_MPEG_STREAM_VBI_FMT_NONE, 1,				default_params.stream_vbi_fmt);	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:		return v4l2_ctrl_query_fill(qctrl, 1, 34, 1,				params->is_50hz ? 12 : 15);	/* CX23415/6 specific */	case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:		return cx2341x_ctrl_query_fill(qctrl,			V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,			V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO, 1,			default_params.video_spatial_filter_mode);	case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:		cx2341x_ctrl_query_fill(qctrl, 0, 15, 1,				default_params.video_spatial_filter);		qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;		if (params->video_spatial_filter_mode ==			    V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:		cx2341x_ctrl_query_fill(qctrl,			V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF,			V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE,			1,			default_params.video_luma_spatial_filter_type);		if (params->video_spatial_filter_mode ==			    V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:		cx2341x_ctrl_query_fill(qctrl,		    V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF,		    V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,		    1,		    default_params.video_chroma_spatial_filter_type);		if (params->video_spatial_filter_mode ==			V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:		return cx2341x_ctrl_query_fill(qctrl,			V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,			V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO, 1,			default_params.video_temporal_filter_mode);	case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:		cx2341x_ctrl_query_fill(qctrl, 0, 31, 1,				default_params.video_temporal_filter);		qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;		if (params->video_temporal_filter_mode ==			V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:		return cx2341x_ctrl_query_fill(qctrl,			V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,			V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG, 1,			default_params.video_median_filter_type);	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:		cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,				default_params.video_luma_median_filter_top);		qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;		if (params->video_median_filter_type ==				V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:		cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,				default_params.video_luma_median_filter_bottom);		qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;		if (params->video_median_filter_type ==				V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:		cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,				default_params.video_chroma_median_filter_top);		qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;		if (params->video_median_filter_type ==				V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:		cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,			default_params.video_chroma_median_filter_bottom);		qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;		if (params->video_median_filter_type ==				V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)			qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;		return 0;	case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:		return cx2341x_ctrl_query_fill(qctrl, 0, 1, 1,				default_params.stream_insert_nav_packets);	default:		return v4l2_ctrl_query_fill_std(qctrl);	}}EXPORT_SYMBOL(cx2341x_ctrl_query);const char **cx2341x_ctrl_get_menu(const struct cx2341x_mpeg_params *p, u32 id){	static const char *mpeg_stream_type_without_ts[] = {		"MPEG-2 Program 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_type_with_ts[] = {		"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 *cx2341x_video_spatial_filter_mode_menu[] = {		"Manual",		"Auto",		NULL	};	static const char *cx2341x_video_luma_spatial_filter_type_menu[] = {		"Off",		"1D Horizontal",		"1D Vertical",		"2D H/V Separable",		"2D Symmetric non-separable",		NULL	};	static const char *cx2341x_video_chroma_spatial_filter_type_menu[] = {		"Off",		"1D Horizontal",		NULL	};	static const char *cx2341x_video_temporal_filter_mode_menu[] = {		"Manual",		"Auto",		NULL	};	static const char *cx2341x_video_median_filter_type_menu[] = {		"Off",		"Horizontal",		"Vertical",		"Horizontal/Vertical",		"Diagonal",		NULL	};	switch (id) {	case V4L2_CID_MPEG_STREAM_TYPE:		return (p->capabilities & CX2341X_CAP_HAS_TS) ?			mpeg_stream_type_with_ts : mpeg_stream_type_without_ts;	case V4L2_CID_MPEG_AUDIO_L1_BITRATE:	case V4L2_CID_MPEG_AUDIO_L3_BITRATE:

⌨️ 快捷键说明

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