#define _XOPEN_SOURCE 500 #include #include #include #include #include #include "video_decode.h" #include "util.h" static void usage(void) { fprintf(stderr, "findcut [-dh] [-t THRESHOLD] VIDEO CUT\n" "\n" "OPTIONS\n" "\t-d\tprint diff for every frame\n" "\t-h\tprint this help message\n" "\t-t\tthreshold matching\n" "\t-T\tprint timestamp of every frame\n"); exit(EXIT_FAILURE); } int main(int argc, char **argv) { struct video_decode *video_vd; struct video_decode *cut_vd; struct video_frame *cur_frame = NULL, *cut_frame = NULL; int ret, ch; int diff_flag = 0, time_flag = 0, range_flag = 0, last_flag = 0; int64_t timestamp = 0; int64_t threshold = 10; double diff = 0.0; while ((ch = getopt(argc, argv, "dtThrl")) != -1) { switch (ch) { case 'd': diff_flag = 1; /* print diff of every frame */ break; case 't': threshold = strtol(optarg, NULL, 10); break; case 'T': time_flag = 1; break; case 'r': range_flag = 1; break; case 'l': last_flag = 1; break; case 'h': default: usage(); /* NOTREACHED */ } } argc -= optind; argv += optind; if (argc < 2) usage(); ret = video_decode_init(&cut_vd, argv[1], timestamp); if (ret < 0) return -ret; /* just get first frame of the cut */ video_decode_get_frame(cut_vd, &cut_frame); ret = video_decode_init(&video_vd, argv[0], timestamp); if (ret < 0) return -ret; int64_t last_time=0; for (int i = 0; video_decode_get_frame(video_vd, &cur_frame) > 0; ++i) { diff = frame_diff(cut_frame, cur_frame); if (diff <= threshold || diff_flag) { int64_t time = last_flag ? last_time : cur_frame->dts; if (time_flag) printf("%" PRId64, time); else print_time(time); if (range_flag) { printf(" "); if (time_flag) printf("%" PRId64, cur_frame->dts+cut_vd->duration); else print_time(cur_frame->dts+cut_vd->duration); printf("\n"); } else printf(" %f\n", diff); fflush(stdout); } last_time=cur_frame->dts; } video_decode_free_frame(&cur_frame); video_decode_free_frame(&cut_frame); video_decode_uninit(&video_vd); video_decode_uninit(&cut_vd); return EXIT_SUCCESS; }