summaryrefslogtreecommitdiffstats
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c365
1 files changed, 129 insertions, 236 deletions
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;
+}
+
+