diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ctrls.c')
| -rw-r--r-- | drivers/media/v4l2-core/v4l2-ctrls.c | 38 | 
1 files changed, 36 insertions, 2 deletions
| diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c index d29e45516eb7..599c1cbff3b9 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -431,6 +431,20 @@ const char * const *v4l2_ctrl_get_menu(u32 id)  		"Use Previous Specific Frame",  		NULL,  	}; +	static const char * const vp8_profile[] = { +		"0", +		"1", +		"2", +		"3", +		NULL, +	}; +	static const char * const vp9_profile[] = { +		"0", +		"1", +		"2", +		"3", +		NULL, +	};  	static const char * const flash_led_mode[] = {  		"Off", @@ -614,6 +628,10 @@ const char * const *v4l2_ctrl_get_menu(u32 id)  		return mpeg4_profile;  	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL:  		return vpx_golden_frame_sel; +	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE: +		return vp8_profile; +	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE: +		return vp9_profile;  	case V4L2_CID_JPEG_CHROMA_SUBSAMPLING:  		return jpeg_chroma_subsampling;  	case V4L2_CID_DV_TX_MODE: @@ -839,7 +857,8 @@ const char *v4l2_ctrl_get_name(u32 id)  	case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP:			return "VPX Maximum QP Value";  	case V4L2_CID_MPEG_VIDEO_VPX_I_FRAME_QP:		return "VPX I-Frame QP Value";  	case V4L2_CID_MPEG_VIDEO_VPX_P_FRAME_QP:		return "VPX P-Frame QP Value"; -	case V4L2_CID_MPEG_VIDEO_VPX_PROFILE:			return "VPX Profile"; +	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:			return "VP8 Profile"; +	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:			return "VP9 Profile";  	/* HEVC controls */  	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:		return "HEVC I-Frame QP Value"; @@ -1180,6 +1199,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,  	case V4L2_CID_DEINTERLACING_MODE:  	case V4L2_CID_TUNE_DEEMPHASIS:  	case V4L2_CID_MPEG_VIDEO_VPX_GOLDEN_FRAME_SEL: +	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE: +	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:  	case V4L2_CID_DETECT_MD_MODE:  	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:  	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL: @@ -3137,9 +3158,22 @@ static int try_or_set_cluster(struct v4l2_fh *fh, struct v4l2_ctrl *master,  	/* If OK, then make the new values permanent. */  	update_flag = is_cur_manual(master) != is_new_manual(master); -	for (i = 0; i < master->ncontrols; i++) + +	for (i = 0; i < master->ncontrols; i++) { +		/* +		 * If we switch from auto to manual mode, and this cluster +		 * contains volatile controls, then all non-master controls +		 * have to be marked as changed. The 'new' value contains +		 * the volatile value (obtained by update_from_auto_cluster), +		 * which now has to become the current value. +		 */ +		if (i && update_flag && is_new_manual(master) && +		    master->has_volatiles && master->cluster[i]) +			master->cluster[i]->has_changed = true; +  		new_to_cur(fh, master->cluster[i], ch_flags |  			((update_flag && i > 0) ? V4L2_EVENT_CTRL_CH_FLAGS : 0)); +	}  	return 0;  } |