brintos

brintos / linux-shallow public Read only

0
0
Text · 19.0 KiB · d9d2a29 Raw
643 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.4 * Copyright (C) 2017 Linaro Ltd.5 */6#include <linux/types.h>7#include <media/v4l2-ctrls.h>8 9#include "core.h"10#include "venc.h"11#include "helpers.h"12 13#define BITRATE_MIN		3200014#define BITRATE_MAX		16000000015#define BITRATE_DEFAULT		100000016#define BITRATE_DEFAULT_PEAK	(BITRATE_DEFAULT * 2)17#define BITRATE_STEP		10018#define SLICE_BYTE_SIZE_MAX	102419#define SLICE_BYTE_SIZE_MIN	102420#define SLICE_MB_SIZE_MAX	30021#define AT_SLICE_BOUNDARY	\22	V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY23#define MAX_LTR_FRAME_COUNT 424 25static int venc_calc_bpframes(u32 gop_size, u32 conseq_b, u32 *bf, u32 *pf)26{27	u32 half = (gop_size - 1) >> 1;28	u32 b, p, ratio;29	bool found = false;30 31	if (!gop_size)32		return -EINVAL;33 34	*bf = *pf = 0;35 36	if (!conseq_b) {37		*pf = gop_size -  1;38		return 0;39	}40 41	b = p = half;42 43	for (; b <= gop_size - 1; b++, p--) {44		if (b % p)45			continue;46 47		ratio = b / p;48 49		if (ratio == conseq_b) {50			found = true;51			break;52		}53 54		if (ratio > conseq_b)55			break;56	}57 58	if (!found)59		return -EINVAL;60 61	if (b + p + 1 != gop_size)62		return -EINVAL;63 64	*bf = b;65	*pf = p;66 67	return 0;68}69 70static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)71{72	struct venus_inst *inst = ctrl_to_inst(ctrl);73	struct venc_controls *ctr = &inst->controls.enc;74	struct hfi_enable en = { .enable = 1 };75	struct hfi_bitrate brate;76	struct hfi_ltr_use ltr_use;77	struct hfi_ltr_mark ltr_mark;78	u32 bframes;79	u32 ptype;80	int ret;81 82	switch (ctrl->id) {83	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:84		ctr->bitrate_mode = ctrl->val;85		break;86	case V4L2_CID_MPEG_VIDEO_BITRATE:87		ctr->bitrate = ctrl->val;88		mutex_lock(&inst->lock);89		if (inst->streamon_out && inst->streamon_cap) {90			ptype = HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE;91			brate.bitrate = ctr->bitrate;92			brate.layer_id = 0;93 94			ret = hfi_session_set_property(inst, ptype, &brate);95			if (ret) {96				mutex_unlock(&inst->lock);97				return ret;98			}99		}100		mutex_unlock(&inst->lock);101		break;102	case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:103		ctr->bitrate_peak = ctrl->val;104		break;105	case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:106		ctr->h264_entropy_mode = ctrl->val;107		break;108	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:109		ctr->profile.mpeg4 = ctrl->val;110		break;111	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:112		ctr->profile.h264 = ctrl->val;113		break;114	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:115		ctr->profile.hevc = ctrl->val;116		break;117	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:118		ctr->profile.vp8 = ctrl->val;119		break;120	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:121		ctr->level.mpeg4 = ctrl->val;122		break;123	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:124		ctr->level.h264 = ctrl->val;125		break;126	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:127		ctr->level.hevc = ctrl->val;128		break;129	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:130		ctr->h264_i_qp = ctrl->val;131		break;132	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:133		ctr->h264_p_qp = ctrl->val;134		break;135	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:136		ctr->h264_b_qp = ctrl->val;137		break;138	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:139		ctr->h264_min_qp = ctrl->val;140		break;141	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP:142		ctr->h264_i_min_qp = ctrl->val;143		break;144	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP:145		ctr->h264_p_min_qp = ctrl->val;146		break;147	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP:148		ctr->h264_b_min_qp = ctrl->val;149		break;150	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:151		ctr->h264_max_qp = ctrl->val;152		break;153	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP:154		ctr->h264_i_max_qp = ctrl->val;155		break;156	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP:157		ctr->h264_p_max_qp = ctrl->val;158		break;159	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP:160		ctr->h264_b_max_qp = ctrl->val;161		break;162	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP:163		ctr->hevc_i_qp = ctrl->val;164		break;165	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP:166		ctr->hevc_p_qp = ctrl->val;167		break;168	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:169		ctr->hevc_b_qp = ctrl->val;170		break;171	case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP:172		ctr->hevc_min_qp = ctrl->val;173		break;174	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP:175		ctr->hevc_i_min_qp = ctrl->val;176		break;177	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP:178		ctr->hevc_p_min_qp = ctrl->val;179		break;180	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP:181		ctr->hevc_b_min_qp = ctrl->val;182		break;183	case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP:184		ctr->hevc_max_qp = ctrl->val;185		break;186	case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP:187		ctr->hevc_i_max_qp = ctrl->val;188		break;189	case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP:190		ctr->hevc_p_max_qp = ctrl->val;191		break;192	case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP:193		ctr->hevc_b_max_qp = ctrl->val;194		break;195	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:196		ctr->multi_slice_mode = ctrl->val;197		break;198	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:199		ctr->multi_slice_max_bytes = ctrl->val;200		break;201	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:202		ctr->multi_slice_max_mb = ctrl->val;203		break;204	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:205		ctr->h264_loop_filter_alpha = ctrl->val;206		break;207	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:208		ctr->h264_loop_filter_beta = ctrl->val;209		break;210	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:211		ctr->h264_loop_filter_mode = ctrl->val;212		break;213	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:214		ctr->header_mode = ctrl->val;215		mutex_lock(&inst->lock);216		if (inst->streamon_out && inst->streamon_cap) {217			if (ctrl->val == V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE)218				en.enable = 0;219			else220				en.enable = 1;221			ptype = HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER;222			ret = hfi_session_set_property(inst, ptype, &en);223			if (ret) {224				mutex_unlock(&inst->lock);225				return ret;226			}227		}228		mutex_unlock(&inst->lock);229		break;230	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:231		ret = venc_calc_bpframes(ctrl->val, ctr->num_b_frames, &bframes,232					 &ctr->num_p_frames);233		if (ret)234			return ret;235 236		ctr->gop_size = ctrl->val;237		break;238	case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:239		ctr->h264_i_period = ctrl->val;240		break;241	case V4L2_CID_MPEG_VIDEO_VPX_MIN_QP:242		ctr->vp8_min_qp = ctrl->val;243		break;244	case V4L2_CID_MPEG_VIDEO_VPX_MAX_QP:245		ctr->vp8_max_qp = ctrl->val;246		break;247	case V4L2_CID_MPEG_VIDEO_B_FRAMES:248		ret = venc_calc_bpframes(ctr->gop_size, ctrl->val, &bframes,249					 &ctr->num_p_frames);250		if (ret)251			return ret;252 253		ctr->num_b_frames = bframes;254		break;255	case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:256		mutex_lock(&inst->lock);257		if (inst->streamon_out && inst->streamon_cap) {258			ptype = HFI_PROPERTY_CONFIG_VENC_REQUEST_SYNC_FRAME;259			ret = hfi_session_set_property(inst, ptype, &en);260 261			if (ret) {262				mutex_unlock(&inst->lock);263				return ret;264			}265		}266		mutex_unlock(&inst->lock);267		break;268	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:269		ctr->rc_enable = ctrl->val;270		break;271	case V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY:272		ctr->const_quality = ctrl->val;273		break;274	case V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE:275		ctr->frame_skip_mode = ctrl->val;276		break;277	case V4L2_CID_MPEG_VIDEO_BASELAYER_PRIORITY_ID:278		ctr->base_priority_id = ctrl->val;279		break;280	case V4L2_CID_MPEG_VIDEO_AU_DELIMITER:281		ctr->aud_enable = ctrl->val;282		break;283	case V4L2_CID_MPEG_VIDEO_LTR_COUNT:284		ctr->ltr_count = ctrl->val;285		break;286	case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX:287		mutex_lock(&inst->lock);288		if (inst->streamon_out && inst->streamon_cap) {289			ptype = HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME;290			ltr_mark.mark_frame = ctrl->val;291			ret = hfi_session_set_property(inst, ptype, &ltr_mark);292			if (ret) {293				mutex_unlock(&inst->lock);294				return ret;295			}296		}297		mutex_unlock(&inst->lock);298		break;299	case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES:300		mutex_lock(&inst->lock);301		if (inst->streamon_out && inst->streamon_cap) {302			ptype = HFI_PROPERTY_CONFIG_VENC_USELTRFRAME;303			ltr_use.ref_ltr = ctrl->val;304			ltr_use.use_constrnt = true;305			ltr_use.frames = 0;306			ret = hfi_session_set_property(inst, ptype, &ltr_use);307			if (ret) {308				mutex_unlock(&inst->lock);309				return ret;310			}311		}312		mutex_unlock(&inst->lock);313		break;314	case V4L2_CID_COLORIMETRY_HDR10_CLL_INFO:315		ctr->cll = *ctrl->p_new.p_hdr10_cll;316		break;317	case V4L2_CID_COLORIMETRY_HDR10_MASTERING_DISPLAY:318		ctr->mastering = *ctrl->p_new.p_hdr10_mastering;319		break;320	case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE:321		ctr->intra_refresh_type = ctrl->val;322		break;323	case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD:324		ctr->intra_refresh_period = ctrl->val;325		break;326	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:327		if (ctr->profile.h264 != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH &&328		    ctr->profile.h264 != V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH)329			return -EINVAL;330 331		/*332		 * In video firmware, 8x8 transform is supported only for333		 * high profile(HP) and constrained high profile(CHP).334		 * If client wants to disable 8x8 transform for HP/CHP,335		 * it is better to set profile as main profile(MP).336		 * Because there is no difference between HP and MP337		 * if we disable 8x8 transform for HP.338		 */339 340 341		ctr->h264_8x8_transform = ctrl->val;342		break;343	default:344		return -EINVAL;345	}346 347	return 0;348}349 350static int venc_op_g_volatile_ctrl(struct v4l2_ctrl *ctrl)351{352	struct venus_inst *inst = ctrl_to_inst(ctrl);353	struct hfi_buffer_requirements bufreq;354	enum hfi_version ver = inst->core->res->hfi_version;355	int ret;356 357	switch (ctrl->id) {358	case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:359		ret = venus_helper_get_bufreq(inst, HFI_BUFFER_INPUT, &bufreq);360		if (!ret)361			ctrl->val = hfi_bufreq_get_count_min(&bufreq, ver);362		break;363	default:364		return -EINVAL;365	}366 367	return 0;368}369 370static const struct v4l2_ctrl_ops venc_ctrl_ops = {371	.s_ctrl = venc_op_s_ctrl,372	.g_volatile_ctrl = venc_op_g_volatile_ctrl,373};374 375int venc_ctrl_init(struct venus_inst *inst)376{377	int ret;378	struct v4l2_ctrl_hdr10_mastering_display p_hdr10_mastering = {379		{ 34000, 13250, 7500 },380		{ 16000, 34500, 3000 }, 15635, 16450, 10000000, 500,381	};382	struct v4l2_ctrl_hdr10_cll_info p_hdr10_cll = { 1000, 400 };383 384	ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 59);385	if (ret)386		return ret;387 388	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,389		V4L2_CID_MPEG_VIDEO_BITRATE_MODE,390		V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,391		~((1 << V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |392		  (1 << V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) |393		  (1 << V4L2_MPEG_VIDEO_BITRATE_MODE_CQ)),394		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);395 396	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,397		V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,398		V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,399		0, V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC);400 401	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,402		V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,403		V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY,404		~((1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) |405		  (1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)),406		V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE);407 408	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,409		V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,410		V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,411		0, V4L2_MPEG_VIDEO_MPEG4_LEVEL_0);412 413	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,414		V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,415		V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10,416		~((1 << V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN) |417		  (1 << V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE) |418		  (1 << V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10)),419		V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN);420 421	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,422		V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,423		V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,424		0, V4L2_MPEG_VIDEO_HEVC_LEVEL_1);425 426	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,427		V4L2_CID_MPEG_VIDEO_H264_PROFILE,428		V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH,429		~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |430		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |431		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |432		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) |433		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH) |434		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH)),435		V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);436 437	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,438		V4L2_CID_MPEG_VIDEO_H264_LEVEL,439		V4L2_MPEG_VIDEO_H264_LEVEL_5_1,440		0, V4L2_MPEG_VIDEO_H264_LEVEL_1_0);441 442	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,443		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,444		AT_SLICE_BOUNDARY,445		0, V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED);446 447	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,448		V4L2_CID_MPEG_VIDEO_HEADER_MODE,449		V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,450		~((1 << V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE) |451		(1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME)),452		V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME);453 454	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,455		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,456		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES,457		0, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE);458 459	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,460		V4L2_CID_MPEG_VIDEO_VP8_PROFILE,461		V4L2_MPEG_VIDEO_VP8_PROFILE_3,462		0, V4L2_MPEG_VIDEO_VP8_PROFILE_0);463 464	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,465			  V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, 4, 11, 1, 4);466 467	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,468		V4L2_CID_MPEG_VIDEO_BITRATE, BITRATE_MIN, BITRATE_MAX,469		BITRATE_STEP, BITRATE_DEFAULT);470 471	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,472		V4L2_CID_MPEG_VIDEO_BITRATE_PEAK, BITRATE_MIN, BITRATE_MAX,473		BITRATE_STEP, BITRATE_DEFAULT_PEAK);474 475	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,476			  V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, 1, 51, 1, 26);477 478	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,479			  V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, 1, 51, 1, 28);480 481	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,482			  V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, 1, 51, 1, 30);483 484	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,485			  V4L2_CID_MPEG_VIDEO_H264_MIN_QP, 1, 51, 1, 1);486 487	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,488			  V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP, 1, 51, 1, 1);489 490	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,491			  V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM, 0, 1, 1, 1);492 493	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,494			  V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP, 1, 51, 1, 1);495 496	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,497			  V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP, 1, 51, 1, 1);498 499	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,500			  V4L2_CID_MPEG_VIDEO_H264_MAX_QP, 1, 51, 1, 51);501 502	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,503			  V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP, 1, 51, 1, 51);504 505	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,506			  V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP, 1, 51, 1, 51);507 508	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,509			  V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP, 1, 51, 1, 51);510 511	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,512			  V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP, 1, 63, 1, 26);513 514	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,515			  V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP, 1, 63, 1, 28);516 517	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,518			  V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP, 1, 63, 1, 30);519 520	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,521			  V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP, 1, 63, 1, 1);522 523	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,524			  V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP, 1, 63, 1, 1);525 526	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,527			  V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP, 1, 63, 1, 1);528 529	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,530			  V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP, 1, 63, 1, 1);531 532	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,533			  V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP, 1, 63, 1, 63);534 535	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,536			  V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP, 1, 63, 1, 63);537 538	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,539			  V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP, 1, 63, 1, 63);540 541	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,542			  V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP, 1, 63, 1, 63);543 544	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,545		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, SLICE_BYTE_SIZE_MIN,546		SLICE_BYTE_SIZE_MAX, 1, SLICE_BYTE_SIZE_MIN);547 548	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,549		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, 1,550		SLICE_MB_SIZE_MAX, 1, 1);551 552	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,553		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA, -6, 6, 1, 0);554 555	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,556		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA, -6, 6, 1, 0);557 558	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,559		V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, (1 << 16) - 1, 1, 30);560 561	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,562		V4L2_CID_MPEG_VIDEO_VPX_MIN_QP, 1, 128, 1, 1);563 564	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,565		V4L2_CID_MPEG_VIDEO_VPX_MAX_QP, 1, 128, 1, 128);566 567	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,568		V4L2_CID_MPEG_VIDEO_B_FRAMES, 0, 4, 1, 0);569 570	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,571		V4L2_CID_MPEG_VIDEO_H264_I_PERIOD, 0, (1 << 16) - 1, 1, 0);572 573	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,574			  V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, 0, 0, 0, 0);575 576	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,577			  V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, 0, 1, 1, 1);578 579	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,580			  V4L2_CID_MPEG_VIDEO_CONSTANT_QUALITY, 0, 100, 1, 0);581 582	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,583			       V4L2_CID_MPEG_VIDEO_FRAME_SKIP_MODE,584			       V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT,585			       ~((1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED) |586			       (1 << V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_BUF_LIMIT)),587			       V4L2_MPEG_VIDEO_FRAME_SKIP_MODE_DISABLED);588 589	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,590			  V4L2_CID_MPEG_VIDEO_BASELAYER_PRIORITY_ID, 0,591			  6, 1, 0);592 593	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,594			  V4L2_CID_MPEG_VIDEO_AU_DELIMITER, 0, 1, 1, 0);595 596	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,597			  V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES, 0,598			  ((1 << MAX_LTR_FRAME_COUNT) - 1), 0, 0);599 600	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,601			  V4L2_CID_MPEG_VIDEO_LTR_COUNT, 0,602			  MAX_LTR_FRAME_COUNT, 1, 0);603 604	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,605			  V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX, 0,606			  (MAX_LTR_FRAME_COUNT - 1), 1, 0);607 608	v4l2_ctrl_new_std_compound(&inst->ctrl_handler, &venc_ctrl_ops,609				   V4L2_CID_COLORIMETRY_HDR10_CLL_INFO,610				   v4l2_ctrl_ptr_create(&p_hdr10_cll));611 612	v4l2_ctrl_new_std_compound(&inst->ctrl_handler, &venc_ctrl_ops,613				   V4L2_CID_COLORIMETRY_HDR10_MASTERING_DISPLAY,614				   v4l2_ctrl_ptr_create((void *)&p_hdr10_mastering));615 616	v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,617			       V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE,618			       V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC,619			       0, V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM);620 621	v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,622			  V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD, 0,623			  ((4096 * 2304) >> 8), 1, 0);624 625	ret = inst->ctrl_handler.error;626	if (ret)627		goto err;628 629	ret = v4l2_ctrl_handler_setup(&inst->ctrl_handler);630	if (ret)631		goto err;632 633	return 0;634err:635	v4l2_ctrl_handler_free(&inst->ctrl_handler);636	return ret;637}638 639void venc_ctrl_deinit(struct venus_inst *inst)640{641	v4l2_ctrl_handler_free(&inst->ctrl_handler);642}643