Newer
Older
Import / research / video-compression / build-table.cpp
/*
 * =====================================================================================
 *
 *       Filename:  build-table.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  03/04/2011 22:11:22
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  John Ryland (jryland), jryland@xiaofrog.com
 *        Company:  InvertedLogic
 *
 * =====================================================================================
 */
#include <QApplication>
#include <QPixmap>
#include <QImage>
#include <stdio.h>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

printf("starting\n");

    const int size = 65536*4;
    int *rTableHCnt = (int*)malloc(size);
    int *gTableHCnt = (int*)malloc(size);
    int *bTableHCnt = (int*)malloc(size);

    int *rTableH = (int*)malloc(size);
    int *gTableH = (int*)malloc(size);
    int *bTableH = (int*)malloc(size);

    int *rTableLCnt = (int*)malloc(size);
    int *gTableLCnt = (int*)malloc(size);
    int *bTableLCnt = (int*)malloc(size);

    int *rTableL = (int*)malloc(size);
    int *gTableL = (int*)malloc(size);
    int *bTableL = (int*)malloc(size);

printf("alloced mem\n");

    memset(rTableL, 0, size);
    memset(gTableL, 0, size);
    memset(bTableL, 0, size);

    memset(rTableLCnt, 0, size);
    memset(gTableLCnt, 0, size);
    memset(bTableLCnt, 0, size);

    memset(rTableH, 0, size);
    memset(gTableH, 0, size);
    memset(bTableH, 0, size);

    memset(rTableHCnt, 0, size);
    memset(gTableHCnt, 0, size);
    memset(bTableHCnt, 0, size);

