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