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 */ 232