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:
@@ -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,
|
||||||
|
@@ -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);
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user