summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Schinagl <oliver@schinagl.nl>2005-05-16 20:32:25 (GMT)
committerOliver Schinagl <oliver@schinagl.nl>2005-05-16 20:32:25 (GMT)
commit3b2f57c60a00c7772d02e37a04cb8ab70be660db (patch)
treeb828890b6dd7c42b5a0063222548c49d2195b7de
parent5fb88b19bbd727ea9ad38e16ec097d73dd83c529 (diff)
download5kk53-3b2f57c60a00c7772d02e37a04cb8ab70be660db.zip
5kk53-3b2f57c60a00c7772d02e37a04cb8ab70be660db.tar.gz
5kk53-3b2f57c60a00c7772d02e37a04cb8ab70be660db.tar.bz2
And the idct and fdct are working perfect..
-rw-r--r--src/bmpjpeg.c2
-rw-r--r--src/color.c4
-rw-r--r--src/idct.c4
-rw-r--r--src/main.c104
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);