#include "downsample.h"
#include "config.h"
#include "global.h"
#include <stdio.h>
#include <stdlib.h>
void mat_multiply _ANSI_ARGS_((float *dp, float *p1, float *p2));
void mat_multiply_abstract _ANSI_ARGS_((float *dp, float *p1, int *p2, int column));
void add_to_pic _ANSI_ARGS_((int *dp, int column, float *block1, float *block2, float *block3, float *block4,
float *block5, float *block6, float *block7, float *block8, float *block9));
main()
{
int k, n, m, i, column=1920, line=1080;
int *A, *B, *buffer;
float block1[64]={0}, block2[64]={0}, block3[64]={0}, block4[64]={0};
float block5[64]={0}, block6[64]={0}, block7[64]={0}, block8[64]={0}, block9[64]={0};
float block_1[64]={0}, block_2[64]={0}, block_3[64]={0}, block_4[64]={0};
float block_5[64]={0}, block_6[64]={0}, block_7[64]={0}, block_8[64]={0}, block_9[64]={0};
FILE *fpin, *fpout;
if((fpin=fopen("bigpic.bin", "rb"))==NULL)
{
printf("cannot open this file!\n");
exit(0);
}
buffer=(int*)calloc(column*line, sizeof(int));
fread(buffer, sizeof(int), column*line, fpin);
B=(int*)calloc(sizeof(int), column*line*4/9/3);
A=buffer;
if(line%72==0)
{
for (k=0; k<line/72; k++)
{
for(n=0; n<column/24; n++)
{
for (m=0; m<4; m++)
{
mat_multiply_abstract(block1, wl+192*m, A+(72*k+16*m)*column+24*n, column);
mat_multiply_abstract(block2, wl+192*m, A+(72*k+16*m)*column+24*n+8, column);
mat_multiply_abstract(block3, wl+192*m, A+(72*k+16*m)*column+24*n+16, column);
mat_multiply_abstract(block4, wl+192*m+64, A+(72*k+16*m+8)*column+24*n, column);
mat_multiply_abstract(block5, wl+192*m+64, A+(72*k+16*m+8)*column+24*n+8, column);
mat_multiply_abstract(block6, wl+192*m+64, A+(72*k+16*m+8)*column+24*n+16, column);
mat_multiply_abstract(block7, wl+192*m+128, A+(72*k+16*m+16)*column+24*n, column);
mat_multiply_abstract(block8, wl+192*m+128, A+(72*k+16*m+16)*column+24*n+8, column);
mat_multiply_abstract(block9, wl+192*m+128, A+(72*k+16*m+16)*column+24*n+16, column);
mat_multiply(block_1, block1, wr1);
mat_multiply(block_2, block2, wr2);
mat_multiply(block_3, block3, wr3);
mat_multiply(block_4, block4, wr1);
mat_multiply(block_5, block5, wr2);
mat_multiply(block_6, block6, wr3);
mat_multiply(block_7, block7, wr1);
mat_multiply(block_8, block8, wr2);
mat_multiply(block_9, block9, wr3);
add_to_pic(B+column/3*(8*m+32*k)+8*n, column/3, block_1, block_2, block_3,
block_4, block_5, block_6, block_7, block_8, block_9);
for (i=0; i<64; i++)
{
*(block1+i)=0;
*(block2+i)=0;
*(block3+i)=0;
*(block4+i)=0;
*(block5+i)=0;
*(block6+i)=0;
*(block7+i)=0;
*(block8+i)=0;
*(block9+i)=0;
*(block_1+i)=0;
*(block_2+i)=0;
*(block_3+i)=0;
*(block_4+i)=0;
*(block_5+i)=0;
*(block_6+i)=0;
*(block_7+i)=0;
*(block_8+i)=0;
*(block_9+i)=0;
}
}
}
}
}
else
{
for (k=0; k<(line-line%72)/72; k++)
{
for(n=0; n<column/24; n++)
{
for (m=0; m<4; m++)
{
mat_multiply_abstract(block1, wl+192*m, A+(72*k+16*m)*column+24*n, column);
mat_multiply_abstract(block2, wl+192*m, A+(72*k+16*m)*column+24*n+8, column);
mat_multiply_abstract(block3, wl+192*m, A+(72*k+16*m)*column+24*n+16, column);
mat_multiply_abstract(block4, wl+192*m+64, A+(72*k+16*m+8)*column+24*n, column);
mat_multiply_abstract(block5, wl+192*m+64, A+(72*k+16*m+8)*column+24*n+8, column);
mat_multiply_abstract(block6, wl+192*m+64, A+(72*k+16*m+8)*column+24*n+16, column);
mat_multiply_abstract(block7, wl+192*m+128, A+(72*k+16*m+16)*column+24*n, column);
mat_multiply_abstract(block8, wl+192*m+128, A+(72*k+16*m+16)*column+24*n+8, column);
mat_multiply_abstract(block9, wl+192*m+128, A+(72*k+16*m+16)*column+24*n+16, column);
mat_multiply(block_1, block1, wr1);
mat_multiply(block_2, block2, wr2);
mat_multiply(block_3, block3, wr3);
mat_multiply(block_4, block4, wr1);
mat_multiply(block_5, block5, wr2);
mat_multiply(block_6, block6, wr3);
mat_multiply(block_7, block7, wr1);
mat_multiply(block_8, block8, wr2);
mat_multiply(block_9, block9, wr3);
add_to_pic(B+column/3*(8*m+32*k)+8*n, column/3, block_1, block_2, block_3,
block_4, block_5, block_6, block_7, block_8, block_9);
for (i=0; i<64; i++)
{
*(block1+i)=0;
*(block2+i)=0;
*(block3+i)=0;
*(block4+i)=0;
*(block5+i)=0;
*(block6+i)=0;
*(block7+i)=0;
*(block8+i)=0;
*(block9+i)=0;
*(block_1+i)=0;
*(block_2+i)=0;
*(block_3+i)=0;
*(block_4+i)=0;
*(block_5+i)=0;
*(block_6+i)=0;
*(block_7+i)=0;
*(block_8+i)=0;
*(block_9+i)=0;
}
}
}
}
for(n=0; n<column/24; n++)
{
for (m=0; m<2; m++)
{
mat_multiply_abstract(block1, wl+192*m, A+(72*k+16*m)*column+24*n, column);
mat_multiply_abstract(block2, wl+192*m, A+(72*k+16*m)*column+24*n+8, column);
mat_multiply_abstract(block3, wl+192*m, A+(72*k+16*m)*column+24*n+16, column);
mat_multiply_abstract(block4, wl+192*m+64, A+(72*k+16*m+8)*column+24*n, column);
mat_multiply_abstract(block5, wl+192*m+64, A+(72*k+16*m+8)*column+24*n+8, column);
mat_multiply_abstract(block6, wl+192*m+64, A+(72*k+16*m+8)*column+24*n+16, column);
if (m==0)
{
mat_multiply_abstract(block7, wl+192*m+128, A+(72*k+16*m+16)*column+24*n, column);
mat_multiply_abstract(block8, wl+192*m+128, A+(72*k+16*m+16)*column+24*n+8, column);
mat_multiply_abstract(block9, wl+192*m+128, A+(72*k+16*m+16)*column+24*n+16, column);
}
else
{
mat_multiply_abstract(block7, wl+192*m+128, A+(72*k+16*m+16-4)*column+24*n, column);
mat_multiply_abstract(block8, wl+192*m+128, A+(72*k+16*m+16-4)*column+24*n+8, column);
mat_multiply_abstract(block9, wl+192*m+128, A+(72*k+16*m+16-4)*column+24*n+16, column);
}
mat_multiply(block_1, block1, wr1);
mat_multiply(block_2, block2, wr2);
mat_multiply(block_3, block3, wr3);
mat_multiply(block_4, block4, wr1);
mat_multiply(block_5, block5, wr2);
mat_multiply(block_6, block6, wr3);
mat_multiply(block_7, block7, wr1);
mat_multiply(block_8, block8, wr2);
mat_multiply(block_9, block9, wr3);
add_to_pic(B+column/3*(8*m+32*k)+8*n, column/3, block_1, block_2, block_3,
block_4, block_5, block_6, block_7, block_8, block_9);
for (i=0; i<64; i++)
{
*(block1+i)=0;
*(block2+i)=0;
*(block3+i)=0;
*(block4+i)=0;
*(block5+i)=0;
*(block6+i)=0;
*(block7+i)=0;
*(block8+i)=0;
*(block9+i)=0;
*(block_1+i)=0;
*(block_2+i)=0;
*(block_3+i)=0;
*(block_4+i)=0;
*(block_5+i)=0;
*(block_6+i)=0;
*(block_7+i)=0;
*(block_8+i)=0;
*(block_9+i)=0;
}
}
}
}
if((fpout=fopen("output2.bintxt", "wb"))==NULL)
{
printf("cannot open this file!\n");
exit(0);
}
fwrite(B, sizeof(int), column*line*4/9/3, fpout);
fclose(fpout);
}
void mat_multiply(float *dp, float *p1, float *p2)
{
int m, j, i;
for (m=0; m<8; m++)
{
for (j=0; j<8; j++)
{
for (i=0; i<8; i++)
{
*dp+=(*p1) * (*p2);
p1++;
p2+=8;
}
dp++;
p1-=8;
p2-=63;
}
p1+=8;
p2-=8;
}
}
void mat_multiply_abstract(float *dp, float *p1, int *p2, int column)
{
int m, j, i;
for (m=0; m<8; m++)
{
for (j=0; j<8; j++)
{
for (i=0; i<8; i++)
{
*dp+=(*p1) * (*p2);
p1++;
p2+=column;
}
dp++;
p1-=8;
p2-=column*8-1;
}
p1+=8;
p2-=8;
}
}
void add_to_pic(int *dp, int column, float *block1, float *block2, float *block3, float *block4,
float