annotate ffmpeg/tools/yuvcmp.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 * originally by Andreas Ă–man (andoma)
yading@11 3 * some changes by Alexander Strange
yading@11 4 */
yading@11 5
yading@11 6 #include <string.h>
yading@11 7 #include <stdlib.h>
yading@11 8 #include <inttypes.h>
yading@11 9 #include <stdio.h>
yading@11 10 #include <sys/stat.h>
yading@11 11 #include <fcntl.h>
yading@11 12 #include <unistd.h>
yading@11 13
yading@11 14
yading@11 15 int
yading@11 16 main(int argc, char **argv)
yading@11 17 {
yading@11 18 int fd[2];
yading@11 19 int print_pixels = 0;
yading@11 20 int dump_blocks = 0;
yading@11 21
yading@11 22 int width;
yading@11 23 int height;
yading@11 24 int to_skip = 0;
yading@11 25
yading@11 26 if (argc < 6) {
yading@11 27 fprintf(stderr, "%s [YUV file 1] [YUV file 2] width height pixelcmp|blockdump (# to skip)\n", argv[0]);
yading@11 28 return 1;
yading@11 29 }
yading@11 30
yading@11 31 width = atoi(argv[3]);
yading@11 32 height = atoi(argv[4]);
yading@11 33 if (argc > 6)
yading@11 34 to_skip = atoi(argv[6]);
yading@11 35
yading@11 36 uint8_t *Y[2], *C[2][2];
yading@11 37 int i, v, c, p;
yading@11 38 int lsiz = width * height;
yading@11 39 int csiz = width * height / 4;
yading@11 40 int x, y;
yading@11 41 int cwidth = width / 2;
yading@11 42 int fr = to_skip;
yading@11 43 int mb;
yading@11 44 char *mberrors;
yading@11 45 int mb_x, mb_y;
yading@11 46 uint8_t *a;
yading@11 47 uint8_t *b;
yading@11 48 int die = 0;
yading@11 49
yading@11 50 print_pixels = strstr(argv[5], "pixelcmp") ? 1 : 0;
yading@11 51 dump_blocks = strstr(argv[5], "blockdump") ? 1 : 0;
yading@11 52
yading@11 53 for(i = 0; i < 2; i++) {
yading@11 54 Y[i] = malloc(lsiz);
yading@11 55 C[0][i] = malloc(csiz);
yading@11 56 C[1][i] = malloc(csiz);
yading@11 57
yading@11 58 fd[i] = open(argv[1 + i], O_RDONLY);
yading@11 59 if(fd[i] == -1) {
yading@11 60 perror("open");
yading@11 61 exit(1);
yading@11 62 }
yading@11 63 fcntl(fd[i], F_NOCACHE, 1);
yading@11 64
yading@11 65 if (to_skip)
yading@11 66 lseek(fd[i], to_skip * (lsiz + 2*csiz), SEEK_SET);
yading@11 67 }
yading@11 68
yading@11 69 mb_x = width / 16;
yading@11 70 mb_y = height / 16;
yading@11 71
yading@11 72 mberrors = malloc(mb_x * mb_y);
yading@11 73
yading@11 74 while(!die) {
yading@11 75 memset(mberrors, 0, mb_x * mb_y);
yading@11 76
yading@11 77 printf("Loading frame %d\n", ++fr);
yading@11 78
yading@11 79 for(i = 0; i < 2; i++) {
yading@11 80 v = read(fd[i], Y[i], lsiz);
yading@11 81 if(v != lsiz) {
yading@11 82 fprintf(stderr, "Unable to read Y from file %d, exiting\n", i + 1);
yading@11 83 return 1;
yading@11 84 }
yading@11 85 }
yading@11 86
yading@11 87
yading@11 88 for(c = 0; c < lsiz; c++) {
yading@11 89 if(Y[0][c] != Y[1][c]) {
yading@11 90 x = c % width;
yading@11 91 y = c / width;
yading@11 92
yading@11 93 mb = x / 16 + (y / 16) * mb_x;
yading@11 94
yading@11 95 if(print_pixels)
yading@11 96 printf("Luma diff 0x%02x != 0x%02x at pixel (%4d,%-4d) mb(%d,%d) #%d\n",
yading@11 97 Y[0][c],
yading@11 98 Y[1][c],
yading@11 99 x, y,
yading@11 100 x / 16,
yading@11 101 y / 16,
yading@11 102 mb);
yading@11 103
yading@11 104 mberrors[mb] |= 1;
yading@11 105 }
yading@11 106 }
yading@11 107
yading@11 108 /* Chroma planes */
yading@11 109
yading@11 110 for(p = 0; p < 2; p++) {
yading@11 111
yading@11 112 for(i = 0; i < 2; i++) {
yading@11 113 v = read(fd[i], C[p][i], csiz);
yading@11 114 if(v != csiz) {
yading@11 115 fprintf(stderr, "Unable to read %c from file %d, exiting\n",
yading@11 116 "UV"[p], i + 1);
yading@11 117 return 1;
yading@11 118 }
yading@11 119 }
yading@11 120
yading@11 121 for(c = 0; c < csiz; c++) {
yading@11 122 if(C[p][0][c] != C[p][1][c]) {
yading@11 123 x = c % cwidth;
yading@11 124 y = c / cwidth;
yading@11 125
yading@11 126 mb = x / 8 + (y / 8) * mb_x;
yading@11 127
yading@11 128 mberrors[mb] |= 2 << p;
yading@11 129
yading@11 130 if(print_pixels)
yading@11 131
yading@11 132 printf("c%c diff 0x%02x != 0x%02x at pixel (%4d,%-4d) "
yading@11 133 "mb(%3d,%-3d) #%d\n",
yading@11 134 p ? 'r' : 'b',
yading@11 135 C[p][0][c],
yading@11 136 C[p][1][c],
yading@11 137
yading@11 138 x, y,
yading@11 139 x / 8,
yading@11 140 y / 8,
yading@11 141 x / 8 + y / 8 * cwidth / 8);
yading@11 142 }
yading@11 143 }
yading@11 144 }
yading@11 145
yading@11 146 for(i = 0; i < mb_x * mb_y; i++) {
yading@11 147 x = i % mb_x;
yading@11 148 y = i / mb_x;
yading@11 149
yading@11 150 if(mberrors[i]) {
yading@11 151 die = 1;
yading@11 152
yading@11 153 printf("MB (%3d,%-3d) %4d %d %c%c%c damaged\n",
yading@11 154 x, y, i, mberrors[i],
yading@11 155 mberrors[i] & 1 ? 'Y' : ' ',
yading@11 156 mberrors[i] & 2 ? 'U' : ' ',
yading@11 157 mberrors[i] & 4 ? 'V' : ' ');
yading@11 158
yading@11 159 if(dump_blocks) {
yading@11 160 a = Y[0] + x * 16 + y * 16 * width;
yading@11 161 b = Y[1] + x * 16 + y * 16 * width;
yading@11 162
yading@11 163 for(y = 0; y < 16; y++) {
yading@11 164 printf("%c ", "TB"[y&1]);
yading@11 165 for(x = 0; x < 16; x++)
yading@11 166 printf("%02x%c", a[x + y * width],
yading@11 167 a[x + y * width] != b[x + y * width] ? '<' : ' ');
yading@11 168
yading@11 169 printf("| ");
yading@11 170 for(x = 0; x < 16; x++)
yading@11 171 printf("%02x%c", b[x + y * width],
yading@11 172 a[x + y * width] != b[x + y * width] ? '<' : ' ');
yading@11 173
yading@11 174 printf("\n");
yading@11 175 }
yading@11 176 }
yading@11 177 }
yading@11 178 }
yading@11 179 }
yading@11 180
yading@11 181 return 0;
yading@11 182 }