/***************************************************************************************/
/*								  	  	                                               */
/*  Program Name : MDCT & HUFFMAN AUDIO CODEC                                          */
/*								  	  	                                               */
/*	Date         : 2022.03.15	New Create			  	  	                           */
/*								  	  	                                               */
/*	Author       : Takashi Nakajima                                                    */
/*								  	  	                                               */
/*	Function     : 44.1kHz Signed 16bit STEREO WAV AUDIO COMPRESSION   			       */
/*	                                                                                   */
/*  ver01  2022.03.15   New Create                      				   	  	       */
/*		       						  	  	                                           */
/***************************************************************************************/
				
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <complex.h>
#define uchar           unsigned char
#define ushort          unsigned short
#define uint            unsigned int
#define ulong           unsigned long
#define rchar           register char
#define rshort          register short
#define rint            register int
#define rlong           register long
#define ruchar          register uchar
#define rushort         register ushort
#define ruint           register uint
#define rulong          register ulong
#define schar           static char
#define sshhort         static short
#define sint            static int
#define slong           static long
#define suchar          static uchar
#define sushort         static ushort
#define suint           static uint
#define sulong          static ulong
#define ORG_IMAGE_X     720
#define ORG_IMAGE_Y     480

#define BUNBOMAX 32
#define BUNSHIMAX 31
#define TAPMAXY 50
#define TAPMAXC 50
                                                                                                                                                         
typedef struct control_data {
  uint          sizex;
  uint          sizey;
  uint          startx;
  uint          starty;
  char         InputFileName[128];
  char         InputFileName2[128];
  char         OutputFileName[128];
  uint          hv;
  uint		sm;
  uint          smy;	
  uint          bunshi;
  uint          bunbo;
  uint          norm;
  uint          mado;
  uint          tapnum_y;
  uint          tapnum_c;
  int  			p;
  int 			ol;
  int 			af;
  double        Fs;	
  double        angle;	
} CNTL;
        char inputfile[50];
        char inputfile2[50];
        char outputfile[50];
        int hsize;
        int vsize;
        int org_image_x;
        int org_image_y;
	void coeffhairetsuculc(uint , uint, uint , uint, uint, uint, uint, uint, double, double, double, double, double *,double *, uint,double);
        double INITPHASECULC(uint , uint , uint , uint , uint );
        uint FILPATCULC(uint , uint , uint , double , double *);
        void COEFCULC( uint , uint , uint , uint , uint , uint , uint, double );
  	void normarize(uint ,uint ,uint ,uint , double *, uint  );
	void DFT1DV(int , double *, double *, double *, double *);
	void DFT1DH(int , int  , double *, double*, double *, double *);
	void IDFT1DV(int , double *, double *, double *, double *);
	void IDFT1DH(int , int  , double *, double*, double *, double *);
void resize( int hsize, int vsize, int sizeminus, int smy,  unsigned char *vin_buffer , unsigned char *vout);
void    print_help( void )
{
  fprintf( stderr, "Usage: ARBITRARY ROTATION BMP [options]\n" );
  fprintf( stderr, "\toptions: \n" );
  fprintf( stderr, "\t  -help          : help\n" );
  fprintf( stderr, "\t  -i             : input wav filename(44.1kHzSTEREO16bitLinearPCMonly)\n" );
  fprintf( stderr, "\t  -o             : output wav filename(44.1kHzSTEREO16bitLinearPCMonly auto add .wav extension\n" );
  fprintf( stderr, "\t  -p             : MDCT sample number\n" );
//  fprintf( stderr, "\t  -ol            : overlap num(2 no baisuu only) \n" );
//  fprintf( stderr, "\t  -af            : 0:seigenha kasan housiki 1:IFFT housiki\n" );
//  fprintf( stderr, "\t  -angle         : angle 0<SIETA<360 \n" );
//  fprintf( stderr, "\t  -x             : 出力補正スペクトルを何倍にするか指定\n" );
//  fprintf( stderr, "\t  -orgx          : 水平画素サイズ(任意の自然数)\n" );
//  fprintf( stderr, "\t  -orgy          : 垂直画素サイズ(任意の自然数)\n" );
//  fprintf( stderr, "\t  -sizexminus    : 原画像水平方向サイズと水平方向縮小後サイズとの差分(任意の自然数)\n" );
//  fprintf( stderr, "\t  -sizexminusy   : 原画像垂直方向サイズと垂直方向縮小後サイズとの差分(任意の自然数)\n" );
//  fprintf( stderr, "\t  -hv       : 1:水平 2:プログレッシブ垂直 3:インタレース垂直\n" );
//  fprintf( stderr, "\t  -bunshi   : 縮小率分子 max31\n" );
//  fprintf( stderr, "\t  -bunbo    : 縮小率分母 max32\n" );
//  fprintf( stderr, "\t  -tapnum_y : 輝度フィルタタップ数  推奨 21 max50\n" );
//  fprintf( stderr, "\t  -tapnum_c : 色差フィルタタップ数  推奨 11 max50\n" );
//  fprintf( stderr, "\t  -norm     : 総係数合計 推奨4096 サブサンプルプログラムで使う場合\n" );
//  fprintf( stderr, "\t  -mado     : 1:矩形 2:Lanczos 3:hanning(両端が0) 4:hamming\n" );
//  fprintf( stderr, "\t  -Fsc      : サブサンプル後のサンプリング周波数を１としたときカットオフ周波数を指定(推奨0.5)\n" );

}
void    option_set(short argc,char *argv[], CNTL *ptr)
{
  short i;
                                                                                                                                                         
  for(i=1;i < argc;i++) {
    if(argv[i][0] != '-')
      continue;

    if ( !strcmp( &argv[i][1], "h" ) ){
      /* \245\330\245\353\245\327\311\275\274\250 */
      print_help();
      exit(0);
    } else if ( !strcmp( &argv[i][1], "o" ) ){
      /* \275\320\316\317\245\325\245\241\245\244\245\353\314\276 */
      strcpy(ptr->OutputFileName, argv[++i]);
    } else if ( !strcmp( &argv[i][1], "i" ) ){
      strcpy(ptr->InputFileName, argv[++i]);
    } else if ( !strcmp( &argv[i][1], "i2" ) ){
      strcpy(ptr->InputFileName2, argv[++i]);
                                                                                                                                                         
    } else if ( !strcmp( &argv[i][1], "x" ) ){
      ptr->sizex = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "y" ) ){
      ptr->sizey = atoi(argv[++i]);
                                                                                                                                                         
    } else if ( !strcmp( &argv[i][1], "startx" ) ){
      ptr->startx = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "starty" ) ){
      ptr->starty = atoi(argv[++i]);
                                                                                                                                                         
    } else if ( !strcmp( &argv[i][1], "hv" ) ){
      ptr->hv = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "bunshi" ) ){
      ptr->bunshi = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "bunbo" ) ){
      ptr->bunbo = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "norm" ) ){
      ptr->norm = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "mado" ) ){
      ptr->mado = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "tapnum_y" ) ){
      ptr->tapnum_y = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "af" ) ){
      ptr->af = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "tapnum_c" ) ){
      ptr->tapnum_c = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "Fsc" ) ){
      ptr->Fs = atof(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "angle" ) ){
      ptr->angle = atof(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "sizexminus" ) ){
      ptr->sm = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "sizexminusy" ) ){
      ptr->smy = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "p" ) ){
      ptr->p = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "ol" ) ){
      ptr->ol = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "orgx" ) ){
      /* \277\345\312\277\312\375\270\376\306\376\316\317\262\350\301\374\245\265\245\244\245\272 */
      org_image_x = atoi(argv[++i]);
    } else if ( !strcmp( &argv[i][1], "orgy" ) ){
      /* \277\342\304\276\312\375\270\376\306\376\316\317\262\350\301\374\245\265\245\244\245\272 */
      org_image_y = atoi(argv[++i]);
    } else {
      print_help();
      exit(0);
    }
  }
                                                                                                                                                         
}

	
	
