Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e502daae authored by Surajit Podder's avatar Surajit Podder
Browse files

msm: vidc: Add support for TME



Expose TME functionality as an additional
codec type for encoder output.

Change-Id: I06947fb1a7d064bf93d7bcf83d103c594a7f6d99
Signed-off-by: default avatarSurajit Podder <spodder@codeaurora.org>
parent 285ff288
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -164,6 +164,9 @@ enum hal_video_codec vidc_get_hal_codec(u32 hfi_codec)
	case HFI_VIDEO_CODEC_VP9:
		hal_codec = HAL_VIDEO_CODEC_VP9;
		break;
	case HFI_VIDEO_CODEC_TME:
		hal_codec = HAL_VIDEO_CODEC_TME;
		break;
	default:
		dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
			__func__, hfi_codec);
@@ -220,6 +223,9 @@ u32 vidc_get_hfi_codec(enum hal_video_codec hal_codec)
	case HAL_VIDEO_CODEC_VP9:
		hfi_codec = HFI_VIDEO_CODEC_VP9;
		break;
	case HAL_VIDEO_CODEC_TME:
		hfi_codec = HFI_VIDEO_CODEC_TME;
		break;
	default:
		dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
			__func__, hal_codec);
+9 −0
Original line number Diff line number Diff line
@@ -969,6 +969,15 @@ static enum vidc_status hfi_parse_init_done_properties(
			num_properties--;
			break;
		}
		case HFI_PROPERTY_TME_VERSION_SUPPORTED:
		{
			capabilities->tme_version =
				*((u32 *)(data_ptr + next_offset));
			next_offset +=
				sizeof(u32);
			num_properties--;
			break;
		}
		default:
			dprintk(VIDC_DBG,
				"%s: default case - data_ptr %pK, prop_id 0x%x\n",
+81 −0
Original line number Diff line number Diff line
@@ -117,6 +117,17 @@ static const char *const hevc_tier_level[] = {
	"Level unknown",
};

static const char *const tme_profile[] = {
	"0",
	"1",
	"2",
	"3",
};

static const char *const tme_level[] = {
	"Integer",
};

static const char *const hevc_profile[] = {
	"Main",
	"Main10",
@@ -485,6 +496,46 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
		),
		.qmenu = hevc_tier_level,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE,
		.name = "TME Profile",
		.type = V4L2_CTRL_TYPE_MENU,
		.minimum = V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0,
		.maximum = V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3,
		.default_value =
			V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0,
		.menu_skip_mask = ~(
		(1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0) |
		(1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_1) |
		(1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_2) |
		(1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3)
		),
		.qmenu = tme_profile,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL,
		.name = "TME Level",
		.type = V4L2_CTRL_TYPE_MENU,
		.minimum = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
		.maximum = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
		.default_value = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
		.menu_skip_mask =  ~(
		(1 << V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER)
		),
		.qmenu = tme_level,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_TME_PAYLOAD_VERSION,
		.name = "TME Payload Version",
		.type = V4L2_CTRL_TYPE_INTEGER,
		.minimum = 0,
		.maximum = 0xFFFFFFF,
		.default_value = 0,
		.step = 1,
		.menu_skip_mask = 0,
		.flags = V4L2_CTRL_FLAG_READ_ONLY,
		.qmenu = NULL,
	},
	{
		.id = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION,
		.name = "Rotation",
@@ -1064,6 +1115,13 @@ static struct msm_vidc_format venc_formats[] = {
		.get_frame_size = get_frame_size_tp10_ubwc,
		.type = OUTPUT_PORT,
	},
	{
		.name = "TME",
		.description = "TME MBI format",
		.fourcc = V4L2_PIX_FMT_TME,
		.get_frame_size = get_frame_size_compressed,
		.type = CAPTURE_PORT,
	},
};

