cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

venc_ctrls.c (18665B)


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