Subversion Repositories Games.Prince of Persia

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 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