#include #include "dct.h" #include "bmpjpeg.h" #define ENCODE 0 #define DECODE 1 #define MAXROWS 1024 #define MAXCOLS 768 #define HEADER 54 #define SOI_MK 0xFFD8 /* start of image */ #define SOF_MK 0xFFC0 /* start of frame */ #define EOI_MK 0xFFD9 /* end of image */ #define DRI_MK 0xFFDD /* restart interval */ #define get_size(fi) (((unsigned int)Image1[fi]) << 8) + (unsigned int)Image1[fi+1] unsigned char Image1[MAXCOLS*3*MAXROWS+HEADER]; int main(int argc, char *argv[]) { int retval, i; int workspace[DCTSIZE_BLOCK]; unsigned char blok8x8[64*3]; int type, hCounter = 0; int x_size, y_size, offset, depth; char *fileIn, *fileOut; FILE *fI, *fO; unsigned char ch, mrgb[3]; unsigned int aux; /*******************************************************************************************/ /* Just for testing on the PC */ if(argc != 4) { printf("need more arguments, 0|1 for de/encrypt and 2 more for the in/ouput files"); return 0; } type = atoi(argv[1]); fileIn = argv[2]; fileOut = argv[3]; if (NULL == (fI = fopen(fileIn, "rb"))){ printf("unable to open the file to read from (%s)",fileIn); return 0; } if ((fO = fopen(fileOut,"wb")) == NULL) { printf("unable to open the file to write (%s)",fileOut); return 0; } /* Read the max possible size to the memory */ fread(Image1, sizeof(unsigned char), (MAXROWS*MAXCOLS*3+HEADER), fI); /*******************************************************************************************/ /* The image must be in the memory by now */ switch(type) { case ENCODE: offset = ((int)Image1[13] << 24) + ((int)Image1[12] << 16) + ((int)Image1[11] << 8) + Image1[10]; x_size = ((int)Image1[21] << 24) + ((int)Image1[20] << 16) + ((int)Image1[19] << 8) + Image1[18]; y_size = ((int)Image1[25] << 24) + ((int)Image1[24] << 16) + ((int)Image1[23] << 8) + Image1[22]; depth = ((int)Image1[29] << 8) + Image1[28]; /**/ printf("Image Resolution: %d x %d x %i Offset: %i\n", x_size, y_size, depth, offset); break; case DECODE: /* First find the SOI marker: */ aux = get_size(hCounter); hCounter+=2; if (aux != SOI_MK) { printf("INFO:\tNO SOI marker!\n"); return 0;} printf("%ld:\tINFO:\tFound the SOI marker!\n", hCounter); /* Read first marker */ while( aux != SOF_MK) { aux = get_size(hCounter); hCounter+=2; if(aux == SOF_MK) { get_size(hCounter); hCounter+=2; /* header size, don't care */ /* load basic image parameters */ hCounter++; /* precision, 8bit, don't care */ y_size = get_size(hCounter); hCounter+=2; x_size = get_size(hCounter); hCounter+=2; printf("\tINFO:\tImage size is %d by %d\n", x_size, y_size); depth = Image1[hCounter]; /* # of components */ printf("\tINFO:\t"); switch (depth) { case 1: printf("Monochrome"); break; case 3: printf("Color"); break; default: printf("Not a"); break; } printf(" JPEG image!\n"); return 0; } else { hCounter = hCounter + get_size(hCounter); } } } retval = 0; type = ENCODE; printf("Before:"); for(i=0;i<(x_size*y_size*3);i++) { if((i%24)==0) printf("\n"); printf("%02x ",Image1[i+offset]); } printf("\nBMPto8x8 functie\n"); BMPto8x8AndYCbCr(0,0,x_size,y_size,offset,depth,Image1,blok8x8); printf("\n8x8 Blok:\n"); for(i=0;i<64;i++) { printf("%02x",blok8x8[i]); } for(i=0;i<(x_size*y_size*3);i++) { Image1[i+offset] = 0; } printf("\n8x8toBMP functie\n"); YCbCrAnd8x8toBMP(0,0,x_size,y_size,offset,depth,Image1,blok8x8); printf("\nAfter:\n"); for(i=0;i<(x_size*y_size*3);i++) { if((i%24)==0) printf("\n"); printf("%02x ",Image1[i+offset]); } switch(type) { case ENCODE: // RGB -> YUV ---> done // Convert to 8x8 --> done //BMPto8x8AndYCbCr(0,0,x_size,y_size,offset,depth,Image1,blok8x8); // DCT fdct(workspace); // ZZ // Q // VLC (huffman) break; case DECODE: // VLD (huffman) // IQ // ZZ // IDCT //idct(workspace); // Convert 8x8 to BMP style -> done // YUV -> RGB // YCbCrAnd8x8toBMP() break; } return retval; }