From 2126abf6c35b4fbebb9d1080ed3481118ce26d85 Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Fri, 8 Jan 2021 14:37:18 -0800 Subject: [PATCH] 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 --- driver/platform/waipio/src/msm_vidc_waipio.c | 12 ++++ driver/vidc/inc/msm_vidc_internal.h | 2 + driver/vidc/src/msm_vdec.c | 64 ++++++++++-------- driver/vidc/src/msm_venc.c | 65 +++++++++++-------- driver/vidc/src/msm_vidc_control.c | 4 ++ driver/vidc/src/msm_vidc_driver.c | 6 ++ .../uapi/vidc/media/v4l2_vidc_extensions.h | 12 +++- 7 files changed, 109 insertions(+), 56 deletions(-) diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 73e3432c14..1015dd2524 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/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, 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, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 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, 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, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, 1, V4L2_MPEG_MSM_VIDC_DISABLE, diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index cc13bb0d05..346ae758d4 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -343,6 +343,7 @@ enum msm_vidc_inst_capability_type { META_DPB_MISR, META_OPB_MISR, META_INTERLACE, + META_TIMESTAMP, META_CONCEALED_MB_CNT, META_HIST_INFO, META_SEI_MASTERING_DISP, @@ -351,6 +352,7 @@ enum msm_vidc_inst_capability_type { META_EVA_STATS, META_BUF_TAG, META_SUBFRAME_OUTPUT, + META_ENC_QP_METADATA, META_ROI_INFO, INST_CAP_MAX, }; diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index bc795cd988..9d03caa797 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -37,14 +37,6 @@ u32 msm_vdec_subscribe_for_properties[] = { 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) { int rc = 0; @@ -976,11 +968,21 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst, int rc = 0; struct msm_vidc_core *core; 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) { 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; d_vpr_h("%s()\n", __func__); + capability = inst->capabilities; 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, HFI_CMD_SUBSCRIBE_MODE, port, HFI_PAYLOAD_U32_ARRAY, &payload[0], - (ARRAY_SIZE(msm_vdec_subscribe_for_metadata) + 1) * - sizeof(u32)); + (count + 1) * sizeof(u32)); return rc; } @@ -1010,11 +1017,11 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst, int rc = 0; struct msm_vidc_core *core; 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) { 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; d_vpr_h("%s()\n", __func__); + capability = inst->capabilities; 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, HFI_CMD_DELIVERY_MODE, port, HFI_PAYLOAD_U32_ARRAY, &payload[0], - (ARRAY_SIZE(msm_vdec_deliver_as_metadata) + 1) * - sizeof(u32)); + (count + 1) * sizeof(u32)); return rc; } diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index 8228d1207a..89c31877ed 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -34,23 +34,6 @@ u32 msm_venc_input_subscribe_for_properties[] = { 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[] = { HFI_PROP_PICTURE_TYPE, HFI_PROP_BUFFER_MARK, @@ -645,7 +628,16 @@ static int msm_venc_metadata_delivery(struct msm_vidc_inst *inst, int rc = 0; struct msm_vidc_core *core; 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) { 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; d_vpr_h("%s()\n", __func__); + capability = inst->capabilities; 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, HFI_CMD_DELIVERY_MODE, port, HFI_PAYLOAD_U32_ARRAY, &payload[0], - (ARRAY_SIZE(msm_venc_deliver_as_metadata) + 1) * - sizeof(u32)); + (count + 1) * sizeof(u32)); return rc; } @@ -675,7 +672,16 @@ static int msm_venc_metadata_subscription(struct msm_vidc_inst *inst, int rc = 0; struct msm_vidc_core *core; 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) { 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; d_vpr_h("%s()\n", __func__); + capability = inst->capabilities; 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, HFI_CMD_SUBSCRIBE_MODE, port, HFI_PAYLOAD_U32_ARRAY, &payload[0], - (ARRAY_SIZE(msm_venc_subscribe_for_metadata) + 1) * - sizeof(u32)); + (count + 1) * sizeof(u32)); return rc; } diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index cfd955ec4d..d4720a435b 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/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"; case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO: 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: s_vpr_e(sid, "%s: ctrl name not available for ctrl id %#x\n", __func__, control_id); diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 26f18128da..93fae80cd6 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/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; } + if (type == INPUT_META_PLANE || type == OUTPUT_META_PLANE) + return 0; + if (type == INPUT_MPLANE) { if (inst->state == MSM_VIDC_OPEN) 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; } + if (type == INPUT_META_PLANE || type == OUTPUT_META_PLANE) + return 0; + if (type == INPUT_MPLANE) { if (inst->state == MSM_VIDC_START_INPUT) { new_state = MSM_VIDC_OPEN; diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index a4e15c8bfa..31e8fde888 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/include/uapi/vidc/media/v4l2_vidc_extensions.h @@ -81,7 +81,7 @@ enum v4l2_mpeg_vidc_blur_types { (V4L2_CID_MPEG_VIDC_BASE + 0x16) #define V4L2_CID_MPEG_VIDC_METADATA_INTERLACE \ (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) #define V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO \ (V4L2_CID_MPEG_VIDC_BASE + 0x19) @@ -99,6 +99,10 @@ enum v4l2_mpeg_vidc_blur_types { (V4L2_CID_MPEG_VIDC_BASE + 0x1F) #define V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO \ (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 { METADATA_FLAGS_NONE = 0, @@ -121,11 +125,12 @@ struct msm_vidc_metapayload_header { }; enum v4l2_mpeg_vidc_metadata { METADATA_LTR_MARK_USE_DETAILS = 0x03000137, - METADATA_METADATA_SEQ_HEADER_NAL = 0x0300014a, + METADATA_SEQ_HEADER_NAL = 0x0300014a, METADATA_DPB_LUMA_CHROMA_MISR = 0x03000153, METADATA_OPB_LUMA_CHROMA_MISR = 0x03000154, METADATA_INTERLACE = 0x03000156, - METADATA_CONEALED_MB_COUNT = 0x0300015f, + METADATA_TIMESTAMP = 0x0300015c, + METADATA_CONCEALED_MB_COUNT = 0x0300015f, METADATA_HISTOGRAM_INFO = 0x03000161, METADATA_SEI_MASTERING_DISPLAY_COLOUR = 0x03000163, METADATA_SEI_CONTENT_LIGHT_LEVEL = 0x03000164, @@ -133,6 +138,7 @@ enum v4l2_mpeg_vidc_metadata { METADATA_EVA_STATS = 0x03000167, METADATA_BUFFER_TAG = 0x0300016b, METADATA_SUBFRAME_OUTPUT = 0x0300016d, + METADATA_ENC_QP_METADATA = 0x0300016e, METADATA_ROI_INFO = 0x03000173, };