Browse Source

video: driver: Update metadata delivery and subscription

Enable delivery and subscriptions of various metadata based
on client settings. Also, skip instance state changes during
metadata port streamon/streamoff.

Change-Id: I063b562818c661bf1932c3362ecb709d7fe6bc20
Signed-off-by: Mihir Ganu <[email protected]>
Mihir Ganu 4 years ago
parent
commit
2126abf6c3

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

@@ -967,6 +967,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_CID_MPEG_VIDC_METADATA_INTERLACE,
 		V4L2_CID_MPEG_VIDC_METADATA_INTERLACE,
 		HFI_PROP_INTERLACE_INFO},
 		HFI_PROP_INTERLACE_INFO},
 
 
+	{META_TIMESTAMP, DEC | ENC, CODECS_ALL,
+		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP,
+		HFI_PROP_TIMESTAMP},
+
 	{META_CONCEALED_MB_CNT, DEC, CODECS_ALL,
 	{META_CONCEALED_MB_CNT, DEC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -1015,6 +1021,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
 		HFI_PROP_SUBFRAME_OUTPUT},
 		HFI_PROP_SUBFRAME_OUTPUT},
 
 
+	{META_ENC_QP_METADATA, ENC, CODECS_ALL,
+		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
+		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA,
+		HFI_PROP_ENC_QP_METADATA},
+
 	{META_ROI_INFO, ENC, CODECS_ALL,
 	{META_ROI_INFO, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,

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

@@ -343,6 +343,7 @@ enum msm_vidc_inst_capability_type {
 	META_DPB_MISR,
 	META_DPB_MISR,
 	META_OPB_MISR,
 	META_OPB_MISR,
 	META_INTERLACE,
 	META_INTERLACE,
+	META_TIMESTAMP,
 	META_CONCEALED_MB_CNT,
 	META_CONCEALED_MB_CNT,
 	META_HIST_INFO,
 	META_HIST_INFO,
 	META_SEI_MASTERING_DISP,
 	META_SEI_MASTERING_DISP,
@@ -351,6 +352,7 @@ enum msm_vidc_inst_capability_type {
 	META_EVA_STATS,
 	META_EVA_STATS,
 	META_BUF_TAG,
 	META_BUF_TAG,
 	META_SUBFRAME_OUTPUT,
 	META_SUBFRAME_OUTPUT,
+	META_ENC_QP_METADATA,
 	META_ROI_INFO,
 	META_ROI_INFO,
 	INST_CAP_MAX,
 	INST_CAP_MAX,
 };
 };

+ 38 - 26
driver/vidc/src/msm_vdec.c

@@ -37,14 +37,6 @@ u32 msm_vdec_subscribe_for_properties[] = {
 	HFI_PROP_NO_OUTPUT,
 	HFI_PROP_NO_OUTPUT,
 };
 };
 
 
-u32 msm_vdec_subscribe_for_metadata[] = {
-	HFI_PROP_BUFFER_TAG,
-};
-
-u32 msm_vdec_deliver_as_metadata[] = {
-	HFI_PROP_BUFFER_TAG,
-};
-
 static int msm_vdec_codec_change(struct msm_vidc_inst *inst, u32 v4l2_codec)
 static int msm_vdec_codec_change(struct msm_vidc_inst *inst, u32 v4l2_codec)
 {
 {
 	int rc = 0;
 	int rc = 0;
@@ -976,11 +968,21 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	int rc = 0;
 	int rc = 0;
 	struct msm_vidc_core *core;
 	struct msm_vidc_core *core;
 	u32 payload[32] = {0};
 	u32 payload[32] = {0};
-	u32 i;
-
-	//todo: (DP)
-	d_vpr_h("%s(): skip subscribe metadata\n", __func__);
-	return 0;
+	u32 i, count = 0;
+	struct msm_vidc_inst_capability *capability;
+	u32 metadata_list[] = {
+		META_DPB_MISR,
+		META_OPB_MISR,
+		META_INTERLACE,
+		META_TIMESTAMP,
+		META_CONCEALED_MB_CNT,
+		META_HIST_INFO,
+		META_SEI_MASTERING_DISP,
+		META_SEI_CLL,
+		META_HDR10PLUS,
+		META_BUF_TAG,
+		META_SUBFRAME_OUTPUT,
+	};
 
 
 	if (!inst || !inst->core) {
 	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -989,17 +991,22 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	core = inst->core;
 	core = inst->core;
 	d_vpr_h("%s()\n", __func__);
 	d_vpr_h("%s()\n", __func__);
 
 
+	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(msm_vdec_subscribe_for_metadata); i++)
-		payload[i + 1] = msm_vdec_subscribe_for_metadata[i];
+	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++;
+		}
+	};
 
 
 	rc = venus_hfi_session_command(inst,
 	rc = venus_hfi_session_command(inst,
 			HFI_CMD_SUBSCRIBE_MODE,
 			HFI_CMD_SUBSCRIBE_MODE,
 			port,
 			port,
 			HFI_PAYLOAD_U32_ARRAY,
 			HFI_PAYLOAD_U32_ARRAY,
 			&payload[0],
 			&payload[0],
-			(ARRAY_SIZE(msm_vdec_subscribe_for_metadata) + 1) *
-			sizeof(u32));
+			(count + 1) * sizeof(u32));
 
 
 	return rc;
 	return rc;
 }
 }
