tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

vorbisenc.h (16990B)


      1 /********************************************************************
      2 *                                                                  *
      3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
      4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
      5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
      6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
      7 *                                                                  *
      8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *
      9 * by the Xiph.Org Foundation https://xiph.org/                     *
     10 *                                                                  *
     11 ********************************************************************
     12 
     13 function: vorbis encode-engine setup
     14 
     15 ********************************************************************/
     16 
     17 /** \file
     18 * Libvorbisenc is a convenient API for setting up an encoding
     19 * environment using libvorbis. Libvorbisenc encapsulates the
     20 * actions needed to set up the encoder properly.
     21 */
     22 
     23 #ifndef _OV_ENC_H_
     24 #define _OV_ENC_H_
     25 
     26 #ifdef __cplusplus
     27 extern "C"
     28 {
     29 #endif /* __cplusplus */
     30 
     31 #include "codec.h"
     32 
     33 /**
     34 * This is the primary function within libvorbisenc for setting up managed
     35 * bitrate modes.
     36 *
     37 * Before this function is called, the \ref vorbis_info
     38 * struct should be initialized by using vorbis_info_init() from the libvorbis
     39 * API.  After encoding, vorbis_info_clear() should be called.
     40 *
     41 * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set
     42 * constraints for the encoded file.  This function uses these settings to
     43 * select the appropriate encoding mode and set it up.
     44 *
     45 * \param vi               Pointer to an initialized \ref vorbis_info struct.
     46 * \param channels         The number of channels to be encoded.
     47 * \param rate             The sampling rate of the source audio.
     48 * \param max_bitrate      Desired maximum bitrate (limit). -1 indicates unset.
     49 * \param nominal_bitrate  Desired average, or central, bitrate. -1 indicates unset.
     50 * \param min_bitrate      Desired minimum bitrate. -1 indicates unset.
     51 *
     52 * \return Zero for success, and negative values for failure.
     53 *
     54 * \retval 0          Success.
     55 * \retval OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption.
     56 * \retval OV_EINVAL  Invalid setup request, eg, out of range argument.
     57 * \retval OV_EIMPL   Unimplemented mode; unable to comply with bitrate request.
     58 */
     59 extern int vorbis_encode_init(vorbis_info *vi,
     60                              long channels,
     61                              long rate,
     62 
     63                              long max_bitrate,
     64                              long nominal_bitrate,
     65                              long min_bitrate);
     66 
     67 /**
     68 * This function performs step-one of a three-step bitrate-managed encode
     69 * setup.  It functions similarly to the one-step setup performed by \ref
     70 * vorbis_encode_init but allows an application to make further encode setup
     71 * tweaks using \ref vorbis_encode_ctl before finally calling \ref
     72 * vorbis_encode_setup_init to complete the setup process.
     73 *
     74 * Before this function is called, the \ref vorbis_info struct should be
     75 * initialized by using vorbis_info_init() from the libvorbis API.  After
     76 * encoding, vorbis_info_clear() should be called.
     77 *
     78 * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set
     79 * constraints for the encoded file.  This function uses these settings to
     80 * select the appropriate encoding mode and set it up.
     81 *
     82 * \param vi                Pointer to an initialized vorbis_info struct.
     83 * \param channels          The number of channels to be encoded.
     84 * \param rate              The sampling rate of the source audio.
     85 * \param max_bitrate       Desired maximum bitrate (limit). -1 indicates unset.
     86 * \param nominal_bitrate   Desired average, or central, bitrate. -1 indicates unset.
     87 * \param min_bitrate       Desired minimum bitrate. -1 indicates unset.
     88 *
     89 * \return Zero for success, and negative for failure.
     90 *
     91 * \retval 0           Success
     92 * \retval OV_EFAULT   Internal logic fault; indicates a bug or heap/stack corruption.
     93 * \retval OV_EINVAL   Invalid setup request, eg, out of range argument.
     94 * \retval OV_EIMPL    Unimplemented mode; unable to comply with bitrate request.
     95 */
     96 extern int vorbis_encode_setup_managed(vorbis_info *vi,
     97                                       long channels,
     98                                       long rate,
     99 
    100                                       long max_bitrate,
    101                                       long nominal_bitrate,
    102                                       long min_bitrate);
    103 
    104 /**
    105 * This function performs step-one of a three-step variable bitrate
    106 * (quality-based) encode setup.  It functions similarly to the one-step setup
    107 * performed by \ref vorbis_encode_init_vbr() but allows an application to
    108 * make further encode setup tweaks using \ref vorbis_encode_ctl() before
    109 * finally calling \ref vorbis_encode_setup_init to complete the setup
    110 * process.
    111 *
    112 * Before this function is called, the \ref vorbis_info struct should be
    113 * initialized by using \ref vorbis_info_init() from the libvorbis API.  After
    114 * encoding, vorbis_info_clear() should be called.
    115 *
    116 * \param vi        Pointer to an initialized vorbis_info struct.
    117 * \param channels  The number of channels to be encoded.
    118 * \param rate      The sampling rate of the source audio.
    119 * \param quality   Desired quality level, currently from -0.1 to 1.0 (lo to hi).
    120 *
    121 * \return Zero for success, and negative values for failure.
    122 *
    123 * \retval  0          Success
    124 * \retval  OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption.
    125 * \retval  OV_EINVAL  Invalid setup request, eg, out of range argument.
    126 * \retval  OV_EIMPL   Unimplemented mode; unable to comply with quality level request.
    127 */
    128 extern int vorbis_encode_setup_vbr(vorbis_info *vi,
    129                                  long channels,
    130                                  long rate,
    131 
    132                                  float quality
    133                                  );
    134 
    135 /**
    136 * This is the primary function within libvorbisenc for setting up variable
    137 * bitrate ("quality" based) modes.
    138 *
    139 *
    140 * Before this function is called, the vorbis_info struct should be
    141 * initialized by using vorbis_info_init() from the libvorbis API. After
    142 * encoding, vorbis_info_clear() should be called.
    143 *
    144 * \param vi           Pointer to an initialized vorbis_info struct.
    145 * \param channels     The number of channels to be encoded.
    146 * \param rate         The sampling rate of the source audio.
    147 * \param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi).
    148 *
    149 *
    150 * \return Zero for success, or a negative number for failure.
    151 *
    152 * \retval 0           Success
    153 * \retval OV_EFAULT   Internal logic fault; indicates a bug or heap/stack corruption.
    154 * \retval OV_EINVAL   Invalid setup request, eg, out of range argument.
    155 * \retval OV_EIMPL    Unimplemented mode; unable to comply with quality level request.
    156 */
    157 extern int vorbis_encode_init_vbr(vorbis_info *vi,
    158                                  long channels,
    159                                  long rate,
    160 
    161                                  float base_quality
    162                                  );
    163 
    164 /**
    165 * This function performs the last stage of three-step encoding setup, as
    166 * described in the API overview under managed bitrate modes.
    167 *
    168 * Before this function is called, the \ref vorbis_info struct should be
    169 * initialized by using vorbis_info_init() from the libvorbis API, one of
    170 * \ref vorbis_encode_setup_managed() or \ref vorbis_encode_setup_vbr() called to
    171 * initialize the high-level encoding setup, and \ref vorbis_encode_ctl()
    172 * called if necessary to make encoding setup changes.
    173 * vorbis_encode_setup_init() finalizes the highlevel encoding structure into
    174 * a complete encoding setup after which the application may make no further
    175 * setup changes.
    176 *
    177 * After encoding, vorbis_info_clear() should be called.
    178 *
    179 * \param vi Pointer to an initialized \ref vorbis_info struct.
    180 *
    181 * \return Zero for success, and negative values for failure.
    182 *
    183 * \retval  0           Success.
    184 * \retval  OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption.
    185 *
    186 * \retval OV_EINVAL   Attempt to use vorbis_encode_setup_init() without first
    187 * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to
    188 * initialize the high-level encoding setup
    189 *
    190 */
    191 extern int vorbis_encode_setup_init(vorbis_info *vi);
    192 
    193 /**
    194 * This function implements a generic interface to miscellaneous encoder
    195 * settings similar to the classic UNIX 'ioctl()' system call.  Applications
    196 * may use vorbis_encode_ctl() to query or set bitrate management or quality
    197 * mode details by using one of several \e request arguments detailed below.
    198 * vorbis_encode_ctl() must be called after one of
    199 * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr().  When used
    200 * to modify settings, \ref vorbis_encode_ctl() must be called before \ref
    201 * vorbis_encode_setup_init().
    202 *
    203 * \param vi      Pointer to an initialized vorbis_info struct.
    204 *
    205 * \param number Specifies the desired action; See \ref encctlcodes "the list
    206 * of available requests".
    207 *
    208 * \param arg void * pointing to a data structure matching the request
    209 * argument.
    210 *
    211 * \retval 0          Success. Any further return information (such as the result of a
    212 * query) is placed into the storage pointed to by *arg.
    213 *
    214 * \retval OV_EINVAL  Invalid argument, or an attempt to modify a setting after
    215 * calling vorbis_encode_setup_init().
    216 *
    217 * \retval OV_EIMPL   Unimplemented or unknown request
    218 */
    219 extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg);
    220 
    221 /**
    222 * \deprecated This is a deprecated interface. Please use vorbis_encode_ctl()
    223 * with the \ref ovectl_ratemanage2_arg struct and \ref
    224 * OV_ECTL_RATEMANAGE2_GET and \ref OV_ECTL_RATEMANAGE2_SET calls in new code.
    225 *
    226 * The \ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl()
    227 * and the \ref OV_ECTL_RATEMANAGE_GET, \ref OV_ECTL_RATEMANAGE_SET, \ref
    228 * OV_ECTL_RATEMANAGE_AVG, \ref OV_ECTL_RATEMANAGE_HARD calls in order to
    229 * query and modify specifics of the encoder's bitrate management
    230 * configuration.
    231 */
    232 struct ovectl_ratemanage_arg {
    233  int    management_active; /**< nonzero if bitrate management is active*/
    234 /** hard lower limit (in kilobits per second) below which the stream bitrate
    235    will never be allowed for any given bitrate_hard_window seconds of time.*/
    236  long   bitrate_hard_min;
    237 /** hard upper limit (in kilobits per second) above which the stream bitrate
    238    will never be allowed for any given bitrate_hard_window seconds of time.*/
    239  long   bitrate_hard_max;
    240 /** the window period (in seconds) used to regulate the hard bitrate minimum
    241    and maximum*/
    242  double bitrate_hard_window;
    243 /** soft lower limit (in kilobits per second) below which the average bitrate
    244    tracker will start nudging the bitrate higher.*/
    245  long   bitrate_av_lo;
    246 /** soft upper limit (in kilobits per second) above which the average bitrate
    247    tracker will start nudging the bitrate lower.*/
    248  long   bitrate_av_hi;
    249 /** the window period (in seconds) used to regulate the average bitrate
    250    minimum and maximum.*/
    251  double bitrate_av_window;
    252 /** Regulates the relative centering of the average and hard windows; in
    253    libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but
    254    followed the average window regulation. In libvorbis 1.1 a bit-reservoir
    255    interface replaces the old windowing interface; the older windowing
    256    interface is simulated and this field has no effect.*/
    257  double bitrate_av_window_center;
    258 };
    259 
    260 /**
    261 * \name struct ovectl_ratemanage2_arg
    262 *
    263 * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and
    264 * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to
    265 * query and modify specifics of the encoder's bitrate management
    266 * configuration.
    267 *
    268 */
    269 struct ovectl_ratemanage2_arg {
    270  int    management_active; /**< nonzero if bitrate management is active */
    271 /** Lower allowed bitrate limit in kilobits per second */
    272  long   bitrate_limit_min_kbps;
    273 /** Upper allowed bitrate limit in kilobits per second */
    274  long   bitrate_limit_max_kbps;
    275  long   bitrate_limit_reservoir_bits; /**<Size of the bitrate reservoir in bits */
    276 /** Regulates the bitrate reservoir's preferred fill level in a range from 0.0
    277 * to 1.0; 0.0 tries to bank bits to buffer against future bitrate spikes, 1.0
    278 * buffers against future sudden drops in instantaneous bitrate. Default is
    279 * 0.1
    280 */
    281  double bitrate_limit_reservoir_bias;
    282 /** Average bitrate setting in kilobits per second */
    283  long   bitrate_average_kbps;
    284 /** Slew rate limit setting for average bitrate adjustment; sets the minimum
    285 *  time in seconds the bitrate tracker may swing from one extreme to the
    286 *  other when boosting or damping average bitrate.
    287 */
    288  double bitrate_average_damping;
    289 };
    290 
    291 
    292 /**
    293 * \name vorbis_encode_ctl() codes
    294 *
    295 * \anchor encctlcodes
    296 *
    297 * These values are passed as the \c number parameter of vorbis_encode_ctl().
    298 * The type of the referent of that function's \c arg pointer depends on these
    299 * codes.
    300 */
    301 /*@{*/
    302 
    303 /**
    304 * Query the current encoder bitrate management setting.
    305 *
    306 *Argument: <tt>struct ovectl_ratemanage2_arg *</tt>
    307 *
    308 * Used to query the current encoder bitrate management setting. Also used to
    309 * initialize fields of an ovectl_ratemanage2_arg structure for use with
    310 * \ref OV_ECTL_RATEMANAGE2_SET.
    311 */
    312 #define OV_ECTL_RATEMANAGE2_GET      0x14
    313 
    314 /**
    315 * Set the current encoder bitrate management settings.
    316 *
    317 * Argument: <tt>struct ovectl_ratemanage2_arg *</tt>
    318 *
    319 * Used to set the current encoder bitrate management settings to the values
    320 * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable
    321 * bitrate management.
    322 */
    323 #define OV_ECTL_RATEMANAGE2_SET      0x15
    324 
    325 /**
    326 * Returns the current encoder hard-lowpass setting (kHz) in the double
    327 * pointed to by arg.
    328 *
    329 * Argument: <tt>double *</tt>
    330 */
    331 #define OV_ECTL_LOWPASS_GET          0x20
    332 
    333 /**
    334 *  Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid
    335 *  lowpass settings range from 2 to 99.
    336 *
    337 * Argument: <tt>double *</tt>
    338 */
    339 #define OV_ECTL_LOWPASS_SET          0x21
    340 
    341 /**
    342 *  Returns the current encoder impulse block setting in the double pointed
    343 *  to by arg.
    344 *
    345 * Argument: <tt>double *</tt>
    346 */
    347 #define OV_ECTL_IBLOCK_GET           0x30
    348 
    349 /**
    350 *  Sets the impulse block bias to the the value pointed to by arg.
    351 *
    352 * Argument: <tt>double *</tt>
    353 *
    354 *  Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will
    355 *  direct to encoder to use more bits when incoding short blocks that contain
    356 *  strong impulses, thus improving the accuracy of impulse encoding.
    357 */
    358 #define OV_ECTL_IBLOCK_SET           0x31
    359 
    360 /**
    361 *  Returns the current encoder coupling setting in the int pointed
    362 *  to by arg.
    363 *
    364 * Argument: <tt>int *</tt>
    365 */
    366 #define OV_ECTL_COUPLING_GET         0x40
    367 
    368 /**
    369 *  Enables/disables channel coupling in multichannel encoding according to arg.
    370 *
    371 * Argument: <tt>int *</tt>
    372 *
    373 *  Zero disables channel coupling for multichannel inputs, nonzer enables
    374 *  channel coupling.  Setting has no effect on monophonic encoding or
    375 *  multichannel counts that do not offer coupling.  At present, coupling is
    376 *  available for stereo and 5.1 encoding.
    377 */
    378 #define OV_ECTL_COUPLING_SET         0x41
    379 
    380  /* deprecated rate management supported only for compatibility */
    381 
    382 /**
    383 * Old interface to querying bitrate management settings.
    384 *
    385 * Deprecated after move to bit-reservoir style management in 1.1 rendered
    386 * this interface partially obsolete.
    387 
    388 * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_GET instead.
    389 *
    390 * Argument: <tt>struct ovectl_ratemanage_arg *</tt>
    391 */
    392 #define OV_ECTL_RATEMANAGE_GET       0x10
    393 /**
    394 * Old interface to modifying bitrate management settings.
    395 *
    396 *  deprecated after move to bit-reservoir style management in 1.1 rendered
    397 *  this interface partially obsolete.
    398 *
    399 * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead.
    400 *
    401 * Argument: <tt>struct ovectl_ratemanage_arg *</tt>
    402 */
    403 #define OV_ECTL_RATEMANAGE_SET       0x11
    404 /**
    405 * Old interface to setting average-bitrate encoding mode.
    406 *
    407 * Deprecated after move to bit-reservoir style management in 1.1 rendered
    408 * this interface partially obsolete.
    409 *
    410 *  \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead.
    411 *
    412 * Argument: <tt>struct ovectl_ratemanage_arg *</tt>
    413 */
    414 #define OV_ECTL_RATEMANAGE_AVG       0x12
    415 /**
    416 * Old interface to setting bounded-bitrate encoding modes.
    417 *
    418 * deprecated after move to bit-reservoir style management in 1.1 rendered
    419 * this interface partially obsolete.
    420 *
    421 *  \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead.
    422 *
    423 * Argument: <tt>struct ovectl_ratemanage_arg *</tt>
    424 */
    425 #define OV_ECTL_RATEMANAGE_HARD      0x13
    426 
    427 /*@}*/
    428 
    429 
    430 
    431 #ifdef __cplusplus
    432 }
    433 #endif /* __cplusplus */
    434 
    435 #endif