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 <mganu@codeaurora.org>
这个提交包含在:
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
在新工单中引用
屏蔽一个用户