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