brintos

brintos / linux-shallow public Read only

0
0
Text · 5.7 KiB · 7e0f29b Raw
195 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 "helpers.h"11#include "vdec.h"12 13static int vdec_op_s_ctrl(struct v4l2_ctrl *ctrl)14{15	struct venus_inst *inst = ctrl_to_inst(ctrl);16	struct vdec_controls *ctr = &inst->controls.dec;17 18	switch (ctrl->id) {19	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:20		ctr->post_loop_deb_mode = ctrl->val;21		break;22	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:23	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:24	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:25	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:26		ctr->profile = ctrl->val;27		break;28	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:29	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:30	case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:31		ctr->level = ctrl->val;32		break;33	case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY:34		ctr->display_delay = ctrl->val;35		break;36	case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE:37		ctr->display_delay_enable = ctrl->val;38		break;39	case V4L2_CID_MPEG_VIDEO_DEC_CONCEAL_COLOR:40		ctr->conceal_color = *ctrl->p_new.p_s64;41		break;42	default:43		return -EINVAL;44	}45 46	return 0;47}48 49static int vdec_op_g_volatile_ctrl(struct v4l2_ctrl *ctrl)50{51	struct venus_inst *inst = ctrl_to_inst(ctrl);52	struct vdec_controls *ctr = &inst->controls.dec;53	struct hfi_buffer_requirements bufreq;54	enum hfi_version ver = inst->core->res->hfi_version;55	u32 profile, level;56	int ret;57 58	switch (ctrl->id) {59	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:60	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:61	case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:62	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:63		ret = venus_helper_get_profile_level(inst, &profile, &level);64		if (!ret)65			ctr->profile = profile;66		ctrl->val = ctr->profile;67		break;68	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:69	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:70	case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:71		ret = venus_helper_get_profile_level(inst, &profile, &level);72		if (!ret)73			ctr->level = level;74		ctrl->val = ctr->level;75		break;76	case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:77		ctrl->val = ctr->post_loop_deb_mode;78		break;79	case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:80		ret = venus_helper_get_bufreq(inst, HFI_BUFFER_OUTPUT, &bufreq);81		if (!ret)82			ctrl->val = hfi_bufreq_get_count_min(&bufreq, ver);83		break;84	default:85		return -EINVAL;86	}87 88	return 0;89}90 91static const struct v4l2_ctrl_ops vdec_ctrl_ops = {92	.s_ctrl = vdec_op_s_ctrl,93	.g_volatile_ctrl = vdec_op_g_volatile_ctrl,94};95 96int vdec_ctrl_init(struct venus_inst *inst)97{98	struct v4l2_ctrl *ctrl;99	int ret;100 101	ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 12);102	if (ret)103		return ret;104 105	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,106		V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,107		V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY,108		~((1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) |109		  (1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)),110		V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE);111	if (ctrl)112		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;113 114	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,115				      V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,116				      V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,117				      0, V4L2_MPEG_VIDEO_MPEG4_LEVEL_0);118	if (ctrl)119		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;120 121	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,122		V4L2_CID_MPEG_VIDEO_H264_PROFILE,123		V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH,124		~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |125		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |126		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |127		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) |128		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH) |129		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH)),130		V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE);131	if (ctrl)132		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;133 134	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,135				      V4L2_CID_MPEG_VIDEO_H264_LEVEL,136				      V4L2_MPEG_VIDEO_H264_LEVEL_5_1,137				      0, V4L2_MPEG_VIDEO_H264_LEVEL_1_0);138	if (ctrl)139		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;140 141	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,142				      V4L2_CID_MPEG_VIDEO_VP8_PROFILE,143				      V4L2_MPEG_VIDEO_VP8_PROFILE_3,144				      0, V4L2_MPEG_VIDEO_VP8_PROFILE_0);145	if (ctrl)146		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;147 148	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,149				      V4L2_CID_MPEG_VIDEO_VP9_PROFILE,150				      V4L2_MPEG_VIDEO_VP9_PROFILE_3,151				      0, V4L2_MPEG_VIDEO_VP9_PROFILE_0);152	if (ctrl)153		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;154 155	ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,156				      V4L2_CID_MPEG_VIDEO_VP9_LEVEL,157				      V4L2_MPEG_VIDEO_VP9_LEVEL_6_2,158				      0, V4L2_MPEG_VIDEO_VP9_LEVEL_1_0);159	if (ctrl)160		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;161 162	v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,163		V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER, 0, 1, 1, 0);164 165	ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,166		V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 1);167	if (ctrl)168		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;169 170	v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,171			  V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY,172			  0, 16383, 1, 0);173 174	v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,175			  V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE,176			  0, 1, 1, 0);177 178	v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,179			  V4L2_CID_MPEG_VIDEO_DEC_CONCEAL_COLOR, 0,180			  0xffffffffffffLL, 1, 0x8000800010LL);181 182	ret = inst->ctrl_handler.error;183	if (ret) {184		v4l2_ctrl_handler_free(&inst->ctrl_handler);185		return ret;186	}187 188	return 0;189}190 191void vdec_ctrl_deinit(struct venus_inst *inst)192{193	v4l2_ctrl_handler_free(&inst->ctrl_handler);194}195