- /******************************************************************** 
-  *                                                                  * 
-  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   * 
-  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     * 
-  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 
-  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       * 
-  *                                                                  * 
-  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             * 
-  * by the Xiph.Org Foundation http://www.xiph.org/                  * 
-  *                                                                  * 
-  ******************************************************************** 
-   
-  function: vorbis encode-engine setup 
-  last mod: $Id: vorbisenc.h 17021 2010-03-24 09:29:41Z xiphmont $ 
-   
-  ********************************************************************/ 
-   
- /** \file 
-  * Libvorbisenc is a convenient API for setting up an encoding 
-  * environment using libvorbis. Libvorbisenc encapsulates the 
-  * actions needed to set up the encoder properly. 
-  */ 
-   
- #ifndef _OV_ENC_H_ 
- #define _OV_ENC_H_ 
-   
- #ifdef __cplusplus 
- extern "C" 
- { 
- #endif /* __cplusplus */ 
-   
- #include "codec.h" 
-   
- /** 
-  * This is the primary function within libvorbisenc for setting up managed 
-  * bitrate modes. 
-  * 
-  * Before this function is called, the \ref vorbis_info 
-  * struct should be initialized by using vorbis_info_init() from the libvorbis 
-  * API.  After encoding, vorbis_info_clear() should be called. 
-  * 
-  * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set 
-  * constraints for the encoded file.  This function uses these settings to 
-  * select the appropriate encoding mode and set it up. 
-  * 
-  * \param vi               Pointer to an initialized \ref vorbis_info struct. 
-  * \param channels         The number of channels to be encoded. 
-  * \param rate             The sampling rate of the source audio. 
-  * \param max_bitrate      Desired maximum bitrate (limit). -1 indicates unset. 
-  * \param nominal_bitrate  Desired average, or central, bitrate. -1 indicates unset. 
-  * \param min_bitrate      Desired minimum bitrate. -1 indicates unset. 
-  * 
-  * \return Zero for success, and negative values for failure. 
-  * 
-  * \retval 0          Success. 
-  * \retval OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption. 
-  * \retval OV_EINVAL  Invalid setup request, eg, out of range argument. 
-  * \retval OV_EIMPL   Unimplemented mode; unable to comply with bitrate request. 
-  */ 
- extern int vorbis_encode_init(vorbis_info *vi, 
-                               long channels, 
-                               long rate, 
-   
-                               long max_bitrate, 
-                               long nominal_bitrate, 
-                               long min_bitrate); 
-   
- /** 
-  * This function performs step-one of a three-step bitrate-managed encode 
-  * setup.  It functions similarly to the one-step setup performed by \ref 
-  * vorbis_encode_init but allows an application to make further encode setup 
-  * tweaks using \ref vorbis_encode_ctl before finally calling \ref 
-  * vorbis_encode_setup_init to complete the setup process. 
-  * 
-  * Before this function is called, the \ref vorbis_info struct should be 
-  * initialized by using vorbis_info_init() from the libvorbis API.  After 
-  * encoding, vorbis_info_clear() should be called. 
-  * 
-  * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set 
-  * constraints for the encoded file.  This function uses these settings to 
-  * select the appropriate encoding mode and set it up. 
-  * 
-  * \param vi                Pointer to an initialized vorbis_info struct. 
-  * \param channels          The number of channels to be encoded. 
-  * \param rate              The sampling rate of the source audio. 
-  * \param max_bitrate       Desired maximum bitrate (limit). -1 indicates unset. 
-  * \param nominal_bitrate   Desired average, or central, bitrate. -1 indicates unset. 
-  * \param min_bitrate       Desired minimum bitrate. -1 indicates unset. 
-  * 
-  * \return Zero for success, and negative for failure. 
-  * 
-  * \retval 0           Success 
-  * \retval OV_EFAULT   Internal logic fault; indicates a bug or heap/stack corruption. 
-  * \retval OV_EINVAL   Invalid setup request, eg, out of range argument. 
-  * \retval OV_EIMPL    Unimplemented mode; unable to comply with bitrate request. 
-  */ 
- extern int vorbis_encode_setup_managed(vorbis_info *vi, 
-                                        long channels, 
-                                        long rate, 
-   
-                                        long max_bitrate, 
-                                        long nominal_bitrate, 
-                                        long min_bitrate); 
-   
- /** 
-  * This function performs step-one of a three-step variable bitrate 
-  * (quality-based) encode setup.  It functions similarly to the one-step setup 
-  * performed by \ref vorbis_encode_init_vbr() but allows an application to 
-  * make further encode setup tweaks using \ref vorbis_encode_ctl() before 
-  * finally calling \ref vorbis_encode_setup_init to complete the setup 
-  * process. 
-  * 
-  * Before this function is called, the \ref vorbis_info struct should be 
-  * initialized by using \ref vorbis_info_init() from the libvorbis API.  After 
-  * encoding, vorbis_info_clear() should be called. 
-  * 
-  * \param vi        Pointer to an initialized vorbis_info struct. 
-  * \param channels  The number of channels to be encoded. 
-  * \param rate      The sampling rate of the source audio. 
-  * \param quality   Desired quality level, currently from -0.1 to 1.0 (lo to hi). 
-  * 
-  * \return Zero for success, and negative values for failure. 
-  * 
-  * \retval  0          Success 
-  * \retval  OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption. 
-  * \retval  OV_EINVAL  Invalid setup request, eg, out of range argument. 
-  * \retval  OV_EIMPL   Unimplemented mode; unable to comply with quality level request. 
-  */ 
- extern int vorbis_encode_setup_vbr(vorbis_info *vi, 
-                                   long channels, 
-                                   long rate, 
-   
-                                   float quality 
-                                   ); 
-   
- /** 
-  * This is the primary function within libvorbisenc for setting up variable 
-  * bitrate ("quality" based) modes. 
-  * 
-  * 
-  * Before this function is called, the vorbis_info struct should be 
-  * initialized by using vorbis_info_init() from the libvorbis API. After 
-  * encoding, vorbis_info_clear() should be called. 
-  * 
-  * \param vi           Pointer to an initialized vorbis_info struct. 
-  * \param channels     The number of channels to be encoded. 
-  * \param rate         The sampling rate of the source audio. 
-  * \param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). 
-  * 
-  * 
-  * \return Zero for success, or a negative number for failure. 
-  * 
-  * \retval 0           Success 
-  * \retval OV_EFAULT   Internal logic fault; indicates a bug or heap/stack corruption. 
-  * \retval OV_EINVAL   Invalid setup request, eg, out of range argument. 
-  * \retval OV_EIMPL    Unimplemented mode; unable to comply with quality level request. 
-  */ 
- extern int vorbis_encode_init_vbr(vorbis_info *vi, 
-                                   long channels, 
-                                   long rate, 
-   
-                                   float base_quality 
-                                   ); 
-   
- /** 
-  * This function performs the last stage of three-step encoding setup, as 
-  * described in the API overview under managed bitrate modes. 
-  * 
-  * Before this function is called, the \ref vorbis_info struct should be 
-  * initialized by using vorbis_info_init() from the libvorbis API, one of 
-  * \ref vorbis_encode_setup_managed() or \ref vorbis_encode_setup_vbr() called to 
-  * initialize the high-level encoding setup, and \ref vorbis_encode_ctl() 
-  * called if necessary to make encoding setup changes. 
-  * vorbis_encode_setup_init() finalizes the highlevel encoding structure into 
-  * a complete encoding setup after which the application may make no further 
-  * setup changes. 
-  * 
-  * After encoding, vorbis_info_clear() should be called. 
-  * 
-  * \param vi Pointer to an initialized \ref vorbis_info struct. 
-  * 
-  * \return Zero for success, and negative values for failure. 
-  * 
-  * \retval  0           Success. 
-  * \retval  OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption. 
-  * 
-  * \retval OV_EINVAL   Attempt to use vorbis_encode_setup_init() without first 
-  * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to 
-  * initialize the high-level encoding setup 
-  * 
-  */ 
- extern int vorbis_encode_setup_init(vorbis_info *vi); 
-   
- /** 
-  * This function implements a generic interface to miscellaneous encoder 
-  * settings similar to the classic UNIX 'ioctl()' system call.  Applications 
-  * may use vorbis_encode_ctl() to query or set bitrate management or quality 
-  * mode details by using one of several \e request arguments detailed below. 
-  * vorbis_encode_ctl() must be called after one of 
-  * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr().  When used 
-  * to modify settings, \ref vorbis_encode_ctl() must be called before \ref 
-  * vorbis_encode_setup_init(). 
-  * 
-  * \param vi      Pointer to an initialized vorbis_info struct. 
-  * 
-  * \param number Specifies the desired action; See \ref encctlcodes "the list 
-  * of available requests". 
-  * 
-  * \param arg void * pointing to a data structure matching the request 
-  * argument. 
-  * 
-  * \retval 0          Success. Any further return information (such as the result of a 
-  * query) is placed into the storage pointed to by *arg. 
-  * 
-  * \retval OV_EINVAL  Invalid argument, or an attempt to modify a setting after 
-  * calling vorbis_encode_setup_init(). 
-  * 
-  * \retval OV_EIMPL   Unimplemented or unknown request 
-  */ 
- extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); 
-   
- /** 
-  * \deprecated This is a deprecated interface. Please use vorbis_encode_ctl() 
-  * with the \ref ovectl_ratemanage2_arg struct and \ref 
-  * OV_ECTL_RATEMANAGE2_GET and \ref OV_ECTL_RATEMANAGE2_SET calls in new code. 
-  * 
-  * The \ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl() 
-  * and the \ref OV_ECTL_RATEMANAGE_GET, \ref OV_ECTL_RATEMANAGE_SET, \ref 
-  * OV_ECTL_RATEMANAGE_AVG, \ref OV_ECTL_RATEMANAGE_HARD calls in order to 
-  * query and modify specifics of the encoder's bitrate management 
-  * configuration. 
- */ 
- struct ovectl_ratemanage_arg { 
-   int    management_active; /**< nonzero if bitrate management is active*/ 
- /** hard lower limit (in kilobits per second) below which the stream bitrate 
-     will never be allowed for any given bitrate_hard_window seconds of time.*/ 
-   long   bitrate_hard_min; 
- /** hard upper limit (in kilobits per second) above which the stream bitrate 
-     will never be allowed for any given bitrate_hard_window seconds of time.*/ 
-   long   bitrate_hard_max; 
- /** the window period (in seconds) used to regulate the hard bitrate minimum 
-     and maximum*/ 
-   double bitrate_hard_window; 
- /** soft lower limit (in kilobits per second) below which the average bitrate 
-     tracker will start nudging the bitrate higher.*/ 
-   long   bitrate_av_lo; 
- /** soft upper limit (in kilobits per second) above which the average bitrate 
-     tracker will start nudging the bitrate lower.*/ 
-   long   bitrate_av_hi; 
- /** the window period (in seconds) used to regulate the average bitrate 
-     minimum and maximum.*/ 
-   double bitrate_av_window; 
- /** Regulates the relative centering of the average and hard windows; in 
-     libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but 
-     followed the average window regulation. In libvorbis 1.1 a bit-reservoir 
-     interface replaces the old windowing interface; the older windowing 
-     interface is simulated and this field has no effect.*/ 
-   double bitrate_av_window_center; 
- }; 
-   
- /** 
-  * \name struct ovectl_ratemanage2_arg 
-  * 
-  * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and 
-  * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to 
-  * query and modify specifics of the encoder's bitrate management 
-  * configuration. 
-  * 
- */ 
- struct ovectl_ratemanage2_arg { 
-   int    management_active; /**< nonzero if bitrate management is active */ 
- /** Lower allowed bitrate limit in kilobits per second */ 
-   long   bitrate_limit_min_kbps; 
- /** Upper allowed bitrate limit in kilobits per second */ 
-   long   bitrate_limit_max_kbps; 
-   long   bitrate_limit_reservoir_bits; /**<Size of the bitrate reservoir in bits */ 
- /** Regulates the bitrate reservoir's preferred fill level in a range from 0.0 
-  * to 1.0; 0.0 tries to bank bits to buffer against future bitrate spikes, 1.0 
-  * buffers against future sudden drops in instantaneous bitrate. Default is 
-  * 0.1 
-  */ 
-   double bitrate_limit_reservoir_bias; 
- /** Average bitrate setting in kilobits per second */ 
-   long   bitrate_average_kbps; 
- /** Slew rate limit setting for average bitrate adjustment; sets the minimum 
-  *  time in seconds the bitrate tracker may swing from one extreme to the 
-  *  other when boosting or damping average bitrate. 
-  */ 
-   double bitrate_average_damping; 
- }; 
-   
-   
- /** 
-  * \name vorbis_encode_ctl() codes 
-  * 
-  * \anchor encctlcodes 
-  * 
-  * These values are passed as the \c number parameter of vorbis_encode_ctl(). 
-  * The type of the referent of that function's \c arg pointer depends on these 
-  * codes. 
-  */ 
- /*@{*/ 
-   
- /** 
-  * Query the current encoder bitrate management setting. 
-  * 
-  *Argument: <tt>struct ovectl_ratemanage2_arg *</tt> 
-  * 
-  * Used to query the current encoder bitrate management setting. Also used to 
-  * initialize fields of an ovectl_ratemanage2_arg structure for use with 
-  * \ref OV_ECTL_RATEMANAGE2_SET. 
-  */ 
- #define OV_ECTL_RATEMANAGE2_GET      0x14 
-   
- /** 
-  * Set the current encoder bitrate management settings. 
-  * 
-  * Argument: <tt>struct ovectl_ratemanage2_arg *</tt> 
-  * 
-  * Used to set the current encoder bitrate management settings to the values 
-  * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable 
-  * bitrate management. 
- */ 
- #define OV_ECTL_RATEMANAGE2_SET      0x15 
-   
- /** 
-  * Returns the current encoder hard-lowpass setting (kHz) in the double 
-  * pointed to by arg. 
-  * 
-  * Argument: <tt>double *</tt> 
- */ 
- #define OV_ECTL_LOWPASS_GET          0x20 
-   
- /** 
-  *  Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid 
-  *  lowpass settings range from 2 to 99. 
-  * 
-  * Argument: <tt>double *</tt> 
- */ 
- #define OV_ECTL_LOWPASS_SET          0x21 
-   
- /** 
-  *  Returns the current encoder impulse block setting in the double pointed 
-  *  to by arg. 
-  * 
-  * Argument: <tt>double *</tt> 
- */ 
- #define OV_ECTL_IBLOCK_GET           0x30 
-   
- /** 
-  *  Sets the impulse block bias to the the value pointed to by arg. 
-  * 
-  * Argument: <tt>double *</tt> 
-  * 
-  *  Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will 
-  *  direct to encoder to use more bits when incoding short blocks that contain 
-  *  strong impulses, thus improving the accuracy of impulse encoding. 
-  */ 
- #define OV_ECTL_IBLOCK_SET           0x31 
-   
- /** 
-  *  Returns the current encoder coupling setting in the int pointed 
-  *  to by arg. 
-  * 
-  * Argument: <tt>int *</tt> 
- */ 
- #define OV_ECTL_COUPLING_GET         0x40 
-   
- /** 
-  *  Enables/disables channel coupling in multichannel encoding according to arg. 
-  * 
-  * Argument: <tt>int *</tt> 
-  * 
-  *  Zero disables channel coupling for multichannel inputs, nonzer enables 
-  *  channel coupling.  Setting has no effect on monophonic encoding or 
-  *  multichannel counts that do not offer coupling.  At present, coupling is 
-  *  available for stereo and 5.1 encoding. 
-  */ 
- #define OV_ECTL_COUPLING_SET         0x41 
-   
-   /* deprecated rate management supported only for compatibility */ 
-   
- /** 
-  * Old interface to querying bitrate management settings. 
-  * 
-  * Deprecated after move to bit-reservoir style management in 1.1 rendered 
-  * this interface partially obsolete. 
-   
-  * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_GET instead. 
-  * 
-  * Argument: <tt>struct ovectl_ratemanage_arg *</tt> 
-  */ 
- #define OV_ECTL_RATEMANAGE_GET       0x10 
- /** 
-  * Old interface to modifying bitrate management settings. 
-  * 
-  *  deprecated after move to bit-reservoir style management in 1.1 rendered 
-  *  this interface partially obsolete. 
-  * 
-  * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. 
-  * 
-  * Argument: <tt>struct ovectl_ratemanage_arg *</tt> 
-  */ 
- #define OV_ECTL_RATEMANAGE_SET       0x11 
- /** 
-  * Old interface to setting average-bitrate encoding mode. 
-  * 
-  * Deprecated after move to bit-reservoir style management in 1.1 rendered 
-  * this interface partially obsolete. 
-  * 
-  *  \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. 
-  * 
-  * Argument: <tt>struct ovectl_ratemanage_arg *</tt> 
-  */ 
- #define OV_ECTL_RATEMANAGE_AVG       0x12 
- /** 
-  * Old interface to setting bounded-bitrate encoding modes. 
-  * 
-  * deprecated after move to bit-reservoir style management in 1.1 rendered 
-  * this interface partially obsolete. 
-  * 
-  *  \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. 
-  * 
-  * Argument: <tt>struct ovectl_ratemanage_arg *</tt> 
-  */ 
- #define OV_ECTL_RATEMANAGE_HARD      0x13 
-   
- /*@}*/ 
-   
-   
-   
- #ifdef __cplusplus 
- } 
- #endif /* __cplusplus */ 
-   
- #endif 
-