diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-03-21 12:07:41 +0100 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-03-21 12:07:41 +0100 |
commit | 13737dbe61b1e0598f6ef9e0444b47e2942aba99 (patch) | |
tree | 41fc12a0a2edc6a787c2f98c44c02942ae7e1d40 | |
parent | d916e26c4d4b047d75fdc9627aaa0a061582c907 (diff) | |
download | gst-plugins-fsl-vpu-13737dbe61b1e0598f6ef9e0444b47e2942aba99.tar.gz gst-plugins-fsl-vpu-13737dbe61b1e0598f6ef9e0444b47e2942aba99.tar.xz |
module: Add avg/max encoding times to info
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | module/imx-vpu.c | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/module/imx-vpu.c b/module/imx-vpu.c index 28d5b43..37fe8bf 100644 --- a/module/imx-vpu.c +++ b/module/imx-vpu.c @@ -300,6 +300,12 @@ struct vpu_instance { int flushing; int standard; unsigned int readofs, fifo_in, fifo_out; + + /* statistic */ + uint64_t encoding_time_max; + uint64_t encoding_time_total; + uint64_t start_time; + int num_frames; }; struct vpu { @@ -422,15 +428,29 @@ static ssize_t show_info(struct device *dev, instance->hold, instance->width, instance->height); - if (instance->mode == VPU_MODE_ENCODER) - len += sprintf(buf + len, "kfifo_avail: %d\n" - "buffered size: %d\n" - "header size: %d\n", - kfifo_avail(&instance->fifo), - instance->buffered_size, - instance->headersize); - else + if (instance->mode == VPU_MODE_ENCODER) { + uint64_t max_time = instance->encoding_time_max; + uint64_t avg_time = instance->encoding_time_total; + + do_div(max_time, 1000000); + do_div(avg_time, instance->num_frames); + do_div(avg_time, 1000000); + + len += sprintf(buf + len, + "kfifo_avail: %d\n" + "buffered size: %d\n" + "header size: %d\n" + "avg encoding time: %lldms\n" + "max encoding time: %lldms\n", + kfifo_avail(&instance->fifo), + instance->buffered_size, + instance->headersize, + avg_time, + max_time); + } else { len += sprintf(buf + len, "fifo_avail: %d\n", vpu_fifo_avail(instance)); + } + len += sprintf(buf + len, "\n"); } len += sprintf(buf + len, "queued buffers\n" @@ -1054,6 +1074,7 @@ static void vpu_work(struct work_struct *work) struct vpu_buffer *vbuf; struct vpu_instance *instance = NULL; int i, ret; + struct timespec s; while (1) { for (i = 0; i < VPU_NUM_INSTANCE; i++) { @@ -1079,9 +1100,12 @@ static void vpu_work(struct work_struct *work) } } - if (!vpu->active) { + if (!vpu->active) return; - } + + ktime_get_ts(&s); + + instance->start_time = timespec_to_ns(&s); if (instance->mode == VPU_MODE_ENCODER) vpu_enc_start_frame(instance); @@ -1132,6 +1156,8 @@ static void vpu_enc_irq_handler(struct vpu *vpu, struct vpu_instance *instance, int size; int ret; struct vpu_buffer *buf = to_vpu_vb(vb); + s64 time; + struct timespec e; size = vpu_read(vpu, BIT_WR_PTR(instance->idx)) - vpu_read(vpu, BIT_RD_PTR(instance->idx)); @@ -1149,6 +1175,13 @@ static void vpu_enc_irq_handler(struct vpu *vpu, struct vpu_instance *instance, BUG(); } + ktime_get_ts(&e); + time = timespec_to_ns(&e) - instance->start_time; + if (time > instance->encoding_time_max) + instance->encoding_time_max = time; + instance->encoding_time_total += time; + instance->num_frames++; + list_del_init(&buf->list); vb2_buffer_done(vb, VB2_BUF_STATE_DONE); @@ -1225,6 +1258,10 @@ static int vpu_open(struct file *file) instance->fifo_in = 0; instance->fifo_out = 0; + instance->encoding_time_max = 0; + instance->encoding_time_total = 0; + instance->num_frames = 0; + memset(instance->rec, 0, sizeof(instance->rec)); instance->frametime = ktime_set(0, 0); |