static int msm_venc_set_csc(struct msm_vidc_inst *inst);
@@ -1345,6 +1403,29 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
				temp_ctrl->val);
		pdata = &profile_level;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE:
		temp_ctrl =
			TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL);

		property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
		profile_level.profile = msm_comm_v4l2_to_hal(ctrl->id,
							ctrl->val);
		profile_level.level = msm_comm_v4l2_to_hal(
				V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL,
				temp_ctrl->val);
		pdata = &profile_level;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL:
		temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE);

		property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
		profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
							ctrl->val);
		profile_level.profile = msm_comm_v4l2_to_hal(
				V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE,
				temp_ctrl->val);
		pdata = &profile_level;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
	{
		property_id = HAL_PARAM_VPE_ROTATION;
+3 −0
Original line number Diff line number Diff line
@@ -1401,6 +1401,9 @@ static int try_get_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
		}
		ctrl->val = bufreq->buffer_count_min_host;
		break;
	case V4L2_CID_MPEG_VIDC_VIDEO_TME_PAYLOAD_VERSION:
		ctrl->val = inst->capability.tme_version;
		break;
	default:
		/*
		 * Other controls aren't really volatile, shouldn't need to
+29 −2
Original line number Diff line number Diff line
@@ -492,6 +492,26 @@ int msm_comm_v4l2_to_hal(int id, int value)
		default:
			goto unknown_value;
		}
	case V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE:
		switch (value) {
		case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0:
			return HAL_TME_PROFILE_0;
		case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_1:
			return HAL_TME_PROFILE_1;
		case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_2:
			return HAL_TME_PROFILE_2;
		case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3:
			return HAL_TME_PROFILE_3;
		default:
			goto unknown_value;
		}
	case V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL:
		switch (value) {
		case V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER:
			return HAL_TME_LEVEL_INTEGER;
		default:
			goto unknown_value;
		}
	case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
		switch (value) {
		case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE:
@@ -795,7 +815,6 @@ enum hal_video_codec get_hal_codec(int fourcc)
	case V4L2_PIX_FMT_H264_MVC:
		codec = HAL_VIDEO_CODEC_MVC;
		break;

	case V4L2_PIX_FMT_MPEG1:
		codec = HAL_VIDEO_CODEC_MPEG1;
		break;
@@ -811,6 +830,9 @@ enum hal_video_codec get_hal_codec(int fourcc)
	case V4L2_PIX_FMT_HEVC:
		codec = HAL_VIDEO_CODEC_HEVC;
		break;
	case V4L2_PIX_FMT_TME:
		codec = HAL_VIDEO_CODEC_TME;
		break;
	default:
		dprintk(VIDC_ERR, "Wrong codec: %d\n", fourcc);
		codec = HAL_UNUSED_CODEC;
@@ -1260,6 +1282,9 @@ static int msm_vidc_comm_update_ctrl(struct msm_vidc_inst *inst,
static void msm_vidc_comm_update_ctrl_limits(struct msm_vidc_inst *inst)
{
	if (inst->session_type == MSM_VIDC_ENCODER) {
		if (get_hal_codec(inst->fmts[CAPTURE_PORT].fourcc) ==
			HAL_VIDEO_CODEC_TME)
			return;
		msm_vidc_comm_update_ctrl(inst,
				V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE,
				&inst->capability.hier_p_hybrid);
@@ -5520,7 +5545,9 @@ int msm_vidc_comm_s_parm(struct msm_vidc_inst *inst, struct v4l2_streamparm *a)
	dprintk(VIDC_PROF, "reported fps changed for %pK: %d->%d\n",
			inst, inst->prop.fps, fps);
	inst->prop.fps = fps;
	if (inst->session_type == MSM_VIDC_ENCODER) {
	if (inst->session_type == MSM_VIDC_ENCODER &&
		get_hal_codec(inst->fmts[CAPTURE_PORT].fourcc) !=
			HAL_VIDEO_CODEC_TME) {
		frame_rate.frame_rate = inst->prop.fps * BIT(16);
		frame_rate.buffer_type = HAL_BUFFER_OUTPUT;
		pdata = &frame_rate;
Loading