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