diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index e9375eeca2..6ce0dca31d 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/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, diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index c226aad219..a4db8b968f 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/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); diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 82f69bb0ba..9abc4eccec 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/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, diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 1977708ab3..d4ec0e5048 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/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; diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 20f3d8ab73..028ccbfa33 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/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; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 2862f7cce6..23cdd110ef 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/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; diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index 07d2302468..3817bef95d 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/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,