From 3b2f57c60a00c7772d02e37a04cb8ab70be660db Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Mon, 16 May 2005 20:32:25 +0000 Subject: And the idct and fdct are working perfect.. --- src/bmpjpeg.c | 2 +- src/color.c | 4 +-- src/idct.c | 4 +-- src/main.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++-------- 4 files changed, 95 insertions(+), 19 deletions(-) diff --git a/src/bmpjpeg.c b/src/bmpjpeg.c index a21bfe8..66e34b2 100644 --- a/src/bmpjpeg.c +++ b/src/bmpjpeg.c @@ -1,6 +1,6 @@ #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, unsigned char *blok8x8) +void BMPto8x8AndYCbCr(int Start_x, int Start_y, int ImageSize_x, int ImageSize_y, int offset, unsigned char depth ,unsigned char *Image, int *blok8x8) { unsigned char i,color; int x,y,Start_point; diff --git a/src/color.c b/src/color.c index 7057a23..cc4abae 100644 --- a/src/color.c +++ b/src/color.c @@ -12,8 +12,8 @@ unsigned char clip(int value) { // Y = 0.299 R + 0.587 G + 0.114 B // Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128 // Cr = 0.5 R - 0.4187 G - 0.0813 B + 128 -void RGB2YCbCr (unsigned char R, unsigned char G, unsigned char B,unsigned char *Y,unsigned char *Cb,unsigned char *Cr) { - *Y = clip(Mul_Shift(R,77) + Mul_Shift(G,150) + Mul_Shift(B,29)); +void RGB2YCbCr (unsigned char R, unsigned char G, unsigned char B,int *Y,int *Cb,int *Cr) { + *Y = clip(Mul_Shift(R,77) + Mul_Shift(G,150) + Mul_Shift(B,29)); *Cb = clip((B>>1)-Mul_Shift(R,43) - Mul_Shift(G,85) + 128); *Cr = clip((R>>1) - Mul_Shift(G,107) - Mul_Shift(B,21) + 128); } diff --git a/src/idct.c b/src/idct.c index fce305a..2b20b8c 100644 --- a/src/idct.c +++ b/src/idct.c @@ -77,13 +77,11 @@ idct_1d(int *Y) /* Inverse 2-D Discrete Cosine Transform. */ void -IDCT(const int input[64], int *output) +IDCT(const int input[64], unsigned char *output) { int Y[64]; int k,l; - printf("\n"); - /* Pass 1: process rows. */ for (k = 0; k < 8; k++) { diff --git a/src/main.c b/src/main.c index 39d99bb..1b25658 100644 --- a/src/main.c +++ b/src/main.c @@ -13,11 +13,75 @@ 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 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 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[64*3]; + //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; @@ -78,16 +142,30 @@ int main(int argc, char *argv[]) { // RGB -> YUV & Convert to 8x8 --> done BMPto8x8AndYCbCr(i,j,x_size,y_size,offset,depth,Image1,blok8x8); // DCT - fdct(blok8x8); - //fdct(workspace); - - // ZZ - - // Q - - // VLC (huffman) - - YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,depth,Image2,blok8x8); + // 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); + // After dct + //dump_data(blok8x8); + + quanize_data(blok8x8,quan_data); + //printf("\nafter quantize\n"); + //dump_data(blok8x8); + + 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); } } @@ -108,7 +186,7 @@ int main(int argc, char *argv[]) { // IDCT //idct(workspace); // YUV -> RGB & Convert 8x8 to BMP style & - YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,depth,Image2,blok8x8); + YCbCrAnd8x8toBMP(i,j,x_size,y_size,offset,depth,Image2,blok8x8_2); } } WriteBMPHeaderInfo(Image2,offset,x_size,y_size, depth); -- cgit v0.12