about summary refs log tree commit diff
path: root/converter/other/fiasco/codec/wfa.h
blob: 9253affd3cdd13b17457f9d2eb7be85851460fee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 *  wfa.h
 *
 *  Written by:		Ullrich Hafner
 *		
 *  This file is part of FIASCO («F»ractal «I»mage «A»nd «S»equence «CO»dec)
 *  Copyright (C) 1994-2000 Ullrich Hafner <hafner@bigfoot.de>
 */

/*
 *  $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 informations 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 */