FILE *infile, *outfile; /* 入力ファイル, 出力ファイル */
unsigned long outcount = 0; /* 出力バイト数カウンタ */
static int getcount = 0, putcount = 8; /* ビット入出力カウンタ */
static unsigned bitbuf = 0; /* ビット入出力バッファ */
#define rightbits(n, x) ((x) & ((1U << (n)) - 1U)) /* xの右nビット */

void error(char *message) /* メッセージを表示し終了 */
{
fprintf(stderr, "\n%s\n", message);
exit(EXIT_FAILURE);
}

unsigned getbit(void) /* 1ビット読む */
{
if (--getcount >= 0) return (bitbuf >> getcount) & 1U;
getcount = 7; bitbuf = getc(infile);
return (bitbuf >> 7) & 1U;
}

unsigned getbits(int n) /* nビット読む */
{
unsigned x;

x = 0;
while (n > getcount) {
n -= getcount;
x |= rightbits(getcount, bitbuf) << n;
bitbuf = getc(infile); getcount = 8;
}
getcount -= n;
return x | rightbits(n, bitbuf >> getcount);
}

void putbit(unsigned bit) /* 1ビット書き出す */
{
putcount--;
if (bit != 0) bitbuf |= (1 << putcount);
if (putcount == 0) {
if (putc(bitbuf, outfile) == EOF) error("cant write");
bitbuf = 0; putcount = 8; outcount++;
}
}

void putbits(int n, unsigned x) /* nビット書き出す */
{
while (n >= putcount) {
n -= putcount;
bitbuf |= rightbits(putcount, x >> n);
if (putc(bitbuf, outfile) == EOF) error("cant write");
bitbuf = 0U; putcount = 8; outcount++;
}
putcount -= n;
bitbuf |= rightbits(n, x) << putcount;
}





#define N 256 /* 文字の種類 */
#define CHARBITS 8 /* 1バイトのビット数 */
int heapsize, heap[2*N-1], /* 優先待ち行列用ヒープ */
parent[2*N-1], left[2*N-1], right[2*N-1]; /* Huffman木 */
unsigned long int freq[2*N-1]; /* 各文字の出現頻度 */

static void downheap(int i) /* 優先待ち行列に挿入 */
{
int j, k;

k = heap[i];
while ((j = 2 * i) <= heapsize) {
if (j < heapsize && freq[heap[j]] > freq[heap[j + 1]])
j++;
if (freq[k] <= freq[heap[j]]) break;
heap[i] = heap[j]; i = j;
}
heap[i] = k;
}

void writetree(int i) /* 枝を出力 */
{
if (i < N) { /* 葉 */
putbit(0);
putbits(CHARBITS, i); /* 文字そのもの */
} else { /* 節 */
putbit(1);
writetree(left[i]); writetree(right[i]); /* 左右の枝 */
}
}

void encode(void) /* 圧縮 */
{
int i, j, k, avail, tablesize;
unsigned long int incount, cr;
static char codebit[N]; /* 符号語 */

for (i = 0; i < N; i++) freq[i] = 0; /* 頻度の初期化 */
while ((i = getc(infile)) != EOF) freq[i]++; /* 頻度数え */
heap[1] = 0; /* 長さ0のファイルに備える */
heapsize = 0;
for (i = 0; i < N; i++)
if (freq[i] != 0) heap[++heapsize] = i; /* 優先待ち行列に登録 */
for (i = heapsize / 2; i >= 1; i--) downheap(i); /* ヒープ作り */
for (i = 0; i < 2 * N - 1; i++) parent[i] = 0; /* 念のため */
k = heap[1]; /* 以下のループが1回も実行されない場合に備える */
avail = N; /* 以下のループでハフマン木を作る */
while (heapsize > 1) { /* 2個以上残りがある間 */
i = heap[1]; /* 最小の要素を取り出す */
heap[1] = heap[heapsize--]; downheap(1); /* ヒープ再構成 */
j = heap[1]; /* 次に最小の要素を取り出す */
k = avail++; /* 新しい節を生成する */
freq[k] = freq[i] + freq[j]; /* 頻度を合計 */
heap[1] = k; downheap(1); /* 待ち行列に登録 */
parent[i] = k; parent[j] = -k; /* 木を作る */
left[k] = i; right[k] = j; /* 〃 */
}
writetree(k); /* 木を出力 */
tablesize = (int) outcount; /* 表の大きさ */
incount = 0; rewind(infile); /* 再走査 */
while ((j = getc(infile)) != EOF) {
k = 0;
while ((j = parent[j]) != 0)
if (j > 0) codebit[k++] = 0;
else { codebit[k++] = 1; j = -j; }
while (--k >= 0) putbit(codebit[k]);
if ((++incount & 1023) == 0)
printf("%12lu\r", incount); /* 状況報告 */
}
putbits(7, 0); /* バッファの残りをフラッシュ */
printf("In : %lu bytes\n", incount); /* 結果報告 */
printf("Out: %lu bytes (table: %d bytes)\n",
outcount, tablesize);
if (incount != 0) { /* 圧縮比を求めて報告 */
cr = (1000 * outcount + incount / 2) / incount;
printf("Out/In: %lu.%03lu\n", cr / 1000, cr % 1000);
}
}

int readtree(void) /* 木を読む */
{
int i;
static int avail = N;

if (getbit()) { /* bit=1: 葉でない節 */
if ((i = avail++) >= 2 * N - 1) error("fugouhyoumatigatteru!!");
left [i] = readtree(); /* 左の枝を読む */
right[i] = readtree(); /* 右の枝を読む */
return i; /* 節を返す */
} else return (int) getbits(CHARBITS); /* 文字 */
}

void decode(unsigned long int size) /* 復元 */
{
int j, root;
unsigned long int k;

root = readtree(); /* 木を読む */
for (k = 0; k < size; k++) { /* 各文字を復元 */
j = root; /* 根 */
while (j >= N)
if (getbit()) j = right[j]; else j = left[j];
putc(j, outfile);
if ((k & 1023) == 0) printf("%12lu\r", k); /* 出力バイト数 */
}
printf("%12lu\n", size); /* 復元したバイト数 */
}

int huffman(int argc2, char *argv2[])
{
int c;
unsigned long int size; /* 元のバイト数 */

if (argc2 != 4 || ((c = *argv2[1]) != 'E' && c != 'e'
&& c != 'D' && c != 'd'))
error("usage uncorrect");
if ((infile = fopen(argv2[2], "rb")) == NULL)
error("input file cant open");
if ((outfile = fopen(argv2[3], "wb")) == NULL)
error("output file cant open");
if (c == 'E' || c == 'e') {
fseek(infile, 0L, SEEK_END); /* infile の末尾を探す */
size = ftell(infile); /* infile のバイト数 */
fwrite(&size, sizeof size, 1, outfile);
rewind(infile);
encode(); /* 圧縮 */
} else {
fread(&size, sizeof size, 1, infile); /* 元のバイト数 */
decode(size); /* 復元 */
}
fclose(infile); fclose(outfile);
return EXIT_SUCCESS;
}

	
	
	
	
