summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Schinagl <oliver@schinagl.nl>2005-06-05 14:53:00 (GMT)
committerOliver Schinagl <oliver@schinagl.nl>2005-06-05 14:53:00 (GMT)
commitb0e57067b2b60fb42c2695569bc1cc7f53b024f4 (patch)
tree8615d32398726768bbedda46f7e30a2b25ed8ec3
parentf4cc8f1906c41a06cd69878094427fe21f7d2912 (diff)
download5kk53-b0e57067b2b60fb42c2695569bc1cc7f53b024f4.zip
5kk53-b0e57067b2b60fb42c2695569bc1cc7f53b024f4.tar.gz
5kk53-b0e57067b2b60fb42c2695569bc1cc7f53b024f4.tar.bz2
Made it optimized.
-rw-r--r--src/bmpjpeg.c102
-rw-r--r--src/fdct.c54
-rw-r--r--src/idct.c20
-rw-r--r--src/main.c365
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 <stdio.h>
-#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<x_size;i+=8)
- {
- for(j=0;j<y_size;j+=8)
- {
- //printf("\nImage Resolution: %i %i\n", i,j);
- // RGB -> 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<x_size;i+=8)
- {
- for(j=0;j<y_size;j+=8)
- {
-
- // VLD (huffman)
-
- // IQ
-
- // ZZ
-
- // IDCT
- //idct(workspace);
- // YUV -> 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 <stdio.h>
+#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<x_size;i+=8)
+ {
+ for(j=0;j<y_size;j+=8)
+ {
+ // RGB -> 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<x_size;i+=8)
+ {
+ for(j=0;j<y_size;j+=8)
+ {
+
+ // VLD (huffman)
+
+ // IQ
+
+ // ZZ
+
+ // IDCT
+ //idct(workspace);
+ // YUV -> 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;
+}
+
+