* @metadata_idx: index for metadata buffer
* @codec: codec type
* @last_buffer_dequeued: a flag to indicate that last buffer is sent by driver
+ * @last_buf_ns: start time of received input buffer for current one second FPS window
+ * @frame_counter: input buffer counter for current one second FPS window
* @frame_rate: frame rate of current instance
* @operating_rate: operating rate of current instance
* @hfi_rc_type: rate control type
u32 metadata_idx;
u32 codec;
bool last_buffer_dequeued;
+ u64 last_buf_ns;
+ u32 frame_counter;
u32 frame_rate;
u32 operating_rate;
u32 hfi_rc_type;
f->fmt.pix_mp.quantization = V4L2_QUANTIZATION_DEFAULT;
inst->buffers[BUF_OUTPUT].min_count = iris_vpu_buf_count(inst, BUF_OUTPUT);
inst->buffers[BUF_OUTPUT].size = f->fmt.pix_mp.plane_fmt[0].sizeimage;
+ inst->frame_rate = MAXIMUM_FPS;
memcpy(&inst->fw_caps[0], &core->inst_fw_caps_dec[0],
INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
if (ret)
return ret;
+ inst->frame_counter = 0;
+
return iris_process_streamon_input(inst);
}
{
struct iris_buffer *buf = to_iris_buffer(vbuf);
struct vb2_buffer *vb2 = &vbuf->vb2_buf;
+ u64 cur_buf_ns, delta_ns;
struct vb2_queue *q;
int ret;
return 0;
}
+ if (buf->type == BUF_INPUT) {
+ cur_buf_ns = ktime_get_ns();
+
+ if (!inst->frame_counter)
+ inst->last_buf_ns = cur_buf_ns;
+
+ inst->frame_counter++;
+ delta_ns = cur_buf_ns - inst->last_buf_ns;
+
+ if (delta_ns >= NSEC_PER_SEC) {
+ inst->frame_rate = clamp_t(u32, inst->frame_counter, DEFAULT_FPS,
+ MAXIMUM_FPS);
+ inst->frame_counter = 0;
+ }
+ }
+
iris_scale_power(inst);
return iris_queue_buffer(inst, buf);
struct v4l2_format *inp_f = inst->fmt_src;
u32 mbs_per_second, mbpf, height, width;
unsigned long vpp_freq, vsp_freq;
- u32 fps = DEFAULT_FPS;
+ u32 fps = inst->frame_rate;
width = max(inp_f->fmt.pix_mp.width, inst->crop.width);
height = max(inp_f->fmt.pix_mp.height, inst->crop.height);
u32 height, width, mbs_per_second, mbpf;
u64 fw_cycles, fw_vpp_cycles;
u64 vsp_cycles, vpp_cycles;
- u32 fps = DEFAULT_FPS;
+ u32 fps = inst->frame_rate;
width = max(inp_f->fmt.pix_mp.width, inst->crop.width);
height = max(inp_f->fmt.pix_mp.height, inst->crop.height);
if (inst->fw_caps[PIPE].value > 1)
vpp_cycles += div_u64(vpp_cycles * 59, 1000);
+ /* 1.05 is VPP FW overhead */
+ if (inst->fw_caps[STAGE].value == STAGE_2)
+ vpp_cycles += mult_frac(vpp_cycles, 5, 100);
+
vsp_cycles = fps * data_size * 8;
vsp_cycles = div_u64(vsp_cycles, 2);
/* VSP FW overhead 1.05 */