video: driver: add support to send input meta buffer via request

Client can enable V4L2_CID_MPEG_VIDC_INPUT_METADATA_VIA_REQUEST_ENABLE
control and send input metadata buffer via request.

Change-Id: Icccdada8253d1d0291c01e2e539968141f7ddd2c
Signed-off-by: Darshana Patil <quic_darshana@quicinc.com>
This commit is contained in:
Darshana Patil
2022-01-31 10:02:43 -08:00
parent 7c4952934b
commit 9978dc376e
9 changed files with 176 additions and 21 deletions

View File

@@ -1519,6 +1519,15 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
{0}, {0}, {0}, {0},
NULL, NULL}, NULL, NULL},
{INPUT_META_VIA_REQUEST, ENC|DEC, CODECS_ALL,
V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
1, V4L2_MPEG_MSM_VIDC_DISABLE,
V4L2_CID_MPEG_VIDC_INPUT_METADATA_VIA_REQUEST_ENABLE,
0,
CAP_FLAG_INPUT_PORT,
{0}, {0},
NULL, NULL},
{META_LTR_MARK_USE, ENC, H264|HEVC, {META_LTR_MARK_USE, ENC, H264|HEVC,
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

@@ -452,5 +452,7 @@ bool res_is_less_than(u32 width, u32 height,
bool res_is_less_than_or_equal_to(u32 width, u32 height, bool res_is_less_than_or_equal_to(u32 width, u32 height,
u32 ref_width, u32 ref_height); u32 ref_width, u32 ref_height);
int msm_vidc_get_properties(struct msm_vidc_inst *inst); int msm_vidc_get_properties(struct msm_vidc_inst *inst);
int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, u32 buf_fd);
int msm_vidc_update_input_meta_buffer_index(struct msm_vidc_inst *inst, struct vb2_buffer *vb2);
#endif // _MSM_VIDC_DRIVER_H_ #endif // _MSM_VIDC_DRIVER_H_

View File

@@ -433,6 +433,7 @@ enum msm_vidc_inst_capability_type {
SUPER_BLOCK, SUPER_BLOCK,
DRAP, DRAP,
INPUT_METADATA_FD, INPUT_METADATA_FD,
INPUT_META_VIA_REQUEST,
META_BITSTREAM_RESOLUTION, META_BITSTREAM_RESOLUTION,
META_CROP_OFFSETS, META_CROP_OFFSETS,
META_DPB_MISR, META_DPB_MISR,

View File

@@ -1613,12 +1613,18 @@ int msm_vdec_streamon_input(struct msm_vidc_inst *inst)
return -EINVAL; return -EINVAL;
} }
if (is_input_meta_enabled(inst) && /*
!inst->bufq[INPUT_META_PORT].vb2q->streaming) { * do not check for input meta port streamon when
i_vpr_e(inst, * request is enabled
"%s: Meta port must be streamed on before data port\n", */
__func__); if (!inst->capabilities->cap[INPUT_META_VIA_REQUEST].value) {
return -EINVAL; if (is_input_meta_enabled(inst) &&
!inst->bufq[INPUT_META_PORT].vb2q->streaming) {
i_vpr_e(inst,
"%s: Meta port must be streamed on before data port\n",
__func__);
return -EINVAL;
}
} }
rc = msm_vidc_check_session_supported(inst); rc = msm_vidc_check_session_supported(inst);

View File

@@ -814,12 +814,18 @@ int msm_venc_streamon_input(struct msm_vidc_inst *inst)
return -EINVAL; return -EINVAL;
} }
if (is_input_meta_enabled(inst) && /*
!inst->bufq[INPUT_META_PORT].vb2q->streaming) { * do not check for input meta port streamon when
i_vpr_e(inst, * request is enabled
"%s: Meta port must be streamed on before data port\n", */
__func__); if (!inst->capabilities->cap[INPUT_META_VIA_REQUEST].value) {
return -EINVAL; if (is_input_meta_enabled(inst) &&
!inst->bufq[INPUT_META_PORT].vb2q->streaming) {
i_vpr_e(inst,
"%s: Meta port must be streamed on before data port\n",
__func__);
return -EINVAL;
}
} }
rc = msm_vidc_check_session_supported(inst); rc = msm_vidc_check_session_supported(inst);

View File

