/*
 *  wfa.h
 *
 *  Written by:         Ullrich Hafner
 *
 *  This file is part of FIASCO (Fractal Image And Sequence COdec)
 *  Copyright (C) 1994-2000 Ullrich Hafner
 */

/*
 *  $Date: 2000/07/18 15:44:57 $
 *  $Author: hafner $
 *  $Revision: 5.3 $
 *  $State: Exp $
 */

#ifndef _WFA_H
#define _WFA_H

#define MAXEDGES  5
#define MAXSTATES 6000
#define MAXLABELS 2                     /* only bintree possible anymore */
#define MAXLEVEL  22

#define FIASCO_BINFILE_RELEASE   2
#define FIASCO_MAGIC             "FIASCO" /* FIASCO magic number */
#define FIASCO_BASIS_MAGIC       "Fiasco" /* FIASCO initial basis */

#define NO_EDGE         -1
#define RANGE           -1
#define NO_RANGE         0

#define CHILD            1
#define LEAF             0

#define MAX_PROB         9
#define MIN_PROB         1

/*
 *  WFA state types:
 *      0:               state is not allowed to be used in an
 *                       approximation and it's image is not needed
 *                       for ip computations.
 *      AUXILIARY_MASK:  state is required for computation of ip's but is not
 *                       allowed to be used in an approximation.
 *      USE_DOMAIN_MASK: state is allowed to be used in an approximation.
 */
enum state_types {AUXILIARY_MASK = 1 << 0, USE_DOMAIN_MASK = 1 << 1};

#define isedge(x)          ((x) != NO_EDGE)
#define isdomain(x)        ((x) != NO_EDGE)
#define isrange(x)         ((x) == RANGE)
#define ischild(x)         ((x) != RANGE)
#define isauxiliary(d,wfa) ((wfa)->domain_type[d] & AUXILIARY_MASK)
#define usedomain(d, wfa)  ((wfa)->domain_type[d] & USE_DOMAIN_MASK)
#define need_image(d,wfa)  (isauxiliary ((d), (wfa)) || usedomain ((d), (wfa)))

typedef enum mc_type {NONE, FORWARD, BACKWARD, INTERPOLATED} mc_type_e;
typedef enum frame_type {I_FRAME, P_FRAME, B_FRAME} frame_type_e;
typedef enum header {HEADER_END, HEADER_TITLE, HEADER_COMMENT} header_type_e;

typedef struct mv
/*
 *  Motion vector components
 */
{
   mc_type_e type;                      /* motion compensation type */
   int       fx, fy;                    /* forward vector coordinates */
   int       bx, by;                    /* backward vector coordinates */
} mv_t;

typedef struct range_info
{
   unsigned x, y;                       /* coordinates of upper left corner */
   unsigned level;                      /* bintree level of range */
} range_info_t;

#include "image.h"
#include "rpf.h"
#include "bit-io.h"

typedef struct wfa_info
{
   char     *wfa_name;                  /* filename of the WFA */
   char     *basis_name;                /* filename of the initial basis */
   char     *title;                     /* title of FIASCO stream */
   char     *comment;                   /* comment for FIASCO stream */

   unsigned  max_states;                /* max. cardinality of domain pool */
   unsigned  chroma_max_states;         /* max. cardinality of domain pool for
                                           chroma band coding */
   bool_t    color;                     /* color image */
   unsigned  width;                     /* image width */
   unsigned  height;                    /* image height */
   unsigned  level;                     /* image level */
   rpf_t    *rpf;                       /* Standard reduced precision format */
   rpf_t    *dc_rpf;                    /* DC reduced precision format */
   rpf_t    *d_rpf;                     /* Delta reduced precision format */
   rpf_t    *d_dc_rpf;                  /* Delta DC reduced precision format */
   unsigned  frames;                    /* number of frames in the video */
   unsigned  fps;                       /* number of frames per second */
   unsigned  p_min_level;               /* min. level of prediction */
   unsigned  p_max_level;               /* max. level of prediction */
   unsigned  search_range;              /* motion vector interval */
   bool_t    half_pixel;                /* usage of half pixel precision */
   bool_t    cross_B_search;            /* usage of Cross-B-Search */
   bool_t    B_as_past_ref;             /* usage of B frames as ref's */
   unsigned  smoothing;                 /* smoothing of image along borders */
   unsigned  release;                   /* FIASCO file format release */
} wfa_info_t;

typedef struct wfa
/*
 *  Used to store all information and data structures of a WFA
 */
{
   wfa_info_t   *wfainfo;               /* misc. information about the WFA */
   frame_type_e frame_type;             /* intra, predicted, bi-directional */
   unsigned     states;                 /* number of states */
   unsigned     basis_states;           /* number of states in the basis */
   unsigned     root_state;             /* root of the tree */
   real_t       *final_distribution;    /* one pixel images */
   byte_t       *level_of_state;        /* level of the image part which is
                                           represented by the current state */
   byte_t       *domain_type;           /* Bit_0==1: auxiliary state
                                           Bit_1==1: used for Y compr */
   mv_t         (*mv_tree)[MAXLABELS];  /* motion vectors */
   word_t       (*tree)[MAXLABELS];     /* bintree partitioning */
   u_word_t     (*x)[MAXLABELS];        /* range coordinate */
   u_word_t     (*y)[MAXLABELS];        /* range coordinate */
   word_t       (*into)[MAXLABELS][MAXEDGES + 1];   /* domain references */
   real_t       (*weight)[MAXLABELS][MAXEDGES + 1]; /* lin.comb. coefficients */
   word_t       (*int_weight)[MAXLABELS][MAXEDGES + 1]; /* bin. representation */
   word_t       (*y_state)[MAXLABELS];  /* bintree of Y component */
   byte_t       (*y_column)[MAXLABELS]; /* array for Y component references */
   byte_t       (*prediction)[MAXLABELS]; /* DC prediction */
   bool_t       (*delta_state);         /* delta state */
} wfa_t;

#endif /* not _WFA_H */

