Update to MPlayer SVN rev 29319 and FFmpeg SVN rev 18938.
[vaapi:mplayer.git] / xvid_vbr.h
1 /******************************************************************************
2  *
3  *   XviD VBR Library
4  *
5  *   Copyright (C) 2002 Edouard Gomez <ed.gomez@wanadoo.fr>
6  *
7  *   The curve treatment algorithm is based on work done by Foxer <email?> and
8  *   Dirk Knop <dknop@gwdg.de> for the XviD vfw dynamic library.
9  *
10  *  This program is free software; you can redistribute it and/or modify
11  *  it under the terms of the GNU General Public License as published by
12  *  the Free Software Foundation; either version 2 of the License, or
13  *  (at your option) any later version.
14  *
15  *  This program is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *  GNU General Public License for more details.
19  *
20  *  You should have received a copy of the GNU General Public License
21  *  along with this program; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23  *
24  *****************************************************************************/
25
26 #ifndef MPLAYER_XVID_VBR_H
27 #define MPLAYER_XVID_VBR_H
28
29 #define VBR_VERSION 0
30
31 /******************************************************************************
32  * Function types used in the vbr controler
33  *****************************************************************************/
34
35 typedef int (vbr_init_function)(void *state);
36 typedef vbr_init_function *vbr_init_function_ptr;
37
38 typedef int (vbr_get_quant_function)(void *state);
39 typedef vbr_get_quant_function *vbr_get_quant_function_ptr;
40
41 typedef int (vbr_get_intra_function)(void *state);
42 typedef vbr_get_intra_function *vbr_get_intra_function_ptr;
43
44 typedef int (vbr_update_function)(void *state,
45                                   int quant,
46                                   int intra,
47                                   int header_bytes,
48                                   int total_bytes,
49                                   int kblocks,
50                                   int mblocks,
51                                   int ublocks);
52 typedef vbr_update_function *vbr_update_function_ptr;
53
54 typedef int (vbr_finish_function)(void *state);
55 typedef vbr_finish_function *vbr_finish_function_ptr;
56
57 /******************************************************************************
58  * The VBR CONTROLER structure - the spin of the library
59  *****************************************************************************/
60
61 typedef struct vbr_control_t
62 {
63
64         /* All modes - specifies what VBR algorithm has to be used */
65         int mode;
66
67         /* All modes - specifies what fps the movie uses */
68         float fps;
69
70         /* All modes */
71         int debug;
72
73         /*
74          * For VBR_MODE_2PASS_1/2 - specifies from/to what file the vbr
75          * controller has to write/read stats
76          */
77         char *filename;
78
79         /* For VBR_MODE_2PASS_2 - Target size */
80         int desired_bitrate;
81
82         /* For VBR_MODE_2PASS_2 - Credits parameters */
83         int credits_mode;
84         int credits_start;
85         int credits_start_begin;
86         int credits_start_end;
87         int credits_end;
88         int credits_end_begin;
89         int credits_end_end;
90         int credits_quant_ratio;
91         int credits_fixed_quant;
92         int credits_quant_i;
93         int credits_quant_p;
94         int credits_start_size;
95         int credits_end_size;
96
97         /* For VBR_MODE_2PASS_2 - keyframe parameters */
98         int keyframe_boost;
99         int kftreshold;
100         int kfreduction;
101         int min_key_interval;
102         int max_key_interval;
103
104         /* For VBR_MODE_2PASS_2 - Normal curve */
105         int curve_compression_high;
106         int curve_compression_low;
107
108         /* For VBR_MODE_2PASS_2 - Alternate curve parameters */
109         int use_alt_curve;
110         int alt_curve_type;
111         int alt_curve_low_dist;
112         int alt_curve_high_dist;
113         int alt_curve_min_rel_qual;
114         int alt_curve_use_auto;
115         int alt_curve_auto_str;
116         int alt_curve_use_auto_bonus_bias;
117         int alt_curve_bonus_bias;
118         int bitrate_payback_method;
119         int bitrate_payback_delay;
120         int max_iquant;
121         int min_iquant;
122         int max_pquant;
123         int min_pquant;
124         int twopass_max_bitrate;
125         int twopass_max_overflow_improvement;
126         int twopass_max_overflow_degradation;
127
128         /*
129          * For VBR_MODE_FIXED_QUANT - the quantizer that has to be used for all
130          * frames
131          */
132         int fixed_quant;
133
134         /* ----------- Internal data - Do not modify ----------- */
135         void *debug_file;
136         void *pass1_file;
137
138         long long desired_size;
139
140         int cur_frame;
141         int nb_frames;
142         int nb_keyframes;
143
144         int *keyframe_locations;
145         int last_keyframe;
146
147         double credits_start_curve;
148         double credits_end_curve;
149         double movie_curve;
150         double average_frame;
151         double alt_curve_low;
152         double alt_curve_low_diff;
153         double alt_curve_high;
154         double alt_curve_high_diff;
155         double alt_curve_mid_qual;
156         double alt_curve_qual_dev;
157         double curve_bias_bonus;
158         double curve_comp_scale;
159         double curve_comp_error;
160
161         int pass1_quant;
162         int pass1_intra;
163         int pass1_bytes;
164
165         int bytes1;
166         int bytes2;
167         int desired_bytes2;
168         int max_framesize;
169         int last_quant;
170         int quant_count[32];
171         double quant_error[32];
172
173         int overflow;
174         int KFoverflow;
175         int KFoverflow_partial;
176         int KF_idx;
177
178         int debug_quant_count[32];
179
180         /* ----------- Internal data - do not modify ----------- */
181         vbr_init_function_ptr      init;
182         vbr_get_quant_function_ptr getquant;
183         vbr_get_intra_function_ptr getintra;
184         vbr_update_function_ptr    update;
185         vbr_finish_function_ptr    finish;
186
187 }vbr_control_t;
188
189 /******************************************************************************
190  * Constants
191  *****************************************************************************/
192
193 /* Constants for the mode member */
194 #define VBR_MODE_1PASS       0x01
195 #define VBR_MODE_2PASS_1     0x02
196 #define VBR_MODE_2PASS_2     0x04
197 #define VBR_MODE_FIXED_QUANT 0x08
198
199 /* Constants for the credits mode */
200 #define VBR_CREDITS_MODE_RATE  0x01
201 #define VBR_CREDITS_MODE_QUANT 0x02
202 #define VBR_CREDITS_MODE_SIZE  0x04
203
204 /* Alternate curve treatment types */
205 #define VBR_ALT_CURVE_SOFT      0x01
206 #define VBR_ALT_CURVE_LINEAR    0x02
207 #define VBR_ALT_CURVE_AGGRESIVE 0x04
208
209 /* Payback modes */
210 #define VBR_PAYBACK_BIAS            0x01
211 #define VBR_PAYBACK_PROPORTIONAL    0x02
212
213 /******************************************************************************
214  * VBR API
215  *****************************************************************************/
216
217 extern int vbrSetDefaults(vbr_control_t *state);
218 extern int vbrInit(vbr_control_t *state);
219 extern int vbrGetQuant(vbr_control_t *state);
220 extern int vbrGetIntra(vbr_control_t *state);
221 extern int vbrUpdate(vbr_control_t *state,
222                      int quant,
223                      int intra,
224                      int header_bytes,
225                      int total_bytes,
226                      int kblocks,
227                      int mblocks,
228                      int ublocks);
229 extern int vbrFinish(vbr_control_t *state);
230
231 #endif /* MPLAYER_XVID_VBR_H */