Commit f44ef2d4 authored by Dikshita Agarwal's avatar Dikshita Agarwal Committed by Hans Verkuil
Browse files

media: iris: Add platform capabilities for HEVC and VP9 decoders



Add platform capabilities for HEVC and VP9 codecs in decoder driver
with related hooks.

Reviewed-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
Acked-by: default avatarVikash Garodia <quic_vgarodia@quicinc.com>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-HDK
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-QRD
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8650-HDK
Signed-off-by: default avatarDikshita Agarwal <quic_dikshita@quicinc.com>
Tested-by: Vikash Garodia <quic_vgarodia@quicinc.com> # on sa8775p-ride
Signed-off-by: default avatarBryan O'Donoghue <bod@kernel.org>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
parent fde6161d
Loading
Loading
Loading
Loading
+24 −4
Original line number Diff line number Diff line
@@ -18,9 +18,19 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
{
	switch (id) {
	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
		return PROFILE;
		return PROFILE_H264;
	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
		return PROFILE_HEVC;
	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
		return PROFILE_VP9;
	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
		return LEVEL;
		return LEVEL_H264;
	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
		return LEVEL_HEVC;
	case V4L2_CID_MPEG_VIDEO_VP9_LEVEL:
		return LEVEL_VP9;
	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
		return TIER;
	default:
		return INST_FW_CAP_MAX;
	}
@@ -32,10 +42,20 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
		return 0;

	switch (cap_id) {
	case PROFILE:
	case PROFILE_H264:
		return V4L2_CID_MPEG_VIDEO_H264_PROFILE;
	case LEVEL:
	case PROFILE_HEVC:
		return V4L2_CID_MPEG_VIDEO_HEVC_PROFILE;
	case PROFILE_VP9:
		return V4L2_CID_MPEG_VIDEO_VP9_PROFILE;
	case LEVEL_H264:
		return V4L2_CID_MPEG_VIDEO_H264_LEVEL;
	case LEVEL_HEVC:
		return V4L2_CID_MPEG_VIDEO_HEVC_LEVEL;
	case LEVEL_VP9:
		return V4L2_CID_MPEG_VIDEO_VP9_LEVEL;
	case TIER:
		return V4L2_CID_MPEG_VIDEO_HEVC_TIER;
	default:
		return 0;
	}
+26 −2
Original line number Diff line number Diff line
@@ -295,7 +295,19 @@ static int iris_hfi_gen2_set_profile(struct iris_inst *inst)
{
	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
	u32 profile = inst->fw_caps[PROFILE].value;
	u32 profile = 0;

	switch (inst->codec) {
	case V4L2_PIX_FMT_HEVC:
		profile = inst->fw_caps[PROFILE_HEVC].value;
		break;
	case V4L2_PIX_FMT_VP9:
		profile = inst->fw_caps[PROFILE_VP9].value;
		break;
	case V4L2_PIX_FMT_H264:
		profile = inst->fw_caps[PROFILE_H264].value;
		break;
	}

	inst_hfi_gen2->src_subcr_params.profile = profile;

@@ -312,7 +324,19 @@ static int iris_hfi_gen2_set_level(struct iris_inst *inst)
{
	struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst);
	u32 port = iris_hfi_gen2_get_port(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
	u32 level = inst->fw_caps[LEVEL].value;
	u32 level = 0;

	switch (inst->codec) {
	case V4L2_PIX_FMT_HEVC:
		level = inst->fw_caps[LEVEL_HEVC].value;
		break;
	case V4L2_PIX_FMT_VP9:
		level = inst->fw_caps[LEVEL_VP9].value;
		break;
	case V4L2_PIX_FMT_H264:
		level = inst->fw_caps[LEVEL_H264].value;
		break;
	}

	inst_hfi_gen2->src_subcr_params.level = level;

+1 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@
#define HFI_PROP_CROP_OFFSETS			0x03000105
#define HFI_PROP_PROFILE			0x03000107
#define HFI_PROP_LEVEL				0x03000108
#define HFI_PROP_TIER				0x03000109
#define HFI_PROP_STAGE				0x0300010a
#define HFI_PROP_PIPE				0x0300010b
#define HFI_PROP_LUMA_CHROMA_BIT_DEPTH		0x0300010f
+30 −4
Original line number Diff line number Diff line
@@ -571,8 +571,21 @@ static void iris_hfi_gen2_read_input_subcr_params(struct iris_inst *inst)
	inst->crop.width = pixmp_ip->width -
		((subsc_params.crop_offsets[1] >> 16) & 0xFFFF) - inst->crop.left;

	inst->fw_caps[PROFILE].value = subsc_params.profile;
	inst->fw_caps[LEVEL].value = subsc_params.level;
	switch (inst->codec) {
	case V4L2_PIX_FMT_HEVC:
		inst->fw_caps[PROFILE_HEVC].value = subsc_params.profile;
		inst->fw_caps[LEVEL_HEVC].value = subsc_params.level;
		break;
	case V4L2_PIX_FMT_VP9:
		inst->fw_caps[PROFILE_VP9].value = subsc_params.profile;
		inst->fw_caps[LEVEL_VP9].value = subsc_params.level;
		break;
	case V4L2_PIX_FMT_H264:
		inst->fw_caps[PROFILE_H264].value = subsc_params.profile;
		inst->fw_caps[LEVEL_H264].value = subsc_params.level;
		break;
	}

	inst->fw_caps[POC].value = subsc_params.pic_order_cnt;

	if (subsc_params.bit_depth != BIT_DEPTH_8 ||
@@ -796,8 +809,21 @@ static void iris_hfi_gen2_init_src_change_param(struct iris_inst *inst)
					     full_range, video_format,
					     video_signal_type_present_flag);

	subsc_params->profile = inst->fw_caps[PROFILE].value;
	subsc_params->level = inst->fw_caps[LEVEL].value;
	switch (inst->codec) {
	case V4L2_PIX_FMT_HEVC:
		subsc_params->profile = inst->fw_caps[PROFILE_HEVC].value;
		subsc_params->level = inst->fw_caps[LEVEL_HEVC].value;
		break;
	case V4L2_PIX_FMT_VP9:
		subsc_params->profile = inst->fw_caps[PROFILE_VP9].value;
		subsc_params->level = inst->fw_caps[LEVEL_VP9].value;
		break;
	case V4L2_PIX_FMT_H264:
		subsc_params->profile = inst->fw_caps[PROFILE_H264].value;
		subsc_params->level = inst->fw_caps[LEVEL_H264].value;
		break;
	}

	subsc_params->pic_order_cnt = inst->fw_caps[POC].value;
	subsc_params->bit_depth = inst->fw_caps[BIT_DEPTH].value;
	if (inst->fw_caps[CODED_FRAMES].value ==
+6 −2
Original line number Diff line number Diff line
@@ -81,8 +81,12 @@ struct platform_inst_caps {
};

enum platform_inst_fw_cap_type {
	PROFILE = 1,
	LEVEL,
	PROFILE_H264 = 1,
	PROFILE_HEVC,
	PROFILE_VP9,
	LEVEL_H264,
	LEVEL_HEVC,
	LEVEL_VP9,
	INPUT_BUF_HOST_MAX_COUNT,
	STAGE,
	PIPE,
Loading