@@ -1010,11 +1017,11 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 	int rc = 0;
 	int rc = 0;
 	struct msm_vidc_core *core;
 	struct msm_vidc_core *core;
 	u32 payload[32] = {0};
 	u32 payload[32] = {0};
-	u32 i;
-
-	//todo: (DP)
-	d_vpr_h("%s(): skip delivery mode metadata\n", __func__);
-	return 0;
+	u32 i, count = 0;
+	struct msm_vidc_inst_capability *capability;
+	u32 metadata_list[] = {
+		META_BUF_TAG,
+	};
 
 
 	if (!inst || !inst->core) {
 	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -1023,17 +1030,22 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 	core = inst->core;
 	core = inst->core;
 	d_vpr_h("%s()\n", __func__);
 	d_vpr_h("%s()\n", __func__);
 
 
+	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(msm_vdec_deliver_as_metadata); i++)
-		payload[i + 1] = msm_vdec_deliver_as_metadata[i];
+	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++;
+		}
+	};
 
 
 	rc = venus_hfi_session_command(inst,
 	rc = venus_hfi_session_command(inst,
 			HFI_CMD_DELIVERY_MODE,
 			HFI_CMD_DELIVERY_MODE,
 			port,
 			port,
 			HFI_PAYLOAD_U32_ARRAY,
 			HFI_PAYLOAD_U32_ARRAY,
 			&payload[0],
 			&payload[0],
-			(ARRAY_SIZE(msm_vdec_deliver_as_metadata) + 1) *
-			sizeof(u32));
+			(count + 1) * sizeof(u32));
 
 
 	return rc;
 	return rc;
 }
 }

+ 38 - 27
driver/vidc/src/msm_venc.c

@@ -34,23 +34,6 @@ u32 msm_venc_input_subscribe_for_properties[] = {
 	HFI_PROP_NO_OUTPUT,
 	HFI_PROP_NO_OUTPUT,
 };
 };
 
 
-u32 msm_venc_deliver_as_metadata[] = {
-	HFI_PROP_BUFFER_TAG,
-	HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR,
-	HFI_PROP_SEI_CONTENT_LIGHT_LEVEL,
-	HFI_PROP_SEI_HDR10PLUS_USERDATA,
-	HFI_PROP_EVA_STAT_INFO,
-};
-
-u32 msm_venc_subscribe_for_metadata[] = {
-	HFI_PROP_BUFFER_TAG,
-	HFI_PROP_METADATA_SEQ_HEADER_NAL,
-	HFI_PROP_TIMESTAMP,
-	HFI_PROP_LTR_MARK_USE_DETAILS,
-	HFI_PROP_SUBFRAME_OUTPUT,
-	HFI_PROP_ENC_QP_METADATA,
-};
-
 u32 msm_venc_output_subscribe_for_properties[] = {
 u32 msm_venc_output_subscribe_for_properties[] = {
 	HFI_PROP_PICTURE_TYPE,
 	HFI_PROP_PICTURE_TYPE,
 	HFI_PROP_BUFFER_MARK,
 	HFI_PROP_BUFFER_MARK,
@@ -645,7 +628,16 @@ static int msm_venc_metadata_delivery(struct msm_vidc_inst *inst,
 	int rc = 0;
 	int rc = 0;
 	struct msm_vidc_core *core;
 	struct msm_vidc_core *core;
 	u32 payload[32] = {0};
 	u32 payload[32] = {0};
-	u32 i;
+	u32 i, count = 0;
+	struct msm_vidc_inst_capability *capability;
+	u32 metadata_list[] = {
+		META_SEI_MASTERING_DISP,
+		META_SEI_CLL,
+		META_HDR10PLUS,
+		META_EVA_STATS,
+		META_BUF_TAG,
+		META_ROI_INFO,
+	};
 
 
 	if (!inst || !inst->core) {
 	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -654,17 +646,22 @@ static int msm_venc_metadata_delivery(struct msm_vidc_inst *inst,
 	core = inst->core;
 	core = inst->core;
 	d_vpr_h("%s()\n", __func__);
 	d_vpr_h("%s()\n", __func__);
 
 
+	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(msm_venc_deliver_as_metadata); i++)
-		payload[i + 1] = msm_venc_deliver_as_metadata[i];
+	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++;
+		}
+	};
 
 
 	rc = venus_hfi_session_command(inst,
 	rc = venus_hfi_session_command(inst,
 			HFI_CMD_DELIVERY_MODE,
 			HFI_CMD_DELIVERY_MODE,
 			port,
 			port,
 			HFI_PAYLOAD_U32_ARRAY,
 			HFI_PAYLOAD_U32_ARRAY,
 			&payload[0],
 			&payload[0],
-			(ARRAY_SIZE(msm_venc_deliver_as_metadata) + 1) *
-			sizeof(u32));
+			(count + 1) * sizeof(u32));
 
 
 	return rc;
 	return rc;
 }
 }
