diff options
author | Jan Klemkow <j.klemkow@wemelug.de> | 2012-11-14 17:16:16 +0100 |
---|---|---|
committer | Jan Klemkow <j.klemkow@wemelug.de> | 2012-11-14 17:16:16 +0100 |
commit | bfcb903f8ff64c55cf3b4d0789369be495e5dac8 (patch) | |
tree | 63992459c6bdb527fac0129ba0ce5288ead0fd12 | |
parent | 871f4383c4295b2796f46c7faee1a5056b5c95c3 (diff) | |
download | advtime-bfcb903f8ff64c55cf3b4d0789369be495e5dac8.tar.gz advtime-bfcb903f8ff64c55cf3b4d0789369be495e5dac8.tar.bz2 advtime-bfcb903f8ff64c55cf3b4d0789369be495e5dac8.zip |
Add frame diff calculation and getopt.
-rw-r--r-- | src/advtime.c | 86 |
1 files changed, 71 insertions, 15 deletions
diff --git a/src/advtime.c b/src/advtime.c index 5dbe6d7..6144cc3 100644 --- a/src/advtime.c +++ b/src/advtime.c @@ -1,13 +1,37 @@ +#define _XOPEN_SOURCE 500 #include <stdio.h> #include <stdlib.h> #include <stdint.h> +#include <unistd.h> #include "video_decode.h" -static int64_t +static double +frame_diff(struct video_frame *frame_a, struct video_frame *frame_b) +{ + double average = 0; + uint8_t *row_a = frame_a->data, *col_a = NULL; + uint8_t *row_b = frame_b->data, *col_b = NULL; + + for (int y = 0; y < frame_a->height; ++y) { + col_a = row_a; + col_b = row_b; + for (int x = 0; x < frame_a->width; ++x) { + average += abs(*col_a - *col_b); + col_a++; + col_b++; + } + row_a += frame_a->stride; + row_b += frame_b->stride; + } + + return average / (frame_a->width * frame_a->height); +} + +static double frame_average(struct video_frame *frame) { - int64_t average = 0; + double average = 0; uint8_t *row = frame->data; uint8_t *col = NULL; @@ -23,31 +47,63 @@ frame_average(struct video_frame *frame) return average / (frame->width * frame->height); } +static void +usage(void) +{ + fprintf(stderr, "advtime [-a] [-d] FILE\n"); + exit(EXIT_FAILURE); +} + int main(int argc, char **argv) { struct video_decode *vd; - struct video_frame *frame; - int ret; + struct video_frame *frame_a; + struct video_frame *frame_b; + int ret, ch; + int diff_flag = 0, average_flag = 0; int64_t timestamp = 0; - if (argc < 2) - return 1; + while ((ch = getopt(argc, argv, "ad")) != -1) { + switch (ch) { + case 'a': + average_flag = 1; + break; + case 'd': + diff_flag = 1; + break; + default: + usage(); + /* NOTREACHED */ + } + } + argc -= optind; + argv += optind; + + if (argc < 1) + usage(); - if (argc == 3 && strtol(argv[2], NULL, 10) > 0) - timestamp = strtol(argv[2], NULL, 10); + if (argc == 2 && strtol(argv[1], NULL, 10) > 0) + timestamp = strtol(argv[1], NULL, 10); - ret = video_decode_init(&vd, argv[1], timestamp); + ret = video_decode_init(&vd, argv[0], timestamp); if (ret < 0) return -ret; - while (video_decode_get_frame(vd, &frame) == 0) { - printf("%ld\n", frame_average(frame)); - video_decode_free_frame(&frame); - } + ret = video_decode_get_frame(vd, &frame_a); + if (ret < 0) + return -ret; -// pgm_save(frame->data, frame->stride, frame->width, frame->height, -// argv[2]); + while (video_decode_get_frame(vd, &frame_b) == 0) { + if (average_flag == 1) + printf("%f\n", frame_average(frame_a)); + if (diff_flag == 1) + printf("%f\n", frame_diff(frame_a, frame_b)); + video_decode_free_frame(&frame_a); + frame_a = frame_b; + } + video_decode_free_frame(&frame_b); video_decode_uninit(&vd); + return EXIT_SUCCESS; } |