void fft(double *real,double *imag, int power, int flg)
{
double c,s,t1,t2;
int arg,inc,i,j,k,lmax,lix,j1,j2,pnum,pnum1,nv2;
pnum = (int)(pow(2.0,(float)(power))+0.5);
double PI = atan(1.0) * 4.0;

lmax = pnum;
inc = 1;
for(i=0;i<power;i++){
lix=lmax;
lmax /= 2;
arg = 0;
for(j=0;j<lmax;j++){
c=cos(2.0*PI*((double)(arg))/((double)(pnum)));
s=flg*sin(2.0*PI*((double)(arg))/((double)(pnum)));
arg += inc;
for(k=lix;k<=pnum;k+=lix){
j1=k-lix+j;
j2=j1+lmax;
t1=(*(real+j1))-(*(real+j2));
t2=(*(imag+j1))-(*(imag+j2));
*(real+j1) += *(real+j2);
*(imag+j1) += *(imag+j2);
*(real+j2) = c*t1+s*t2;
*(imag+j2) = c*t2-s*t1;
}
}
inc *= 2;
}
j=0;
nv2=pnum/2;
pnum1=pnum-1;
for(i=0;i<pnum1;i++){
if(i<j){
t1=*(real+j);
t2=*(imag+j);
*(real+j)=*(real+i);
*(imag+j)=*(imag+i);
*(real+i)=t1;
*(imag+i)=t2;
}
k=nv2;
while(k<j+1){
j -= k;
k /= 2;
}
j+=k;
}
}
int mdct(int *s1,double *OUT)
{
	int i,j,k,l,m,num;
	double PI;
	PI = atan(1.0)*4.0;
	num =2048;
	complex double *SS,*p,*si,*q,*pp,*SSS;
	double *s,*pr,*pi,*ss,*ppr,*ppi;
//	FILE *fpw;
	p=(complex double*)malloc(sizeof(complex double)*num);
	pp=(complex double*)malloc(sizeof(complex double)*num);
	si=(complex double*)malloc(sizeof(complex double)*num);
	s=(double*)malloc(sizeof(double)*num);
	ss=(double*)malloc(sizeof(double)*num);
	q=(complex double*)malloc(sizeof(complex double)*num);
	pr=(double*)malloc(sizeof(double)*num);
	pi=(double*)malloc(sizeof(double)*num);
	ppr=(double*)malloc(sizeof(double)*num);
	ppi=(double*)malloc(sizeof(double)*num);
	SS=(complex double*)malloc(sizeof(complex double)*num);
	SSS=(complex double*)malloc(sizeof(complex double)*num);
//	fpw=fopen("kari.txt","w");
//	for(i=0;i<num/4;i++){
//		s[num/2+num/4+i] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)));
//		s[num/2+num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)));
//		s[i+num/4] = (double)(i);
//		s[num/4-i-1] = (double)(-i-1);
//		s[i+num/4] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)+0.5));//+cos(2.0*PI/(double)(num/2.0)*(double)(num/2-i));
//		s[num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)-0.5));
//		s[num/2+num/4+i] = (double)(i)+0.5;//sin(2.0*PI*1.5/(double)(num)*((double)(i)+0.5));
//		s[num/2+num/4-i-1] = (double)(-i-1)+0.5;

//		s[num/2+num/4+i] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)+0.5));
//		s[num/2+num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)-0.5));
//		s[i+num/4] = (double)(i)+0.5;
//		s[num/4-i-1] = (double)(-i-1)+0.5;
//		s[i+num/4] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)+0.5));//+cos(2.0*PI/(double)(num/2.0)*(double)(num/2-i));
//		s[num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)-0.5));
//		s[num/2+num/4+i] = (double)(i)+0.5;//sin(2.0*PI*1.5/(double)(num)*((double)(i)+0.5));
//		s[num/2+num/4-i-1] = (double)(-i-1)+0.5;
//	}
	for(i=0;i<num;i++){
		s[i]=(double)s1[i];//fprintf(fpw,"%f\n",s[i]);
	}
	for(i=0;i<num/4;i++){
		p[i] = cexp(I*PI*((double)i+0.5)/(double)num)*(-s[i+3*num/4]-s[3*num/4-1-i]);
//		q[i] =-s[i+3*num/4]-s[3*num/4-1-i];
	}
	for(i=num/4;i<3*num/4;i++){
		p[i] = cexp(I*PI*((double)i+0.5)/(double)num)*(s[i-num/4]-s[3*num/4-1-i]);
//		q[i] =s[i-num/4]-s[3*num/4-1-i];
	}
	for(i=3*num/4;i<num;i++){
		p[i] = cexp(I*PI*((double)i+0.5)/(double)num)*(s[i-num/4]+s[7*num/4-1-i]);
//		q[i] =s[i-num/4]+s[7*num/4-1-i];
	}
	for(i=0;i<num;i++){
		pr[i]=creal(p[i]);
		pi[i]=cimag(p[i]);
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f,%f\n",pr[i],pi[i]);
//	}
	fft(pr,pi,11,-1);
	for(i=0;i<num;i++){
		p[i] = pr[i]+I*pi[i];
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f,%f\n",pr[i],pi[i]);
//	}
	for(j=0;j<num;j++){
		SS[j]=0.5*cexp(I*PI*(double)j/(double)num)*p[j];
//		SS[j]=p[j];
	}
//	printf("kari=%f,%f\n",creal(cexp(I*PI)),cimag(cexp(I*PI)));
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f,%f\n",creal(SS[i]),cimag(SS[i]));
//		fprintf(fpw,"%f\n",q[i]);
//	}
	for(i=0;i<num/2;i++){
		OUT[i] = creal(SS[i]);
	}
	goto end;
//	for(i=0;i<num;i++){
//		ss[i] = 0.0;
//	}
//	for(i=0;i<num;i++){
//		for(j=0;j<num/2;j++){
//			ss[i] += creal(SS[j])*cos(2.0*PI/(double)num*((double)i+0.5+(double)num/4.0)*(j+0.5));
//		}
//	}
	
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f\n",ss[i]);
//	}
//SS[i] i=0〜N-1 奇関数でMDCT係数がもとまっている。
	
	for(i=0;i<num;i++){
		pp[i] = 2.0*cexp(-I*PI*(double)i/(double)num)*SS[i];
	}
	for(i=0;i<num;i++){
		ppr[i] = creal(pp[i]);
		ppi[i] = cimag(pp[i]);
	}
	fft(ppr,ppi,11,1);
	
	for(i=0;i<num;i++){
		pp[i] = ppr[i] + I * ppi[i];
	}
	
	for(i=0;i<num;i++){
		SSS[i] = cexp(-I*PI*((double)i+0.5)/(double)num)*pp[i];
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f\n",creal(SSS[i]));
//	}
	for(i=0;i<3*num/4;i++){
		ss[i] = SSS[i+num/4];
	}
	for(i=0;i<num/4;i++){
		ss[i+3*num/4] = -SSS[i];
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f\n",ss[i]);
//	}
	
//	fclose(fpw);

	
	
end:
	
	
	
	return 0;
}
int imdct(double *IN,double *ss)
{
	int i,j,k,l,m,num;
	double PI;
	PI = atan(1.0)*4.0;
	num =2048;
	complex double /**SS,*/*p,*si,*q,*pp,*SSS;
	double *SS,*s,*pr,*pi,/**ss,*/*ppr,*ppi;
//	FILE *fpw;
	p=(complex double*)malloc(sizeof(complex double)*num);
	pp=(complex double*)malloc(sizeof(complex double)*num);
	si=(complex double*)malloc(sizeof(complex double)*num);
	s=(double*)malloc(sizeof(double)*num);
//	ss=(double*)malloc(sizeof(double)*num);
	q=(complex double*)malloc(sizeof(complex double)*num);
	pr=(double*)malloc(sizeof(double)*num);
	pi=(double*)malloc(sizeof(double)*num);
	ppr=(double*)malloc(sizeof(double)*num);
	ppi=(double*)malloc(sizeof(double)*num);
	SS=(double*)malloc(sizeof(double)*num);
	SSS=(complex double*)malloc(sizeof(complex double)*num);
//	fpw=fopen("kari.txt","w");
//	for(i=0;i<num/4;i++){
//		s[num/2+num/4+i] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)));
//		s[num/2+num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)));
//		s[i+num/4] = (double)(i);
//		s[num/4-i-1] = (double)(-i-1);
//		s[i+num/4] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)+0.5));//+cos(2.0*PI/(double)(num/2.0)*(double)(num/2-i));
//		s[num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)-0.5));
//		s[num/2+num/4+i] = (double)(i)+0.5;//sin(2.0*PI*1.5/(double)(num)*((double)(i)+0.5));
//		s[num/2+num/4-i-1] = (double)(-i-1)+0.5;

//		s[num/2+num/4+i] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)+0.5));
//		s[num/2+num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)-0.5));
//		s[i+num/4] = (double)(i)+0.5;
//		s[num/4-i-1] = (double)(-i-1)+0.5;
//		s[i+num/4] = 5.0*cos(2.0*PI/(double)(num)*((double)(i)+0.5));//+cos(2.0*PI/(double)(num/2.0)*(double)(num/2-i));
//		s[num/4-i-1] = 5.0*cos(2.0*PI/(double)(num)*((double)(-i)-0.5));
//		s[num/2+num/4+i] = (double)(i)+0.5;//sin(2.0*PI*1.5/(double)(num)*((double)(i)+0.5));
//		s[num/2+num/4-i-1] = (double)(-i-1)+0.5;
//	}
	goto start;
//	for(i=0;i<num;i++){
//		s[i]=(double)s1[i];//fprintf(fpw,"%f\n",s[i]);
//	}
	for(i=0;i<num/4;i++){
		p[i] = cexp(I*PI*((double)i+0.5)/(double)num)*(-s[i+3*num/4]-s[3*num/4-1-i]);
//		q[i] =-s[i+3*num/4]-s[3*num/4-1-i];
	}
	for(i=num/4;i<3*num/4;i++){
		p[i] = cexp(I*PI*((double)i+0.5)/(double)num)*(s[i-num/4]-s[3*num/4-1-i]);
//		q[i] =s[i-num/4]-s[3*num/4-1-i];
	}
	for(i=3*num/4;i<num;i++){
		p[i] = cexp(I*PI*((double)i+0.5)/(double)num)*(s[i-num/4]+s[7*num/4-1-i]);
//		q[i] =s[i-num/4]+s[7*num/4-1-i];
	}
	for(i=0;i<num;i++){
		pr[i]=creal(p[i]);
		pi[i]=cimag(p[i]);
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f,%f\n",pr[i],pi[i]);
//	}
	fft(pr,pi,11,-1);
	for(i=0;i<num;i++){
		p[i] = pr[i]+I*pi[i];
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f,%f\n",pr[i],pi[i]);
//	}
	for(j=0;j<num;j++){
		SS[j]=0.5*cexp(I*PI*(double)j/(double)num)*p[j];
//		SS[j]=p[j];
	}
//	printf("kari=%f,%f\n",creal(cexp(I*PI)),cimag(cexp(I*PI)));
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f,%f\n",creal(SS[i]),cimag(SS[i]));
//		fprintf(fpw,"%f\n",q[i]);
//	}
//	for(i=0;i<num/2;i++){
//		OUT[i] = creal(SS[i]);
//	}
	goto end;
//	for(i=0;i<num;i++){
//		ss[i] = 0.0;
//	}
//	for(i=0;i<num;i++){
//		for(j=0;j<num/2;j++){
//			ss[i] += creal(SS[j])*cos(2.0*PI/(double)num*((double)i+0.5+(double)num/4.0)*(j+0.5));
//		}
//	}
	
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f\n",ss[i]);
//	}
//SS[i] i=0〜N-1 奇関数でMDCT係数がもとまっている。
start:
	for(i=0;i<num/2;i++){
		SS[i]=IN[i];
		SS[num-1-i] = -IN[i];
	}
	for(i=0;i<num;i++){
		pp[i] = 2.0*cexp(-I*PI*(double)i/(double)num)*SS[i];
	}
	for(i=0;i<num;i++){
		ppr[i] = creal(pp[i]);
		ppi[i] = cimag(pp[i]);
	}
	fft(ppr,ppi,11,1);
	
	for(i=0;i<num;i++){
		pp[i] = ppr[i] + I * ppi[i];
	}
	
	for(i=0;i<num;i++){
		SSS[i] = cexp(-I*PI*((double)i+0.5)/(double)num)*pp[i];
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f\n",creal(SSS[i]));
//	}
	for(i=0;i<3*num/4;i++){
		ss[i] = SSS[i+num/4]/4.0;
	}
	for(i=0;i<num/4;i++){
		ss[i+3*num/4] = -SSS[i]/4.0;
	}
//	for(i=0;i<num;i++){
//		fprintf(fpw,"%f\n",ss[i]);
//	}
	
//	fclose(fpw);

	
	
end:
	
	
	
	return 0;
}
int channel( int *SOURCE, int NUM, double *KEISUU, int WINDOWSIZE,int *KNUM)
{
	int i,j,k;
	int KAISUU;
	int *BUFFER;
	double *SS;
	double PI;
	PI = 4.0*atan(1.0);
	BUFFER = (int*)malloc(sizeof(int)*WINDOWSIZE);
	KAISUU = NUM / WINDOWSIZE * 2 - 1;
	*KNUM = KAISUU;
	SS = (double*)malloc(sizeof(double)*WINDOWSIZE/2);
	printf("NUM=%d,WSIZE=%d\n",NUM,WINDOWSIZE);
	for(i=0;i<KAISUU;i++){
		for(j=0;j<WINDOWSIZE;j++){
			BUFFER[j] = SOURCE[j+WINDOWSIZE/2*i];
		}
		for(j=0;j<WINDOWSIZE;j++){
			BUFFER[j] = BUFFER[j] * sin(PI/(double)WINDOWSIZE*((double)j+0.5));
		}
//		for(j=0;j<WINDOWSIZE/2;j++){
//			SS[j] = 0.0;
//		}
//		for(j=0;j<WINDOWSIZE/2;j++){
//			for(k=0;k<WINDOWSIZE;k++){
//				SS[j] += BUFFER[k]*cos(2.0*PI/(double)(WINDOWSIZE)*((double)k+0.5+(double)WINDOWSIZE/4.0)*((double)j+0.5));
//			}
//		}
		mdct(BUFFER,SS);
		for(j=0;j<WINDOWSIZE/2;j++){
			KEISUU[j+i*WINDOWSIZE/2] = SS[j]/(double)WINDOWSIZE*2.0;
		//	if(i==0 && j>=0 && j <= 20){
		//	printf("%f\n",KEISUU[j+i*WINDOWSIZE/2]);
		//	}
		}//while(1);
	}
	return 0;
}
int	ichannel( double *KEISUU, int NUM,int *DIST, int WINDOWSIZE,int FILESIZE){
	int i,j,k;
	double *DISTDBL,*BUFFER,PI,*SSS;
	PI = 4.0*atan(1.0);
	BUFFER = (double*)malloc(sizeof(double)*WINDOWSIZE/2);
	SSS = (double*)malloc(sizeof(double)*WINDOWSIZE);
	DISTDBL = (double*)malloc(sizeof(double)*FILESIZE);
	for(i=0;i<FILESIZE;i++){
		DISTDBL[i] = 0.0;
	}
	for(i=0;i<NUM;i++){
//		for(j=0;j<WINDOWSIZE;j++){
//			SSS[j] = 0.0;
//		}
//		for(j=0;j<WINDOWSIZE;j++){
//			for(k=0;k<WINDOWSIZE/2;k++){
//				SSS[j] += KEISUU[i*WINDOWSIZE/2+k]*cos(2.0*PI/(double)WINDOWSIZE*((double)j+0.5+(double)WINDOWSIZE/4.0)*((double)k+0.5));
//			}
//		}
		imdct(KEISUU+i*WINDOWSIZE/2,SSS);
//		for(i=0;i<30;i++){
//			printf("%f\n",SSS[i]);
//		}while(1);
		for(j=0;j<WINDOWSIZE;j++){
			DISTDBL[j+i*WINDOWSIZE/2] += SSS[j] * sin(PI*((double)j+0.5)/(double)WINDOWSIZE);
		}
	}
	for(i=0;i<FILESIZE;i++){
		if(DISTDBL[i] >= 0.0){
		DIST[i] = (int)(DISTDBL[i] + 0.5);
		} else {
		DIST[i] = (int)(DISTDBL[i] - 0.5);
		}
	}
	return 0;
		
}

int main(int argc, char *argv[]){
FILE *fpr1;
FILE *fpr2;
FILE *fpw5;
unsigned char *vin;
unsigned char *vout;
unsigned char *vin_buffer;
//#define HSIZE 360
//#define VSIZE 288
//#define tmp HSIZE*VSIZE 
int i,j,k,l,m,n,o ;
CNTL  *cnt;
int center0;
int sizeminus;
int filesizebyte;
int filesizebyte2;
	
unsigned char *B;
unsigned char *G;
unsigned char *R;
unsigned char *BIN;
unsigned char *GIN;
unsigned char *RIN;
unsigned char *RUPOUT;
unsigned char *GUPOUT;
unsigned char *BUPOUT;
unsigned char temp;
unsigned char temp2;
unsigned int  filesize;
double	      DiagonalLength;
int	      NewHsize;
int	      NewVsize;
double        PI;
double 	      *rotx;
double	      *roty;
double	      *screen_rotx;
double	      *screen_roty;
int	      *introtx;
int	      *introty;
double				aaa;
double				bbb;
int				ww;
int				xx;
int				yy;
int				zz;
double				low_x;
double				up_x;
int				wwg;
int				xxg;
int				yyg;
int				zzg;
double				low_xg;
double				up_xg;
int				wwr;
int				xxr;
int				yyr;
int				zzr;
double				low_xr;
double				up_xr;
double				ccc;
double				ddd;


  org_image_x = ORG_IMAGE_X;
  org_image_y = ORG_IMAGE_Y;

        if( argc < 2 ) {
                print_help();
                exit(0);
        }
//-----debug-----
//for(;;);
//----------------
        cnt = (CNTL *)malloc( sizeof(CNTL)*sizeof(uchar) );
                                                                                                                                                         
        /* \245\307\245\325\245\251\245\353\245\310\303\315\300\337\304\352 */
        cnt->sizex = ORG_IMAGE_X;    
        cnt->sizey = ORG_IMAGE_Y;     
        cnt->startx = 0;
        cnt->starty = 0;
                                                                                                                                                         
        /* \245\252\245\327\245\267\245\347\245\363\245\301\245\247\245\303\245\257 */
	    cnt->p = 2048;
        //option_set(argc, argv, cnt);
                                                                                                                                                         
                                                                                                                                                         
        hsize = org_image_x;
        vsize = org_image_y;
        //strcpy(inputfile,cnt->InputFileName);
        //strcpy(inputfile2,cnt->InputFileName2);
        //strcpy(outputfile,cnt->OutputFileName);
	sizeminus = cnt->sm;
    int argc2;
	char **argv2;
		argv2 = (char**)malloc(sizeof(char*)*6);
	for(i=0;i<6;i++){
		argv2[i] = (char*)malloc(sizeof(char)*80);
	}
/********************************/ 
/*				*/
/*	  MAIN ROUTINE		*/
/*				*/
/********************************/
	int karikari;
	unsigned char karikari2,karikari3;

//	vin_buffer = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
//	vout = (unsigned char *)malloc(sizeof(unsigned char)*(hsize+sizeminus)*(vsize+smy)*2);
		if(argc != 4){ exit(0);};
	if(argv[1][0] == 'e' || argv[1][0] == 'E'){;}
	else if(argv[1][0] == 'd' || argv[1][0] == 'D'){goto decode_start;}
        if((fpr1 = fopen(argv[2],"rb"))==NULL){
                exit(0);
        }
//debug start
//for(;;);
//debug end
/***************************************************/
/* picture size & file size get from bitmap header */
/***************************************************/
	fread(&filesizebyte,sizeof(int),1,fpr1);
	if(filesizebyte == 0x46464952){
		fprintf(stderr,"RIFFdayoOK\n");
	} else {
		fprintf(stderr,"RIFFjyanaiyo!!\n");
	    fclose(fpr1);
		exit(0);
	}
//	fseek(fpr1,18,SEEK_SET);
//	fread(&hsize,sizeof(int),1,fpr1);
	fseek(fpr1,0x8,SEEK_SET);
	fread(&filesizebyte,sizeof(int),1,fpr1);
	fread(&filesizebyte2,sizeof(int),1,fpr1);
	if(filesizebyte == 0x45564157 && filesizebyte2 == 0x20746D66){
		fprintf(stderr,"WAVEfmt dayoOK\n");
	} else {
		fprintf(stderr,"WAVEfmt jyanaiyo!!\n");
	    fclose(fpr1);
		exit(0);
	}
	fseek(fpr1,0x14,SEEK_SET);
	fread(&filesizebyte,sizeof(int),1,fpr1);
//	fread(&filesizebyte2,sizeof(int),1,fpr1);
	if(filesizebyte == 0x020001 ){
		fprintf(stderr,"LINEAR PCM STEREO dayoOK\n");
	} else if(filesizebyte == 0x010001 ){
		fprintf(stderr,"LINEAR PCM MONO dayoOK\n");
	} else {
	    fclose(fpr1);
		exit(0);
	}
	fread(&filesizebyte,sizeof(int),1,fpr1);
	if(filesizebyte == 0xAC44 ){//44.1kHz
		fprintf(stderr,"SampleRate 44.1kHz dayoOK\n");
	} else if(filesizebyte == 0xAC44/2){
		fprintf(stderr,"SampleRate 22.05kHz dayoOK\n");
	} else {
	    fclose(fpr1);
		exit(0);
	}
	fread(&filesizebyte2,sizeof(int),1,fpr1);
//	fread(&filesizebyte2,sizeof(int),1,fpr1);
	if(filesizebyte2 == 176400 && filesizebyte == 0xAC44){
		fprintf(stderr,"16bit dayo!!OK\n");
	} else if(filesizebyte2 == 176400/2 && filesizebyte == 0xAC44){
		fprintf(stderr,"16bit dayo!!OK\n");
	} else if(filesizebyte == 0xAC44/2 && filesizebyte2 == 0xAC44/2*2*2){
		fprintf(stderr,"16bit dayo!!OK\n");
	} else if(filesizebyte == 0xAC44/2 && filesizebyte2 == 0xAC44/2*2){
		fprintf(stderr,"16bit dayo!!OK\n");
	    fclose(fpr1);
		exit(0);
	}
//	fread(&vsize,sizeof(int),1,fpr1);
//	fseek(fpr1,2,SEEK_SET);
//	fread(&filesizebyte,sizeof(int),1,fpr1);
//debug start
//printf ("%d\n",filesizebyte);
//for(;;);
//debug end

/***************/
/* picture get */
/***************/
//	vin = (unsigned char *)malloc(sizeof(unsigned char)*(filesizebyte-54));
	B = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
	G = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
	R = (unsigned char *)malloc(sizeof(unsigned char)*hsize*vsize);
	fseek(fpr1,0x28,SEEK_SET);
	fread(&filesizebyte,sizeof(int),1,fpr1);
//	for(i=0;i<filesizebyte;i++){
//	}
//	fprintf(stderr,"filesize=0x%x\n",filesizebyte);
//	while(1);
//	fseek(fpr1,54,SEEK_SET);
	vin = (unsigned char *)malloc(sizeof(unsigned char)*(filesizebyte));
	if(fread(vin,sizeof(unsigned char),filesizebyte ,fpr1) != filesizebyte  ){
		fprintf(stderr,"input file size err!!\n");
		exit(1);
	}
	fclose(fpr1);
//debug start
//	while(1);
//debug end
	unsigned char LD,LU,RD,RU;
	int *LEFT,*RIGHT;
	LEFT = (int*)malloc(sizeof(int)*filesizebyte/4);
	RIGHT = (int*)malloc(sizeof(int)*filesizebyte/4);
//debug start
//	while(1);
//debug end 
	for(i=0;i<filesizebyte/4;i++){
		LD = *(vin+4*i);
		LU = *(vin+4*i+1);
		RD = *(vin+4*i+2);
		RU = *(vin+4*i+3);
		*(LEFT+i)=LD+256*LU;
		*(RIGHT+i)=RD+256*RU;
		if(*(LEFT+i)>=32768){
			*(LEFT+i) = -(32768*2-(*(LEFT+i)));
		}
		if(*(RIGHT+i)>=32768){
			*(RIGHT+i) = -(32768*2-(*(RIGHT+i)));
		}
//tyuui		
//		*(LEFT+i) +=32768;
  //  	*(RIGHT+i) +=32768;
	}
	
	int *SAISYOL,*SAISYOR,*SAIGOL,*SAIGOR,SAIGONUM;
	SAIGONUM = cnt->p / 2 + ((filesizebyte/4) % cnt->p);
	SAISYOL = (int*)malloc(sizeof(int)* cnt->p / 2);
	SAISYOR = (int*)malloc(sizeof(int)* cnt->p / 2);
	SAIGOR = (int*)malloc(sizeof(int)* SAIGONUM);
	SAIGOL = (int*)malloc(sizeof(int)* SAIGONUM);
	for(i=0;i < cnt->p / 2;i++){
		SAISYOL[i] = LEFT[i];
		SAISYOR[i] = RIGHT[i];
	}
	for(i=0;i<SAIGONUM;i++){
		SAIGOR[i] = RIGHT[filesizebyte/4-SAIGONUM+i];
		SAIGOL[i] = LEFT[filesizebyte/4-SAIGONUM+i];
	}
//	FILE *fpw4;
//	fpw4 = fopen("debug.txt","w");
//	for(i=0;i<9000;i++){
//		fprintf(fpw4,"%d\n",LEFT[i]);
//	}
//	fclose(fpw4);
//	for(i=0;filesizebyte/4;i++){
//		LEFT[i] -= 32768;
//		RIGHT[i] -= 32768;
//	}
	double *KEISUUL,*KEISUUR;
	int KNUM,*DISTR,*DISTL;
//	int *INT_KEISUU_HEAD_TAIL_R,*INT_KEISUU_HEAD_TAIL_L;
	int FILESIZE;
	FILESIZE = filesizebyte/4;
	KEISUUR = (double*)malloc(sizeof(double)*filesizebyte/4);
	KEISUUL = (double*)malloc(sizeof(double)*filesizebyte/4);
	DISTL = (int*)malloc(sizeof(int)*filesizebyte/4);
	DISTR = (int*)malloc(sizeof(int)*filesizebyte/4);
//	INT_KEISUU_HEAD_TAIL_R = (int*)malloc(sizeof(int)*filesizebyte/4);
//	INT_KEISUU_HEAD_TAIL_L = (int*)malloc(sizeof(int)*filesizebyte/4);
	channel( LEFT, filesizebyte/4, KEISUUL, cnt->p,&KNUM);
	channel( RIGHT, filesizebyte/4, KEISUUR, cnt->p,&KNUM);

	// 4byte kata channel sample suu
	// 2048 byte  atama R data  1024 sample
	// 2048 byte  atama L data  1024 sample
	// (filesizebyte/4 % 2048 + 1024) * 2 byte  tail R data (filesizebyte/4 % 2048 + 1024)sample 
	// (filesizebyte/4 % 2048 + 1024) * 2 byte  tail L data (filesizebyte/4 % 2048 + 1024)sample
	// (filesizebyte/4/2048 * 2 - 1)*1024*2 byte KEISUU R
	// (filesizebyte/4/2048 * 2 - 1)*1024*2 byte KEISUU L

	FILE *fpw6;
//	int karikari;
//	unsigned char karikari2,karikari3;
	fpw6 = fopen("xxx.bit","wb");
	fwrite(&FILESIZE,sizeof(int),1,fpw6);
	for(i=0;i<cnt->p/2;i++){
		karikari = SAISYOR[i];
		if(karikari < 0){
			karikari += 32768*2;
		}
		karikari2 = (unsigned char)(karikari & 0xff);//lower
		karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper
		fwrite(&karikari2,sizeof(unsigned char),1,fpw6);
		fwrite(&karikari3,sizeof(unsigned char),1,fpw6);
		
	}
	for(i=0;i<cnt->p/2;i++){
		karikari = SAISYOL[i];
		if(karikari < 0){
			karikari += 32768*2;
		}
		karikari2 = (unsigned char)(karikari & 0xff);//lower
		karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper
		fwrite(&karikari2,sizeof(unsigned char),1,fpw6);
		fwrite(&karikari3,sizeof(unsigned char),1,fpw6);
		
	}
	for(i=0;i<SAIGONUM;i++){
		karikari = SAIGOR[i];
		if(karikari < 0){
			karikari += 32768*2;
		}
		karikari2 = (unsigned char)(karikari & 0xff);//lower
		karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper
		fwrite(&karikari2,sizeof(unsigned char),1,fpw6);
		fwrite(&karikari3,sizeof(unsigned char),1,fpw6);
		
	}	
	for(i=0;i<SAIGONUM;i++){
		karikari = SAIGOL[i];
		if(karikari < 0){
			karikari += 32768*2;
		}
		karikari2 = (unsigned char)(karikari & 0xff);//lower
		karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper
		fwrite(&karikari2,sizeof(unsigned char),1,fpw6);
		fwrite(&karikari3,sizeof(unsigned char),1,fpw6);
		
	}	
	for(i=0;i<KNUM*cnt->p/2;i++){
		karikari = (int)(KEISUUR[i]+0.5);
		if(karikari < 0){
			karikari += 32768*2;
		}
		karikari2 = (unsigned char)(karikari & 0xff);//lower
		karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper
		fwrite(&karikari2,sizeof(unsigned char),1,fpw6);
		fwrite(&karikari3,sizeof(unsigned char),1,fpw6);
		
	}	
	for(i=0;i<KNUM*cnt->p/2;i++){
		karikari = (int)(KEISUUL[i]+0.5);
		if(karikari < 0){
			karikari += 32768*2;
		}
		karikari2 = (unsigned char)(karikari & 0xff);//lower
		karikari3 = (unsigned char)((karikari >> 8) & 0xff);//upper
		fwrite(&karikari2,sizeof(unsigned char),1,fpw6);
		fwrite(&karikari3,sizeof(unsigned char),1,fpw6);
		
	}	
	fclose(fpw6);
	argc2 = 4;
	argv2[1][0] = 'e';
	argv2[2][0]='x';
	argv2[2][1]='x';
	argv2[2][2]='x';
	argv2[2][3]='.';
	argv2[2][4]='b';
	argv2[2][5]='i';
	argv2[2][6]='t';
	argv2[2][7]='\0';
//	argv2[3][0]='y';
//	argv2[3][1]='y';
//	argv2[3][2]='y';
//	argv2[3][3]='.';
//	argv2[3][4]='b';
//	argv2[3][5]='i';
//	argv2[3][6]='t';
//	argv2[3][7]='\0';
	strcpy(argv2[3],argv[3]);	
	huffman(argc2,argv2);
	if(argv[1][0] == 'e' || argv[1][0] == 'E') {goto encode_end;}
decode_start:	
	argc2 = 4;
	argv2[1][0] = 'd';
//	argv2[2][0]='y';
//	argv2[2][1]='y';
//	argv2[2][2]='y';
//	argv2[2][3]='.';
//	argv2[2][4]='b';
//	argv2[2][5]='i';
//	argv2[2][6]='t';
//	argv2[2][7]='\0';
	strcpy(argv2[2],argv[2]);
	argv2[3][0]='z';
	argv2[3][1]='z';
	argv2[3][2]='z';
	argv2[3][3]='.';
	argv2[3][4]='b';
	argv2[3][5]='i';
	argv2[3][6]='t';
	argv2[3][7]='\0';

	huffman(argc2,argv2);
	cnt->p = 2048;
	FILE *fpr3;
	fpr3 = fopen("zzz.bit","rb");
	fread(&karikari,sizeof(int),1,fpr3);
	printf("FILESIZE = %d\n",karikari);
	FILESIZE = karikari;
	//printf("FILESIZE2=%d\n",FILESIZE);
	SAIGONUM = cnt->p / 2 + ((FILESIZE) % cnt->p);
	int *SAISYOL2,*SAISYOR2,*SAIGOR2,*SAIGOL2,*DISTL2,*DISTR2;
	double *KEISUUR2,*KEISUUL2;
	SAISYOL2 = (int*)malloc(sizeof(int)* cnt->p / 2);
	SAISYOR2 = (int*)malloc(sizeof(int)* cnt->p / 2);
	SAIGOR2 = (int*)malloc(sizeof(int)* SAIGONUM);
	SAIGOL2 = (int*)malloc(sizeof(int)* SAIGONUM);
	KEISUUR2 = (double*)malloc(sizeof(double)*FILESIZE);
	KEISUUL2 = (double*)malloc(sizeof(double)*FILESIZE);
	DISTL2 = (int*)malloc(sizeof(int)*FILESIZE);
	DISTR2 = (int*)malloc(sizeof(int)*FILESIZE);
//	for(i=0;i<cnt->p + SAIGONUM * 2;i++){
//		fread(&karikari2,sizeof(unsigned char),1,fpr3);
//		fread(&karikari2,sizeof(unsigned char),1,fpr3);
//	}
	for(i=0;i<cnt->p / 2;i++){
		fread(&karikari2,sizeof(unsigned char),1,fpr3);
		fread(&karikari3,sizeof(unsigned char),1,fpr3);
		SAISYOR2[i] = karikari3*256+karikari2;
		if(SAISYOR2[i] >=32768){
			SAISYOR2[i] = -(32768*2-SAISYOR2[i]);
		}
	}
	for(i=0;i<cnt->p / 2;i++){
		fread(&karikari2,sizeof(unsigned char),1,fpr3);
		fread(&karikari3,sizeof(unsigned char),1,fpr3);
		SAISYOL2[i] = karikari3*256+karikari2;
		if(SAISYOL2[i] >=32768){
			SAISYOL2[i] = -(32768*2-SAISYOL2[i]);
		}
	}
	for(i=0;i<SAIGONUM;i++){
		fread(&karikari2,sizeof(unsigned char),1,fpr3);
		fread(&karikari3,sizeof(unsigned char),1,fpr3);
		SAIGOR2[i] = karikari3*256+karikari2;
		if(SAIGOR2[i] >=32768){
			SAIGOR2[i] = -(32768*2-SAIGOR2[i]);
		}
	}
	for(i=0;i<SAIGONUM;i++){
		fread(&karikari2,sizeof(unsigned char),1,fpr3);
		fread(&karikari3,sizeof(unsigned char),1,fpr3);
		SAIGOL2[i] = karikari3*256+karikari2;
		if(SAIGOL2[i] >=32768){
			SAIGOL2[i] = -(32768*2-SAIGOL2[i]);
		}
	}
		
//		KAISUU = NUM / WINDOWSIZE * 2 - 1;
	KNUM = FILESIZE / cnt->p * 2 -1;
	for(i=0;i<KNUM*cnt->p/2;i++){
		fread(&karikari2,sizeof(unsigned char),1,fpr3);
		fread(&karikari3,sizeof(unsigned char),1,fpr3);
		KEISUUR2[i] = karikari3*256+karikari2;
		if(KEISUUR2[i] >=32768){
			KEISUUR2[i] = -(32768*2-KEISUUR2[i]);
		}
	}
	for(i=0;i<KNUM*cnt->p/2;i++){
		fread(&karikari2,sizeof(unsigned char),1,fpr3);
		fread(&karikari3,sizeof(unsigned char),1,fpr3);
		KEISUUL2[i] = karikari3*256+karikari2;
		if(KEISUUL2[i] >=32768){
			KEISUUL2[i] = -(32768*2-KEISUUL2[i]);
		}
	}
	fclose(fpr3);	
	//while(1);
	
	
	ichannel(KEISUUL2,KNUM,DISTL2,cnt->p,FILESIZE);
	ichannel(KEISUUR2,KNUM,DISTR2,cnt->p,FILESIZE);
	//while(1);
//	for(i=0;i<filesizebyte/4;i++){
//		DISTR[i] -= 32768;
//		DISTL[i] -= 32768;
//		fprintf(fpw4,"%d\n",DISTL[i]);
//	}
	
//	fclose(fpw4);
//	while(1);
	for(i=0;i< cnt->p / 2;i++){
		DISTR2[i] = SAISYOR2[i];
		DISTL2[i] = SAISYOL2[i];
	}//while(1);
	for(i=0;i<SAIGONUM;i++){
		DISTR2[(FILESIZE)/cnt->p*cnt->p - cnt->p/2+i] =  SAIGOR2[i];
		DISTL2[(FILESIZE)/cnt->p*cnt->p - cnt->p/2+i] =  SAIGOL2[i];
	}
	
	
	//while(1);
	//printf("tootta\n");
	int *LEFTINT;
	int FSIZE;
	FSIZE = FILESIZE;
	printf("FSIZE=%d\n",FILESIZE);
	LEFTINT = (int*)malloc(sizeof(int)*(FSIZE));
	for(i=0;i<FSIZE;i++){
//		if((*(LEFTSAMPLE+i)/*-32768.0*/) >= 0.0){
//		*(LEFTINT+i)=(int)((*(LEFTSAMPLE+i)/*-32768.0*/)+0.5);
//		}
//		if((*(LEFTSAMPLE+i)/*-32768.0*/) < 0.0){
//		*(LEFTINT+i)=(int)((*(LEFTSAMPLE+i)/*-32768.0*/)-0.5);
//		}
		LEFTINT[i] = DISTL2[i];
		if(*(LEFTINT+i) > 32767){
			//fprintf(stderr,"%d\n",*(LEFTINT+i));
			*(LEFTINT+i) = 32767;
		}
		if(*(LEFTINT+i) < -32768){
			//fprintf(stderr,"%d\n",*(LEFTINT+i));
			*(LEFTINT+i) = -32768;
		}
		//fprintf(stderr,"%d\n",*(LEFTINT+i));
	}
	int *RIGHTINT;
	RIGHTINT = (int*)malloc(sizeof(int)*(FSIZE));
	for(i=0;i<FSIZE;i++){
//		if((*(RIGHTSAMPLE+i)/*-32768.0*/) >= 0.0){
//		*(RIGHTINT+i)=(int)((*(RIGHTSAMPLE+i)/*-32768.0*/)+0.5);
//		}
//		if((*(RIGHTSAMPLE+i)/*-32768.0*/) < 0.0){
//		*(RIGHTINT+i)=(int)((*(RIGHTSAMPLE+i)/*-32768.0*/)-0.5);
//		}
		RIGHTINT[i] = DISTR2[i];
		if(*(RIGHTINT+i) > 32767){
			*(RIGHTINT+i) = 32767;
		}
		if(*(RIGHTINT+i) < -32768){
			*(RIGHTINT+i) = -32768;
		}
	}
	//LEFTINTとRIGHTINTにfilesizeyte/2-1個の-32768〜32767のデータを16bit 2の補数に直す。以下8行
	for(i=0;i<FSIZE;i++){
		if(*(RIGHTINT+i) < 0){
			*(RIGHTINT+i) += 32768*2;
		}
		if(*(LEFTINT+i) < 0){
			*(LEFTINT+i) += 32768*2;
		}
	}
//	while(1);
/*	int *MONO;
	MONO = (int*)malloc(sizeof(int)*filesizebyte/4);
	for(i=0;i<filesizebyte/4;i++){
		if(*(RIGHT+i)+ *(LEFT+i) >=0){
			*(MONO+i)= (int)(((((float)(*(RIGHT+i))) + ((float)(*(LEFT+i))))/2.0)+0.5);
		}
		if(*(RIGHT+i)+ *(LEFT+i) < 0){
			*(MONO+i)= (int)(((((float)(*(RIGHT+i))) + ((float)(*(LEFT+i))))/2.0)-0.5);
		}
		if(*(MONO+i) < 0){
			*(MONO+i) = 32768*2+(*(MONO+i));
		}
//		*(MONO+i) += 32768;
	}
	*/
//	int FFFFFFF;
//	FFFFFFF=(int)(-15.3);
//	fprintf(stderr,"%d\n",FFFFFFF);
//	while(1);
//	fprintf(stderr,"%x\n",((0x0000FF00 & 0x1234)>>8));
//	while(1);
	RUPOUT = (unsigned char *)malloc(sizeof(unsigned char)*(hsize)*(vsize));
	GUPOUT = (unsigned char *)malloc(sizeof(unsigned char)*(hsize)*(vsize));
	BUPOUT = (unsigned char *)malloc(sizeof(unsigned char)*(hsize)*(vsize));


//	hsize = NewHsize;
//	vsize = NewVsize;
	strcpy(outputfile,argv[3]);
	sprintf(cnt->OutputFileName,"%s.wav",outputfile);
	fpw5 = fopen(cnt->OutputFileName,"wb");
/************************/
/* HEADER 54 byte write */
/************************/
//	if(((hsize*3)%4) == 0){
//		filesize = 0x36 + hsize*vsize*3;
//	} else {
//		filesize = 0x36 + hsize*vsize*3+(4-(hsize*3)%4)*vsize;
//	}
//debug start
//	while(1);
//debug end
	filesize = 0x46464952;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
	filesize = (unsigned int)(FSIZE*4+0x24);
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0x45564157;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0x20746D66;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0x10;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0x00020001;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0xAC44;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =176400;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0x100004;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =0x61746164;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
    filesize =FSIZE*4;
	fwrite(&filesize,sizeof(unsigned int),1,fpw5);
	for(i=0;i<FSIZE;i++){
	RD = 0x000000FF & *(LEFTINT+i);
	RU = ((0x0000FF00 & *(LEFTINT+i))>>8);
fwrite(&RD,sizeof(unsigned char),1,fpw5);
fwrite(&RU,sizeof(unsigned char),1,fpw5);
	RD = 0x000000FF & *(RIGHTINT+i);
	RU = ((0x0000FF00 & *(RIGHTINT+i))>>8);
fwrite(&RD,sizeof(unsigned char),1,fpw5);
fwrite(&RU,sizeof(unsigned char),1,fpw5);
	}
	
/*	
	
	temp = 0x42; //'B'
	fwrite(&temp,sizeof(unsigned char),1,fpw);
	temp = 0x4D; //'M'
	fwrite(&temp,sizeof(unsigned char),1,fpw);
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	filesize = 0;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	filesize = 0x00000036;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	filesize = 0x28;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	fwrite(&hsize,sizeof(int),1,fpw);	
	fwrite(&vsize,sizeof(int),1,fpw);
	filesize = 0x00180001;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	filesize = 0;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	filesize = 0x00000EC4;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	filesize = 0;
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	fwrite(&filesize,sizeof(unsigned int),1,fpw);
	temp2 =0;

	for(i=0;i<vsize;i++){
		for(j=0;j<hsize;j++){
			fwrite((BUPOUT+j*vsize+vsize-1-i),sizeof(unsigned char),1,fpw);
			fwrite((GUPOUT+j*vsize+vsize-1-i),sizeof(unsigned char),1,fpw);
			fwrite((RUPOUT+j*vsize+vsize-1-i),sizeof(unsigned char),1,fpw);
		}
		temp = 4-((hsize*3)%4) ;
		if(temp != 4 ){
			for(k=0;k<temp;k++){
				fwrite( &temp2,sizeof(unsigned char),1,fpw);
			}
		}
	}	
*/
	fclose(fpw5);
encode_end:
        return 0;
}