@@ -675,7 +672,16 @@ static int msm_venc_metadata_subscription(struct msm_vidc_inst *inst,
 	int rc = 0;
 	int rc = 0;
 	struct msm_vidc_core *core;
 	struct msm_vidc_core *core;
 	u32 payload[32] = {0};
 	u32 payload[32] = {0};
-	u32 i;
+	u32 i, count = 0;
+	struct msm_vidc_inst_capability *capability;
+	u32 metadata_list[] = {
+		META_LTR_MARK_USE,
+		META_SEQ_HDR_NAL,
+		META_TIMESTAMP,
+		META_BUF_TAG,
+		META_SUBFRAME_OUTPUT,
+		META_ENC_QP_METADATA,
+	};
 
 
 	if (!inst || !inst->core) {
 	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -684,17 +690,22 @@ static int msm_venc_metadata_subscription(struct msm_vidc_inst *inst,
 	core = inst->core;
 	core = inst->core;
 	d_vpr_h("%s()\n", __func__);
 	d_vpr_h("%s()\n", __func__);
 
 
+	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(msm_venc_subscribe_for_metadata); i++)
-		payload[i + 1] = msm_venc_subscribe_for_metadata[i];
+	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++;
+		}
+	};
 
 
 	rc = venus_hfi_session_command(inst,
 	rc = venus_hfi_session_command(inst,
 			HFI_CMD_SUBSCRIBE_MODE,
 			HFI_CMD_SUBSCRIBE_MODE,
 			port,
 			port,
 			HFI_PAYLOAD_U32_ARRAY,
 			HFI_PAYLOAD_U32_ARRAY,
 			&payload[0],
 			&payload[0],
-			(ARRAY_SIZE(msm_venc_subscribe_for_metadata) + 1) *
-			sizeof(u32));
+			(count + 1) * sizeof(u32));
 
 
 	return rc;
 	return rc;
 }
 }

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

@@ -165,6 +165,10 @@ static const char *msm_vidc_get_priv_ctrl_name(u32 sid, u32 control_id)
 		return "Subframe Output Metadata";
 		return "Subframe Output Metadata";
 	case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO:
 	case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO:
 		return "ROI Info Metadata";
 		return "ROI Info Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP:
+		return "Timestamp Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA:
+		return "Encoder QP Metadata";
 	default:
 	default:
 		s_vpr_e(sid, "%s: ctrl name not available for ctrl id %#x\n",
 		s_vpr_e(sid, "%s: ctrl name not available for ctrl id %#x\n",
 			__func__, control_id);
 			__func__, control_id);

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

@@ -751,6 +751,9 @@ int msm_vidc_state_change_streamon(struct msm_vidc_inst *inst, u32 type)
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 
 
