video: driver: adjust properties during reqbufs

- Adjust v4l2 properties during reqbufs of
  master port. Set properties to firmware
  during streamon of master port.
- Calculate buffer size and buffer counts
  during reqbufs call of each port.
- This is done to recalculate buffer sizes
  and counts after client has configured
  all the controls and updated size and
  count can be returned to client before
  streamon.

Change-Id: Ifc7ee36456d5d4e1c862952de581af3d7ae126b0
Signed-off-by: Darshana Patil <quic_darshana@quicinc.com>
This commit is contained in:
Darshana Patil
2023-03-23 16:34:35 -07:00
committed by Gerrit - the friendly Code Review server
parent b12f5ec06e
commit 7affdd1031
8 changed files with 61 additions and 43 deletions

View File

@@ -16,7 +16,8 @@ int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl);
int msm_v4l2_op_g_volatile_ctrl(struct v4l2_ctrl *ctrl);
int msm_vidc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl);
int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst);
int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst);
int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst);
int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst);
bool is_valid_cap_id(enum msm_vidc_inst_capability_type cap_id);
bool is_valid_cap(struct msm_vidc_inst *inst,
enum msm_vidc_inst_capability_type cap_id);

View File

@@ -127,6 +127,7 @@ struct msm_vidc_inst {
bool once_per_session_set;
bool ipsc_properties_set;
bool opsc_properties_set;
bool caps_list_prepared;
struct dentry *debugfs_root;
struct msm_vidc_debug debug;
struct debug_buf_count debug_count;
@@ -146,6 +147,7 @@ struct msm_vidc_inst {
bool ir_enabled;
u32 adjust_priority;
bool iframe;
u32 fw_min_count;
};
#endif // _MSM_VIDC_INST_H_

View File

@@ -1338,8 +1338,11 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
inst->fmts[OUTPUT_PORT].fmt.pix_mp.quantization;
inst->buffers.output.min_count = subsc_params.fw_min_count;
inst->fw_min_count = subsc_params.fw_min_count;
inst->buffers.output.extra_count = call_session_op(core,
extra_count, inst, MSM_VIDC_BUF_OUTPUT);
inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
inst->buffers.output_meta.extra_count = inst->buffers.output.extra_count;
if (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) {
if (inst->buffers.output.min_count != 1) {
i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n",
@@ -1448,7 +1451,7 @@ int msm_vdec_streamon_input(struct msm_vidc_inst *inst)
if (rc)
goto error;
rc = msm_vidc_adjust_set_v4l2_properties(inst);
rc = msm_vidc_set_v4l2_properties(inst);
if (rc)
goto error;
@@ -2692,6 +2695,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
inst->buffers.output.extra_count;
inst->buffers.output.size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
inst->max_map_output_count = MAX_MAP_OUTPUT_COUNT;
inst->fw_min_count = 0;
f = &inst->fmts[OUTPUT_META_PORT];
f->type = OUTPUT_META_PLANE;

View File

@@ -1067,7 +1067,7 @@ int msm_venc_streamon_output(struct msm_vidc_inst *inst)
if (rc)
goto error;
rc = msm_vidc_adjust_set_v4l2_properties(inst);
rc = msm_vidc_set_v4l2_properties(inst);
if (rc)
goto error;

View File

@@ -922,6 +922,7 @@ void *msm_vidc_open(void *vidc_core, u32 session_type)
inst->request = false;
inst->ipsc_properties_set = false;
inst->opsc_properties_set = false;
inst->caps_list_prepared = false;
inst->has_bframe = false;
inst->iframe = false;
inst->auto_framerate = DEFAULT_FPS << 16;

View File

@@ -65,6 +65,9 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst)
return 1;
if (is_decode_session(inst)) {
if (inst->fw_min_count)
return inst->fw_min_count;
switch (inst->codec) {
case MSM_VIDC_H264:
case MSM_VIDC_HEVC:

View File

@@ -1049,11 +1049,7 @@ error:
return rc;
}
/*
* Loop over instance capabilities from caps_list
* and call adjust and set function
*/
int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst)
int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst)
{
struct msm_vidc_inst_cap_entry *entry = NULL, *temp = NULL;
int rc = 0;
@@ -1074,6 +1070,20 @@ int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst)
return rc;
}
return rc;
}
int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst)
{
struct msm_vidc_inst_cap_entry *entry = NULL, *temp = NULL;
int rc = 0;
if (!inst || !inst->capabilities) {
d_vpr_e("%s: invalid params\n", __func__);
return -EINVAL;
}
i_vpr_h(inst, "%s()\n", __func__);
/* set all caps from caps_list */
list_for_each_entry_safe(entry, temp, &inst->caps_list, list) {
rc = msm_vidc_set_cap(inst, entry->cap_id, __func__);

View File

@@ -247,6 +247,7 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
enum msm_vidc_buffer_type buffer_type = 0;
enum msm_vidc_buffer_region region = MSM_VIDC_REGION_NONE;
struct context_bank_info *cb = NULL;
struct msm_vidc_buffers *buffers;
if (!q || !num_buffers || !num_planes
|| !sizes || !q->drv_priv) {
@@ -270,6 +271,24 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
if (port < 0)
return -EINVAL;
/* prepare dependency list once per session */
if (!inst->caps_list_prepared) {
rc = msm_vidc_prepare_dependency_list(inst);
if (rc)
return rc;
inst->caps_list_prepared = true;
}
/* adjust v4l2 properties for master port */
if ((is_encode_session(inst) && port == OUTPUT_PORT) ||
(is_decode_session(inst) && port == INPUT_PORT)) {
rc = msm_vidc_adjust_v4l2_properties(inst);
if (rc) {
i_vpr_e(inst, "%s: failed to adjust properties\n", __func__);
return rc;
}
}
if (*num_planes && (port == INPUT_PORT || port == OUTPUT_PORT)) {
f = &inst->fmts[port];
if (*num_planes != f->fmt.pix_mp.num_planes) {
@@ -295,44 +314,26 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
return rc;
}
if (port == INPUT_PORT) {
*num_planes = 1;
if (*num_buffers < inst->buffers.input.min_count +
inst->buffers.input.extra_count)
*num_buffers = inst->buffers.input.min_count +
inst->buffers.input.extra_count;
inst->buffers.input.actual_count = *num_buffers;
buffers = msm_vidc_get_buffers(inst, buffer_type, __func__);
if (!buffers)
return -EINVAL;
} else if (port == INPUT_META_PORT) {
*num_planes = 1;
if (*num_buffers < inst->buffers.input_meta.min_count +
inst->buffers.input_meta.extra_count)
*num_buffers = inst->buffers.input_meta.min_count +
inst->buffers.input_meta.extra_count;
inst->buffers.input_meta.actual_count = *num_buffers;
} else if (port == OUTPUT_PORT) {
*num_planes = 1;
if (*num_buffers < inst->buffers.output.min_count +
inst->buffers.output.extra_count)
*num_buffers = inst->buffers.output.min_count +
inst->buffers.output.extra_count;
inst->buffers.output.actual_count = *num_buffers;
} else if (port == OUTPUT_META_PORT) {
*num_planes = 1;
if (*num_buffers < inst->buffers.output_meta.min_count +
inst->buffers.output_meta.extra_count)
*num_buffers = inst->buffers.output_meta.min_count +
inst->buffers.output_meta.extra_count;
inst->buffers.output_meta.actual_count = *num_buffers;
}
buffers->min_count = call_session_op(core, min_count, inst, buffer_type);
buffers->extra_count = call_session_op(core, extra_count, inst, buffer_type);
if (*num_buffers < buffers->min_count + buffers->extra_count)
*num_buffers = buffers->min_count + buffers->extra_count;
buffers->actual_count = *num_buffers;
*num_planes = 1;
buffers->size = call_session_op(core, buffer_size, inst, buffer_type);
if (port == INPUT_PORT || port == OUTPUT_PORT) {
inst->fmts[port].fmt.pix_mp.plane_fmt[0].sizeimage = buffers->size;
sizes[0] = inst->fmts[port].fmt.pix_mp.plane_fmt[0].sizeimage;
} else if (port == OUTPUT_META_PORT) {
inst->fmts[port].fmt.meta.buffersize = buffers->size;
sizes[0] = inst->fmts[port].fmt.meta.buffersize;
} else if (port == INPUT_META_PORT) {
inst->fmts[port].fmt.meta.buffersize = buffers->size;
if (inst->capabilities->cap[SUPER_FRAME].value)
sizes[0] = inst->capabilities->cap[SUPER_FRAME].value *
inst->fmts[port].fmt.meta.buffersize;
@@ -428,10 +429,6 @@ int msm_vidc_start_streaming(struct msm_vidc_inst *inst, struct vb2_queue *q)
if (!inst->once_per_session_set) {
inst->once_per_session_set = true;
rc = msm_vidc_prepare_dependency_list(inst);
if (rc)
return rc;
rc = msm_vidc_session_set_codec(inst);
if (rc)
return rc;