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