JPEG compressor
Dependencies: SDL_lib SX1276Lib mbed
Diff: functions.h
- Revision:
- 0:1076a8b67c6c
- Child:
- 1:f0c646dfe574
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/functions.h Wed Sep 07 18:47:02 2016 +0000 @@ -0,0 +1,188 @@ +//Author: Miguel Ruiz García +//Company: University of Cantabria. 2016 +//mail: mrg47@alumnos.unican.es + + +#define PI 3.1415952 +#define WIDTH 320 +#define HEIGHT 8 +#define DEPTH 24 +#define RAIZ2 1.414214 +#define PI16 0.19635 + +void DCT(int matrix[8][8][3],short int f[HEIGHT][WIDTH][3],int p_fil,int p_col){ + int i=0,j=0,u,v; + float cu=1.0,cv=1.0; + int linea,bpp; + + Uint8 *pixel; + + + for(u=p_fil;u<8+p_fil;u++){ + + if(u==0){ + cu=RAIZ2/2; + } + else cu=1.0; + for(v=p_col;v<8+p_col;v++){ + f[u][v][0]=0; + f[u][v][1]=0; + f[u][v][2]=0; + if(v==0){ + cv=RAIZ2/2; + + } + else cv=1.0; + + short int dato=0; + short int dato2=0; + + + for(i=0;i<8;i++){ + + for(j=0;j<8;j++){ + + dato=(short int)(cos((float)(((j<<1)+1)*(v-p_col)*PI16))); + dato2=(short int)(cos((float)(((i<<1)+1)*(u-p_fil)*PI16))); + + f[u][v][0]+=(dato*dato2*(matrix[i][j][0]));//crominancia V + f[u][v][1]+=(dato*dato2*(matrix[i][j][1]));//crominancia U + f[u][v][2]+=(dato*dato2*(matrix[i][j][2]));//luminancia Y + + } + } + float dato3=(float)((cu*cv)/4); + f[u][v][0]*=dato3; + f[u][v][1]*=dato3; + f[u][v][2]*=dato3; + + + } + + + } + + +} + +void rgb_to_yuv(short int f[HEIGHT][WIDTH][3]){ + + + Uint8 *pixel; + int i=0,j=0; + const int linea=1920,bpp=3; + float y=0.0,u=0.0,v=0.0; + + for(i=0;i<HEIGHT;i++){ + for(j=0;j<WIDTH;j++){ + short int dato2=f[i][j][2]; + short int dato1=f[i][j][1]; + short int dato=f[i][j][0]; + y=dato2*0.257+dato1*0.504+dato*0.098+16;//y + // y=dato2*0.257+(Uint8)(*(pixel+1)>>1)+*(pixel)/100+16;//y + u=dato2*-0.148+dato1*-0.291+dato*0.439+128;//u + v=dato2*0.439+dato1*-0.368+dato*-0.071+128;//v + if(y>235) y=235; + if(u>240) u=240; + if(v>240) v=240; + + if(y<16) y=16; + if(u<16) u=16; + if(v<16) v=16; + /* y=*(pixel+2)*0.183+(*(pixel+1))*0.614+*(pixel)*0.062+16;//y + u=*(pixel+2)*-0.101+*(pixel+1)*-0.339+*(pixel)*0.439+128;//u + v=*(pixel+2)*0.439+*(pixel+1)*-0.339+*(pixel)*-0.040+128;//v*/ + +//http://www.equasys.de/colorconversion.html + + f[i][j][2]=(Uint8)y; + f[i][j][1]=(Uint8)u; + f[i][j][0]=(Uint8)v; + + } + + } + + +} + +void zig_zag(short int f[HEIGHT][WIDTH][3],short int *matrix){ + + int i=0,p_x=0,p_y=0,j=0; + int flag=0; + + for(i=0;i<WIDTH*HEIGHT;i++){ + + *(matrix+j)=f[p_y][p_x][0]; + *(matrix+j+1)=f[p_y][p_x][1]; + *(matrix+j+2)=f[p_y][p_x][2]; + + j+=3; + if(flag==0){ + p_x++,p_y--; + if(p_y<0){ + p_y=0; + flag=1; + + } + if(p_x>WIDTH-1){ + p_x=WIDTH-1; + p_y+=2; + flag=1; + + + } + + } + else{ + p_x--,p_y++; + if(p_y>HEIGHT-1){ + p_y=HEIGHT-1; + p_x+=2; + flag=0; + + } + if(p_x<0){ + p_x=0; + flag=0; + } + + } + + + } + + + +} + +void cuantizador(short int mat[HEIGHT][WIDTH][3]){ + short int luma[8][8]={{16,11,10,16,24,40,51,61}, + {12,12,14,19,26,58,60,55}, + {14,13,16,24,40,57,69,56}, + {14,17,22,29,51,87,80,62}, + {18,22,37,56,68,109,103,77}, + {24,35,55,64,81,104,113,92}, + {49,64,78,87,103,121,120,101}, + {72,92,95,98,112,100,103,99}}; + short int croma[8][8]={{17,18,24,47,99,99,99,99}, + {18,21,26,66,99,99,99,99}, + {24,26,56,99,99,99,99,99}, + {47,66,99,99,99,99,99,99}, + {99,99,99,99,99,99,99,99}, + {99,99,99,99,99,99,99,99}, + {99,99,99,99,99,99,99,99}, + {99,99,99,99,99,99,99,99}}; + int i=0,x_block,y_block,j; + for(i=0;i<HEIGHT;i+=8){ + for(j=0;j<WIDTH;j+=8) + for(x_block=i; x_block<i+8 ;x_block++){ + for(y_block=j; y_block<j+8 ;y_block++){ + mat[x_block][y_block][2]/=luma[x_block-i][y_block-j]; + mat[x_block][y_block][1]/=croma[x_block-i][y_block-j]; + mat[x_block][y_block][0]/=croma[x_block-i][y_block-j]; + } + } + } + +} \ No newline at end of file