printf("zeroed mem\n");

    const int shift = 4;

    for (int i = 1; i < 100; i++) {
        QImage pix( QString("test/test%1%2.png").arg(i/10).arg(i%10) );
        int w = pix.width();
        int h = pix.height();
        //printf("%i%i wxh: %i, %i\n", i/10, i%10, w, h);


        for (int y = 1; y < h; y++) {
            for (int x = 1; x < w-2; x++) {
                QRgb p1 = pix.pixel(x-1,y-1);
                QRgb p2 = pix.pixel(x,y-1);
                QRgb p3 = pix.pixel(x+1,y-1);
                QRgb p4 = pix.pixel(x-1,y);
                QRgb p = pix.pixel(x,y);
                int r1 = qRed(p1);
                int r2 = qRed(p2);
                int r3 = qRed(p3);
                int r4 = qRed(p4);
                int r = qRed(p);
                int g1 = qGreen(p1);
                int g2 = qGreen(p2);
                int g3 = qGreen(p3);
                int g4 = qGreen(p4);
                int g = qGreen(p);
                int b1 = qBlue(p1);
                int b2 = qBlue(p2);
                int b3 = qBlue(p3);
                int b4 = qBlue(p4);
                int b = qBlue(p);

                int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
                int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
                int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;

                rTableL[rLindex] += r&0xF;
                rTableL[gLindex] += g&0xF;
                rTableL[bLindex] += b&0xF;

                rTableLCnt[rLindex]++;
                rTableLCnt[gLindex]++;
                rTableLCnt[bLindex]++;

                r1 >>= shift;
                r2 >>= shift;
                r3 >>= shift;
                r4 >>= shift;
                g1 >>= shift;
                g2 >>= shift;
                g3 >>= shift;
                g4 >>= shift;
                b1 >>= shift;
                b2 >>= shift;
                b3 >>= shift;
                b4 >>= shift;

                int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
                int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
                int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;

                rTableH[rindex] += r&0xF0;
                rTableH[gindex] += g&0xF0;
                rTableH[bindex] += b&0xF0;

                rTableHCnt[rindex]++;
                rTableHCnt[gindex]++;
                rTableHCnt[bindex]++;
            }
        }

        for (int y = h-2; y >= 0; y--) {
            for (int x = w-2; x >= 1; x--) {
                QRgb p1 = pix.pixel(x+1,y+1);
                QRgb p2 = pix.pixel(x,y+1);
                QRgb p3 = pix.pixel(x-1,y+1);
                QRgb p4 = pix.pixel(x+1,y);
                QRgb p = pix.pixel(x,y);
                int r1 = qRed(p1);
                int r2 = qRed(p2);
                int r3 = qRed(p3);
                int r4 = qRed(p4);
                int r = qRed(p);
                int g1 = qGreen(p1);
                int g2 = qGreen(p2);
                int g3 = qGreen(p3);
                int g4 = qGreen(p4);
                int g = qGreen(p);
                int b1 = qBlue(p1);
                int b2 = qBlue(p2);
                int b3 = qBlue(p3);
                int b4 = qBlue(p4);
                int b = qBlue(p);

                int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
                int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
                int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;

                rTableL[rLindex] += r&0xF;
                rTableL[gLindex] += g&0xF;
                rTableL[bLindex] += b&0xF;

                rTableLCnt[rLindex]++;
                rTableLCnt[gLindex]++;
                rTableLCnt[bLindex]++;

                r1 >>= shift;
                r2 >>= shift;
                r3 >>= shift;
                r4 >>= shift;
                g1 >>= shift;
                g2 >>= shift;
                g3 >>= shift;
                g4 >>= shift;
                b1 >>= shift;
                b2 >>= shift;
                b3 >>= shift;
                b4 >>= shift;

                int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
                int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
                int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;

                rTableH[rindex] += r&0xF0;
                rTableH[gindex] += g&0xF0;
                rTableH[bindex] += b&0xF0;

                rTableHCnt[rindex]++;
                rTableHCnt[gindex]++;
                rTableHCnt[bindex]++;
            }
        }



        for (int x = w-2; x >= 0; x--) {
            for (int y = 1; y < h-2; y++) {
                QRgb p1 = pix.pixel(x+1,y-1);
                QRgb p2 = pix.pixel(x+1,y);
                QRgb p3 = pix.pixel(x+1,y+1);
                QRgb p4 = pix.pixel(x,y-1);
                QRgb p = pix.pixel(x,y);
                int r1 = qRed(p1);
                int r2 = qRed(p2);
                int r3 = qRed(p3);
                int r4 = qRed(p4);
                int r = qRed(p);
                int g1 = qGreen(p1);
                int g2 = qGreen(p2);
                int g3 = qGreen(p3);
                int g4 = qGreen(p4);
                int g = qGreen(p);
                int b1 = qBlue(p1);
                int b2 = qBlue(p2);
                int b3 = qBlue(p3);
                int b4 = qBlue(p4);
                int b = qBlue(p);

                int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
                int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
                int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;

                rTableL[rLindex] += r&0xF;
                rTableL[gLindex] += g&0xF;
                rTableL[bLindex] += b&0xF;

                rTableLCnt[rLindex]++;
                rTableLCnt[gLindex]++;
                rTableLCnt[bLindex]++;

                r1 >>= shift;
                r2 >>= shift;
                r3 >>= shift;
                r4 >>= shift;
                g1 >>= shift;
                g2 >>= shift;
                g3 >>= shift;
                g4 >>= shift;
                b1 >>= shift;
                b2 >>= shift;
                b3 >>= shift;
                b4 >>= shift;

                int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
                int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
                int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;

                rTableH[rindex] += r&0xF0;
                rTableH[gindex] += g&0xF0;
                rTableH[bindex] += b&0xF0;

                rTableHCnt[rindex]++;
                rTableHCnt[gindex]++;
                rTableHCnt[bindex]++;
            }
        }


        for (int x = 1; x < w-1; x++) {
            for (int y = h-2; y >= 1; y--) {
                QRgb p1 = pix.pixel(x-1,y+1);
                QRgb p2 = pix.pixel(x-1,y);
                QRgb p3 = pix.pixel(x-1,y-1);
                QRgb p4 = pix.pixel(x,y+1);
                QRgb p = pix.pixel(x,y);
                int r1 = qRed(p1);
                int r2 = qRed(p2);
                int r3 = qRed(p3);
                int r4 = qRed(p4);
                int r = qRed(p);
                int g1 = qGreen(p1);
                int g2 = qGreen(p2);
                int g3 = qGreen(p3);
                int g4 = qGreen(p4);
                int g = qGreen(p);
                int b1 = qBlue(p1);
                int b2 = qBlue(p2);
                int b3 = qBlue(p3);
                int b4 = qBlue(p4);
                int b = qBlue(p);

                int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
                int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
                int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;

                rTableL[rLindex] += r&0xF;
                rTableL[gLindex] += g&0xF;
                rTableL[bLindex] += b&0xF;

                rTableLCnt[rLindex]++;
                rTableLCnt[gLindex]++;
                rTableLCnt[bLindex]++;

                r1 >>= shift;
                r2 >>= shift;
                r3 >>= shift;
                r4 >>= shift;
                g1 >>= shift;
                g2 >>= shift;
                g3 >>= shift;
                g4 >>= shift;
                b1 >>= shift;
                b2 >>= shift;
                b3 >>= shift;
                b4 >>= shift;

                int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
                int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
                int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;

                rTableH[rindex] += r&0xF0;
                rTableH[gindex] += g&0xF0;
                rTableH[bindex] += b&0xF0;

                rTableHCnt[rindex]++;
                rTableHCnt[gindex]++;
                rTableHCnt[bindex]++;
            }
        }


    }

    printf("Red Table: ");
    for (int i = 0; i < size/4; i++) {
        if ( rTableHCnt[i] )
            rTableH[i] /= rTableHCnt[i];
        if ( gTableHCnt[i] )
            gTableH[i] /= gTableHCnt[i];
        if ( bTableHCnt[i] )
            bTableH[i] /= bTableHCnt[i];
        if ( rTableLCnt[i] )
            rTableL[i] /= rTableLCnt[i];
        if ( gTableLCnt[i] )
            gTableL[i] /= gTableLCnt[i];
        if ( bTableLCnt[i] )
            bTableL[i] /= bTableLCnt[i];
        //printf("%i, ", rTable[i]);
        
        //rTableH[i] &= 0xF0;
        //gTableH[i] &= 0xF0;
        //bTableH[i] &= 0xF0;
        
        rTableL[i] &= 0xF;
        gTableL[i] &= 0xF;
        bTableL[i] &= 0xF;
    }

    FILE *f = fopen("blah.out", "w");

    int cnt2 = 0;
    int cnt4 = 0;
    int cnt8 = 0;
    int cnt16 = 0;
    int cnt32 = 0;
    int cnt64 = 0;
    int cnt128 = 0;
    int cnt256 = 0;

    for (int i = 1; i < 100; i++) {
        QImage pix( QString("test/test%1%2.png").arg(i/10).arg(i%10) );
        int w = pix.width();
        int h = pix.height();

        for (int y = 1; y < h; y++) {
            for (int x = 1; x < w-2; x++) {
                QRgb p1 = pix.pixel(x-1,y-1);
                QRgb p2 = pix.pixel(x,y-1);
                QRgb p3 = pix.pixel(x+1,y-1);
                QRgb p4 = pix.pixel(x-1,y);
                QRgb p = pix.pixel(x,y);
                int r1 = qRed(p1);
                int r2 = qRed(p2);
                int r3 = qRed(p3);
                int r4 = qRed(p4);
                int r = qRed(p);
                int g1 = qGreen(p1);
                int g2 = qGreen(p2);
                int g3 = qGreen(p3);
                int g4 = qGreen(p4);
                int g = qGreen(p);
                int b1 = qBlue(p1);
                int b2 = qBlue(p2);
                int b3 = qBlue(p3);
                int b4 = qBlue(p4);
                int b = qBlue(p);

                int rLindex= ((r1&0xF)<<(shift*3) | (r2&0xF)<<(shift*2) | (r3&0xF)<<shift | (r4&0xF)) & 0xFFFF;
                int gLindex= ((g1&0xF)<<(shift*3) | (g2&0xF)<<(shift*2) | (g3&0xF)<<shift | (g4&0xF)) & 0xFFFF;
                int bLindex= ((b1&0xF)<<(shift*3) | (b2&0xF)<<(shift*2) | (b3&0xF)<<shift | (b4&0xF)) & 0xFFFF;

                r1 >>= shift;
                r2 >>= shift;
                r3 >>= shift;
                r4 >>= shift;
                g1 >>= shift;
                g2 >>= shift;
                g3 >>= shift;
                g4 >>= shift;
                b1 >>= shift;
                b2 >>= shift;
                b3 >>= shift;
                b4 >>= shift;

                int rindex= (r1<<(shift*3) | r2<<(shift*2) | r3<<shift | r4) & 0xFFFF;
                int gindex= (g1<<(shift*3) | g2<<(shift*2) | g3<<shift | g4) & 0xFFFF;
                int bindex= (b1<<(shift*3) | b2<<(shift*2) | b3<<shift | b4) & 0xFFFF;

                int pr = rTableH[rindex] | rTableL[rLindex];
                int pg = rTableH[gindex] | rTableL[gLindex];
                int pb = rTableH[bindex] | rTableL[bLindex];

                //pr = (r1*10+r2*14+r3*10+r4*14)/48;
                //pg = (g1*10+g2*14+g3*10+g4*14)/48;
                //pb = (b1*10+b2*14+b3*10+b4*14)/48;

                //printf(",%i,%i,%i", r-pr, g-pg, b-pb);
               
                int ar = r-pr; if (ar<0) ar = -ar;
                int ag = g-pg; if (ag<0) ag = -ag;
                int ab = b-pb; if (ab<0) ab = -ab;

                if ( ar < 2 )
                    cnt2++;
                if ( ag < 2 )
                    cnt2++;
                if ( ab < 2 )
                    cnt2++;
                if ( ar >= 2 && ar < 4 )
                    cnt4++;
                if ( ag >= 2 && ag < 4 )
                    cnt4++;
                if ( ab >= 2 && ab < 4 )
                    cnt4++;
                if ( ar >= 4 && ar < 8 )
                    cnt8++;
                if ( ag >= 4 && ag < 8 )
                    cnt8++;
                if ( ab >= 4 && ab < 8 )
                    cnt8++;
                if ( ar >= 8 && ar < 16 )
                    cnt16++;
                if ( ag >= 8 && ag < 16 )
                    cnt16++;
                if ( ab >= 8 && ab < 16 )
                    cnt16++;
                if ( ar >= 16 && ar < 32 )
                    cnt32++;
                if ( ag >= 16 && ag < 32 )
                    cnt32++;
                if ( ab >= 16 && ab < 32 )
                    cnt32++;
                if ( ar >= 32 && ar < 64 )
                    cnt64++;
                if ( ag >= 32 && ag < 64 )
                    cnt64++;
                if ( ab >= 32 && ab < 64 )
                    cnt64++;
                if ( ar >= 64 && ar < 128 )
                    cnt128++;
                if ( ag >= 64 && ag < 128 )
                    cnt128++;
                if ( ab >= 64 && ab < 128 )
                    cnt128++;
                if ( ar >= 128 )
                    cnt256++;
                if ( ag >= 128 )
                    cnt256++;
                if ( ab >= 128 )
                    cnt256++;
                
                unsigned char a1 = r-pr;
                unsigned char a2 = g-pg;
                unsigned char a3 = b-pb;

                fwrite(&a1, 1, 1, f);
                fwrite(&a2, 1, 1, f);
                fwrite(&a3, 1, 1, f);

                //fwrite(&r, 1, 1, f);
                //fwrite(&g, 1, 1, f);
                //fwrite(&b, 1, 1, f);
            }
            //printf("\n");
        }
                
    }

    fclose(f);
    printf("\n");
    printf(" cnt 2   : %i\n", cnt2);
    printf(" cnt 4   : %i\n", cnt4);
    printf(" cnt 8   : %i\n", cnt8);
    printf(" cnt 16  : %i\n", cnt16);
    printf(" cnt 32  : %i\n", cnt32);
    printf(" cnt 64  : %i\n", cnt64);
    printf(" cnt 128 : %i\n", cnt128);
    printf(" cnt 256 : %i\n", cnt256);

    return 0;//app.exec();
}