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>
This commit is contained in:
Mihir Ganu
2021-01-08 14:37:18 -08:00
parent d98075c932
commit 2126abf6c3
7 changed files with 109 additions and 56 deletions

View File

@@ -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,

View File

@@ -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,
};

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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,
};