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