video: driver: Add support to deliver HFI_PROP_BUFFER_TAG via FTB

Add support to deliver HFI_PROP_BUFFER_TAG via FTB metadata buffer
to receive HFI_PROP_DPB_TAG_LIST from fw via FBD metadata buffer.

Change-Id: Id9eeee26135379975f55923505d9c91905fa0b9e
Signed-off-by: Akshata Sahukar <asahukar@codeaurora.org>
This commit is contained in:
Akshata Sahukar
2021-03-31 14:39:51 -07:00
parent bc24301695
commit 89e7e48231
7 changed files with 84 additions and 10 deletions

View File

@@ -1241,6 +1241,12 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST, V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST,
HFI_PROP_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, {META_SUBFRAME_OUTPUT, 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,

View File

@@ -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_MASTERING_DISP].value ||
inst->capabilities->cap[META_SEI_CLL].value || inst->capabilities->cap[META_SEI_CLL].value ||
inst->capabilities->cap[META_BUF_TAG].value || inst->capabilities->cap[META_BUF_TAG].value ||
inst->capabilities->cap[META_DPB_TAG_LIST].value ||
inst->capabilities->cap[META_SUBFRAME_OUTPUT].value); inst->capabilities->cap[META_SUBFRAME_OUTPUT].value);
} else if (is_encode_session(inst)) { } else if (is_encode_session(inst)) {
enabled = inst->capabilities->cap[META_BUF_TAG].value ? 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); 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_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_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); 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); enum msm_vidc_allow msm_vidc_allow_stop(struct msm_vidc_inst *inst);
bool msm_vidc_allow_start(struct msm_vidc_inst *inst); bool msm_vidc_allow_start(struct msm_vidc_inst *inst);

View File

@@ -430,6 +430,7 @@ enum msm_vidc_inst_capability_type {
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_SUBFRAME_OUTPUT, META_SUBFRAME_OUTPUT,
META_ENC_QP_METADATA, META_ENC_QP_METADATA,
META_ROI_INFO, META_ROI_INFO,

View File

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

View File

@@ -58,6 +58,7 @@ static bool is_meta_ctrl(u32 id)
id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS || id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS ||
id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS || id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS ||
id == V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG || 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_SUBFRAME_OUTPUT ||
id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO || id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP || 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 (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); rc = msm_vidc_update_meta_port_settings(inst);
if (rc) if (rc)
return rc; return rc;

View File

@@ -179,6 +179,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
{META_EVA_STATS, "META_EVA_STATS" }, {META_EVA_STATS, "META_EVA_STATS" },
{META_BUF_TAG, "META_BUF_TAG" }, {META_BUF_TAG, "META_BUF_TAG" },
{META_DPB_TAG_LIST, "META_DPB_TAG_LIST" }, {META_DPB_TAG_LIST, "META_DPB_TAG_LIST" },
{META_OUTPUT_BUF_TAG, "META_OUTPUT_BUF_TAG" },
{META_SUBFRAME_OUTPUT, "META_SUBFRAME_OUTPUT" }, {META_SUBFRAME_OUTPUT, "META_SUBFRAME_OUTPUT" },
{META_ENC_QP_METADATA, "META_ENC_QP_METADATA" }, {META_ENC_QP_METADATA, "META_ENC_QP_METADATA" },
{META_ROI_INFO, "META_ROI_INFO" }, {META_ROI_INFO, "META_ROI_INFO" },
@@ -1114,6 +1115,33 @@ exit:
return allow; 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 msm_vidc_allow_reqbufs(struct msm_vidc_inst *inst, u32 type)
{ {
bool allow = false; bool allow = false;

View File

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