diff options
Diffstat (limited to 'live.c')
-rw-r--r-- | live.c | 36 |
1 files changed, 28 insertions, 8 deletions
@@ -60,6 +60,9 @@ static struct timespec fps_ts = { 0, 0 }; static unsigned int fps_count = 0; static bool show_fps = true; +static unsigned int frame_count = 0; +static unsigned int frame_skip = 0; + static struct omap3_isp_device *isp = NULL; static struct videoout *vo = NULL; @@ -167,6 +170,9 @@ static void viewfinder_process(struct omap3_isp_device *isp __attribute__((__unu { struct timespec ts; float interval; + int ret; + + frame_count++; if (show_fps){ fps_count++; @@ -190,7 +196,18 @@ static void viewfinder_process(struct omap3_isp_device *isp __attribute__((__unu return; } - vo_queue_buffer(vo, buffer); + /* Queue the buffer to the display, or requeue it to the viewfinder if + * it needs to be skipped. + */ + if ((frame_count % (frame_skip + 1)) == 0) { + vo_queue_buffer(vo, buffer); + return; + } + + ret = omap3_isp_viewfinder_put_buffer(isp, buffer); + if (ret < 0) + printf("error: unable to requeue buffer: %s (%d)\n", + strerror(-ret), ret); } @@ -354,11 +371,13 @@ static void usage(const char *argv0) { printf("Usage: %s [options]\n", argv0); printf("Supported options:\n"); - printf("-h, --help Show this help screen\n"); + printf("-h, --help Show this help screen\n"); + printf("-s, --skip n Skip display of n frames out of n+1\n"); } static struct option opts[] = { { "help", 0, 0, 'h' }, + { "skip", 1, 0, 's' }, { 0, 0, 0, 0 } }; @@ -367,7 +386,6 @@ int main(int argc __attribute__((__unused__)), char *argv[] __attribute__((__unu struct v4l2_mbus_framefmt view_format; struct v4l2_buffers_pool *pool = NULL; struct timespec start, end; - unsigned int count = 0; struct v4l2_rect rect; int exit_code = EXIT_FAILURE; const char *vo_devname; @@ -375,11 +393,14 @@ int main(int argc __attribute__((__unused__)), char *argv[] __attribute__((__unu int ret; int c; - while ((c = getopt_long(argc, argv, "h", opts, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "hs:", opts, NULL)) != -1) { switch (c) { case 'h': usage(argv[0]); return 0; + case 's': + frame_skip = atoi(optarg); + break; default: printf("Invalid option -%c\n", c); printf("Run %s -h for help.\n", argv[0]); @@ -492,7 +513,6 @@ int main(int argc __attribute__((__unused__)), char *argv[] __attribute__((__unu } events_dispatch(&rfds, &wfds); - count++; } clock_gettime(CLOCK_MONOTONIC, &end); @@ -508,10 +528,10 @@ int main(int argc __attribute__((__unused__)), char *argv[] __attribute__((__unu end.tv_nsec += 1000000000; } - fps = count / (end.tv_sec + end.tv_nsec / 1000000000.0); + fps = frame_count / (end.tv_sec + end.tv_nsec / 1000000000.0); - printf("%u images processed in %lu.%06lu seconds (%f fps)\n", count, - end.tv_sec, end.tv_nsec / 1000, fps); + printf("%u images processed in %lu.%06lu seconds (%f fps)\n", + frame_count, end.tv_sec, end.tv_nsec / 1000, fps); exit_code = EXIT_SUCCESS; |