From b0e57067b2b60fb42c2695569bc1cc7f53b024f4 Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Sun, 5 Jun 2005 14:53:00 +0000 Subject: Made it optimized. --- src/bmpjpeg.c | 102 +++++----------- src/fdct.c | 54 ++++++--- src/idct.c | 20 +++- src/main.c | 365 +++++++++++++++++++++------------------------------------- 4 files changed, 212 insertions(+), 329 deletions(-) diff --git a/src/bmpjpeg.c b/src/bmpjpeg.c index 66e34b2..e8470e7 100644 --- a/src/bmpjpeg.c +++ b/src/bmpjpeg.c @@ -1,72 +1,34 @@ -#include "color.h" - -void BMPto8x8AndYCbCr(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int offset, unsigned char depth ,unsigned char *Image, int *blok8x8) +void BMPto8x8AndYCbCr(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int offset, unsigned char *Image, int *blok8x8) { unsigned char i,color; int x,y,Start_point; -// printf("\nBMPto8x8AndYCbCr:\n"); - depth = depth/8; - Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x))*depth; - for(i=0;i<(64*depth);i+=depth) + Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x)); + for(i=0;i<64;i++) { -// if((i%8)==0) printf("\n"); - if((Start_y+(i/(8*depth))) < ImageSize_y) + if((Start_y+(i/8)) < ImageSize_y) { - if((Start_x+((i%(8*depth))/depth)) < ImageSize_x) - { - if(depth == 3) - { - RGB2YCbCr(Image[Start_point+(i%(8*depth)) -(i/(8*depth))*(ImageSize_x*depth)], - Image[Start_point+(i%(8*depth))+1-(i/(8*depth))*(ImageSize_x*depth)], - Image[Start_point+(i%(8*depth))+2-(i/(8*depth))*(ImageSize_x*depth)], - &blok8x8[i],&blok8x8[i+1],&blok8x8[i+2]); - - // printf("%02x%02x%02x|",blok8x8[i+0],blok8x8[i+1],blok8x8[i+2]); - } - if(depth == 1) - { - blok8x8[i] = Image[Start_point+(i%(8*depth))-(i/(8*depth))*(ImageSize_x*depth)]; -// printf("%02x ",blok8x8[i]); - } - } + if((Start_x+(i%8)) < ImageSize_x) + blok8x8[i] = Image[Start_point+(i%8)-(i/8)*(ImageSize_x)]; } else - i = (64*depth); + i = 64; } } -void YCbCrAnd8x8toBMP(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int offset, unsigned char depth ,unsigned char *Image, unsigned char *blok8x8) +void YCbCrAnd8x8toBMP(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int offset,unsigned char *Image, unsigned char *blok8x8) { unsigned char i; int x,y,Start_point; -// printf("\nYCbCrAnd8x8toBMP:\n"); - depth = depth/8; - Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x))*depth; - for(i=0;i<(64*depth);i+=depth) + Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x)); + for(i=0;i<64;i++) { -// if((i%8)==0) printf("\n"); - if((Start_y+(i/(8*depth))) < ImageSize_y) + if((Start_y+(i/8)) < ImageSize_y) { - if((Start_x+((i%(8*depth))/depth)) < ImageSize_x) - { - if(depth == 3) - { - YCbCr2RGB(blok8x8[i+0],blok8x8[i+1],blok8x8[i+2], - &Image[Start_point+(i%(8*depth)) -(i/(8*depth))*(ImageSize_x*depth)], - &Image[Start_point+(i%(8*depth))+1-(i/(8*depth))*(ImageSize_x*depth)], - &Image[Start_point+(i%(8*depth))+2-(i/(8*depth))*(ImageSize_x*depth)]); - - // printf("%02x%02x%02x|",blok8x8[i+0],blok8x8[i+1],blok8x8[i+2]); - } - if(depth == 1) - { - Image[Start_point+(i%(8*depth))-(i/(8*depth))*(ImageSize_x*depth)] = blok8x8[i]; -// printf("%02x ",blok8x8[i]); - } - } + if((Start_x+(i%8)) < ImageSize_x) + Image[Start_point+(i%8)-(i/8)*(ImageSize_x)] = blok8x8[i]; } else - i = (64*depth); + i = 64; } } @@ -80,30 +42,30 @@ void BMPto8x8(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int of unsigned char i; int x,y,Start_point; depth = depth/8; - Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x))*depth; - for(i=0;i<(64*depth);i+=depth) + Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x)); + for(i=0;i<(64);i+=depth) { if((i%8)==0) printf("\n"); - if((Start_y+(i/(8*depth))) < ImageSize_y) + if((Start_y+(i/(8))) < ImageSize_y) { - if((Start_x+((i%(8*depth))/depth)) < ImageSize_x) + if((Start_x+((i%(8))/depth)) < ImageSize_x) { if(depth == 3) { - blok8x8[i+2] = Image[Start_point+(i%(8*depth)) -(i/(8*depth))*(ImageSize_x*depth)]; //R - blok8x8[i+1] = Image[Start_point+(i%(8*depth))+1-(i/(8*depth))*(ImageSize_x*depth)]; //G - blok8x8[i+0] = Image[Start_point+(i%(8*depth))+2-(i/(8*depth))*(ImageSize_x*depth)]; //B + blok8x8[i+2] = Image[Start_point+(i%(8)) -(i/(8))*(ImageSize_x)]; //R + blok8x8[i+1] = Image[Start_point+(i%(8))+1-(i/(8))*(ImageSize_x)]; //G + blok8x8[i+0] = Image[Start_point+(i%(8))+2-(i/(8))*(ImageSize_x)]; //B printf("%02x%02x%02x|",blok8x8[i+0],blok8x8[i+1],blok8x8[i+2]); } if(depth == 1) { - blok8x8[i+0] = Image[Start_point+(i%(8*depth))-(i/(8*depth))*(ImageSize_x*depth)]; + blok8x8[i+0] = Image[Start_point+(i%(8))-(i/(8))*(ImageSize_x)]; printf("%02x ",blok8x8[i]); } } } else - i = (64*depth); + i = (64); } } @@ -112,30 +74,30 @@ void B8x8toBMP(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int o unsigned char i; int x,y,Start_point; depth = depth/8; - Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x))*depth; - for(i=0;i<(64*depth);i+=depth) + Start_point = offset + (ImageSize_x*(ImageSize_y-1)+Start_x-(Start_y*ImageSize_x)); + for(i=0;i<(64);i+=depth) { if((i%8)==0) printf("\n"); - if((Start_y+(i/(8*depth))) < ImageSize_y) + if((Start_y+(i/(8))) < ImageSize_y) { - if((Start_x+((i%(8*depth))/depth)) < ImageSize_x) + if((Start_x+((i%(8))/depth)) < ImageSize_x) { if(depth == 3) { - Image[Start_point+(i%(8*depth)) -(i/(8*depth))*(ImageSize_x*depth)] = blok8x8[i+2]; //R - Image[Start_point+(i%(8*depth))+1-(i/(8*depth))*(ImageSize_x*depth)] = blok8x8[i+1]; //G - Image[Start_point+(i%(8*depth))+2-(i/(8*depth))*(ImageSize_x*depth)] = blok8x8[i+0]; //B + Image[Start_point+(i%(8)) -(i/(8))*(ImageSize_x)] = blok8x8[i+2]; //R + Image[Start_point+(i%(8))+1-(i/(8))*(ImageSize_x)] = blok8x8[i+1]; //G + Image[Start_point+(i%(8))+2-(i/(8))*(ImageSize_x)] = blok8x8[i+0]; //B printf("%02x%02x%02x|",blok8x8[i+0],blok8x8[i+1],blok8x8[i+2]); } if(depth == 1) { - Image[Start_point+(i%(8*depth))-(i/(8*depth))*(ImageSize_x*depth)] = blok8x8[i+0]; + Image[Start_point+(i%(8))-(i/(8))*(ImageSize_x)] = blok8x8[i+0]; printf("%02x ",blok8x8[i]); } } } else - i = (64*depth); + i = (64); } } diff --git a/src/fdct.c b/src/fdct.c index 2dab7c5..5552856 100644 --- a/src/fdct.c +++ b/src/fdct.c @@ -1,7 +1,6 @@ #include "dct.h" /* Private declarations for DCT subsystem */ #define DCTSIZE 8 -#define INT32 int #define DESCALE(x,shft) ((x) >> (shft)) #define MULTIPLY(var,const) ((var) * (const)) @@ -9,29 +8,29 @@ #define CONST_BITS 13 #define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#define FIX_0_298631336 ((int) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((int) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((int) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((int) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((int) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((int) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((int) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((int) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((int) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((int) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((int) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((int) 25172) /* FIX(3.072711026) */ /* * Perform the forward DCT on one block of samples. */ -void jpeg_fdct_ifast (DCTELEM * data) +void jpeg_fdct_ifast (DCTELEM * data, unsigned char * qdata) { - INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int tmp10, tmp11, tmp12, tmp13; + int z1, z2, z3, z4, z5; DCTELEM *dataptr; int ctr; //SHIFT_TEMPS @@ -42,6 +41,16 @@ void jpeg_fdct_ifast (DCTELEM * data) dataptr = data; for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + dataptr[0] = dataptr[0] - 128; + dataptr[1] = dataptr[1] - 128; + dataptr[2] = dataptr[2] - 128; + dataptr[3] = dataptr[3] - 128; + dataptr[4] = dataptr[4] - 128; + dataptr[5] = dataptr[5] - 128; + dataptr[6] = dataptr[6] - 128; + dataptr[7] = dataptr[7] - 128; + + tmp0 = dataptr[0] + dataptr[7]; tmp7 = dataptr[0] - dataptr[7]; tmp1 = dataptr[1] + dataptr[6]; @@ -157,11 +166,20 @@ void jpeg_fdct_ifast (DCTELEM * data) z3 += z5; z4 += z5; - dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS+PASS1_BITS); //dataptr[DCTSIZE*1] = (dataptr[DCTSIZE*1] / 8)/ qdata[DCTSIZE*1] dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS+PASS1_BITS); dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS+PASS1_BITS); dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*0] = (dataptr[DCTSIZE*0] / 8)/ qdata[DCTSIZE*0]; + dataptr[DCTSIZE*1] = (dataptr[DCTSIZE*1] / 8)/ qdata[DCTSIZE*1]; + dataptr[DCTSIZE*2] = (dataptr[DCTSIZE*2] / 8)/ qdata[DCTSIZE*2]; + dataptr[DCTSIZE*3] = (dataptr[DCTSIZE*3] / 8)/ qdata[DCTSIZE*3]; + dataptr[DCTSIZE*4] = (dataptr[DCTSIZE*4] / 8)/ qdata[DCTSIZE*4]; + dataptr[DCTSIZE*5] = (dataptr[DCTSIZE*5] / 8)/ qdata[DCTSIZE*5]; + dataptr[DCTSIZE*6] = (dataptr[DCTSIZE*6] / 8)/ qdata[DCTSIZE*6]; + dataptr[DCTSIZE*7] = (dataptr[DCTSIZE*7] / 8)/ qdata[DCTSIZE*7]; + dataptr++; /* advance pointer to next column */ } } diff --git a/src/idct.c b/src/idct.c index 2b20b8c..de1e009 100644 --- a/src/idct.c +++ b/src/idct.c @@ -76,18 +76,28 @@ idct_1d(int *Y) } /* Inverse 2-D Discrete Cosine Transform. */ -void -IDCT(const int input[64], unsigned char *output) +// dequanize_data_IDCT(blok8x8,quan_data,blok8x8_2); +//void IDCT(int input[64], unsigned char *output) +void dequanize_data_IDCT(int Y[64], unsigned char *qdata, unsigned char *output) { - int Y[64]; +// int Y[64]; int k,l; /* Pass 1: process rows. */ for (k = 0; k < 8; k++) { + Y[8*k+0]=SCALE(Y[8*k+0]*qdata[8*k+0], S_BITS); + Y[8*k+1]=SCALE(Y[8*k+1]*qdata[8*k+1], S_BITS); + Y[8*k+2]=SCALE(Y[8*k+2]*qdata[8*k+2], S_BITS); + Y[8*k+3]=SCALE(Y[8*k+3]*qdata[8*k+3], S_BITS); + Y[8*k+4]=SCALE(Y[8*k+4]*qdata[8*k+4], S_BITS); + Y[8*k+5]=SCALE(Y[8*k+5]*qdata[8*k+5], S_BITS); + Y[8*k+6]=SCALE(Y[8*k+6]*qdata[8*k+6], S_BITS); + Y[8*k+7]=SCALE(Y[8*k+7]*qdata[8*k+7], S_BITS); + /* Prescale k-th row: */ - for (l = 0; l < 8; l++) - Y[8*k+l] = SCALE(input[8*k+l], S_BITS); + //for (l = 0; l < 8; l++) + // Y[8*k+l] = SCALE(input[8*k+l], S_BITS); /* 1-D IDCT on k-th row: */ idct_1d(&Y[8*k+0]); diff --git a/src/main.c b/src/main.c index 3867112..274dfbf 100644 --- a/src/main.c +++ b/src/main.c @@ -1,236 +1,129 @@ -#include -#include "dct.h" -#include "bmpjpeg.h" -#include "bmp.h" -#include "jpeg.h" - -#define ENCODE 0 -#define DECODE 1 -#define MAXROWS 1200 -#define MAXCOLS 800 -#define HEADER 54 - -unsigned char Image1[MAXCOLS*3*MAXROWS+HEADER]; -unsigned char Image2[MAXCOLS*3*MAXROWS+HEADER]; - -DCTELEM quan_data[64] = { - 8, 6, 6, 7, 6, 5, 8, 7, - 7, 7, 9, 9, 8, 10, 12, 20, - 13, 12, 11, 11, 12, 25, 18, 19, - 15, 20, 29, 26, 31, 30, 29, 26, - 28, 28, 32, 36, 46, 39, 32, 34, - 44, 35, 28, 28, 40, 55, 41, 44, - 48, 49, 52, 52, 52, 31, 39, 57, - 61, 56, 50, 60, 46, 51, 52, 50 -}; - -void quanize_data(int * data,int * qdata) -{ - int i,j; - for (i = 0; i < 8; i++) - { - for(j=0;j < 8;j++) - { - *(data + ((i * 8) + j)) = *(data + ((i * 8) + j)) / *(qdata + ((i * 8) + j)) ; - } - } -} - -void dequanize_data(DCTELEM * data,DCTELEM * qdata) -{ - int i,j; - for (i = 0; i < 8; i++) - { - for(j=0;j < 8;j++) - { - *(data + ((i * 8) + j)) =( *(data + ((i * 8) + j))) *( *(qdata + ((i * 8) + j))) ; - } - } -} - - -void scale_data(DCTELEM * data, DCTELEM scale) -{ - int i,j; - for (i = 0; i < 8; i++) - { - for(j=0;j < 8;j++) - { - *(data + ((i * 8) + j)) = *(data + ((i * 8) + j)) - scale ; - } - } - -} - -void scaleDownData(DCTELEM * data,int scale) -{ - int i,j; - for (i = 0; i < 8; i++) - { - for(j=0;j < 8;j++) - { - *(data + ((i * 8) + j)) =( *(data + ((i * 8) + j))) /scale ; - } - } -} - - -/*void dump_data(DCTELEM * data ) -{ - int i,j; - for (i = 0; i < 8; i++) - { - printf("\n"); - for(j=0;j < 8;j++) - { - printf("%d\t",*(data + ((i * 8) + j))); - } - } - -} - -void dump_data2(unsigned char * data ) -{ - int i,j; - for (i = 0; i < 8; i++) - { - printf("\n"); - for(j=0;j < 8;j++) - { - printf("%d\t",*(data + ((i * 8) + j))); - } - } - -} -*/ - -int main(int argc, char *argv[]) { - int retval, i,j; - //int workspace[DCTSIZE_BLOCK]; - unsigned char blok8x8_2[64]; - int blok8x8[64]; - unsigned char type; - unsigned int x_size, y_size, offset; - unsigned char depth; - - char *fileIn, *fileOut; - - FILE *fI, *fO; - - - -/*******************************************************************************************/ -/* 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 */ - -// retval = 0; - - GetBMPHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); - /*printf("Before:"); - for(i=0;i<(x_size*y_size*3+offset);i++) - { - if((i%24)==0) printf("\n"); - printf("%02x ",Image1[i]); - } -*/ - - switch(type) { - case ENCODE: - // GetBMPHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); - printf("Image Resolution: %d x %d x %i Offset: %i\n", x_size, y_size, depth, offset); - for(i=0;i YUV & Convert to 8x8 --> done - BMPto8x8AndYCbCr(i,j,x_size,y_size,offset,depth,Image1,blok8x8); - // DCT - // Basic data - //dump_data(blok8x8); - // Scaling -128 - scale_data(blok8x8,128); - //printf("\nscaled -128\n"); - // After scale - //dump_data(blok8x8); - //printf("\nafter DCT\n"); - jpeg_fdct_ifast(blok8x8); - // Scaling after DCT - scaleDownData(blok8x8,8); - - - // After dct - //dump_data(blok8x8); - quanize_data(blok8x8,quan_data); - //printf("\nafter quantize\n"); - //dump_data(blok8x8); - dequanize_data(blok8x8,quan_data); - - IDCT(blok8x8, blok8x8_2); - //printf("\nafter idct\n"); - - //dump_data2(blok8x8_2); - - //printf("\n\n"); - - YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,depth,Image2,blok8x8_2); - } - } - - break; - case DECODE: - GetJPEGHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); - for(i=0;i RGB & Convert 8x8 to BMP style & - YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,depth,Image2,blok8x8_2); - } - } - WriteBMPHeaderInfo(Image2,offset,x_size,y_size, depth); - - break; - } - WriteBMPHeaderInfo(Image2,offset,x_size,y_size, depth); - //Write Image to the output file. - fwrite(Image2, sizeof(unsigned char), (x_size*y_size*(depth/8))+offset, fO); - fclose(fI); - fclose(fO); - - return retval; -} - - +#include +#include "dct.h" +#include "bmpjpeg.h" +#include "bmp.h" +#include "jpeg.h" + +#define ENCODE 0 +#define DECODE 1 +#define MAXROWS 1200 +#define MAXCOLS 800 +#define HEADER 54 + +unsigned char Image1[MAXCOLS*3*MAXROWS+HEADER]; +unsigned char Image2[MAXCOLS*3*MAXROWS+HEADER]; + +unsigned char quan_data[64] = { + 8, 6, 6, 7, 6, 5, 8, 7, + 7, 7, 9, 9, 8, 10, 12, 20, + 13, 12, 11, 11, 12, 25, 18, 19, + 15, 20, 29, 26, 31, 30, 29, 26, + 28, 28, 32, 36, 46, 39, 32, 34, + 44, 35, 28, 28, 40, 55, 41, 44, + 48, 49, 52, 52, 52, 31, 39, 57, + 61, 56, 50, 60, 46, 51, 52, 50 +}; + +int main(int argc, char *argv[]) { + int retval, i,j; + unsigned char blok8x8_2[64]; + int blok8x8[64]; + unsigned char type; + unsigned int x_size, y_size, offset; + unsigned char depth; + + char *fileIn, *fileOut; + + FILE *fI, *fO; + + + +/*******************************************************************************************/ +/* 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: + GetBMPHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); + printf("Image Resolution: %d x %d x %i Offset: %i\n", x_size, y_size, depth, offset); + for(i=0;i YUV & Convert to 8x8 + BMPto8x8AndYCbCr(i,j,x_size,y_size,offset,Image1,blok8x8); + + /****************************************/ + /********* Forward *********/ + /****************************************/ + jpeg_fdct_ifast(blok8x8,quan_data); + + /****************************************/ + /********* Back *********/ + /****************************************/ + + // Dequantization and IDCT of the blok + dequanize_data_IDCT(blok8x8,quan_data,blok8x8_2); + + YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,Image2,blok8x8_2); + } + } + WriteBMPHeaderInfo(Image2,offset,x_size,y_size, depth); + break; + case DECODE: + GetJPEGHeaderInfo (Image1,&offset,&x_size,&y_size,&depth); + for(i=0;i RGB & Convert 8x8 to BMP style & + YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,Image2,blok8x8_2); + } + } + WriteBMPHeaderInfo(Image2,offset,x_size,y_size, depth); + + break; + } + //Write Image to the output file. + fwrite(Image2, sizeof(unsigned char), (x_size*y_size*(depth/8))+offset, fO); + fclose(fI); + fclose(fO); + + return retval; +} + + -- cgit v0.12