2002-09-09 11:47:54 +00:00
|
|
|
/******************************************************************************
|
|
|
|
*
|
|
|
|
* XviD VBR Library
|
|
|
|
*
|
|
|
|
* Copyright (C) 2002 Edouard Gomez <ed.gomez@wanadoo.fr>
|
|
|
|
*
|
|
|
|
* The curve treatment algorithm is based on work done by Foxer <email?> and
|
|
|
|
* Dirk Knop <dknop@gwdg.de> for the XviD vfw dynamic library.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2006-01-13 00:23:32 +00:00
|
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
2002-09-09 11:47:54 +00:00
|
|
|
*
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2007-07-02 22:34:45 +00:00
|
|
|
#ifndef XVID_VBR_H
|
|
|
|
#define XVID_VBR_H
|
2002-09-09 11:47:54 +00:00
|
|
|
|
|
|
|
#define VBR_VERSION 0
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
* Function types used in the vbr controler
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
typedef int (vbr_init_function)(void *state);
|
|
|
|
typedef vbr_init_function *vbr_init_function_ptr;
|
|
|
|
|
|
|
|
typedef int (vbr_get_quant_function)(void *state);
|
|
|
|
typedef vbr_get_quant_function *vbr_get_quant_function_ptr;
|
|
|
|
|
|
|
|
typedef int (vbr_get_intra_function)(void *state);
|
|
|
|
typedef vbr_get_intra_function *vbr_get_intra_function_ptr;
|
|
|
|
|
|
|
|
typedef int (vbr_update_function)(void *state,
|
|
|
|
int quant,
|
|
|
|
int intra,
|
|
|
|
int header_bytes,
|
|
|
|
int total_bytes,
|
|
|
|
int kblocks,
|
|
|
|
int mblocks,
|
|
|
|
int ublocks);
|
|
|
|
typedef vbr_update_function *vbr_update_function_ptr;
|
|
|
|
|
|
|
|
typedef int (vbr_finish_function)(void *state);
|
|
|
|
typedef vbr_finish_function *vbr_finish_function_ptr;
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
* The VBR CONTROLER structure - the spin of the library
|
|
|
|
*****************************************************************************/
|
|
|
|
|
2008-01-06 23:20:15 +00:00
|
|
|
typedef struct vbr_control_t
|
2002-09-09 11:47:54 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
/* All modes - specifies what VBR algorithm has to be used */
|
|
|
|
int mode;
|
|
|
|
|
|
|
|
/* All modes - specifies what fps the movie uses */
|
|
|
|
float fps;
|
|
|
|
|
|
|
|
/* All modes */
|
|
|
|
int debug;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* For VBR_MODE_2PASS_1/2 - specifies from/to what file the vbr
|
|
|
|
* controller has to write/read stats
|
|
|
|
*/
|
|
|
|
char *filename;
|
|
|
|
|
|
|
|
/* For VBR_MODE_2PASS_2 - Target size */
|
|
|
|
int desired_bitrate;
|
|
|
|
|
|
|
|
/* For VBR_MODE_2PASS_2 - Credits parameters */
|
|
|
|
int credits_mode;
|
|
|
|
int credits_start;
|
|
|
|
int credits_start_begin;
|
|
|
|
int credits_start_end;
|
|
|
|
int credits_end;
|
|
|
|
int credits_end_begin;
|
|
|
|
int credits_end_end;
|
|
|
|
int credits_quant_ratio;
|
|
|
|
int credits_fixed_quant;
|
|
|
|
int credits_quant_i;
|
|
|
|
int credits_quant_p;
|
|
|
|
int credits_start_size;
|
|
|
|
int credits_end_size;
|
|
|
|
|
|
|
|
/* For VBR_MODE_2PASS_2 - keyframe parameters */
|
|
|
|
int keyframe_boost;
|
|
|
|
int kftreshold;
|
|
|
|
int kfreduction;
|
|
|
|
int min_key_interval;
|
|
|
|
int max_key_interval;
|
|
|
|
|
|
|
|
/* For VBR_MODE_2PASS_2 - Normal curve */
|
|
|
|
int curve_compression_high;
|
|
|
|
int curve_compression_low;
|
|
|
|
|
|
|
|
/* For VBR_MODE_2PASS_2 - Alternate curve parameters */
|
|
|
|
int use_alt_curve;
|
|
|
|
int alt_curve_type;
|
|
|
|
int alt_curve_low_dist;
|
|
|
|
int alt_curve_high_dist;
|
|
|
|
int alt_curve_min_rel_qual;
|
|
|
|
int alt_curve_use_auto;
|
|
|
|
int alt_curve_auto_str;
|
|
|
|
int alt_curve_use_auto_bonus_bias;
|
|
|
|
int alt_curve_bonus_bias;
|
|
|
|
int bitrate_payback_method;
|
|
|
|
int bitrate_payback_delay;
|
|
|
|
int max_iquant;
|
|
|
|
int min_iquant;
|
|
|
|
int max_pquant;
|
|
|
|
int min_pquant;
|
2002-09-18 01:32:32 +00:00
|
|
|
int twopass_max_bitrate;
|
|
|
|
int twopass_max_overflow_improvement;
|
|
|
|
int twopass_max_overflow_degradation;
|
2002-09-09 11:47:54 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* For VBR_MODE_FIXED_QUANT - the quantizer that has to be used for all
|
|
|
|
* frames
|
|
|
|
*/
|
|
|
|
int fixed_quant;
|
|
|
|
|
|
|
|
/* ----------- Internal data - Do not modify ----------- */
|
|
|
|
void *debug_file;
|
|
|
|
void *pass1_file;
|
|
|
|
|
|
|
|
long long desired_size;
|
|
|
|
|
|
|
|
int cur_frame;
|
|
|
|
int nb_frames;
|
|
|
|
int nb_keyframes;
|
|
|
|
|
|
|
|
int *keyframe_locations;
|
|
|
|
int last_keyframe;
|
|
|
|
|
|
|
|
double credits_start_curve;
|
|
|
|
double credits_end_curve;
|
|
|
|
double movie_curve;
|
|
|
|
double average_frame;
|
|
|
|
double alt_curve_low;
|
|
|
|
double alt_curve_low_diff;
|
|
|
|
double alt_curve_high;
|
|
|
|
double alt_curve_high_diff;
|
|
|
|
double alt_curve_mid_qual;
|
|
|
|
double alt_curve_qual_dev;
|
|
|
|
double curve_bias_bonus;
|
|
|
|
double curve_comp_scale;
|
|
|
|
double curve_comp_error;
|
|
|
|
|
|
|
|
int pass1_quant;
|
|
|
|
int pass1_intra;
|
|
|
|
int pass1_bytes;
|
|
|
|
|
|
|
|
int bytes1;
|
|
|
|
int bytes2;
|
|
|
|
int desired_bytes2;
|
|
|
|
int max_framesize;
|
|
|
|
int last_quant;
|
|
|
|
int quant_count[32];
|
|
|
|
double quant_error[32];
|
|
|
|
|
|
|
|
int overflow;
|
|
|
|
int KFoverflow;
|
|
|
|
int KFoverflow_partial;
|
|
|
|
int KF_idx;
|
|
|
|
|
|
|
|
int debug_quant_count[32];
|
|
|
|
|
|
|
|
/* ----------- Internal data - do not modify ----------- */
|
|
|
|
vbr_init_function_ptr init;
|
|
|
|
vbr_get_quant_function_ptr getquant;
|
|
|
|
vbr_get_intra_function_ptr getintra;
|
|
|
|
vbr_update_function_ptr update;
|
|
|
|
vbr_finish_function_ptr finish;
|
|
|
|
|
|
|
|
}vbr_control_t;
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
* Constants
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/* Constants for the mode member */
|
|
|
|
#define VBR_MODE_1PASS 0x01
|
|
|
|
#define VBR_MODE_2PASS_1 0x02
|
|
|
|
#define VBR_MODE_2PASS_2 0x04
|
|
|
|
#define VBR_MODE_FIXED_QUANT 0x08
|
|
|
|
|
|
|
|
/* Constants for the credits mode */
|
|
|
|
#define VBR_CREDITS_MODE_RATE 0x01
|
|
|
|
#define VBR_CREDITS_MODE_QUANT 0x02
|
|
|
|
#define VBR_CREDITS_MODE_SIZE 0x04
|
|
|
|
|
|
|
|
/* Alternate curve treatment types */
|
|
|
|
#define VBR_ALT_CURVE_SOFT 0x01
|
|
|
|
#define VBR_ALT_CURVE_LINEAR 0x02
|
|
|
|
#define VBR_ALT_CURVE_AGGRESIVE 0x04
|
|
|
|
|
|
|
|
/* Payback modes */
|
|
|
|
#define VBR_PAYBACK_BIAS 0x01
|
|
|
|
#define VBR_PAYBACK_PROPORTIONAL 0x02
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
* VBR API
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
extern int vbrSetDefaults(vbr_control_t *state);
|
|
|
|
extern int vbrInit(vbr_control_t *state);
|
|
|
|
extern int vbrGetQuant(vbr_control_t *state);
|
|
|
|
extern int vbrGetIntra(vbr_control_t *state);
|
|
|
|
extern int vbrUpdate(vbr_control_t *state,
|
|
|
|
int quant,
|
|
|
|
int intra,
|
|
|
|
int header_bytes,
|
|
|
|
int total_bytes,
|
|
|
|
int kblocks,
|
|
|
|
int mblocks,
|
|
|
|
int ublocks);
|
|
|
|
extern int vbrFinish(vbr_control_t *state);
|
|
|
|
|
2007-12-31 16:15:50 +00:00
|
|
|
#endif /* XVID_VBR_H */
|