#include "movieIO.h"
#include "bwImage.h"
#include "rgbImage.h"
#include "hlsImage.h"
#include "floatImage.h"
#include "sortedList.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main( int argc, char *argv[] )
{
  movieIO movie;
  if ( argc<2 )
  {
    printf( "Usage: %s <moviefile>\n", argv[0] );
    exit(0);
  }
  
  int i;
  rgbImage *rgbBuf;
  bwImage *bwBuf;
  floatImage *grdX, *grdY, *grdMag;
  floatImage *grdXR, *grdXG, *grdXB;
  floatImage *grdYR, *grdYG, *grdYB;
  floatImage *grdRMag, *grdGMag, *grdBMag;
  
  printf( "Preparing \"%s\"...\n", argv[1] );
  if ( !movie.open( argv[1] ) )
  {
    printf( "Error in preparing %s\n", argv[1] );
    exit(0);
  }
  for ( i=0; i<movie.getLength(); i++ )
  {
    printf("Processing frame #%i\n", i+1 );
    bwBuf = movie.getBWFrame(i);
    bwBuf->imgGrad( grdX, grdY );
    grdMag = new floatImage( grdX, grdY, false );
    movie.releaseBWFrame(bwBuf);
    bwBuf = new bwImage(grdMag);
    movie.setBWFrame(i,bwBuf);
    delete bwBuf;
    delete grdX;
    delete grdY;
    delete grdMag;
  }
  printf("Saving output to \"%s\"\n", "grad_plain.qt" );
  movie.setRate(6);
  movie.save( "grad_plain.qt" );
  movie.close();
  
  printf( "Preparing \"%s\"...\n", argv[1] );
  if ( !movie.open( argv[1] ) )
  {
    printf( "Error in preparing %s\n", argv[1] );
    exit(0);
  }
  for ( i=0; i<movie.getLength(); i++ )
  {
    printf("Processing frame #%i\n", i+1 );
    bwBuf = movie.getBWFrame(i);
    bwBuf->imgGradToulouse( grdX, grdY );
    grdMag = new floatImage( grdX, grdY, false );
    movie.releaseBWFrame(bwBuf);
    bwBuf = new bwImage(grdMag);
    movie.setBWFrame(i,bwBuf);
    delete bwBuf;
    delete grdX;
    delete grdY;
    delete grdMag;
  }
  printf("Saving output to \"%s\"\n", "grad_toulouse.qt" );
  movie.setRate(6);
  movie.save( "grad_toulouse.qt" );
  movie.close();
  
  printf( "Preparing \"%s\"...\n", argv[1] );
  if ( !movie.open( argv[1] ) )
  {
    printf( "Error in preparing %s\n", argv[1] );
    exit(0);
  }
  for ( i=0; i<movie.getLength(); i++ )
  {
    printf("Processing frame #%i\n", i+1 );
    rgbBuf = movie.getRGBFrame(i);
    rgbBuf->imgGradToulouse( grdXR, grdXG, grdXB,
			     grdYR, grdYG, grdYB );
    grdRMag = new floatImage( grdXR, grdYR, false );
    grdGMag = new floatImage( grdXG, grdYG, false );
    grdBMag = new floatImage( grdXB, grdYB, false );
    grdMag = new floatImage( grdRMag, grdGMag, grdBMag, false );
    movie.releaseRGBFrame(rgbBuf);
    bwBuf = new bwImage(grdMag);
    movie.setBWFrame(i,bwBuf);
    delete bwBuf;
    delete grdXR;
    delete grdXG;
    delete grdXB;
    delete grdYR;
    delete grdYG;
    delete grdYB;
    delete grdRMag;
    delete grdGMag;
    delete grdBMag;
    delete grdMag;
  }
  printf("Saving output to \"%s\"\n", "grad_toulouse_rgb.qt" );
  movie.setRate(6);
  movie.save( "grad_toulouse_rgb.qt" );
  movie.close();
}
