summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2012-03-21 12:07:41 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2012-03-21 12:07:41 +0100
commit13737dbe61b1e0598f6ef9e0444b47e2942aba99 (patch)
tree41fc12a0a2edc6a787c2f98c44c02942ae7e1d40
parentd916e26c4d4b047d75fdc9627aaa0a061582c907 (diff)
downloadgst-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.c57
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);