• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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