Pārlūkot izejas kodu

Merge "video: driver: Add support to deliver HFI_PROP_BUFFER_TAG via FTB"

qctecmdr 4 gadi atpakaļ
vecāks
revīzija
ced61b7249

+ 6 - 0
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -1241,6 +1241,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST,
 		HFI_PROP_DPB_TAG_LIST},
 
+	{META_OUTPUT_BUF_TAG, DEC, CODECS_ALL,
+		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		0,
+		HFI_PROP_BUFFER_TAG},
+
 	{META_SUBFRAME_OUTPUT, DEC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,

+ 2 - 0
driver/vidc/inc/msm_vidc_driver.h

@@ -106,6 +106,7 @@ static inline bool is_output_meta_enabled(struct msm_vidc_inst *inst)
 			inst->capabilities->cap[META_SEI_MASTERING_DISP].value ||
 			inst->capabilities->cap[META_SEI_CLL].value ||
 			inst->capabilities->cap[META_BUF_TAG].value ||
+			inst->capabilities->cap[META_DPB_TAG_LIST].value ||
 			inst->capabilities->cap[META_SUBFRAME_OUTPUT].value);
 	} else if (is_encode_session(inst)) {
 		enabled = inst->capabilities->cap[META_BUF_TAG].value ?
@@ -318,6 +319,7 @@ struct msm_vidc_inst *get_inst(struct msm_vidc_core *core,
 void put_inst(struct msm_vidc_inst *inst);
 bool msm_vidc_allow_s_fmt(struct msm_vidc_inst *inst, u32 type);
 bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id);
+bool msm_vidc_allow_metadata(struct msm_vidc_inst *inst, u32 cap_id);
 bool msm_vidc_allow_reqbufs(struct msm_vidc_inst *inst, u32 type);
 enum msm_vidc_allow msm_vidc_allow_stop(struct msm_vidc_inst *inst);
 bool msm_vidc_allow_start(struct msm_vidc_inst *inst);

+ 1 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -430,6 +430,7 @@ enum msm_vidc_inst_capability_type {
 	META_EVA_STATS,
 	META_BUF_TAG,
 	META_DPB_TAG_LIST,
+	META_OUTPUT_BUF_TAG,
 	META_SUBFRAME_OUTPUT,
 	META_ENC_QP_METADATA,
 	META_ROI_INFO,

+ 33 - 10
driver/vidc/src/msm_vdec.c

@@ -1072,7 +1072,7 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 		META_SUBFRAME_OUTPUT,
 	};
 
-	if (!inst || !inst->core) {
+	if (!inst || !inst->core || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 	}
@@ -1082,7 +1082,8 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
 	for (i = 0; i < ARRAY_SIZE(metadata_list); i++) {
-		if (capability->cap[metadata_list[i]].value) {
+		if (capability->cap[metadata_list[i]].value &&
+			msm_vidc_allow_metadata(inst, metadata_list[i])) {
 			payload[count + 1] =
 				capability->cap[metadata_list[i]].hfi_id;
 			count++;
@@ -1110,11 +1111,14 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 	u32 payload[32] = {0};
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
-	static const u32 metadata_list[] = {
+	static const u32 metadata_input_list[] = {
 		META_BUF_TAG,
 	};
+	static const u32 metadata_output_list[] = {
+		META_OUTPUT_BUF_TAG,
+	};
 
-	if (!inst || !inst->core) {
+	if (!inst || !inst->core || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 	}
@@ -1123,13 +1127,28 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 
 	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(metadata_list); i++) {
-		if (capability->cap[metadata_list[i]].value) {
-			payload[count + 1] =
-				capability->cap[metadata_list[i]].hfi_id;
-			count++;
+
+	if (port == INPUT_PORT) {
+		for (i = 0; i < ARRAY_SIZE(metadata_input_list); i++) {
+			if (capability->cap[metadata_input_list[i]].value) {
+				payload[count + 1] =
+					capability->cap[metadata_input_list[i]].hfi_id;
+				count++;
+			}
 		}
-	};
+	} else if (port == OUTPUT_PORT) {
+		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
+			if (capability->cap[metadata_output_list[i]].value  &&
+				msm_vidc_allow_metadata(inst, metadata_output_list[i])) {
+				payload[count + 1] =
+					capability->cap[metadata_output_list[i]].hfi_id;
+				count++;
+			}
+		}
+	} else {
+		i_vpr_e(inst, "%s: invalid port: %d\n", __func__, port);
+		return -EINVAL;
+	}
 
 	if (!count)
 		return 0;
@@ -1686,6 +1705,10 @@ int msm_vdec_streamon_output(struct msm_vidc_inst *inst)
 	if (rc)
 		goto error;
 
+	rc = msm_vdec_set_delivery_mode_metadata(inst, OUTPUT_PORT);
+	if (rc)
+		return rc;
+
 	rc = msm_vdec_get_output_internal_buffers(inst);
 	if (rc)
 		goto error;

+ 13 - 0
driver/vidc/src/msm_vidc_control.c

@@ -58,6 +58,7 @@ static bool is_meta_ctrl(u32 id)
 		id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG ||
+		id == V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
 		id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP ||
@@ -663,6 +664,18 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
 		}
 
 		if (is_meta_ctrl(ctrl->id)) {
+			if (cap_id == META_DPB_TAG_LIST) {
+				/*
+				* To subscribe HFI_PROP_DPB_TAG_LIST
+				* data in FBD, HFI_PROP_BUFFER_TAG data
+				* must be delivered via FTB. Hence, update
+				* META_OUTPUT_BUF_TAG when META_DPB_TAG_LIST
+				* is updated.
+				*/
+				msm_vidc_update_cap_value(inst, META_OUTPUT_BUF_TAG,
+					ctrl->val, __func__);
+			}
+
 			rc = msm_vidc_update_meta_port_settings(inst);
 			if (rc)
 				return rc;

+ 28 - 0
driver/vidc/src/msm_vidc_driver.c

@@ -179,6 +179,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{META_EVA_STATS,                 "META_EVA_STATS"             },
 	{META_BUF_TAG,                   "META_BUF_TAG"               },
 	{META_DPB_TAG_LIST,              "META_DPB_TAG_LIST"          },
+	{META_OUTPUT_BUF_TAG,            "META_OUTPUT_BUF_TAG"        },
 	{META_SUBFRAME_OUTPUT,           "META_SUBFRAME_OUTPUT"       },
 	{META_ENC_QP_METADATA,           "META_ENC_QP_METADATA"       },
 	{META_ROI_INFO,                  "META_ROI_INFO"              },
@@ -1114,6 +1115,33 @@ exit:
 	return allow;
 }
 
+bool msm_vidc_allow_metadata(struct msm_vidc_inst *inst, u32 cap_id)
+{
+	bool is_allowed = true;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return false;
+	}
+
+	switch (cap_id) {
+	case META_OUTPUT_BUF_TAG:
+	case META_DPB_TAG_LIST:
+		if (!is_ubwc_colorformat(inst->capabilities->cap[PIX_FMTS].value)) {
+			i_vpr_h(inst,
+				"%s: cap: %24s not allowed for split mode\n",
+				__func__, cap_name(cap_id));
+			is_allowed = false;
+		}
+		break;
+	default:
+		is_allowed = true;
+		break;
+	}
+
+	return is_allowed;
+}
+
 bool msm_vidc_allow_reqbufs(struct msm_vidc_inst *inst, u32 type)
 {
 	bool allow = false;

+ 1 - 0
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -171,6 +171,7 @@ enum v4l2_mpeg_vidc_metadata {
 	METADATA_SUBFRAME_OUTPUT              = 0x0300016d,
 	METADATA_ENC_QP_METADATA              = 0x0300016e,
 	METADATA_ROI_INFO                     = 0x03000173,
+	METADATA_DPB_TAG_LIST                 = 0x03000179,
 };
 enum meta_interlace_info {
 	META_INTERLACE_INFO_NONE                            = 0x00000000,