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