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:

committed by
Gerrit - the friendly Code Review server

parent
b12f5ec06e
commit
7affdd1031
@@ -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);
|
||||
|
@@ -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_
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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:
|
||||
|
@@ -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__);
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user