xref: /third_party/ffmpeg/tools/yuvcmp.c (revision cabdff1a)
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