#include #include #include "libavcodec/colorspace.h" int clip_uint8(int v) { if (v < 0) return 0; if (v > 255) return 255; return v; } int main() { int r, g, b, y, u, v, i = 0; int y1, u1, v1, y2, u2, v2; int y0, r0, g0, b0, r1, g1, b1; int r2, g2, b2; int step = 8; for (r = 0; r <= 256; r += step) { if (r == 256) r = 255; for (g = 0; g <= 256; g += step) { if (g == 256) g = 255; for (b = 0; b <= 256; b += step) { if (b == 256) b = 255; y = (257 * r + 504 * g + 98 * b + 16500) / 1000; u = (-148 * r - 291 * g + 439 * b + 128500) / 1000; v = (439 * r - 368 * g - 71 * b + 128500) / 1000; y1 = RGB_TO_Y_CCIR(r, g, b); u1 = RGB_TO_U_CCIR(r, g, b, 0); v1 = RGB_TO_V_CCIR(r, g, b, 0); y0 = (y-16)*255/219; r0 = y0 + 1.4022*(u-128); g0 = y0 - 0.3456*(u-128) - 0.7145*(v-128); b0 = y0 + 1.7710*(v-128); r2 = y0 + 1.403*(v-128); g2 = y0 - 0.344*(u-128) - 0.714*(v-128); b2 = y0 + 1.770*(u-128); if (y < 16 || y > 235) printf("\n outbound y: %d\n", y); if (y1 < 16 || y1 > 235) printf("\n outbound y1: %d\n", y1); if (r0 < 0 || r0 > 255) { printf("\n outbound r0: %d\n", r0); if (r0 < 0) r0 = 0; else r0 = 255; } if (g0 < 0 || g0 > 255) { printf("\n outbound g0: %d\n", g0); if (g0 < 0) g0 = 0; else g0 = 255; } if (b0 < 0 || b0 > 255) { printf("\n outbound b0: %d\n", b0); if (b0 < 0) b0 = 0; else b0 = 255; } y2 = clip_uint8( 0.1494 * r0 + 0.6061 * g0 + 0.2445 * b0); u2 = clip_uint8( 0.6066 * r0 - 0.4322 * g0 - 0.1744 * b0 + 128); v2 = clip_uint8(-0.08435 * r0 - 0.3422 * g0 + 0.4266 * b0 + 128); y2 = y2*219/255.0+16; if (abs(y - y2) >= 8 || abs(u - u2) >= 8 || abs(v - v2) >= 8) printf("\n far range between original and reverted yuv\n"); if (y2 < 16 || y2 > 235) printf("\n y2y2y2y2y2y2y2y2y2outbound y2: %d\n", y2); y2 = (y2 - 16) * 255 / 219; r1 = y2 + 1.403*(v2-128); g1 = y2 - 0.344*(u2-128) - 0.714*(v2-128); b1 = y2 + 1.770*(u2-128); // if (y != y1 || u != u1 || v != v1) { printf("%02x%02x%02x => %02x%02x%02x ", r, g, b, y, u, v); printf("%02x%02x%02x => %02x%02x%02x ", y1, u1, v1, r0, g0, b0); printf("%02x%02x%02x ", r2, g2, b2); printf("=> %02x%02x%02x => %02x%02x%02x", y2, u2, v2, r1, g1, b1); // if (++i % 2 == 0) printf("\n"); // } } } } printf("\n"); return 0; }