remove leftover and unimplemented proto FLAC__file_decoder_process_remaining_frames()
[flac.git] / include / FLAC / seekable_stream_encoder.h
1 /* libFLAC - Free Lossless Audio Codec library
2  * Copyright (C) 2002,2003  Josh Coalson
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * - Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistributions in binary form must reproduce the above copyright
12  * notice, this list of conditions and the following disclaimer in the
13  * documentation and/or other materials provided with the distribution.
14  *
15  * - Neither the name of the Xiph.org Foundation nor the names of its
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef FLAC__SEEKABLE_STREAM_ENCODER_H
33 #define FLAC__SEEKABLE_STREAM_ENCODER_H
34
35 #include "export.h"
36 #include "stream_encoder.h"
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42
43 /** \file include/FLAC/seekable_stream_encoder.h
44  *
45  *  \brief
46  *  This module contains the functions which implement the seekable stream
47  *  encoder.
48  *
49  *  See the detailed documentation in the
50  *  \link flac_seekable_stream_encoder seekable stream encoder \endlink module.
51  */
52
53 /** \defgroup flac_seekable_stream_encoder FLAC/seekable_stream_encoder.h: seekable stream encoder interface
54  *  \ingroup flac_encoder
55  *
56  *  \brief
57  *  This module contains the functions which implement the seekable stream
58  *  encoder.
59  *
60  * The basic usage of this encoder is as follows:
61  * - The program creates an instance of an encoder using
62  *   FLAC__seekable_stream_encoder_new().
63  * - The program overrides the default settings and sets callbacks using
64  *   FLAC__seekable_stream_encoder_set_*() functions.
65  * - The program initializes the instance to validate the settings and
66  *   prepare for encoding using FLAC__seekable_stream_encoder_init().
67  * - The program calls FLAC__seekable_stream_encoder_process() or
68  *   FLAC__seekable_stream_encoder_process_interleaved() to encode data, which
69  *   subsequently calls the callbacks when there is encoder data ready
70  *   to be written.
71  * - The program finishes the encoding with FLAC__seekable_stream_encoder_finish(),
72  *   which causes the encoder to encode any data still in its input pipe,
73  *   rewrite the metadata with the final encoding statistics, and finally
74  *   reset the encoder to the uninitialized state.
75  * - The instance may be used again or deleted with
76  *   FLAC__seekable_stream_encoder_delete().
77  *
78  * The seekable stream encoder is a wrapper around the
79  * \link flac_stream_encoder stream encoder \endlink with callbacks for
80  * seeking the output.  This allows the encoder to go back and rewrite
81  * some of the metadata after encoding if necessary, and provides the
82  * metadata callback of the stream encoder internally.  However, you
83  * must provide a seek callback (see
84  * FLAC__seekable_stream_encoder_set_seek_callback()).
85  *
86  * Make sure to read the detailed description of the
87  * \link flac_stream_encoder stream encoder module \endlink since the
88  * seekable stream encoder inherits much of its behavior.
89  *
90  * \note
91  * If you are writing the FLAC data to a file, make sure it is open
92  * for update (e.g. mode "w+" for stdio streams).  This is because after
93  * the first encoding pass, the encoder will try to seek back to the
94  * beginning of the stream, to the STREAMINFO block, to write some data
95  * there.
96  *
97  * \note
98  * The "set" functions may only be called when the encoder is in the
99  * state FLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED, i.e. after
100  * FLAC__seekable_stream_encoder_new() or FLAC__seekable_stream_encoder_finish(), but
101  * before FLAC__seekable_stream_encoder_init().  If this is the case they will
102  * return \c true, otherwise \c false.
103  *
104  * \note
105  * FLAC__seekable_stream_encoder_finish() resets all settings to the constructor
106  * defaults, including the callbacks.
107  *
108  * \{
109  */
110
111
112 /** State values for a FLAC__SeekableStreamEncoder
113  *
114  *  The encoder's state can be obtained by calling FLAC__seekable_stream_encoder_get_state().
115  */
116 typedef enum {
117
118         FLAC__SEEKABLE_STREAM_ENCODER_OK = 0,
119         /**< The encoder is in the normal OK state. */
120
121         FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR,
122         /**< An error occurred in the underlying stream encoder;
123          * check FLAC__seekable_stream_encoder_get_stream_encoder_state().
124          */
125
126         FLAC__SEEKABLE_STREAM_ENCODER_MEMORY_ALLOCATION_ERROR,
127         /**< Memory allocation failed. */
128
129         FLAC__SEEKABLE_STREAM_ENCODER_WRITE_ERROR,
130         /**< The write callback returned an error. */
131
132         FLAC__SEEKABLE_STREAM_ENCODER_READ_ERROR,
133         /**< The read callback returned an error. */
134
135         FLAC__SEEKABLE_STREAM_ENCODER_SEEK_ERROR,
136         /**< The seek callback returned an error. */
137
138         FLAC__SEEKABLE_STREAM_ENCODER_ALREADY_INITIALIZED,
139         /**< FLAC__seekable_stream_encoder_init() was called when the encoder was
140          * already initialized, usually because
141          * FLAC__seekable_stream_encoder_finish() was not called.
142          */
143
144         FLAC__SEEKABLE_STREAM_ENCODER_INVALID_CALLBACK,
145         /**< FLAC__seekable_stream_encoder_init() was called without all
146          * callbacks being set.
147          */
148
149         FLAC__SEEKABLE_STREAM_ENCODER_INVALID_SEEKTABLE,
150         /**< An invalid seek table was passed is the metadata to
151          * FLAC__seekable_stream_encoder_set_metadata().
152          */
153
154         FLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED
155         /**< The encoder is in the uninitialized state. */
156
157 } FLAC__SeekableStreamEncoderState;
158
159 /** Maps a FLAC__SeekableStreamEncoderState to a C string.
160  *
161  *  Using a FLAC__SeekableStreamEncoderState as the index to this array
162  *  will give the string equivalent.  The contents should not be modified.
163  */
164 extern FLAC_API const char * const FLAC__SeekableStreamEncoderStateString[];
165
166
167 /** Return values for the FLAC__SeekableStreamEncoder seek callback.
168  */
169 typedef enum {
170
171         FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_OK,
172         /**< The seek was OK and encoding can continue. */
173
174         FLAC__SEEKABLE_STREAM_ENCODER_SEEK_STATUS_ERROR
175         /**< An unrecoverable error occurred.  The encoder will return from the process call. */
176
177 } FLAC__SeekableStreamEncoderSeekStatus;
178
179 /** Maps a FLAC__SeekableStreamEncoderSeekStatus to a C string.
180  *
181  *  Using a FLAC__SeekableStreamEncoderSeekStatus as the index to this array
182  *  will give the string equivalent.  The contents should not be modified.
183  */
184 extern FLAC_API const char * const FLAC__SeekableStreamEncoderSeekStatusString[];
185
186
187 /***********************************************************************
188  *
189  * class FLAC__SeekableStreamEncoder
190  *
191  ***********************************************************************/
192
193 struct FLAC__SeekableStreamEncoderProtected;
194 struct FLAC__SeekableStreamEncoderPrivate;
195 /** The opaque structure definition for the seekable stream encoder type.
196  *  See the \link flac_seekable_stream_encoder seekable stream encoder module \endlink
197  *  for a detailed description.
198  */
199 typedef struct {
200         struct FLAC__SeekableStreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */
201         struct FLAC__SeekableStreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */
202 } FLAC__SeekableStreamEncoder;
203
204 /** Signature for the seek callback.
205  *  See FLAC__seekable_stream_encoder_set_seek_callback() for more info.
206  *
207  * \param  encoder  The encoder instance calling the callback.
208  * \param  absolute_byte_offset  The offset from the beginning of the stream
209  *                               to seek to.
210  * \param  client_data  The callee's client data set through
211  *                      FLAC__seekable_stream_encoder_set_client_data().
212  * \retval FLAC__SeekableStreamEncoderSeekStatus
213  *    The callee's return status.
214  */
215 typedef FLAC__SeekableStreamEncoderSeekStatus (*FLAC__SeekableStreamEncoderSeekCallback)(const FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data);
216
217 /** Signature for the write callback.
218  *  See FLAC__seekable_stream_encoder_set_write_callback()
219  *  and FLAC__StreamEncoderWriteCallback for more info.
220  *
221  * \param  encoder  The encoder instance calling the callback.
222  * \param  buffer   An array of encoded data of length \a bytes.
223  * \param  bytes    The byte length of \a buffer.
224  * \param  samples  The number of samples encoded by \a buffer.
225  *                  \c 0 has a special meaning; see
226  *                  FLAC__stream_encoder_set_write_callback().
227  * \param  current_frame  The number of current frame being encoded.
228  * \param  client_data  The callee's client data set through
229  *                      FLAC__seekable_stream_encoder_set_client_data().
230  * \retval FLAC__StreamEncoderWriteStatus
231  *    The callee's return status.
232  */
233 typedef FLAC__StreamEncoderWriteStatus (*FLAC__SeekableStreamEncoderWriteCallback)(const FLAC__SeekableStreamEncoder *encoder, const FLAC__byte buffer[], unsigned bytes, unsigned samples, unsigned current_frame, void *client_data);
234
235
236 /***********************************************************************
237  *
238  * Class constructor/destructor
239  *
240  ***********************************************************************/
241
242 /** Create a new seekable stream encoder instance.  The instance is created with
243  *  default settings; see the individual FLAC__seekable_stream_encoder_set_*()
244  *  functions for each setting's default.
245  *
246  * \retval FLAC__SeekableStreamEncoder*
247  *    \c NULL if there was an error allocating memory, else the new instance.
248  */
249 FLAC_API FLAC__SeekableStreamEncoder *FLAC__seekable_stream_encoder_new();
250
251 /** Free an encoder instance.  Deletes the object pointed to by \a encoder.
252  *
253  * \param encoder  A pointer to an existing encoder.
254  * \assert
255  *    \code encoder != NULL \endcode
256  */
257 FLAC_API void FLAC__seekable_stream_encoder_delete(FLAC__SeekableStreamEncoder *encoder);
258
259 /***********************************************************************
260  *
261  * Public class method prototypes
262  *
263  ***********************************************************************/
264
265 /** This is inherited from FLAC__StreamEncoder; see
266  *  FLAC__stream_encoder_set_verify().
267  *
268  * \default \c true
269  * \param  encoder  An encoder instance to set.
270  * \param  value    See above.
271  * \assert
272  *    \code encoder != NULL \endcode
273  * \retval FLAC__bool
274  *    \c false if the encoder is already initialized, else \c true.
275  */
276 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_verify(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
277
278 /** This is inherited from FLAC__StreamEncoder; see
279  *  FLAC__stream_encoder_set_streamable_subset().
280  *
281  * \default \c true
282  * \param  encoder  An encoder instance to set.
283  * \param  value    See above.
284  * \assert
285  *    \code encoder != NULL \endcode
286  * \retval FLAC__bool
287  *    \c false if the encoder is already initialized, else \c true.
288  */
289 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_streamable_subset(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
290
291 /** This is inherited from FLAC__StreamEncoder; see
292  *  FLAC__stream_encoder_set_do_mid_side_stereo().
293  *
294  * \default \c false
295  * \param  encoder  An encoder instance to set.
296  * \param  value    See above.
297  * \assert
298  *    \code encoder != NULL \endcode
299  * \retval FLAC__bool
300  *    \c false if the encoder is already initialized, else \c true.
301  */
302 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_do_mid_side_stereo(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
303
304 /** This is inherited from FLAC__StreamEncoder; see
305  *  FLAC__stream_encoder_set_loose_mid_side_stereo().
306  *
307  * \default \c false
308  * \param  encoder  An encoder instance to set.
309  * \param  value    See above.
310  * \assert
311  *    \code encoder != NULL \endcode
312  * \retval FLAC__bool
313  *    \c false if the encoder is already initialized, else \c true.
314  */
315 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_loose_mid_side_stereo(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
316
317 /** This is inherited from FLAC__StreamEncoder; see
318  *  FLAC__stream_encoder_set_channels().
319  *
320  * \default \c 2
321  * \param  encoder  An encoder instance to set.
322  * \param  value    See above.
323  * \assert
324  *    \code encoder != NULL \endcode
325  * \retval FLAC__bool
326  *    \c false if the encoder is already initialized, else \c true.
327  */
328 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_channels(FLAC__SeekableStreamEncoder *encoder, unsigned value);
329
330 /** This is inherited from FLAC__StreamEncoder; see
331  *  FLAC__stream_encoder_set_bits_per_sample().
332  *
333  * \warning
334  * Do not feed the encoder data that is wider than the value you
335  * set here or you will generate an invalid stream.
336  *
337  * \default \c 16
338  * \param  encoder  An encoder instance to set.
339  * \param  value    See above.
340  * \assert
341  *    \code encoder != NULL \endcode
342  * \retval FLAC__bool
343  *    \c false if the encoder is already initialized, else \c true.
344  */
345 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_bits_per_sample(FLAC__SeekableStreamEncoder *encoder, unsigned value);
346
347 /** This is inherited from FLAC__StreamEncoder; see
348  *  FLAC__stream_encoder_set_sample_rate().
349  *
350  * \default \c 44100
351  * \param  encoder  An encoder instance to set.
352  * \param  value    See above.
353  * \assert
354  *    \code encoder != NULL \endcode
355  * \retval FLAC__bool
356  *    \c false if the encoder is already initialized, else \c true.
357  */
358 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_sample_rate(FLAC__SeekableStreamEncoder *encoder, unsigned value);
359
360 /** This is inherited from FLAC__StreamEncoder; see
361  *  FLAC__stream_encoder_set_blocksize().
362  *
363  * \default \c 1152
364  * \param  encoder  An encoder instance to set.
365  * \param  value    See above.
366  * \assert
367  *    \code encoder != NULL \endcode
368  * \retval FLAC__bool
369  *    \c false if the encoder is already initialized, else \c true.
370  */
371 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_blocksize(FLAC__SeekableStreamEncoder *encoder, unsigned value);
372
373 /** This is inherited from FLAC__StreamEncoder; see
374  *  FLAC__stream_encoder_set_max_lpc_order().
375  *
376  * \default \c 0
377  * \param  encoder  An encoder instance to set.
378  * \param  value    See above.
379  * \assert
380  *    \code encoder != NULL \endcode
381  * \retval FLAC__bool
382  *    \c false if the encoder is already initialized, else \c true.
383  */
384 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_max_lpc_order(FLAC__SeekableStreamEncoder *encoder, unsigned value);
385
386 /** This is inherited from FLAC__StreamEncoder; see
387  *  FLAC__stream_encoder_set_qlp_coeff_precision().
388  *
389  * \note
390  * In the current implementation, qlp_coeff_precision + bits_per_sample must
391  * be less than 32.
392  *
393  * \default \c 0
394  * \param  encoder  An encoder instance to set.
395  * \param  value    See above.
396  * \assert
397  *    \code encoder != NULL \endcode
398  * \retval FLAC__bool
399  *    \c false if the encoder is already initialized, else \c true.
400  */
401 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_qlp_coeff_precision(FLAC__SeekableStreamEncoder *encoder, unsigned value);
402
403 /** This is inherited from FLAC__StreamEncoder; see
404  *  FLAC__stream_encoder_set_do_qlp_coeff_prec_search().
405  *
406  * \default \c false
407  * \param  encoder  An encoder instance to set.
408  * \param  value    See above.
409  * \assert
410  *    \code encoder != NULL \endcode
411  * \retval FLAC__bool
412  *    \c false if the encoder is already initialized, else \c true.
413  */
414 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
415
416 /** This is inherited from FLAC__StreamEncoder; see
417  *  FLAC__stream_encoder_set_do_escape_coding().
418  *
419  * \default \c false
420  * \param  encoder  An encoder instance to set.
421  * \param  value    See above.
422  * \assert
423  *    \code encoder != NULL \endcode
424  * \retval FLAC__bool
425  *    \c false if the encoder is already initialized, else \c true.
426  */
427 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_do_escape_coding(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
428
429 /** This is inherited from FLAC__StreamEncoder; see
430  *  FLAC__stream_encoder_set_do_exhaustive_model_search().
431  *
432  * \default \c false
433  * \param  encoder  An encoder instance to set.
434  * \param  value    See above.
435  * \assert
436  *    \code encoder != NULL \endcode
437  * \retval FLAC__bool
438  *    \c false if the encoder is already initialized, else \c true.
439  */
440 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_do_exhaustive_model_search(FLAC__SeekableStreamEncoder *encoder, FLAC__bool value);
441
442 /** This is inherited from FLAC__StreamEncoder; see
443  *  FLAC__stream_encoder_set_min_residual_partition_order().
444  *
445  * \default \c 0
446  * \param  encoder  An encoder instance to set.
447  * \param  value    See above.
448  * \assert
449  *    \code encoder != NULL \endcode
450  * \retval FLAC__bool
451  *    \c false if the encoder is already initialized, else \c true.
452  */
453 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_min_residual_partition_order(FLAC__SeekableStreamEncoder *encoder, unsigned value);
454
455 /** This is inherited from FLAC__StreamEncoder; see
456  *  FLAC__stream_encoder_set_max_residual_partition_order().
457  *
458  * \default \c 0
459  * \param  encoder  An encoder instance to set.
460  * \param  value    See above.
461  * \assert
462  *    \code encoder != NULL \endcode
463  * \retval FLAC__bool
464  *    \c false if the encoder is already initialized, else \c true.
465  */
466 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_max_residual_partition_order(FLAC__SeekableStreamEncoder *encoder, unsigned value);
467
468 /** This is inherited from FLAC__StreamEncoder; see
469  *  FLAC__stream_encoder_set_rice_parameter_search_dist().
470  *
471  * \default \c 0
472  * \param  encoder  An encoder instance to set.
473  * \param  value    See above.
474  * \assert
475  *    \code encoder != NULL \endcode
476  * \retval FLAC__bool
477  *    \c false if the encoder is already initialized, else \c true.
478  */
479 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_rice_parameter_search_dist(FLAC__SeekableStreamEncoder *encoder, unsigned value);
480
481 /** This is inherited from FLAC__StreamEncoder; see
482  *  FLAC__stream_encoder_set_total_samples_estimate().
483  *
484  * \default \c 0
485  * \param  encoder  An encoder instance to set.
486  * \param  value    See above.
487  * \assert
488  *    \code encoder != NULL \endcode
489  * \retval FLAC__bool
490  *    \c false if the encoder is already initialized, else \c true.
491  */
492 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_total_samples_estimate(FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 value);
493
494 /** This is inherited from FLAC__StreamEncoder; see
495  *  FLAC__stream_encoder_set_metadata().
496  *
497  * \note
498  * SEEKTABLE blocks are handled specially.  Since you will not know
499  * the values for the seek point stream offsets, you should pass in
500  * a SEEKTABLE 'template', that is, a SEEKTABLE object with the
501  * required sample numbers (or placeholder points), with \c 0 for the
502  * \a frame_samples and \a stream_offset fields for each point.  While
503  * encoding, the encoder will fill them in for you and when encoding
504  * is finished, it will seek back and write the real values into the
505  * SEEKTABLE block in the stream.  There are helper routines for
506  * manipulating seektable template blocks; see metadata.h:
507  * FLAC__metadata_object_seektable_template_*().
508  *
509  * \note
510  * The encoder instance \b will modify the first \c SEEKTABLE block
511  * as it transforms the template to a valid seektable while encoding,
512  * but it is still up to the caller to free all metadata blocks after
513  * encoding.
514  *
515  * \default \c NULL, 0
516  * \param  encoder     An encoder instance to set.
517  * \param  metadata    See above.
518  * \param  num_blocks  See above.
519  * \assert
520  *    \code encoder != NULL \endcode
521  * \retval FLAC__bool
522  *    \c false if the encoder is already initialized, else \c true.
523  */
524 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_metadata(FLAC__SeekableStreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks);
525
526 /** Set the seek callback.
527  *  The supplied function will be called when the encoder needs to seek
528  *  the output stream.  The encoder will pass the absolute byte offset
529  *  to seek to, 0 meaning the beginning of the stream.
530  *
531  * \note
532  * The callback is mandatory and must be set before initialization.
533  *
534  * \default \c NULL
535  * \param  encoder  An encoder instance to set.
536  * \param  value    See above.
537  * \assert
538  *    \code encoder != NULL \endcode
539  *    \code value != NULL \endcode
540  * \retval FLAC__bool
541  *    \c false if the encoder is already initialized, else \c true.
542  */
543 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_seek_callback(FLAC__SeekableStreamEncoder *encoder, FLAC__SeekableStreamEncoderSeekCallback value);
544
545 /** Set the write callback.
546  *  This is inherited from FLAC__StreamEncoder; see
547  *  FLAC__stream_encoder_set_write_callback().
548  *
549  * \note
550  * The callback is mandatory and must be set before initialization.
551  *
552  * \default \c NULL
553  * \param  encoder  An encoder instance to set.
554  * \param  value    See above.
555  * \assert
556  *    \code encoder != NULL \endcode
557  *    \code value != NULL \endcode
558  * \retval FLAC__bool
559  *    \c false if the encoder is already initialized, else \c true.
560  */
561 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_write_callback(FLAC__SeekableStreamEncoder *encoder, FLAC__SeekableStreamEncoderWriteCallback value);
562
563 /** Set the client data to be passed back to callbacks.
564  *  This value will be supplied to callbacks in their \a client_data
565  *  argument.
566  *
567  * \default \c NULL
568  * \param  encoder  An encoder instance to set.
569  * \param  value    See above.
570  * \assert
571  *    \code encoder != NULL \endcode
572  * \retval FLAC__bool
573  *    \c false if the encoder is already initialized, else \c true.
574  */
575 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_set_client_data(FLAC__SeekableStreamEncoder *encoder, void *value);
576
577 /** Get the current encoder state.
578  *
579  * \param  encoder  An encoder instance to query.
580  * \assert
581  *    \code encoder != NULL \endcode
582  * \retval FLAC__SeekableStreamEncoderState
583  *    The current encoder state.
584  */
585 FLAC_API FLAC__SeekableStreamEncoderState FLAC__seekable_stream_encoder_get_state(const FLAC__SeekableStreamEncoder *encoder);
586
587 /** Get the state of the underlying stream encoder.
588  *  Useful when the seekable stream encoder state is
589  *  \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR.
590  *
591  * \param  encoder  An encoder instance to query.
592  * \assert
593  *    \code encoder != NULL \endcode
594  * \retval FLAC__StreamEncoderState
595  *    The stream encoder state.
596  */
597 FLAC_API FLAC__StreamEncoderState FLAC__seekable_stream_encoder_get_stream_encoder_state(const FLAC__SeekableStreamEncoder *encoder);
598
599 /** Get the state of the underlying stream encoder's verify decoder.
600  *  Useful when the seekable stream encoder state is
601  *  \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR and the
602  *  stream encoder state is \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR.
603  *
604  * \param  encoder  An encoder instance to query.
605  * \assert
606  *    \code encoder != NULL \endcode
607  * \retval FLAC__StreamDecoderState
608  *    The stream encoder state.
609  */
610 FLAC_API FLAC__StreamDecoderState FLAC__seekable_stream_encoder_get_verify_decoder_state(const FLAC__SeekableStreamEncoder *encoder);
611
612 /** Get the current encoder state as a C string.
613  *  This version automatically resolves
614  *  \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR by getting the
615  *  stream encoder's state.
616  *
617  * \param  encoder  A encoder instance to query.
618  * \assert
619  *    \code encoder != NULL \endcode
620  * \retval const char *
621  *    The encoder state as a C string.  Do not modify the contents.
622  */
623 FLAC_API const char *FLAC__seekable_stream_encoder_get_resolved_state_string(const FLAC__SeekableStreamEncoder *encoder);
624
625 /** Get relevant values about the nature of a verify decoder error.
626  *  Inherited from FLAC__stream_encoder_get_verify_decoder_error_stats().
627  *  Useful when the seekable stream encoder state is
628  *  \c FLAC__SEEKABLE_STREAM_ENCODER_STREAM_ENCODER_ERROR and the
629  *  stream encoder state is
630  *  \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR.
631  *
632  * \param  encoder  An encoder instance to query.
633  * \param  absolute_sample  The absolute sample number of the mismatch.
634  * \param  frame_number  The number of the frame in which the mismatch occurred.
635  * \param  channel       The channel in which the mismatch occurred.
636  * \param  sample        The number of the sample (relative to the frame) in
637  *                       which the mismatch occurred.
638  * \param  expected      The expected value for the sample in question.
639  * \param  got           The actual value returned by the decoder.
640  * \assert
641  *    \code encoder != NULL \endcode
642  */
643 FLAC_API void FLAC__seekable_stream_encoder_get_verify_decoder_error_stats(const FLAC__SeekableStreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got);
644
645 /** Get the "verify" flag.
646  *  This is inherited from FLAC__StreamEncoder; see
647  *  FLAC__stream_encoder_get_verify().
648  *
649  * \param  encoder  An encoder instance to query.
650  * \assert
651  *    \code encoder != NULL \endcode
652  * \retval FLAC__bool
653  *    See FLAC__seekable_stream_encoder_set_verify().
654  */
655 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_verify(const FLAC__SeekableStreamEncoder *encoder);
656
657 /** Get the "streamable subset" flag.
658  *  This is inherited from FLAC__StreamEncoder; see
659  *  FLAC__stream_encoder_get_streamable_subset().
660  *
661  * \param  encoder  An encoder instance to query.
662  * \assert
663  *    \code encoder != NULL \endcode
664  * \retval FLAC__bool
665  *    See FLAC__seekable_stream_encoder_set_streamable_subset().
666  */
667 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_streamable_subset(const FLAC__SeekableStreamEncoder *encoder);
668
669 /** Get the "mid/side stereo coding" flag.
670  *  This is inherited from FLAC__StreamEncoder; see
671  *  FLAC__stream_encoder_get_do_mid_side_stereo().
672  *
673  * \param  encoder  An encoder instance to query.
674  * \assert
675  *    \code encoder != NULL \endcode
676  * \retval FLAC__bool
677  *    See FLAC__seekable_stream_encoder_get_do_mid_side_stereo().
678  */
679 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_do_mid_side_stereo(const FLAC__SeekableStreamEncoder *encoder);
680
681 /** Get the "adaptive mid/side switching" flag.
682  *  This is inherited from FLAC__StreamEncoder; see
683  *  FLAC__stream_encoder_get_loose_mid_side_stereo().
684  *
685  * \param  encoder  An encoder instance to query.
686  * \assert
687  *    \code encoder != NULL \endcode
688  * \retval FLAC__bool
689  *    See FLAC__seekable_stream_encoder_set_loose_mid_side_stereo().
690  */
691 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_loose_mid_side_stereo(const FLAC__SeekableStreamEncoder *encoder);
692
693 /** Get the number of input channels being processed.
694  *  This is inherited from FLAC__StreamEncoder; see
695  *  FLAC__stream_encoder_get_channels().
696  *
697  * \param  encoder  An encoder instance to query.
698  * \assert
699  *    \code encoder != NULL \endcode
700  * \retval unsigned
701  *    See FLAC__seekable_stream_encoder_set_channels().
702  */
703 FLAC_API unsigned FLAC__seekable_stream_encoder_get_channels(const FLAC__SeekableStreamEncoder *encoder);
704
705 /** Get the input sample resolution setting.
706  *  This is inherited from FLAC__StreamEncoder; see
707  *  FLAC__stream_encoder_get_bits_per_sample().
708  *
709  * \param  encoder  An encoder instance to query.
710  * \assert
711  *    \code encoder != NULL \endcode
712  * \retval unsigned
713  *    See FLAC__seekable_stream_encoder_set_bits_per_sample().
714  */
715 FLAC_API unsigned FLAC__seekable_stream_encoder_get_bits_per_sample(const FLAC__SeekableStreamEncoder *encoder);
716
717 /** Get the input sample rate setting.
718  *  This is inherited from FLAC__StreamEncoder; see
719  *  FLAC__stream_encoder_get_sample_rate().
720  *
721  * \param  encoder  An encoder instance to query.
722  * \assert
723  *    \code encoder != NULL \endcode
724  * \retval unsigned
725  *    See FLAC__seekable_stream_encoder_set_sample_rate().
726  */
727 FLAC_API unsigned FLAC__seekable_stream_encoder_get_sample_rate(const FLAC__SeekableStreamEncoder *encoder);
728
729 /** Get the blocksize setting.
730  *  This is inherited from FLAC__StreamEncoder; see
731  *  FLAC__stream_encoder_get_blocksize().
732  *
733  * \param  encoder  An encoder instance to query.
734  * \assert
735  *    \code encoder != NULL \endcode
736  * \retval unsigned
737  *    See FLAC__seekable_stream_encoder_set_blocksize().
738  */
739 FLAC_API unsigned FLAC__seekable_stream_encoder_get_blocksize(const FLAC__SeekableStreamEncoder *encoder);
740
741 /** Get the maximum LPC order setting.
742  *  This is inherited from FLAC__StreamEncoder; see
743  *  FLAC__stream_encoder_get_max_lpc_order().
744  *
745  * \param  encoder  An encoder instance to query.
746  * \assert
747  *    \code encoder != NULL \endcode
748  * \retval unsigned
749  *    See FLAC__seekable_stream_encoder_set_max_lpc_order().
750  */
751 FLAC_API unsigned FLAC__seekable_stream_encoder_get_max_lpc_order(const FLAC__SeekableStreamEncoder *encoder);
752
753 /** Get the quantized linear predictor coefficient precision setting.
754  *  This is inherited from FLAC__StreamEncoder; see
755  *  FLAC__stream_encoder_get_qlp_coeff_precision().
756  *
757  * \param  encoder  An encoder instance to query.
758  * \assert
759  *    \code encoder != NULL \endcode
760  * \retval unsigned
761  *    See FLAC__seekable_stream_encoder_set_qlp_coeff_precision().
762  */
763 FLAC_API unsigned FLAC__seekable_stream_encoder_get_qlp_coeff_precision(const FLAC__SeekableStreamEncoder *encoder);
764
765 /** Get the qlp coefficient precision search flag.
766  *  This is inherited from FLAC__StreamEncoder; see
767  *  FLAC__stream_encoder_get_do_qlp_coeff_prec_search().
768  *
769  * \param  encoder  An encoder instance to query.
770  * \assert
771  *    \code encoder != NULL \endcode
772  * \retval FLAC__bool
773  *    See FLAC__seekable_stream_encoder_set_do_qlp_coeff_prec_search().
774  */
775 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__SeekableStreamEncoder *encoder);
776
777 /** Get the "escape coding" flag.
778  *  This is inherited from FLAC__StreamEncoder; see
779  *  FLAC__stream_encoder_get_do_escape_coding().
780  *
781  * \param  encoder  An encoder instance to query.
782  * \assert
783  *    \code encoder != NULL \endcode
784  * \retval FLAC__bool
785  *    See FLAC__seekable_stream_encoder_set_do_escape_coding().
786  */
787 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_do_escape_coding(const FLAC__SeekableStreamEncoder *encoder);
788
789 /** Get the exhaustive model search flag.
790  *  This is inherited from FLAC__StreamEncoder; see
791  *  FLAC__stream_encoder_get_do_exhaustive_model_search().
792  *
793  * \param  encoder  An encoder instance to query.
794  * \assert
795  *    \code encoder != NULL \endcode
796  * \retval FLAC__bool
797  *    See FLAC__seekable_stream_encoder_set_do_exhaustive_model_search().
798  */
799 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_get_do_exhaustive_model_search(const FLAC__SeekableStreamEncoder *encoder);
800
801 /** Get the minimum residual partition order setting.
802  *  This is inherited from FLAC__StreamEncoder; see
803  *  FLAC__stream_encoder_get_min_residual_partition_order().
804  *
805  * \param  encoder  An encoder instance to query.
806  * \assert
807  *    \code encoder != NULL \endcode
808  * \retval unsigned
809  *    See FLAC__seekable_stream_encoder_set_min_residual_partition_order().
810  */
811 FLAC_API unsigned FLAC__seekable_stream_encoder_get_min_residual_partition_order(const FLAC__SeekableStreamEncoder *encoder);
812
813 /** Get maximum residual partition order setting.
814  *  This is inherited from FLAC__StreamEncoder; see
815  *  FLAC__stream_encoder_get_max_residual_partition_order().
816  *
817  * \param  encoder  An encoder instance to query.
818  * \assert
819  *    \code encoder != NULL \endcode
820  * \retval unsigned
821  *    See FLAC__seekable_stream_encoder_set_max_residual_partition_order().
822  */
823 FLAC_API unsigned FLAC__seekable_stream_encoder_get_max_residual_partition_order(const FLAC__SeekableStreamEncoder *encoder);
824
825 /** Get the Rice parameter search distance setting.
826  *  This is inherited from FLAC__StreamEncoder; see
827  *  FLAC__stream_encoder_get_rice_parameter_search_dist().
828  *
829  * \param  encoder  An encoder instance to query.
830  * \assert
831  *    \code encoder != NULL \endcode
832  * \retval unsigned
833  *    See FLAC__seekable_stream_encoder_set_rice_parameter_search_dist().
834  */
835 FLAC_API unsigned FLAC__seekable_stream_encoder_get_rice_parameter_search_dist(const FLAC__SeekableStreamEncoder *encoder);
836
837 /** Get the previously set estimate of the total samples to be encoded.
838  *  This is inherited from FLAC__StreamEncoder; see
839  *  FLAC__stream_encoder_get_total_samples_estimate().
840  *
841  * \param  encoder  An encoder instance to query.
842  * \assert
843  *    \code encoder != NULL \endcode
844  * \retval FLAC__uint64
845  *    See FLAC__seekable_stream_encoder_set_total_samples_estimate().
846  */
847 FLAC_API FLAC__uint64 FLAC__seekable_stream_encoder_get_total_samples_estimate(const FLAC__SeekableStreamEncoder *encoder);
848
849 /** Initialize the encoder instance.
850  *  Should be called after FLAC__seekable_stream_encoder_new() and
851  *  FLAC__seekable_stream_encoder_set_*() but before FLAC__seekable_stream_encoder_process()
852  *  or FLAC__seekable_stream_encoder_process_interleaved().  Will set and return
853  *  the encoder state, which will be FLAC__SEEKABLE_STREAM_ENCODER_OK if
854  *  initialization succeeded.
855  *
856  *  The call to FLAC__seekable_stream_encoder_init() currently will also immediately
857  *  call the write callback with the \c fLaC signature and all the encoded
858  *  metadata.
859  *
860  * \param  encoder  An uninitialized encoder instance.
861  * \assert
862  *    \code encoder != NULL \endcode
863  * \retval FLAC__SeekableStreamEncoderState
864  *    \c FLAC__SEEKABLE_STREAM_ENCODER_OK if initialization was successful; see
865  *    FLAC__SeekableStreamEncoderState for the meanings of other return values.
866  */
867 FLAC_API FLAC__SeekableStreamEncoderState FLAC__seekable_stream_encoder_init(FLAC__SeekableStreamEncoder *encoder);
868
869 /** Finish the encoding process.
870  *  Flushes the encoding buffer, releases resources, resets the encoder
871  *  settings to their defaults, and returns the encoder state to
872  *  FLAC__SEEKABLE_STREAM_ENCODER_UNINITIALIZED.
873  *
874  *  In the event of a prematurely-terminated encode, it is not strictly
875  *  necessary to call this immediately before FLAC__seekable_stream_encoder_delete()
876  *  but it is good practice to match every FLAC__seekable_stream_encoder_init()
877  *  with a FLAC__seekable_stream_encoder_finish().
878  *
879  * \param  encoder  An uninitialized encoder instance.
880  * \assert
881  *    \code encoder != NULL \endcode
882  */
883 FLAC_API void FLAC__seekable_stream_encoder_finish(FLAC__SeekableStreamEncoder *encoder);
884
885 /** Submit data for encoding.
886  *  This is inherited from FLAC__StreamEncoder; see
887  *  FLAC__stream_encoder_process().
888  *
889  * \param  encoder  An initialized encoder instance in the OK state.
890  * \param  buffer   An array of pointers to each channel's signal.
891  * \param  samples  The number of samples in one channel.
892  * \assert
893  *    \code encoder != NULL \endcode
894  *    \code FLAC__seekable_stream_encoder_get_state(encoder) == FLAC__SEEKABLE_STREAM_ENCODER_OK \endcode
895  * \retval FLAC__bool
896  *    \c true if successful, else \c false; in this case, check the
897  *    encoder state with FLAC__seekable_stream_encoder_get_state() to see what
898  *    went wrong.
899  */
900 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_process(FLAC__SeekableStreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples);
901
902 /** Submit data for encoding.
903  *  This is inherited from FLAC__StreamEncoder; see
904  *  FLAC__stream_encoder_process_interleaved().
905  *
906  * \param  encoder  An initialized encoder instance in the OK state.
907  * \param  buffer   An array of channel-interleaved data (see above).
908  * \param  samples  The number of samples in one channel, the same as for
909  *                  FLAC__seekable_stream_encoder_process().  For example, if
910  *                  encoding two channels, \c 1000 \a samples corresponds
911  *                  to a \a buffer of 2000 values.
912  * \assert
913  *    \code encoder != NULL \endcode
914  *    \code FLAC__seekable_stream_encoder_get_state(encoder) == FLAC__SEEKABLE_STREAM_ENCODER_OK \endcode
915  * \retval FLAC__bool
916  *    \c true if successful, else \c false; in this case, check the
917  *    encoder state with FLAC__seekable_stream_encoder_get_state() to see what
918  *    went wrong.
919  */
920 FLAC_API FLAC__bool FLAC__seekable_stream_encoder_process_interleaved(FLAC__SeekableStreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples);
921
922 /* \} */
923
924 #ifdef __cplusplus
925 }
926 #endif
927
928 #endif