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_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_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_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_id(enum msm_vidc_inst_capability_type cap_id);
|
||||||
bool is_valid_cap(struct msm_vidc_inst *inst,
|
bool is_valid_cap(struct msm_vidc_inst *inst,
|
||||||
enum msm_vidc_inst_capability_type cap_id);
|
enum msm_vidc_inst_capability_type cap_id);
|
||||||
|
@@ -127,6 +127,7 @@ struct msm_vidc_inst {
|
|||||||
bool once_per_session_set;
|
bool once_per_session_set;
|
||||||
bool ipsc_properties_set;
|
bool ipsc_properties_set;
|
||||||
bool opsc_properties_set;
|
bool opsc_properties_set;
|
||||||
|
bool caps_list_prepared;
|
||||||
struct dentry *debugfs_root;
|
struct dentry *debugfs_root;
|
||||||
struct msm_vidc_debug debug;
|
struct msm_vidc_debug debug;
|
||||||
struct debug_buf_count debug_count;
|
struct debug_buf_count debug_count;
|
||||||
@@ -146,6 +147,7 @@ struct msm_vidc_inst {
|
|||||||
bool ir_enabled;
|
bool ir_enabled;
|
||||||
u32 adjust_priority;
|
u32 adjust_priority;
|
||||||
bool iframe;
|
bool iframe;
|
||||||
|
u32 fw_min_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _MSM_VIDC_INST_H_
|
#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->fmts[OUTPUT_PORT].fmt.pix_mp.quantization;
|
||||||
|
|
||||||
inst->buffers.output.min_count = subsc_params.fw_min_count;
|
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,
|
inst->buffers.output.extra_count = call_session_op(core,
|
||||||
extra_count, inst, MSM_VIDC_BUF_OUTPUT);
|
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 (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) {
|
||||||
if (inst->buffers.output.min_count != 1) {
|
if (inst->buffers.output.min_count != 1) {
|
||||||
i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n",
|
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)
|
if (rc)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
rc = msm_vidc_adjust_set_v4l2_properties(inst);
|
rc = msm_vidc_set_v4l2_properties(inst);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@@ -2692,6 +2695,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
|
|||||||
inst->buffers.output.extra_count;
|
inst->buffers.output.extra_count;
|
||||||
inst->buffers.output.size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
|
inst->buffers.output.size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
|
||||||
inst->max_map_output_count = MAX_MAP_OUTPUT_COUNT;
|
inst->max_map_output_count = MAX_MAP_OUTPUT_COUNT;
|
||||||
|
inst->fw_min_count = 0;
|
||||||
|
|
||||||
f = &inst->fmts[OUTPUT_META_PORT];
|
f = &inst->fmts[OUTPUT_META_PORT];
|
||||||
f->type = OUTPUT_META_PLANE;
|
f->type = OUTPUT_META_PLANE;
|
||||||
|
@@ -1067,7 +1067,7 @@ int msm_venc_streamon_output(struct msm_vidc_inst *inst)
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
rc = msm_vidc_adjust_set_v4l2_properties(inst);
|
rc = msm_vidc_set_v4l2_properties(inst);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
@@ -922,6 +922,7 @@ void *msm_vidc_open(void *vidc_core, u32 session_type)
|
|||||||
inst->request = false;
|
inst->request = false;
|
||||||
inst->ipsc_properties_set = false;
|
inst->ipsc_properties_set = false;
|
||||||
inst->opsc_properties_set = false;
|
inst->opsc_properties_set = false;
|
||||||
|
inst->caps_list_prepared = false;
|
||||||
inst->has_bframe = false;
|
inst->has_bframe = false;
|
||||||
inst->iframe = false;
|
inst->iframe = false;
|
||||||
inst->auto_framerate = DEFAULT_FPS << 16;
|
inst->auto_framerate = DEFAULT_FPS << 16;
|
||||||
|
@@ -65,6 +65,9 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (is_decode_session(inst)) {
|
if (is_decode_session(inst)) {
|
||||||
|
if (inst->fw_min_count)
|
||||||
|
return inst->fw_min_count;
|
||||||
|
|
||||||
switch (inst->codec) {
|
switch (inst->codec) {
|
||||||
case MSM_VIDC_H264:
|
case MSM_VIDC_H264:
|
||||||
case MSM_VIDC_HEVC:
|
case MSM_VIDC_HEVC:
|
||||||
|
@@ -1049,11 +1049,7 @@ error:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst)
|
||||||
* 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)
|
|
||||||
{
|
{
|
||||||
struct msm_vidc_inst_cap_entry *entry = NULL, *temp = NULL;
|
struct msm_vidc_inst_cap_entry *entry = NULL, *temp = NULL;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
@@ -1074,6 +1070,20 @@ int msm_vidc_adjust_set_v4l2_properties(struct msm_vidc_inst *inst)
|
|||||||
return rc;
|
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 */
|
/* set all caps from caps_list */
|
||||||
list_for_each_entry_safe(entry, temp, &inst->caps_list, list) {
|
list_for_each_entry_safe(entry, temp, &inst->caps_list, list) {
|
||||||
rc = msm_vidc_set_cap(inst, entry->cap_id, __func__);
|
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_type buffer_type = 0;
|
||||||
enum msm_vidc_buffer_region region = MSM_VIDC_REGION_NONE;
|
enum msm_vidc_buffer_region region = MSM_VIDC_REGION_NONE;
|
||||||
struct context_bank_info *cb = NULL;
|
struct context_bank_info *cb = NULL;
|
||||||
|
struct msm_vidc_buffers *buffers;
|
||||||
|
|
||||||
if (!q || !num_buffers || !num_planes
|
if (!q || !num_buffers || !num_planes
|
||||||
|| !sizes || !q->drv_priv) {
|
|| !sizes || !q->drv_priv) {
|
||||||
@@ -270,6 +271,24 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
|
|||||||
if (port < 0)
|
if (port < 0)
|
||||||
return -EINVAL;
|
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)) {
|
if (*num_planes && (port == INPUT_PORT || port == OUTPUT_PORT)) {
|
||||||
f = &inst->fmts[port];
|
f = &inst->fmts[port];
|
||||||
if (*num_planes != f->fmt.pix_mp.num_planes) {
|
if (*num_planes != f->fmt.pix_mp.num_planes) {
|
||||||
@@ -295,44 +314,26 @@ int msm_vb2_queue_setup(struct vb2_queue *q,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (port == INPUT_PORT) {
|
buffers = msm_vidc_get_buffers(inst, buffer_type, __func__);
|
||||||
*num_planes = 1;
|
if (!buffers)
|
||||||
if (*num_buffers < inst->buffers.input.min_count +
|
return -EINVAL;
|
||||||
inst->buffers.input.extra_count)
|
|
||||||
*num_buffers = inst->buffers.input.min_count +
|
|
||||||
inst->buffers.input.extra_count;
|
|
||||||
inst->buffers.input.actual_count = *num_buffers;
|
|
||||||
|
|
||||||
} else if (port == INPUT_META_PORT) {
|
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;
|
*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->size = call_session_op(core, buffer_size, inst, buffer_type);
|
||||||
if (port == INPUT_PORT || port == OUTPUT_PORT) {
|
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;
|
sizes[0] = inst->fmts[port].fmt.pix_mp.plane_fmt[0].sizeimage;
|
||||||
} else if (port == OUTPUT_META_PORT) {
|
} else if (port == OUTPUT_META_PORT) {
|
||||||
|
inst->fmts[port].fmt.meta.buffersize = buffers->size;
|
||||||
sizes[0] = inst->fmts[port].fmt.meta.buffersize;
|
sizes[0] = inst->fmts[port].fmt.meta.buffersize;
|
||||||
} else if (port == INPUT_META_PORT) {
|
} else if (port == INPUT_META_PORT) {
|
||||||
|
inst->fmts[port].fmt.meta.buffersize = buffers->size;
|
||||||
if (inst->capabilities->cap[SUPER_FRAME].value)
|
if (inst->capabilities->cap[SUPER_FRAME].value)
|
||||||
sizes[0] = inst->capabilities->cap[SUPER_FRAME].value *
|
sizes[0] = inst->capabilities->cap[SUPER_FRAME].value *
|
||||||
inst->fmts[port].fmt.meta.buffersize;
|
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) {
|
if (!inst->once_per_session_set) {
|
||||||
inst->once_per_session_set = true;
|
inst->once_per_session_set = true;
|
||||||
rc = msm_vidc_prepare_dependency_list(inst);
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
|
|
||||||
rc = msm_vidc_session_set_codec(inst);
|
rc = msm_vidc_session_set_codec(inst);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
Reference in New Issue
Block a user