Merge "msm: vidc: tune input buffer size based on buffer_size_limit"

This commit is contained in:
qctecmdr 2020-10-22 05:52:31 -07:00 • committed by Gerrit - the friendly Code Review server
commit c41612ec9d
4 changed files with 21 additions and 11 deletions

View file

@ -685,7 +685,7 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
}
mplane->plane_fmt[0].sizeimage =
msm_vidc_calculate_dec_input_frame_size(inst);
msm_vidc_calculate_dec_input_frame_size(inst, inst->buffer_size_limit);
/* Driver can recalculate buffer count only for
* only for bitstream port. Decoder YUV port reconfig
@ -733,7 +733,7 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f)
} else if (f->type == INPUT_MPLANE) {
fmt = &inst->fmts[INPUT_PORT].v4l2_fmt;
fmt->fmt.pix_mp.plane_fmt[0].sizeimage =
msm_vidc_calculate_dec_input_frame_size(inst);
msm_vidc_calculate_dec_input_frame_size(inst, inst->buffer_size_limit);
memcpy(f, fmt, sizeof(struct v4l2_format));
} else {
s_vpr_e(inst->sid, "%s: Unsupported buf type: %d\n",
@ -817,7 +817,7 @@ int msm_vdec_inst_init(struct msm_vidc_inst *inst)
f->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
f->fmt.pix_mp.num_planes = 1;
f->fmt.pix_mp.plane_fmt[0].sizeimage =
msm_vidc_calculate_dec_input_frame_size(inst);
msm_vidc_calculate_dec_input_frame_size(inst, inst->buffer_size_limit);
fmt_desc = msm_comm_get_pixel_fmt_fourcc(vdec_input_formats,
ARRAY_SIZE(vdec_input_formats), f->fmt.pix_mp.pixelformat,
inst->sid);

View file

@ -876,7 +876,7 @@ static int msm_vidc_get_extra_output_buff_count(struct msm_vidc_inst *inst)
return extra_output_count;
}
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst)
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst, u32 buffer_size_limit)
{
u32 frame_size, num_mbs;
u32 div_factor = 1;
@ -928,9 +928,8 @@ u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst)
inst->core->platform_data->vpu_ver != VPU_VERSION_AR50_LITE)
frame_size = frame_size + (frame_size >> 2);
if (inst->buffer_size_limit &&
(inst->buffer_size_limit < frame_size)) {
frame_size = inst->buffer_size_limit;
if (buffer_size_limit && (buffer_size_limit < frame_size)) {
frame_size = buffer_size_limit;
s_vpr_h(inst->sid, "input buffer size limited to %d\n",
frame_size);
} else {

View file

@ -37,7 +37,8 @@ int msm_vidc_calculate_output_buffer_count(struct msm_vidc_inst *inst);
int msm_vidc_calculate_buffer_counts(struct msm_vidc_inst *inst);
int msm_vidc_get_extra_buff_count(struct msm_vidc_inst *inst,
enum hal_buffer buffer_type);
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_dec_input_frame_size(struct msm_vidc_inst *inst,
u32 buffer_size_limit);
u32 msm_vidc_calculate_dec_output_frame_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_dec_output_extra_size(struct msm_vidc_inst *inst);
u32 msm_vidc_calculate_enc_input_frame_size(struct msm_vidc_inst *inst);

View file

@ -3351,7 +3351,10 @@ static void msm_comm_print_mem_usage(struct msm_vidc_core *core)
break;
}
}
sz_i = iplane->plane_fmt[0].sizeimage;
if (is_decode_session(inst))
sz_i = msm_vidc_calculate_dec_input_frame_size(inst, 0);
else
sz_i = iplane->plane_fmt[0].sizeimage;
sz_i_e = iplane->plane_fmt[1].sizeimage;
cnt_i = inp_f->count_min_host;
@ -5802,7 +5805,7 @@ int msm_comm_check_memory_supported(struct msm_vidc_inst *vidc_inst)
struct v4l2_format *f;
struct hal_buffer_requirements *req;
struct context_bank_info *cb = NULL;
u32 i, dpb_cnt = 0, dpb_size = 0, rc = 0;
u32 i, dpb_cnt = 0, dpb_size = 0, input_size = 1, rc = 0;
u32 inst_mem_size, non_sec_cb_size = 0;
u64 total_mem_size = 0, non_sec_mem_size = 0;
u32 memory_limit_mbytes;
@ -5812,10 +5815,17 @@ int msm_comm_check_memory_supported(struct msm_vidc_inst *vidc_inst)
mutex_lock(&core->lock);
list_for_each_entry(inst, &core->instances, list) {
inst_mem_size = 0;
input_size = 1;
/* input port buffers memory size */
fmt = &inst->fmts[INPUT_PORT];
f = &fmt->v4l2_fmt;
for (i = 0; i < f->fmt.pix_mp.num_planes; i++)
if (is_decode_session(inst))
input_size = msm_vidc_calculate_dec_input_frame_size(inst, 0);
else
input_size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
inst_mem_size += input_size * fmt->count_min_host;
for (i = 1; i < f->fmt.pix_mp.num_planes; i++)
inst_mem_size += f->fmt.pix_mp.plane_fmt[i].sizeimage *
fmt->count_min_host;