+	if (type == INPUT_META_PLANE || type == OUTPUT_META_PLANE)
+		return 0;
+
 	if (type == INPUT_MPLANE) {
 	if (type == INPUT_MPLANE) {
 		if (inst->state == MSM_VIDC_OPEN)
 		if (inst->state == MSM_VIDC_OPEN)
 			new_state = MSM_VIDC_START_INPUT;
 			new_state = MSM_VIDC_START_INPUT;
@@ -806,6 +809,9 @@ int msm_vidc_state_change_streamoff(struct msm_vidc_inst *inst, u32 type)
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 
 
+	if (type == INPUT_META_PLANE || type == OUTPUT_META_PLANE)
+		return 0;
+
 	if (type == INPUT_MPLANE) {
 	if (type == INPUT_MPLANE) {
 		if (inst->state == MSM_VIDC_START_INPUT) {
 		if (inst->state == MSM_VIDC_START_INPUT) {
 			new_state = MSM_VIDC_OPEN;
 			new_state = MSM_VIDC_OPEN;

+ 9 - 3
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -81,7 +81,7 @@ enum v4l2_mpeg_vidc_blur_types {
 	(V4L2_CID_MPEG_VIDC_BASE + 0x16)
 	(V4L2_CID_MPEG_VIDC_BASE + 0x16)
 #define V4L2_CID_MPEG_VIDC_METADATA_INTERLACE                                 \
 #define V4L2_CID_MPEG_VIDC_METADATA_INTERLACE                                 \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x17)
 	(V4L2_CID_MPEG_VIDC_BASE + 0x17)
-#define V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT                         \
+#define V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT                        \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x18)
 	(V4L2_CID_MPEG_VIDC_BASE + 0x18)
 #define V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO                            \
 #define V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO                            \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x19)
 	(V4L2_CID_MPEG_VIDC_BASE + 0x19)
@@ -99,6 +99,10 @@ enum v4l2_mpeg_vidc_blur_types {
 	(V4L2_CID_MPEG_VIDC_BASE + 0x1F)
 	(V4L2_CID_MPEG_VIDC_BASE + 0x1F)
 #define V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO                                  \
 #define V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO                                  \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x20)
 	(V4L2_CID_MPEG_VIDC_BASE + 0x20)
+#define V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP                                 \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x21)
+#define V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA                           \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x22)
 
 
 enum v4l2_mpeg_vidc_metapayload_header_flags {
 enum v4l2_mpeg_vidc_metapayload_header_flags {
 	METADATA_FLAGS_NONE             = 0,
 	METADATA_FLAGS_NONE             = 0,
@@ -121,11 +125,12 @@ struct msm_vidc_metapayload_header {
 };
 };
 enum v4l2_mpeg_vidc_metadata {
 enum v4l2_mpeg_vidc_metadata {
 	METADATA_LTR_MARK_USE_DETAILS         = 0x03000137,
 	METADATA_LTR_MARK_USE_DETAILS         = 0x03000137,
-	METADATA_METADATA_SEQ_HEADER_NAL      = 0x0300014a,
+	METADATA_SEQ_HEADER_NAL               = 0x0300014a,
 	METADATA_DPB_LUMA_CHROMA_MISR         = 0x03000153,
 	METADATA_DPB_LUMA_CHROMA_MISR         = 0x03000153,
 	METADATA_OPB_LUMA_CHROMA_MISR         = 0x03000154,
 	METADATA_OPB_LUMA_CHROMA_MISR         = 0x03000154,
 	METADATA_INTERLACE                    = 0x03000156,
 	METADATA_INTERLACE                    = 0x03000156,
-	METADATA_CONEALED_MB_COUNT            = 0x0300015f,
+	METADATA_TIMESTAMP                    = 0x0300015c,
+	METADATA_CONCEALED_MB_COUNT           = 0x0300015f,
 	METADATA_HISTOGRAM_INFO               = 0x03000161,
 	METADATA_HISTOGRAM_INFO               = 0x03000161,
 	METADATA_SEI_MASTERING_DISPLAY_COLOUR = 0x03000163,
 	METADATA_SEI_MASTERING_DISPLAY_COLOUR = 0x03000163,
 	METADATA_SEI_CONTENT_LIGHT_LEVEL      = 0x03000164,
 	METADATA_SEI_CONTENT_LIGHT_LEVEL      = 0x03000164,
@@ -133,6 +138,7 @@ enum v4l2_mpeg_vidc_metadata {
 	METADATA_EVA_STATS                    = 0x03000167,
 	METADATA_EVA_STATS                    = 0x03000167,
 	METADATA_BUFFER_TAG                   = 0x0300016b,
 	METADATA_BUFFER_TAG                   = 0x0300016b,
 	METADATA_SUBFRAME_OUTPUT              = 0x0300016d,
 	METADATA_SUBFRAME_OUTPUT              = 0x0300016d,
+	METADATA_ENC_QP_METADATA              = 0x0300016e,
 	METADATA_ROI_INFO                     = 0x03000173,
 	METADATA_ROI_INFO                     = 0x03000173,
 };
 };