#include <stdio.h>
#include <pgm.h>
#include "emvt.h"


main() {
  FILE *image_file,*outfilex,*outfiley ;
  int cols, rows ;
  gray maxval ;
  gray **image_ref,**image_cur ;
  char image_name[60];
  int i,xcoord,ycoord ;
  int bcol,brow,col,row ;
  gray *pixbrow;
  int outside,nbvec ;

  // Les resultats
  outfilex=fopen("outfilex.dat","w" ) ;
  outfiley=fopen("outfiley.dat","w" ) ;

  // Lecture de la première image
  image_file = fopen("flower1.pgm","rb") ;
  image_ref = pgm_readpgm( image_file, &cols, &rows, &maxval );
  fclose(image_file) ;
  // Boucle sur chaque image
  for(i=2;i<=MAXIMAGE;i++) { 
   
    fprintf(outfilex,"___________________________Vecteurs x image:%01d____________________________________\n",i-2);
    fprintf(outfiley,"___________________________Vecteurs y image:%01d____________________________________\n",i-2);
    // Lecture de l'image courante
    sprintf(image_name,"flower%1d.pgm",i) ;
    image_file = fopen(image_name,"rb") ;
    image_cur = pgm_readpgm( image_file, &cols, &rows, &maxval );
    
    // Calcul des estimations de MV bloc par bloc
    for(brow=0;brow<MAXBROW;brow++) { // boucle sur les rangées de blocs
      nbvec = 0 ;
      for(bcol=0;bcol<MAXBCOL;bcol++) { // boucle sur les lignes de blocs
       
       // Remplissage de la mémoire de bloc courant
       for(row=0;row<BLOCK_SIZE;row++) {  
           ycoord = BLOCK_SIZE*brow+row ;
           pixbrow = image_cur[ycoord] ;
           for(col=0;col<16;col++) {
	     xcoord = BLOCK_SIZE*bcol+col ;
	     cur_block[row][col] = pixbrow[xcoord] ;
	   }
       }
       // Remplissage de la mémoire de référence
       for(row=-EXCURSION;row<BLOCK_SIZE+EXCURSION;row++) {
         ycoord = BLOCK_SIZE*brow+row ;
	 outside = 0 ;
	 if (ycoord < 0 || ycoord >= ROWS) 
	   outside = 1 ;
	 else
           pixbrow = image_ref[ycoord] ;
         for(col=-EXCURSION;col<BLOCK_SIZE+EXCURSION;col++) {
	   xcoord = BLOCK_SIZE*bcol+col ;
	   if (xcoord < 0 || xcoord >= COLS || outside==1) 
	     ref_block[row+EXCURSION][col+EXCURSION] = 0 ; // padding en gris en dehors de l'image
	   else 
	     ref_block[row+EXCURSION][col+EXCURSION] = pixbrow[xcoord] ;
	 }
       }
      // Debug Dump des deux blocs
//       for(row=0;row<BLOCK_SIZE;row++) {  
//          for(col=0;col<16;col++) {
//	     printf("%3d ",cur_block[row][col])  ;
//	   }
//	   printf("\n") ;
//       }
//       for(row=0;row<BLOCK_SIZE+2*EXCURSION;row++) {
//          for(col=0;col<BLOCK_SIZE+2*EXCURSION;col++) {
//	     printf("%3d ",ref_block[row][col])  ;
//	  }
//	   printf("\n") ;
//       }


      // Appel de l'estimation de mouvement
      emvt() ;

      // Dump des vecteurs mouvements
      fprintf(outfilex,"%3d",ref_dx) ;
      fprintf(outfiley,"%3d",ref_dy) ;
      nbvec++ ;
      if(nbvec==BCOLS) { nbvec=0; fprintf(outfilex,"\n");fprintf(outfiley,"\n") ;}
        
      }
    }
    // swap des images pour la suite
    fclose(image_file) ;
    //image_ref = image_cur ;
  }
    fclose(outfilex) ;
    fclose(outfiley) ;
}