@@ -854,6 +854,17 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
return -EINVAL; return -EINVAL;
} }
if (ctrl->id == V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD) {
if (!capability->cap[INPUT_META_VIA_REQUEST].value) {
i_vpr_e(inst,
"%s: input metadata not enabled via request\n", __func__);
return -EINVAL;
}
rc = msm_vidc_create_input_metadata_buffer(inst, ctrl->val);
if (rc)
return rc;
}
capability->cap[cap_id].flags |= CAP_FLAG_CLIENT_SET; capability->cap[cap_id].flags |= CAP_FLAG_CLIENT_SET;
/* Static setting */ /* Static setting */
if (!inst->bufq[OUTPUT_PORT].vb2q->streaming) { if (!inst->bufq[OUTPUT_PORT].vb2q->streaming) {

View File

@@ -150,6 +150,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
{SUPER_BLOCK, "SUPER_BLOCK" }, {SUPER_BLOCK, "SUPER_BLOCK" },
{DRAP, "DRAP" }, {DRAP, "DRAP" },
{INPUT_METADATA_FD, "INPUT_METADATA_FD" }, {INPUT_METADATA_FD, "INPUT_METADATA_FD" },
{INPUT_META_VIA_REQUEST, "INPUT_META_VIA_REQUEST" },
{META_BITSTREAM_RESOLUTION, "META_BITSTREAM_RESOLUTION" }, {META_BITSTREAM_RESOLUTION, "META_BITSTREAM_RESOLUTION" },
{META_CROP_OFFSETS, "META_CROP_OFFSETS" }, {META_CROP_OFFSETS, "META_CROP_OFFSETS" },
{META_DPB_MISR, "META_DPB_MISR" }, {META_DPB_MISR, "META_DPB_MISR" },
@@ -1296,6 +1297,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
case V4L2_CID_MPEG_VIDC_CODEC_CONFIG: case V4L2_CID_MPEG_VIDC_CODEC_CONFIG:
case V4L2_CID_MPEG_VIDC_PRIORITY: case V4L2_CID_MPEG_VIDC_PRIORITY:
case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST: case V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST:
case V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD:
allow = true; allow = true;
break; break;
default: default:
@@ -3633,7 +3635,7 @@ int msm_vidc_vb2_buffer_done(struct msm_vidc_inst *inst,
struct vb2_v4l2_buffer *vbuf; struct vb2_v4l2_buffer *vbuf;
bool found; bool found;
if (!inst || !buf) { if (!inst || !inst->capabilities || !buf) {
d_vpr_e("%s: invalid params\n", __func__); d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL; return -EINVAL;
} }
@@ -3644,6 +3646,14 @@ int msm_vidc_vb2_buffer_done(struct msm_vidc_inst *inst,
if (port < 0) if (port < 0)
return -EINVAL; return -EINVAL;
/*
* vb2_buffer_done not required if input metadata
* buffer sent via request api
*/
if (buf->type == MSM_VIDC_BUF_INPUT_META &&
inst->capabilities->cap[INPUT_META_VIA_REQUEST].value)
return 0;
q = inst->bufq[port].vb2q; q = inst->bufq[port].vb2q;
if (!q->streaming) { if (!q->streaming) {
i_vpr_e(inst, "%s: port %d is not streaming\n", i_vpr_e(inst, "%s: port %d is not streaming\n",
@@ -6138,3 +6148,94 @@ int msm_vidc_get_properties(struct msm_vidc_inst *inst)
return 0; return 0;
} }
int msm_vidc_create_input_metadata_buffer(struct msm_vidc_inst *inst, u32 fd)
{
int rc = 0;
struct msm_vidc_buffer *buf = NULL;
struct msm_vidc_buffers *buffers;
struct dma_buf *dma_buf;
if (!inst) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (fd <= 0) {
i_vpr_e(inst, "%s: invalid input metadata buffer fd %d\n",
__func__, fd);
return -EINVAL;
}
buffers = msm_vidc_get_buffers(inst, MSM_VIDC_BUF_INPUT_META, __func__);
if (!buffers)
return -EINVAL;
buf = msm_memory_pool_alloc(inst, MSM_MEM_POOL_BUFFER);
if (!buf) {
i_vpr_e(inst, "%s: buffer pool alloc failed\n", __func__);
return -EINVAL;
}
INIT_LIST_HEAD(&buf->list);
buf->type = MSM_VIDC_BUF_INPUT_META;
buf->index = INT_MAX;
buf->fd = fd;
dma_buf = msm_vidc_memory_get_dmabuf(inst, fd);
if (!dma_buf) {
rc = -ENOMEM;
goto error_dma_buf;
}
buf->dmabuf = dma_buf;
buf->data_size = dma_buf->size;
buf->buffer_size = dma_buf->size;
buf->attr |= MSM_VIDC_ATTR_DEFERRED;
rc = msm_vidc_map_driver_buf(inst, buf);
if (rc)
goto error_map;
list_add_tail(&buf->list, &buffers->list);
return rc;
error_map:
msm_vidc_memory_put_dmabuf(inst, buf->dmabuf);
error_dma_buf:
msm_memory_pool_free(inst, buf);
return rc;
}
int msm_vidc_update_input_meta_buffer_index(struct msm_vidc_inst *inst,
struct vb2_buffer *vb2)
{
int rc = 0;
bool found = false;
struct msm_vidc_buffer *buf = NULL;
struct msm_vidc_buffers *buffers;
if (!inst || !vb2) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
if (vb2->type != INPUT_MPLANE)
return 0;
buffers = msm_vidc_get_buffers(inst, MSM_VIDC_BUF_INPUT_META, __func__);
if (!buffers)
return -EINVAL;
list_for_each_entry(buf, &buffers->list, list) {
if (buf->index == INT_MAX) {
buf->index = vb2->index;
found = true;
break;
}
}
if (!found) {
i_vpr_e(inst, "%s: missing input metabuffer for index %d\n",
__func__, vb2->index);
rc = -EINVAL;
}
return rc;
}

View File

@@ -172,10 +172,19 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
return -EINVAL; return -EINVAL;
} }
inst = q->drv_priv; inst = q->drv_priv;
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;
} }
if (q->type == INPUT_META_PLANE &&
inst->capabilities->cap[INPUT_META_VIA_REQUEST].value) {
i_vpr_e(inst,
"%s: invalid input meta port start when request enabled\n",
__func__);
return -EINVAL;
}
if (q->type == INPUT_META_PLANE || q->type == OUTPUT_META_PLANE) { if (q->type == INPUT_META_PLANE || q->type == OUTPUT_META_PLANE) {
i_vpr_h(inst, "%s: nothing to start on %s\n", i_vpr_h(inst, "%s: nothing to start on %s\n",
__func__, v4l2_type_name(q->type)); __func__, v4l2_type_name(q->type));
@@ -364,13 +373,16 @@ void msm_vidc_buf_queue(struct vb2_buffer *vb2)
inst->request = false; inst->request = false;
i_vpr_e(inst, "%s: request setup failed, error %d\n", i_vpr_e(inst, "%s: request setup failed, error %d\n",
__func__, rc); __func__, rc);
msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__); goto error;
v4l2_ctrl_request_complete(vb2->req_obj.req, &inst->ctrl_handler);
vb2_buffer_done(vb2, VB2_BUF_STATE_ERROR);
return;
} }
inst->request = false; inst->request = false;
if (inst->capabilities->cap[INPUT_META_VIA_REQUEST].value) {
rc = msm_vidc_update_input_meta_buffer_index(inst, vb2);
if (rc)
goto error;
}
if (is_decode_session(inst)) if (is_decode_session(inst))
rc = msm_vdec_qbuf(inst, vb2); rc = msm_vdec_qbuf(inst, vb2);
else if (is_encode_session(inst)) else if (is_encode_session(inst))
@@ -380,10 +392,14 @@ void msm_vidc_buf_queue(struct vb2_buffer *vb2)
if (rc) { if (rc) {
print_vb2_buffer("failed vb2-qbuf", inst, vb2); print_vb2_buffer("failed vb2-qbuf", inst, vb2);
msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__); goto error;
v4l2_ctrl_request_complete(vb2->req_obj.req, &inst->ctrl_handler);
vb2_buffer_done(vb2, VB2_BUF_STATE_ERROR);
} }
return;
error:
msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__);
v4l2_ctrl_request_complete(vb2->req_obj.req, &inst->ctrl_handler);
vb2_buffer_done(vb2, VB2_BUF_STATE_ERROR);
} }
void msm_vidc_buf_cleanup(struct vb2_buffer *vb) void msm_vidc_buf_cleanup(struct vb2_buffer *vb)

View File

@@ -197,6 +197,9 @@ enum v4l2_mpeg_video_av1_tier {
/* Control to set input metadata buffer fd */ /* Control to set input metadata buffer fd */
#define V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD \ #define V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD \
(V4L2_CID_MPEG_VIDC_BASE + 0x36) (V4L2_CID_MPEG_VIDC_BASE + 0x36)
/* Control to enable input metadata via request api */
#define V4L2_CID_MPEG_VIDC_INPUT_METADATA_VIA_REQUEST_ENABLE \
(V4L2_CID_MPEG_VIDC_BASE + 0x37)
/* add new controls above this line */ /* add new controls above this line */
/* Deprecate below controls once availble in gki and gsi bionic header */ /* Deprecate below controls once availble in gki and gsi bionic header */