diff options
author | Oliver Schinagl <oliver@schinagl.nl> | 2005-05-16 20:32:25 (GMT) |
---|---|---|
committer | Oliver Schinagl <oliver@schinagl.nl> | 2005-05-16 20:32:25 (GMT) |
commit | 3b2f57c60a00c7772d02e37a04cb8ab70be660db (patch) | |
tree | b828890b6dd7c42b5a0063222548c49d2195b7de | |
parent | 5fb88b19bbd727ea9ad38e16ec097d73dd83c529 (diff) | |
download | 5kk53-3b2f57c60a00c7772d02e37a04cb8ab70be660db.zip 5kk53-3b2f57c60a00c7772d02e37a04cb8ab70be660db.tar.gz 5kk53-3b2f57c60a00c7772d02e37a04cb8ab70be660db.tar.bz2 |
And the idct and fdct are working perfect..
-rw-r--r-- | src/bmpjpeg.c | 2 | ||||
-rw-r--r-- | src/color.c | 4 | ||||
-rw-r--r-- | src/idct.c | 4 | ||||
-rw-r--r-- | 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);
}
@@ -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++) {
@@ -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); |