JPEG compressor

Dependencies:   SDL_lib SX1276Lib mbed

Committer:
miruga27
Date:
Wed Sep 07 18:47:02 2016 +0000
Revision:
0:1076a8b67c6c
Child:
1:f0c646dfe574
f

Who changed what in which revision?

UserRevisionLine numberNew contents of line
miruga27 0:1076a8b67c6c 1 //Author: Miguel Ruiz García
miruga27 0:1076a8b67c6c 2 //Company: University of Cantabria. 2016
miruga27 0:1076a8b67c6c 3 //mail: mrg47@alumnos.unican.es
miruga27 0:1076a8b67c6c 4
miruga27 0:1076a8b67c6c 5
miruga27 0:1076a8b67c6c 6 #define PI 3.1415952
miruga27 0:1076a8b67c6c 7 #define WIDTH 320
miruga27 0:1076a8b67c6c 8 #define HEIGHT 8
miruga27 0:1076a8b67c6c 9 #define DEPTH 24
miruga27 0:1076a8b67c6c 10 #define RAIZ2 1.414214
miruga27 0:1076a8b67c6c 11 #define PI16 0.19635
miruga27 0:1076a8b67c6c 12
miruga27 0:1076a8b67c6c 13 void DCT(int matrix[8][8][3],short int f[HEIGHT][WIDTH][3],int p_fil,int p_col){
miruga27 0:1076a8b67c6c 14 int i=0,j=0,u,v;
miruga27 0:1076a8b67c6c 15 float cu=1.0,cv=1.0;
miruga27 0:1076a8b67c6c 16 int linea,bpp;
miruga27 0:1076a8b67c6c 17
miruga27 0:1076a8b67c6c 18 Uint8 *pixel;
miruga27 0:1076a8b67c6c 19
miruga27 0:1076a8b67c6c 20
miruga27 0:1076a8b67c6c 21 for(u=p_fil;u<8+p_fil;u++){
miruga27 0:1076a8b67c6c 22
miruga27 0:1076a8b67c6c 23 if(u==0){
miruga27 0:1076a8b67c6c 24 cu=RAIZ2/2;
miruga27 0:1076a8b67c6c 25 }
miruga27 0:1076a8b67c6c 26 else cu=1.0;
miruga27 0:1076a8b67c6c 27 for(v=p_col;v<8+p_col;v++){
miruga27 0:1076a8b67c6c 28 f[u][v][0]=0;
miruga27 0:1076a8b67c6c 29 f[u][v][1]=0;
miruga27 0:1076a8b67c6c 30 f[u][v][2]=0;
miruga27 0:1076a8b67c6c 31 if(v==0){
miruga27 0:1076a8b67c6c 32 cv=RAIZ2/2;
miruga27 0:1076a8b67c6c 33
miruga27 0:1076a8b67c6c 34 }
miruga27 0:1076a8b67c6c 35 else cv=1.0;
miruga27 0:1076a8b67c6c 36
miruga27 0:1076a8b67c6c 37 short int dato=0;
miruga27 0:1076a8b67c6c 38 short int dato2=0;
miruga27 0:1076a8b67c6c 39
miruga27 0:1076a8b67c6c 40
miruga27 0:1076a8b67c6c 41 for(i=0;i<8;i++){
miruga27 0:1076a8b67c6c 42
miruga27 0:1076a8b67c6c 43 for(j=0;j<8;j++){
miruga27 0:1076a8b67c6c 44
miruga27 0:1076a8b67c6c 45 dato=(short int)(cos((float)(((j<<1)+1)*(v-p_col)*PI16)));
miruga27 0:1076a8b67c6c 46 dato2=(short int)(cos((float)(((i<<1)+1)*(u-p_fil)*PI16)));
miruga27 0:1076a8b67c6c 47
miruga27 0:1076a8b67c6c 48 f[u][v][0]+=(dato*dato2*(matrix[i][j][0]));//crominancia V
miruga27 0:1076a8b67c6c 49 f[u][v][1]+=(dato*dato2*(matrix[i][j][1]));//crominancia U
miruga27 0:1076a8b67c6c 50 f[u][v][2]+=(dato*dato2*(matrix[i][j][2]));//luminancia Y
miruga27 0:1076a8b67c6c 51
miruga27 0:1076a8b67c6c 52 }
miruga27 0:1076a8b67c6c 53 }
miruga27 0:1076a8b67c6c 54 float dato3=(float)((cu*cv)/4);
miruga27 0:1076a8b67c6c 55 f[u][v][0]*=dato3;
miruga27 0:1076a8b67c6c 56 f[u][v][1]*=dato3;
miruga27 0:1076a8b67c6c 57 f[u][v][2]*=dato3;
miruga27 0:1076a8b67c6c 58
miruga27 0:1076a8b67c6c 59
miruga27 0:1076a8b67c6c 60 }
miruga27 0:1076a8b67c6c 61
miruga27 0:1076a8b67c6c 62
miruga27 0:1076a8b67c6c 63 }
miruga27 0:1076a8b67c6c 64
miruga27 0:1076a8b67c6c 65
miruga27 0:1076a8b67c6c 66 }
miruga27 0:1076a8b67c6c 67
miruga27 0:1076a8b67c6c 68 void rgb_to_yuv(short int f[HEIGHT][WIDTH][3]){
miruga27 0:1076a8b67c6c 69
miruga27 0:1076a8b67c6c 70
miruga27 0:1076a8b67c6c 71 Uint8 *pixel;
miruga27 0:1076a8b67c6c 72 int i=0,j=0;
miruga27 0:1076a8b67c6c 73 const int linea=1920,bpp=3;
miruga27 0:1076a8b67c6c 74 float y=0.0,u=0.0,v=0.0;
miruga27 0:1076a8b67c6c 75
miruga27 0:1076a8b67c6c 76 for(i=0;i<HEIGHT;i++){
miruga27 0:1076a8b67c6c 77 for(j=0;j<WIDTH;j++){
miruga27 0:1076a8b67c6c 78 short int dato2=f[i][j][2];
miruga27 0:1076a8b67c6c 79 short int dato1=f[i][j][1];
miruga27 0:1076a8b67c6c 80 short int dato=f[i][j][0];
miruga27 0:1076a8b67c6c 81 y=dato2*0.257+dato1*0.504+dato*0.098+16;//y
miruga27 0:1076a8b67c6c 82 // y=dato2*0.257+(Uint8)(*(pixel+1)>>1)+*(pixel)/100+16;//y
miruga27 0:1076a8b67c6c 83 u=dato2*-0.148+dato1*-0.291+dato*0.439+128;//u
miruga27 0:1076a8b67c6c 84 v=dato2*0.439+dato1*-0.368+dato*-0.071+128;//v
miruga27 0:1076a8b67c6c 85 if(y>235) y=235;
miruga27 0:1076a8b67c6c 86 if(u>240) u=240;
miruga27 0:1076a8b67c6c 87 if(v>240) v=240;
miruga27 0:1076a8b67c6c 88
miruga27 0:1076a8b67c6c 89 if(y<16) y=16;
miruga27 0:1076a8b67c6c 90 if(u<16) u=16;
miruga27 0:1076a8b67c6c 91 if(v<16) v=16;
miruga27 0:1076a8b67c6c 92 /* y=*(pixel+2)*0.183+(*(pixel+1))*0.614+*(pixel)*0.062+16;//y
miruga27 0:1076a8b67c6c 93 u=*(pixel+2)*-0.101+*(pixel+1)*-0.339+*(pixel)*0.439+128;//u
miruga27 0:1076a8b67c6c 94 v=*(pixel+2)*0.439+*(pixel+1)*-0.339+*(pixel)*-0.040+128;//v*/
miruga27 0:1076a8b67c6c 95
miruga27 0:1076a8b67c6c 96 //http://www.equasys.de/colorconversion.html
miruga27 0:1076a8b67c6c 97
miruga27 0:1076a8b67c6c 98 f[i][j][2]=(Uint8)y;
miruga27 0:1076a8b67c6c 99 f[i][j][1]=(Uint8)u;
miruga27 0:1076a8b67c6c 100 f[i][j][0]=(Uint8)v;
miruga27 0:1076a8b67c6c 101
miruga27 0:1076a8b67c6c 102 }
miruga27 0:1076a8b67c6c 103
miruga27 0:1076a8b67c6c 104 }
miruga27 0:1076a8b67c6c 105
miruga27 0:1076a8b67c6c 106
miruga27 0:1076a8b67c6c 107 }
miruga27 0:1076a8b67c6c 108
miruga27 0:1076a8b67c6c 109 void zig_zag(short int f[HEIGHT][WIDTH][3],short int *matrix){
miruga27 0:1076a8b67c6c 110
miruga27 0:1076a8b67c6c 111 int i=0,p_x=0,p_y=0,j=0;
miruga27 0:1076a8b67c6c 112 int flag=0;
miruga27 0:1076a8b67c6c 113
miruga27 0:1076a8b67c6c 114 for(i=0;i<WIDTH*HEIGHT;i++){
miruga27 0:1076a8b67c6c 115
miruga27 0:1076a8b67c6c 116 *(matrix+j)=f[p_y][p_x][0];
miruga27 0:1076a8b67c6c 117 *(matrix+j+1)=f[p_y][p_x][1];
miruga27 0:1076a8b67c6c 118 *(matrix+j+2)=f[p_y][p_x][2];
miruga27 0:1076a8b67c6c 119
miruga27 0:1076a8b67c6c 120 j+=3;
miruga27 0:1076a8b67c6c 121 if(flag==0){
miruga27 0:1076a8b67c6c 122 p_x++,p_y--;
miruga27 0:1076a8b67c6c 123 if(p_y<0){
miruga27 0:1076a8b67c6c 124 p_y=0;
miruga27 0:1076a8b67c6c 125 flag=1;
miruga27 0:1076a8b67c6c 126
miruga27 0:1076a8b67c6c 127 }
miruga27 0:1076a8b67c6c 128 if(p_x>WIDTH-1){
miruga27 0:1076a8b67c6c 129 p_x=WIDTH-1;
miruga27 0:1076a8b67c6c 130 p_y+=2;
miruga27 0:1076a8b67c6c 131 flag=1;
miruga27 0:1076a8b67c6c 132
miruga27 0:1076a8b67c6c 133
miruga27 0:1076a8b67c6c 134 }
miruga27 0:1076a8b67c6c 135
miruga27 0:1076a8b67c6c 136 }
miruga27 0:1076a8b67c6c 137 else{
miruga27 0:1076a8b67c6c 138 p_x--,p_y++;
miruga27 0:1076a8b67c6c 139 if(p_y>HEIGHT-1){
miruga27 0:1076a8b67c6c 140 p_y=HEIGHT-1;
miruga27 0:1076a8b67c6c 141 p_x+=2;
miruga27 0:1076a8b67c6c 142 flag=0;
miruga27 0:1076a8b67c6c 143
miruga27 0:1076a8b67c6c 144 }
miruga27 0:1076a8b67c6c 145 if(p_x<0){
miruga27 0:1076a8b67c6c 146 p_x=0;
miruga27 0:1076a8b67c6c 147 flag=0;
miruga27 0:1076a8b67c6c 148 }
miruga27 0:1076a8b67c6c 149
miruga27 0:1076a8b67c6c 150 }
miruga27 0:1076a8b67c6c 151
miruga27 0:1076a8b67c6c 152
miruga27 0:1076a8b67c6c 153 }
miruga27 0:1076a8b67c6c 154
miruga27 0:1076a8b67c6c 155
miruga27 0:1076a8b67c6c 156
miruga27 0:1076a8b67c6c 157 }
miruga27 0:1076a8b67c6c 158
miruga27 0:1076a8b67c6c 159 void cuantizador(short int mat[HEIGHT][WIDTH][3]){
miruga27 0:1076a8b67c6c 160 short int luma[8][8]={{16,11,10,16,24,40,51,61},
miruga27 0:1076a8b67c6c 161 {12,12,14,19,26,58,60,55},
miruga27 0:1076a8b67c6c 162 {14,13,16,24,40,57,69,56},
miruga27 0:1076a8b67c6c 163 {14,17,22,29,51,87,80,62},
miruga27 0:1076a8b67c6c 164 {18,22,37,56,68,109,103,77},
miruga27 0:1076a8b67c6c 165 {24,35,55,64,81,104,113,92},
miruga27 0:1076a8b67c6c 166 {49,64,78,87,103,121,120,101},
miruga27 0:1076a8b67c6c 167 {72,92,95,98,112,100,103,99}};
miruga27 0:1076a8b67c6c 168 short int croma[8][8]={{17,18,24,47,99,99,99,99},
miruga27 0:1076a8b67c6c 169 {18,21,26,66,99,99,99,99},
miruga27 0:1076a8b67c6c 170 {24,26,56,99,99,99,99,99},
miruga27 0:1076a8b67c6c 171 {47,66,99,99,99,99,99,99},
miruga27 0:1076a8b67c6c 172 {99,99,99,99,99,99,99,99},
miruga27 0:1076a8b67c6c 173 {99,99,99,99,99,99,99,99},
miruga27 0:1076a8b67c6c 174 {99,99,99,99,99,99,99,99},
miruga27 0:1076a8b67c6c 175 {99,99,99,99,99,99,99,99}};
miruga27 0:1076a8b67c6c 176 int i=0,x_block,y_block,j;
miruga27 0:1076a8b67c6c 177 for(i=0;i<HEIGHT;i+=8){
miruga27 0:1076a8b67c6c 178 for(j=0;j<WIDTH;j+=8)
miruga27 0:1076a8b67c6c 179 for(x_block=i; x_block<i+8 ;x_block++){
miruga27 0:1076a8b67c6c 180 for(y_block=j; y_block<j+8 ;y_block++){
miruga27 0:1076a8b67c6c 181 mat[x_block][y_block][2]/=luma[x_block-i][y_block-j];
miruga27 0:1076a8b67c6c 182 mat[x_block][y_block][1]/=croma[x_block-i][y_block-j];
miruga27 0:1076a8b67c6c 183 mat[x_block][y_block][0]/=croma[x_block-i][y_block-j];
miruga27 0:1076a8b67c6c 184 }
miruga27 0:1076a8b67c6c 185 }
miruga27 0:1076a8b67c6c 186 }
miruga27 0:1076a8b67c6c 187
miruga27 0:1076a8b67c6c 188 }